Verilog HDL培训(3)_如何编写TESTBENCH
- 格式:pdf
- 大小:346.38 KB
- 文档页数:85
08:291如何编写TESTBENCH计算机学院微电子所627室陈海燕08:292主要内容Verilog 对验证的支持系统函数和系统任务如何编写模块的TESTBENCH08:293系统任务和系统函数是Verilog中预先定义好的,用于调试和编译预处理的任务或函数。
以$开头,用于控制和检测仿真模拟过程主要有:(1)用于获取仿真时间的系统函数(2)支持文本输出(检测信号、显示信号)的系统任务(3)用于文件输入、输出操作的系统任务(4)用于暂停和退出仿真的系统任务(5)用于产生随机数的系统任务08:294获取当前仿真时间的系统函数$time,$realtime,$stime:返回当前仿真时间。
$time返回一个64位的整数时间值,$realtime返回的结果是实数时间值,是更为精确的仿真时间 $stime返回一个32位整数时间值。
(对大于232的时间,返回模232的值。
使用它可以节省显示及打印空间。
)这些函数的返回值使用调用模块中`timescale 定义的模块仿真时间尺度为单位08:295例..\..\verilog_example\Dec2x4.v..\..\verilog_example\Dec_Test.v # At time 0, input is 0,0,0, output is,xxxx # At time 4, input is 0,0,0, output is,1111# At time 10, input is 0,0,1, output is,1111# At time 13, input is 0,0,1, output is,0111# At time 20, input is 1,0,1, output is,0111# At time 23, input is 1,0,1, output is,0101# At time 26, input is 1,0,1, output is,1101# At time 30, input is 1,1,1, output is,1101# At time 33, input is 1,1,1, output is,1100# At time 36, input is 1,1,1, output is,1110# At time 40, input is 0,1,1, output is,1110# At time 44, input is 0,1,1, output is,1011# At time 50, input is 0,0,1, output is,1011# At time 54, input is 0,0,1, output is,011108:296Verilog 支持的文本输出的系统任务显示任务:用于仿真模拟期间显示信息。
$display$write$strobe$monitor08:297$display$display输出参数列表中信号的当前值。
语法:$display([“format_specifiers”,] <argument_ list>); $display 输出时会自动换行。
$display ($ time, “%b \t %h \t %d \t %o”, sig1, sig2, sig3, sig4);$display ($ time, “%b \t”, sig1, “%h \t”, sig2, “% d \t”, sig3, “%o”, sig4); $display 支持二进制、八进制、十进制和十六进制。
缺省基数为十进制。
$display (sig1, sig2, sig3, sig4);$displayb (sig1, sig2, sig3, sig4);$displayo (sig1, sig2, sig3, sig4);$displayh (sig1, sig2, sig3, sig4);显示格式符08:299显示格式符如没有特定的参数格式说明,$display ,$write ,缺省值格式为十进制。
$displayb ,$writeb;//二进制$displayo ,$writeo;//八进制$displayh ,$writeh;//十六进制例$display(“signal1=%b,signal2=%h ”,signal1, signal2);$write(“signal1=%b,signal2=%h\n ”, signal1, signal2);08:2910$write打印任务$write $write 与$display 相同,不同的是不会自动换行。
$write($time, “%b \t %h \t %d \t %o\t/n ”,sig1, sig2, sig3, sig4);$write 缺省为十进制。
$writeb$writeo$writeh08:2911$strobe选通任务$strobe$strobe(/$strobeb /$strobeo /$strobeh)选通监视,提供一种显示数据的机制,在所有同一时间单元内赋值语句执行完毕后才执行。
定义使用时的参数定义与$display有相同的参数列表格式不同的是:$display显示的变量值是执行到该语句时变量的值,而$strobe显示的是执行该语句的仿真时刻的所有语句执行完后的结果。
(<=)例..\verilog_example\strobe_use.v显示信号值module textio;08:2913仿真结果# 0 xxxxxxxx x # 10 20# 10 30# 000000000000000f 00000010 1$monitor08:2915$monitor —监视信号值(2)将$monitor 写到initial 块中就可以在整个仿真过程对指定的变量值进行监测。
与$display 不同,在仿真过程中只能有一个$monitor 起作用,后面的$monitor将覆盖前面的$monitor。
monitoron和monitoroff任务用来启动和关闭监控功能。
仿真开始时,仿真器的默认状态是monitoron08:2916$monitor —监视信号值(3)$monitor是唯一的不断输出信号值的系统任务。
$monitor和$strobe一样,显示参数列表中信号的稳定状态值,也就是在仿真时间前进之前显示信号。
在一个时间步中,参数列表中信号值的任何变化将触发$monitor 。
但$time,$stime,$realtime不能触发。
任何后续的$monitor覆盖前面调用的$monitor。
只有新的$monitor的参数列表中的信号被监视,而前面的$monitor的参数则不被监视。
可以用$monitoron和$monitoroff系统任务控制持续监视,使用户可以在仿真时只监视特定时间段的信号。
08:2917显示层次利用前面任一显示系统任务中的%m 格式选项,可以显示任何级别的层次 %m 选项无需参数见下例..\..\verilog_example\Display_m_top.v ..\..\verilog_example\Display_m_top.v08:2918文件操作系统任务写文件读文件08:2919写文件操作任务(1)用于写文件的系统任务(1)文件的打开和关闭:$fopen,$fclose 语法表达方式:$fopen(“filename ”);//descriptor=$fopen(“filename ”);//32位整数$fclose(descriptor);descriptor 是使用该任务前预先定义好的文件描述符,用于标识一个打开的文件,系统函数根据$fopen 指定参数打开文件,并返回一个32位的无符号数给描述符descriptor 。
如果文件打开失败(如未找到该文件等),返回给描述符的值为0。
Verilog 允许同时打开230个文件。
以$f开始的显示系统任务将输出写入与descriptor 相对应的文件中。
08:2920写文件操作任务(2)(2)四个格式化显示任务($display, $write, $monitor, $strobe )都有相对应的任务用于向指定文件输出$fdisplay/$fwrite/$fmonitor/$fstrobe(3)第一个参数是文件指针,其余为带有参数表的格式定义,与对应的显示任务相同$fdisplay (descriptor,“signal1=%b,signal2=%h ”,signal1,signal2);$fwrite (descriptor,“signal1=%b,signal2=%h ”,signal1,signal2);$fmonitor(descriptor,“signal1=%b,signal2=%h ”,signal1,signal2);$fstrobe(descriptor,“signal1=%b,signal2=%h ”,signal1,signal2);//descriptor 就是$fopen 的返回值08:292108:2922写文件操作任务(3)实例:文件的写入操作..\verilog_example\writetofile.v 结果08:2923读文件系统任务(1)$readmemb,$readmemh分别用于将文件中的二进制或十六进制数读到存储器(即寄存器数组中)语法表达方式:$readmemb(“filename ”,memname[,start address][,finish address];$readmemh(“filename ”,memname[,start address][,finish address];文件格式:必须是二进制或十六进制数,数与数之间用空白符隔开,一个数之间可用下画线,08:2924读文件系统任务(2)例reg[7:0] mem[1:256];$readmemh(“mem.data ”,mem);$readmemh(“mem.data ”,mem,16);$readmemh(“mem.data ”,mem,128,1);读文件系统任务(08:2926暂停和退出仿真的任务$stop 暂停仿真过程表达形式:$stop;//同stop(0);暂停时不输出任何信息$stop(n);//n=0,1,2;//stop(1)暂停时输出当前仿真时刻和暂停处在程序中的位置;//stop(2):除了完成stop(1),还给出运行统计数//据行,如仿真程序占用内存大小和CPU 时间$finish 退出仿真过程,返回主操作系统表达形式: $finish;//同finish(1)$finish(n);//n=0,1,2;,含义同$stop 的参数n08:2927随机函数$random一般使用方式:$random %b,其中b>0,给出范围在(-b+1,b-1)中的随机数number=$random;//返回一个32位的有符号随机数number=$random(seed);//每次调用会根据不同seed ,返回不同的随机数seed 是一个种子变量,用于控制$random 返回的数,用作seed 的参数必须是寄存器、整数、或时间变量,并在调用$random 之前要为这个变量赋值。