西西软件园多重安全检测下载网站、值得信赖的软件下载站!
软件
软件
文章
搜索

首页编程开发其它知识 → verilog HDL的系统任务及testbench写法

verilog HDL的系统任务及testbench写法

相关软件相关文章发表评论 来源:本站整理时间:2010/7/14 15:34:33字体大小:A-A+

作者:佚名点击:1231次评论:0次标签: 模块

  • 类型:远程监控大小:671KB语言:中文 评分:2.7
  • 标签:
立即下载

通用的HDL包括VHDL和verilog HDL
HDL既可以用来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低层模块,所有模块文件放在同一个文件夹内

    相关评论

    阅读本文后您有什么感想? 已有人给出评价!

    • 8 喜欢喜欢
    • 3 顶
    • 1 难过难过
    • 5 囧
    • 3 围观围观
    • 2 无聊无聊

    热门评论

    最新评论

    发表评论 查看所有评论(0)

    昵称:
    表情: 高兴 可 汗 我不要 害羞 好 下下下 送花 屎 亲亲
    字数: 0/500 (您的评论需要经过审核才能显示)