您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > Verilog-HDL-如何编写TESTBENCH
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#Attime0,inputis0,0,0,outputis,xxxx#Attime4,inputis0,0,0,outputis,1111#Attime10,inputis0,0,1,outputis,1111#Attime13,inputis0,0,1,outputis,0111#Attime20,inputis1,0,1,outputis,0111#Attime23,inputis1,0,1,outputis,0101#Attime26,inputis1,0,1,outputis,1101#Attime30,inputis1,1,1,outputis,1101#Attime33,inputis1,1,1,outputis,1100#Attime36,inputis1,1,1,outputis,1110#Attime40,inputis0,1,1,outputis,1110#Attime44,inputis0,1,1,outputis,1011#Attime50,inputis0,0,1,outputis,1011#Attime54,inputis0,0,1,outputis,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:298显示格式符%h%o%d%b%c%s%v%m%thexoctaldecimalbinaryASCIIstringstrengthmoduletime格式符转义符\t\n\\\%%%0dtab换行反斜杠双引号百分符号%无前导0的十进制数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.v08:2912显示信号值—$write和$strobe举例下面是模块textio仿真的输出:$writeb输出:0xxxxxxxxx时间以没有前导零的十进制形式输出。注意data是32位数据,由8个十六进制数表示缺省情况下,值以十进制显示,忽略前导零,与%0d格式符相同。可以在一个格式化符前插入一个0使Verilog忽略开头的零。$displayh:00000000000000f000000101注意当前时间,一个64位量,需要16个十六进制的数。$display:1020$strobe:1030moduletextio;regflag;reg[31:0]data;initialbegin$writeb(%d,$time,,%h\t,data,,flag,\n);#15flag=1;data=16;$displayh($time,,data,,flag);endinitialbegin#10data=20;$strobe($time,,data);$display($time,,data);data=30;endendmodule08:2913仿真结果#0xxxxxxxxx#1020#1030#000000000000000f00000010108:2914$monitor—监视信号值(1)持续监控和显示指定任务的参数值持续检测(参数列表中)一个或多个信号的变化,每当被监测的信号值发生变化,就将在当拍结束时显示该信号值。参数定义方式与$display同$monitor/$monitorb/$monitoro/$monitorh持续监视和显示指定参数值。$monitor($time,,“a=%d,b=%d”,a,b);实例见..\verilog_example\monitor_use.v#0a=00,b=0b#2a=05,b=0b#3a=05,b=0a08: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[,startaddress][,finishaddress];$readmemh(“filename”,memname[,startaddress][,finishaddress];文件格式:必须是二进制或十六进制数,数与数之间用空白符隔开,一个数之间可用下画线,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:2925读文件系统任务(3)0000_00000110_00010011_0010//地址3~255没有定义@100//hex1111_1100//地址257~1022没有定义@3FF1110_0010文本文件:mem_file.txt10231110001025611111100200110010101100001000000000声明的存储器组reg[0:7]mema[0:1023]modulereadmem;reg[0:7]mema[0:1
本文标题:Verilog-HDL-如何编写TESTBENCH
链接地址:https://www.777doc.com/doc-3966558 .html