testbench

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Verilog testbench总结(一)

1.激励的产生

对于testbench而言,端口应当和被测试的module一一对应。端口分为input,output和i nout类型产生激励信号的时候,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

大家应该注意到有个#符号,该符号的意思是指延迟相应的时间单位。该时间单位由timsca le决定.一般在testbench的开头定义时间单位和仿真精度,比如`timescale1ns/1ps,前面一个是代表时间单位,后面一个代表仿真时间精度。以上面的例子而言,一个时钟周期是20个单位,也就是20ns。而仿真时间精度的概念就是,你能看到1.001ns时对应的信号值,而假如timescale1ns/1ns,1.001ns时候的值就无法看到。对于一个设计而言,时间刻度应该统一,如果设计文件和testbench里面的时间刻度不一致,仿真器默认以test bench为准。一个较好的办法是写一个global.v文件,然后用include的办法,可以防止这个问题。

对于反复执行的操作,可写成task,然后调用,比如

task load_count;

input[3:0]load_value;

begin

@(negedge clk_50);

$display($time,"<>",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等等语句用法类似,虽然不一定都能综合,但是用在testbe nch里面很方便,大家可以自行查阅参考文档

2)文件输入

有时候,需要大量的数据输入,直接赋值的话比较繁琐,可以先生成数据,再将数据读入到寄存器中,需要时取出即可。用$readmemb系统任务从文本文件中读取二进制向量(可以包含输入激励和输出期望值)。$readmemh用于读取十六进制文件。例如:

reg[7:0]mem[1:256]//a8-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模块以下两层的信号,

相关文档
最新文档