1. 首页 > 电脑教程 > verilogHDL的系统任务及testbench写法

verilogHDL的系统任务及testbench写法

通用的HDL包括VHDL和verilog HDLHDL既可以用来design也可以用来test/confirm用HDL写出来的测试文件称为test bench被测试的模块成为device under test,简称DUT,既可以是behavioral级描述也可以是RTL级或gate级描述verilog simulator是verilog语言的仿真器,waveform viewer是波形观测器test bench中应该例化DUT,对应端口名称可以不同testbench中使用两种信号类型: wire reg,test中用法与design时一样wire类型不能在always或initial块中使用reg类型只能在always或initial块中使用initial和always是顺序控制模块,但它们之间是在仿真开始时并行执行的initial和always块中可以插入begin end或fork join来安排执行顺序tesbench开始需要给所有信号设置初值,一般是一个initial块默认的wire类型是Z 默认的reg类型是X`timescale设置了时间步长和时间精度测试文件中两项重要的元素是clocks和resets$display和$monitor格式相同,但?不同task只能在initial或者always中被调用,用于将重复出现的操作打包出来单独存放后仿真时需要库和SDF文件

所有系统任务都以$开头,都只能在initial或always模块里(在initial块中只执行一次,在always里满足条件将不断执行)

显示、探测、监控任务%h%H %d%D %b%B %O %o %C%c %S%s %T%t %M%m以上都以表达式的最大可能值所占用的位数来显示表达式当前值%0h%0H %0d%0D %0b%0B %0O %0o以上都以表达式的当前值最小占用的位数来显示表达式当前值输出时,如果所有位均为不定值,则输出结果为小写的x;所有位均为高阻则输出结果为小写的z输出时,如果部分位为高阻值,则输出结果为大写的X;部分位为高阻则输出结果为大写的Z

$display $displayb $displayo $displayh格式: $display("simulation time is %t",$time);$write $writeb $writeo $writeh格式: $write("simulation time is %t",$time);$display $write这两个任务的作用基本相同,唯一的区别就是$display任务执行完以后自动添加一个换行符n,而$write不自动添加$display("a=%d");和$write("a=%dn");作用相同用于在满足某个条件(如时钟边沿来时)是输出仿真数据$strobe $strobeb $strobeh $strobeo 格式: $strobe("the flip-flop value is %b at time %t",q,$time);用于在指定的时刻之后输出显示仿真数据$strobe和$display不同之处在于 $display是遇到该时刻时执行,$strobe是当前时刻结束(下一时刻开始)时执行

以上任务通常都在always块中执行$monitor $monitorb $monitorh $monitoro格式: $monitor("at %t, d=%d,clk=%d",$time,d,clk);连续监控指定的参数,只要参数表中的参数值发生变化,就在当前仿真时刻结束时显示$monitoron开启所有的$monitor任务 $monitoroff关闭所有的$monitor任务在多模块测试时$monitoron 和$monitoroff用于使能和关闭本模块的监视功能$display $write $strobe 多用于always模块,$monitor用于initial模块always(a or b or c)$display("....");效果与 initial $monitor("...");一样

文件的打开与关闭:$fopen打开一个文件(以整数文件指针方式) 格式:integer file_pointer=$fopen(file_name) $fclose关闭一个文件(以整数文件指针方式) 格式: $fclose(file_pointer)

将信息输出到文件:显示任务 写入任务 探测任务 监控任务都有用于向文件输出信息的相应命令,即$fdisplay $fdisplayb $fdisplayh $fdisplayo$fwrite $fwriteb $fwriteh $fwriteo$fstrobe $fstrobeb $fstrobeh $fstrobeo

$fmonitor $fmonitorb $fmonitorh $fmonitoro与相应的无文件输出命令相比,只是多了打开文件、写入文件、关闭文件三个步骤

从文件中读数据:$readmemb 读取二进制文件$readmemh 读取十六进制文件格式:$readmemb("<数据文件名>",<存储器名>);$readmemb("<数据文件名>",<存储器名>,<起始地址>);$readmemb("<数据文件名>",<存储器名>,<起始地址>,<结束地址>);

仿真控制任务:$stop格式: 在initial中 #500 $stop$finish格式: 在initial中 #500 $finish$stop暂停仿真后返回软件操作主窗口,将控制权交给user$finish终止仿真后关闭软件操作主窗口

时间显示格式:$time 返回64位整型时间$stime 返回32位整型时间$realtime 返回实型时间$time 任何时间以`timescale定义的时间单位为单位$realtime 任何时间以`timescale定义的时间单位+时间精度为单位

随机函数:$random(seed)seed必须是reg或者integer寄存器类型,返回的随机数是32位有符号数$random%60 产生的是-59~59之间的随机数{$random}%60产生的是0~59之间的随机数可以让出现时间随机 也可以让某些位随机出现1或0

层次命令: 模块标示符 任务标示符 函数标示符 程序块标识符,通过层次命令可以访问到任何变量其他模块中共享task和function的方法: 1.使用层次路径名 2.使用头文件.h来包含需要共享的funtion和task

VCD文件(value change dump文件)是常用的波形记录文件,与波形的作用等同,是一个ASCII文件$dumpon $dumpoff 在一个initial块中控制dump的开始和结束$dumpvars $dumpfile 分别在initial中指定VCD文件名(*.dump)和变量dump系统任务基本都在initial模块中使用

测试模块的构成部分:测试模块命名: modulename_tb输入输出信号(与veilog电路描述文件中的端口属性相反)initial或always块来产生激励信号initial或always块中加入系统任务模块实例化测试中常用的波形有两类:initial块及块内延迟来产生特定序列always块及内内延迟来产生周期性序列常用always块来描述时钟,always产生时钟的两种方法;

常用一个initial设置初值;

常用一个initial来设置仿真的启停控制;initial中用forever(无数次)和repeat(有限次)产生循环信号技巧:(用assign及延迟可以产生相移时钟、模块调用方法可以产生多种规格的时钟、读入.vec文件中数据以及比较的写法)

quartus的语法诊错能力比modesim强, modesim的输入语法显示比quartus好

`include命令:一个`include命令只能指定一个被包含模块意义是在包含文件里复制被包含模块的代码易于将一个模块做成特定功能的块,然后结构化组织起来使用时由高层include低层模块,所有模块文件放在同一个文件夹内

声明:希维路由器教程网提供的内容,仅供网友学习交流,如有侵权请与我们联系删除,谢谢。ihuangque@qq.com
本文地址:https://www.ctrlcv.com.cn/diannao/169347962510882.html