首页 > Verilog系列:快速编写TestBench
头像
硅芯思见
编辑于 2022-09-07 17:33 广西
+ 关注

Verilog系列:快速编写TestBench

本文主要提供一些快速编写testbench的方法,希望对有需要的朋友能够有所帮助,其中的主要内容涵盖了testbench的几大重要组成部分,主要包括时钟、复位、信号连接和系统函数的使用方法.

1.基本的Testbench结构

1)常用的编码结构

2)常用结构图示

下节针对Testbench的基本结构的细节进行解析说明.

2.DUT输入输出端口

1)输入端口

DUT的输入端口(input)一般定义为reg类型.

2)输出端口

DUT的输出端口(output)一般定义为wire类型.

3)双向端口

DUT的端口中如果存在双向端口(inout,则一般定义为wire类型.

注意:面对inout类型的处理,通常可以采用以下方法:

a.通过中间变量作为inout类型端口的输出寄存;

【示例】


b.使用forcerelease语句

【示例】


4)模块之间连接

如果Testbench中存在多个模块,且多个模块之间存在互连,则相互之间的连线定义为wire类型.

关于Testbench中各种类型的定义如下如所示:


3.initial定义使用方法

1)在initial语句中定义时钟


2)在initial语句中定义复位


3)在initial语句中定义相关数据信号


4)在initial语句中加入关键字


5)在initial语句中定义#0延时信号


6initial语句的几个特性
  • initial语句在0时刻启动

  • initial语句只能执行一次

  • Testbench中有多个initial语句,则所有的initial语句同时并行执行


7initial语句中被赋值的变量通常为reg类型

8)常用系统函数可作为监控等,详见下文第7.

4.always定义使用方法

1)产生时钟


2)产生数据



5.DUT监测方法

1)调用系统函数对DUT运行状况进行实时监测($dispaly()、$strobe()、$monitor()$fwrite()等)

关于系统函数的详细使用方法可以参阅相关Verilog书籍或者Verilog系列:【13taskfunction.


2)通过功能相似的IP核进行验证

通过SOURCE输入的激励信号同时发送给IP核(该IP功能与DUT功能相同),经过相应处理之后,DUTIP核的输出数据进行比较(CHECK,同时在CHECK中可以对相关的比较进行记录(可以调用系统函数,将结果输出到指定文档等)

6.编写Testbench常用技巧

1CGU:时钟产生电路

将时钟电路作为专门的电路单元或者task进行编写,同时参数化其中的周期参数等,Testbench中进行例化与DUT进行连接,减少Testbench中的代码量,同时使Testbench中的代码更加简洁、模块化、参数化.

Testbench中使用的时钟常采用以下方法产生:

a.使用forever方式产生占空比为50%的时钟

b.使用always方式产生占空比为50%的时钟

c.使用repeat产生确定数目的时钟信号

d.产生占空比不规则的时钟


2RGU:复位产生电路

RGU模块的作用类似于CGU.

Testbench中使用的复位常采用以下方法产生:

a.异步复位

b.同步复位

小结:由上例可以看到,举例中的异步和同步复位其实本质是相同的,只是同步复位中的延迟时间变换成了由时钟上升沿触发并且保持指定数目的时钟个数.


3)CHECK:结果比较电路

基于Testbench简洁清晰化、模块化、参数化,可以将CHECK专门作为一个模块,对测试验证的结果进行相应的处理加工.


4PARAMETER:参数化设计

在对模块调用时,只需要在Testbench中例化模块式,填写相应的参数即可对模块进行中的相应参数进行修改,修改方便简洁.

【示例】

可见,通过参数化处理,不仅可以配置时钟周期,还可以确定数据位宽等,当然在设计中同样可以使用include"abc_cfg.v"文件,对整个系统设计中的所有参数进行统一管理和定义.

5IP REUSEIP复用

随着IP设计的愈加成熟,复用已经成熟的IP进行设计和验证可以大大缩短设计和验证的周期,加快产品的开发,因此,建议在Testbench中可以复用已经成熟的IP进行设计和验证.

6)在initial语句中最好,定义$stop,用以指明仿真何时结束.

7.常用系统函数使用举例

1)添加SDF文件

添加SDF文件不仅可以通过一些仿真工具进行增加,同时还可以使用$sdf_annotate函数进行指定.

【示例】

其中module_instance:使用sdf文件所对应的instancename

scale_factors:针对timmingdelay中的最小延迟(min)、典型延迟(typ)、最大延时(max


2)生成VCD文件,VCD文件可以记录仿真过程中信号的变化,只记录在函数中指定的层次中相关的信号.

【示例】

注意:其中第一个参数表示深度,0表示记录所有层次深度中的信号的变化;第二个参数表示scope,即表示要观测的模块的例化名,当省略时表示当前scope.

【示例】


3)文本文件的梳理

a.读取文本文件

$readmemb系统任务从文本文件中读取二进制向量(可以包含输入输出),$readmemh用于读取十六进制文件.

【示例】

b.输出文本文件

这里需要注意在对文件进行写操作之前需要打开建立文件,使用$fopen(),在写完文件之后要关闭文件$fclose().

【示例】

可以通过$fmonitor,$fdisplay把需要观测的数据按照相应的格式输出到abc.dat

【示例】

通过对本文对Testbench编写的一些经验的总结,希望对VerilogHDL感兴趣的人有所帮助,同时本文有不当之处,希望指正更改,教学相长.

全部评论

(1) 回帖
加载中...
话题 回帖

近期热帖

近期精华帖

热门推荐