目录

0.前言

1.Interface代码

1.1声明接口

1.2声明clocking block

1.3声明modport

2.test代码

3.Test Harness 文件

4.波形文件


0.前言

在上一篇文章中介绍了该router的端口说明和协议,从这篇文章中我们正式开始做lab1,该lab的目标有以下2点:

1.创建interface连接DUT和TB

2.根据协议产生复位激励,初始化DUT

该lab搭建起来的组件及连接关系如下草图:

1.Interface代码

1.1声明接口

使用SV中的logic类型声明端口,logic可代表reg/wire型,这样就不用管各个端口信号相对于TB是输入还是输出,即不用管是input还是output,直接logic类型声明简单粗暴。

interface router_io (input bit clock);//使用外部时钟时要在该处声明logic reset_n;logic [15:0] din ;logic [15:0] frame_n;logic [15:0] valid_n ;logic [15:0] dout ;logic [15:0] valido_n;logic [15:0] busy_n;logic [15:0] frameo_n;//所有DUT接口声明endinterface

1.2声明clocking block

clocking block的主要作用是同步驱动和采样信号,同时声明信号相对于TB的方向,并声明输入/输出偏差,需要注意的是,若不声明,这里默认为:

default input #1step output #0; 

路桑在一篇文章中( IC验证培训——实战SV验证学习(lab1)_路科验证-CSDN博客_sv验证 )表明:input  #1ns 指的是采样时间相对时钟上升沿提前1ns,但不在波形上显示;用来模拟真实电路中的建立时间。output #1ns指的是驱动时间相对时钟上升沿推后1ns,会在波形上显示出来;用来模拟真实电路中的传播延时。

关于clocking block的更详细的介绍我会另写一篇文章深入讲解。

interface router_io (input bit clock);logic reset_n;logic [15:0] din ;logic [15:0] frame_n;logic [15:0] valid_n ;logic [15:0] dout ;logic [15:0] valido_n;logic [15:0] busy_n;logic [15:0] frameo_n;clocking cb @(posedge clock);//用来同步采样和驱动信号,相对于TB方向default input #1ns output #1ns ; //设置输入/出偏差output reset_n; output din; output frame_n; output valid_n; input dout; input valido_n; input busy_n; input frameo_n;
endclocking: cbendinterface

1.3声明modport

interface router_io (input bit clock);logic reset_n;logic [15:0] din ;logic [15:0] frame_n;logic [15:0] valid_n ;logic [15:0] dout ;logic [15:0] valido_n;logic [15:0] busy_n;logic [15:0] frameo_n;clocking cb @(posedge clock);default input #1ns output #1ns ; output reset_n; output din; output frame_n; output valid_n; input dout; input valido_n; input busy_n; input frameo_n;
endclocking: cbmodport TB(clocking cb,output reset_n) ;//声明clocing用来同步采样和驱动信号,另外又在modport中单独声明了reset_n,表明reset_n可同步(cb中)可异步(modport中)endinterface

2.test代码

该test实现的功能十分简单,即打印Hello World和按照router复位协议初始化DUT。该复位协议时序图如下,有如下几点关键点:

1.复位时,reset_n为低电平,frame_n和valid_n为高电平

2.有效复位至少保持1个clk

3.复位后至少等待15个时钟周期后才可以发送数据

按照协议写test如下,具体讲解在代码后注释说明:

program automatic test (router__io.TB rtr__io);//使用接口连接initial begin$display("Hello World!"); //打印字符串$vcdpluson; reset ();//调用复位函数 endtask reset();router.reset_n=1'b0;//注意这里调用的是modport中的reset,是异步复位,用阻塞赋值即可,因此不用等待时钟沿;这里用异步复位的原因是为了在0时刻直接将reset拉低router.cb.frame_n.<='b1; //按照协议将frame和valid拉高router.cb.valid_n<='b1;##2 router.cb.reset_n<=1'b1;//根据协议复位至少保持一个clk,这里等待2个时钟周期后把reset拉高repeat(15) @(router.cb); //按照协议,复位后至少等待15个时钟周期后复位结束endtask
endprogram

3.Test Harness 文件

顶层控制文件是为了将TB和interface和DUT连接起来,并生成全局时钟,具体讲解在代码后注释说明:

`timescale 1ns/lOOps//声明时间单位和精度module router_test__top;parameter simulation_cycle = 100;//声明时钟周期bit SystemClock; //声明全局时钟变量router_io top__io (SystemClock) ;//例化接口 test t (top_io); //例化TB并连接到接口上router dut (.reset_n(top_io.reset__n),.clock(top__io.clock),.din(top_io.din),.frame_n(top_io.frame_n),.valid__n(top_io.valid_n),.dout(top__io.dout),.valido_n(top_io.valido_n),.busy_n(top__io.busy__n),.frameo__n(top_io.frameo_n));//例化DUT并连接到接口上,由于DUT是按照verilog风格写的,所以不能像test一样直接连接接口,而是要通过信号映射的方式连接initial begin$timeformat(-9, 1, "ns", 10) ; //设置时间格式SystemClock = 0;//0时刻时钟变量为0forever begin#(simula.tion__cycle/2) SystemClock = -SystemClock;//生成周期为100ns的时钟endend
endmodule

4.波形文件

由于default  input #1ns output #1ns的作用,根据前述路桑的讲解,结合如下波形文件可见,TB驱动信号valid_n和frameo_n的输出偏差可见,比时钟上升沿50ns晚1ns;而TB的采样信号在波形上在时钟上升沿50ns处变化,但实际上是提前1ns采样,但在波形上确实没有反映出来。

 

配合代码看波形,首先是clock,以100ns为一个周期没有问题;再看reset_n,使用的是异步阻塞赋值,因此在0ns是0,##2表示在2个时钟上升沿后,采样cb中的同步reset_n非阻塞赋值,因此在150ns时拉高为1,但输出偏差延迟了1ns,所以在151ns拉高为1;再看驱动信号frame_n和valid_n,其使用cb中的信号非阻塞赋值,因此在0ns为x值,等到第一个时钟上升沿时同时变为1。

Synopsys SV lab guide—lab1相关推荐

  1. Synopsys SV Lab Guide—lab2

    目录 0.前言 1.全局变量声明 2.定义generator产生随机激励 3.将随机激励驱动到DUT上 4.仿真波形 5.值得注意的细节 0.前言 该lab的目标有以下2点: 1.写一个generat ...

  2. Synopsys SV Lab Guide—lab3

    目录 0.前言 ​1.全局变量声明 2.高层次级函数的确定 3. 接收数据函数 4.检查函数 5.仿真结果 6.完整test代码 0.前言 该lab目标有以下几点: 随机化输入端口和输出端口以全面测试 ...

  3. Synopsys SV Lab Guide—router简介

    目录 1.管脚图 2.设计说明 3.复位协议 4.输入信号协议 5.输出信号协议 1.管脚图 该router有5个输入,4个输出,除了时钟和复位端口外其它信号端口均为16bits,如上左图:需要注意的 ...

  4. ICC使用----ICC 1 Lab Guide学习笔记

    文章目录 Preface ICC 1 Lab Guide Note: 1.Data Setup & Basic Flow(P27) Learning Objectives Create a M ...

  5. SV验证-3Scoreboard

    SV验证-3Scoreboad验证结果 ​ 本文采用system verilog语言对一个router.v模块进行验证.参考文档为Synopsys公司2012年出版的<SystemVerilog ...

  6. 【IC设计】Synopsys数字IC设计流程

    文章目录 数字IC设计流程 前端设计 RTL编写和HDL仿真 逻辑综合 门级仿真 形式化验证 后端设计 数据准备 set mw_phys_refs * set link_library * 数据准备 ...

  7. [CS144] Lab 1: stitching substrings into a byte

    Lab 1: stitching substrings into a byte stream Lab Guide: Checkpoint 1: stitching substrings into a ...

  8. 数字电路设计资料目录内容

    ┃  ┣━数字集成电路350G教程和EDA工具 ┃  ┃  ┣━数字集成电路视频教程和资料_设计和验证 ┃  ┃  ┃  ┣━数字后端视频教程和配套资料 ┃  ┃  ┃  ┃  ┣━oc8051项目脚 ...

  9. IC前端数字验证导学

    前言: 20年,真的很特殊.开学到校,需要等待:毕业答辩,需要等待:研究生复试,也是等待.漫长的等待,使得自己思考了很多,其中之一就是对"中国芯"的考量.在与师兄师姐交流后,意识到 ...

最新文章

  1. 送一台27寸高清显示器
  2. 总是听别人说响应式布局,原来这么简单
  3. 如何写出漂亮的代码:七个法则
  4. 编程软件python下载怎么读-怎么学python编程语言,他说,你需要这个工具
  5. 为什么下一个十年的主战场在 Serverless?
  6. 主成分分析法_主成分分析法在地震学领域的新应用
  7. textedit怎么插入数据_还在手动插入Excel交叉空白行?这个小技巧10秒搞定
  8. 第二天——hibernate讲完了
  9. 有序数组原地删除重复出现的元素问题(js)
  10. 2015年9大优秀项目管理工具集锦
  11. 图论(一)—— 基本概念
  12. oracle数组转换字符串函数,Oracle 字符串转数组的函数
  13. 凸优化第五章对偶 5.2Lagrange对偶问题
  14. MMO游戏服务器从零开发(架构篇)- 网络部分
  15. mysql建立序列相关操作 sequence
  16. 原码 反码 补码 移码(变补)补码与移码的作用
  17. 面向对象课程设计日志(八)
  18. AtCoder Beginner Contest 170 F. Pond Skater
  19. 魔法王座微端不显示服务器,魔法王座无法登陆卡顿等常见问题解决方法
  20. 八数码难题 (IDA*解法)

热门文章

  1. aws ec2开启bbr加速
  2. python海龟怎么隐藏,如何控制海龟图形窗口的打开和关闭?
  3. 男女有别:行为抑制系统和腹内侧前额叶皮层连接的性别差异
  4. 什么将成为云计算的基础设施
  5. Android 7.0+配置Burpsuite证书
  6. Python中文日期转换为标准数字日期
  7. c语言脚本的软件测试,编写自动测试c语言程序的shell脚本
  8. mediasoup 源码分析(二十六)SRTP
  9. HDU1213HDU1232-求连通分支数
  10. Android分类导航