首页 > 技术 > 内容

Verilog testbench总结

时间:2026-01-24  作者:Diven  阅读:0

1. 激励的产生
对于testbench而言,端口应当和被测试的Module一一对应。端口分为input,output和inout类型产生激励信号的时候,input对应的端口应当申明为reg, output对应的端口申明为wire,inout端口比较特殊,下面专门讲解。
1)直接赋值。
一般用initial块给信号赋初值,initial块执行一次,always或者forever表示由事件激发反复执行。
举例,一个Module
module exam();
reg rst_n;
reg clk;
reg data;
initial
begin
       clk=1'b0;
       rst=1'b1;
       #10
       rst=1'b0;
       #500
       rst=1'b1;
end
always
begin
       #10
            clk=~clk;
end 
大家应该注意到有个#符号,该符号的意思是指延迟相应的时间单位。该时间单位由timscale决定.一般在testbench的开头定义时间单位和仿真 精度,比如`timescale 1ns/1ps,前面一个是代表时间单位,后面一个代表仿真时间精度。以上面的例子而言,一个时钟周期是20个单位,也就是20ns。而仿真时间精度的概 念就是,你能看到1.001ns时对应的信号值,而假如timescale 1ns/1ns,1.001ns时候的值就无法看到。对于一个设计而言,时间刻度应该统一,如果设计文件和testbench里面的时间刻度不一致,仿真 器默认以testbench为准。一个较好的办法是写一个global.v文件,然后用include的办法,可以防止这个问题。
对于反复执行的操作,可写成task,然后调用,比如
task load_count;
       input [3:0] load_value;
       begin
            @(negedge clk_50);
                     $display($time, " << Loading the counter with %h >>", load_value);
            load_l = 1’b0;
            count_in = load_value;
            @(negedge clk_50);
            load_l = 1’b1;
       end
endtask //of load_count
initial 
begin
   load_count(4’hA);   // 调用task
end
其像forever,for,function等等语句用法类似,虽然不一定都能综合,但是用在testbench里面很方便,大家可以自行查阅参考文档
2) 文件输入
有时候,需要大量的数据输入,直接赋值的话比较繁琐,可以先生成数据,再将数据读入到寄存器中,需要时取出即可。用 $readmemb系统任务从文本文件中读取二进制向量(可以包含输入激励和输出期望值)。$readmemh 用于读取十六进制文件。例如:
reg [7:0]   mem[1:256]   //   a 8-bit, 256-word 定义存储器mem
initial   $readmemh ( "E:/readhex/mem.dat", mem ) // 将.dat文件读入寄存器mem中
initial   $readmemh ( "E:/readhex/mem.dat", mem, 128, 1 ) // 参数为寄存器加载数据的地址始终
2.   查看仿真结果
对于简单的module来说,要在modelsim的仿真窗口里面看波形,就用add wave ..命令
比如,testbench的顶层module名叫tb,要看时钟信号,就用add wave tb.clk
要查看所有信号的时候,就用 add wave /*
当然,也可以在workspace下的sim窗口里面右键单击instance来添加波形
对于复杂的仿真,免不了要记录波形和数据到文件里面去。 
1)波形文件记录
常见的波形文件一般有两种,vcd和fsdb,debussy是个很好的工具,支持fsdb,所以最好是modelsim+debussy的组合
默认情况下,modelsim不认识fsdb,所以需要先装debussy,再生成fsdb文件。 
$dumpfile和$dumpvar是verilog语言中的两个系统任务,可以调用这两个系统任务来创建和将指定信息导入VCD文件.
对于fsdb文件来说,对应的命令是fsdbDumpfile,dumpfsdbvars
(什么是VCD文件? 答:VCD文件是在对设计进行的仿真过程中,记录各种信号取值变化情况的信息记录文件。EDA工具通过读取VCD格式的文件,显示图形化的仿真波形,所以,可以把VCD文件简单地视为波形记录文件.)下面分别描述用法并举例说明之。
$dumpfile系统任务:为所要创建的VCD文件指定文件名。
举例("//"符号后的内容为注释文字):
initial
$dumpfile ("myfile.dump"); //指定VCD文件的名字为myfile.dump,仿真信息将记录到此文件
$dumpvar系统任务:指定需要记录到VCD文件中的信号,可以指定某一模块层次上的所有信号,也可以单独指定某一个信号。
典型语法为$dumpvar(level, module_name); 参数level为一个整数,用于指定层次数,参数module则指定要记录的模块。整句的意思就是,对于指定的模块,包括其下各个层次(层次数由 level指定)的信号,都需要记录到VCD文件中去。
举例:
initial
$dumpvar (0, top); //指定层次数为0,则top模块及其下面各层次的所有信号将被记录
initial
$dumpvar (1, top); //记录模块实例top以下一层的信号
//层次数为1,即记录top模块这一层次的信号
//对于top模块中调用的更深层次的模块实例,则不记录其信号变化
initial
$dumpvar (2, top); //记录模块实例top以下两层的信号
//即top模块及其下一层的信号将被记录
假设模块top中包含有子模块module1,而我们希望记录top.module1模块以下两层的信号,则语法举例如下:
initial
$dumpvar (2, top.module1); //模块实例top.module1及其下一层的信号将被记录
假设模块top包含信号signal1和signal2(注意是变量而不是子模块), 如我们希望只记录这两个信号,则语法举例如下:
initial
$dumpvar (0, top.signal1, top.signal2); //虽然指定了层次数,但层次数是不影响单独指定的信号的
//即指定层次数和单独指定的信号无关

相关资料


猜您喜欢


现代电子设备和工业自动化领域,连接器的作用不可忽视。CONN_21X5.5MM_TM作为特定类型的连接器,因其独特的设计和优良的性能,应用于各种电子产品中。本文...
2025-04-26 13:00:10
贴片电阻1002 (英制0402) 是一种非常小尺寸的电阻,通常用于空间受限的电路设计中。的阻值选择取决于具体的应用场景,没有一个 universally 合适...
2024-11-29 10:25:45
电流检测电阻作为关键元件,应用于电流测量、过流保护和电路控制等领域。立隆(LELON)作为国内知名的电子元器件品牌,其电流检测电阻以高精度、高可靠性和多样化规格...
2017-02-03 07:00:30
贴片电阻封装好坏直接影响其性能和可靠性。以下几个方面可以帮助你判断:外观检查:尺寸和形状: 观察电阻尺寸是否符合规格,形状是否规则,有无变形、翘曲或缺损。表面:...
2024-11-29 10:26:29
FPGA 是可编程芯片,因此 FPGA 的设计方法包括硬件设计和软件设计两部分。硬件包括 FPGA 芯片电路、 存储器、输入输出接口电路以及其他设备,软件即是相...
2020-07-13 09:53:00
5516光敏电阻是常用的光电元件,应用于光照强度检测、自动控制系统和各种电子产品中。由于其优异的光敏特性,5516光敏电阻在许多领域中有着着重要作用。本文将详细...
2025-04-19 15:31:40
奇力新(CHILISIN)作为一家知名的被动元件制造商,高品质的排阻产品赢得了认可。排阻作为电路中不可少的元器件,其尺寸规格和品牌影响着产品的性能和稳定性。本文...
2023-05-12 22:18:09
还在为繁琐的贴片电阻计算而烦恼吗?现在,一款便捷的贴片电阻计算器手机版来帮您!完全免费下载,让您随时随地轻松计算电阻值。这款计算器操作简单,界面直观,即使您不是...
2025-04-14 15:02:34
PTC热敏电阻作为重要的保护元件,应用于电路保护、温度检测和过流保护等领域。振华科技作为国内知名的电子元器件生产企业,其PTC热敏电阻产品以优良的品质和多样的类...
2016-05-08 02:29:30