赞
踩
目录
◆ 系统任务和系统函数一般以符号“$”开头。系统任务可以返回0个或多个值,而系统函数除只能返回一个值外,与任务类似。例如:$monitor,$readmemh等。
◆ 使用不同的Verilog仿真工具(如:VCS、Verilog-XL、ModelSim等)进行仿真时,这些系统任务和系统函数在使用方法上可能存在差异,应根据使用手册来使用。
◆ 一般在intial或always过程块中,调用系统任务和系统函数。
◆ 用户可以通过编程语言接口(PLI)将自己定义的系统任务和系统函数加到语言中,以进行仿真和调试。
⑴、$display与$write
$display和$write是两个显示与写系统任务,两者的功能相同,都用于显示模拟结果,其区别是$display在输出结束后能自动换行,而$write不能。
$display和$write的使用格式为:
$display(“格式控制符”,输出变量名列表);
$write(“格式控制符”,输出变量名列表);
⑵、$monitor与$strobe
$monitor、$strobe与$display、$write一样也是属于输出控制类的显示系统任务,$monitor与$strobe都提供在指定时刻监控和输出参数列表中字符或变量的值的功能;而$display、$write任务在执行到该语句时执行。
其使用格式为:
$monitor(“格式控制符”,输出变量名列表);
$strobe(“格式控制符”,输出变量名列表);
这里的格式控制符、输出变量名列表与$display和$write中定义的完全相同。
⑶$finish与$stop
系统任务$finish与$stop用于对仿真过程进行控制,分别表示结束仿真和中断仿真。
$finish与$stop 的使用格式如下:
$stop;
$stop(n);
$finish;
$finish(n);
n是$finish和$stop的参数,n 可以是0、1、2等值,分别表示如下含义。
0:不输出任何信息;
1:给出仿真时间和位置;
2:给出仿真时间和位置,还有其他一些运行统计数据。
⑷$readmemh与$readmemb
$readmemh与$readmemb是属于文件读写控制的系统任务,其作用都是从外部文件中读取数据并放入存储器中。两者的区别在于读取数据的格式不同,$readmemh为读取十六进制数据,而$readmemb为读取二进制数据。$readmemh与$readmemb的使用格式为:
$readmemh("数据文件名",存储器名,起始地址,结束地址);
$readmemb("数据文件名",存储器名,起始地址,结束地址);
其中,起始地址和结束地址均可以缺省,如果缺省起始地址,表示从存储器的首地址开始存储;如果缺省结束地址,表示一直存储到存储器的结束地址。
⑴、$time与$realtime
$time、$realtime是属于显示仿真时间标度的系统函数。这两个函数被调用时,都返回当前时刻距离仿真开始时刻的时间量值,所不同的是,$time 函数以64位整数值的形式返回模拟时间,$realtime 函数则以实数型数据返回模拟时间。
⑵、$random
$random是产生随机数的系统函数,每次调用该函数将返回一个32位的随机数,该随机数是一个带符号的整数。
⑶、$fopen和$fclose
$fopen 和$fclose用于打开和关闭一个文件系统函数,完成后返回一个与文件相关的整数指针。
延时包括门延时、assign赋值延时和连线延时等。
门延时是从门输入端发生变化到输出端发生变化的延迟时间;
assign赋值延时指等号右端某个值发生变化到等号左端发生相应变化的延迟时间;
连线延时则体现了信号在连线上的传输延时。
如果没有定义时延值,缺省时延为0。
延时语句用于仿真测试中,它不能综合生成硬件,主要用于仿真真实数字电路运行时的电路延时情况和人为设计的波形输出。
⑴、时间标尺预定义语句`timescale
`timescale语句用于定义模块中指令运行的时间单位和时间精度,其使用格式如下:
`timescale <time_unit>/<time_precision>
`timescale <时间单位>/<时间精度>
其中用来表示时间度量的符号有:s、ms、us、ns、ps和fs,时间单位必须取整数,指令运行时间以时间单位为基准,多少以时间精度进行取舍。
例如:`timescale 1ns/100ps
上面的语句表示时延单位为1ns,时延精度为100ps(即精确到0.1ns)。`timescale编译器指令在模块说明外部出现,并且影响后面所有的时延值,直到遇到另一个`timescale指令或`resetall指令 。当一个文件含有多个模块,且每个模块都有各自`timescale指令时,以精度最小的为基准时间精度。
⑵、延时的表示与延时说明块
延时的表示方法有下面几种:
# delaytime
# (d1,d2)
# (d1,d2,d3)
# delaytime表示延迟时间为delaytime,d1表示上升延迟,d2表示下降延迟,d3则表示转换到高阻态z的延迟,这些延迟的具体时间由时间定义语句'timescale确定。
如:语句间延时:sum=(a^b)^cin
#4 t1=a&cin
如:语句内延时:sum=#3(a^b)^cin
如果没有定义时延值,缺省时延为0。
⑶、延时说明块(specify块)
Verilog可对模块中某一指定的路径进行延迟定义,这一路径连接模块的输入端口(或inout端口)与输出端口(或inout端口),利用延迟定义块在一个独立的块结构中定义模块的延时。在延迟定义块中要描述模块中的不同路径并给这些路径赋值。
延迟定义块的内容应放在关键字specify与endspecify之间,且必须放在一个模块中,还可以使用specparam关键字定义参数。
用户自定义元件(UDP)
利用UDP(User Defined Primitives)用户可以自己定义基本逻辑元件的功能,用户可以象调用基本门元件一样来调用这些自己定义的元件。
UDP关键词为primitive和endprimitive。与一般的模块相比,UDP模块具有下面一些特点:
◆ UDP的输出端口只能有一个,且必须位于端口列表的第一项。只有输出端口能被定义为reg类型。
◆ UDP的输入端口可有多个,一般时序电路UDP的输入端口可多至9个,组合电路UDP的输入端口可多至10个。
◆ 所有的端口变量必须是1位标量。
◆ 在table表项中,只能出现0、1、x三种状态,不能出现z状态。
测试平台( ModelSim)
◆测试模块只有模块名字,没有端口列表;
◆输入信号(激励信号)必须定义为reg型,以保持信号值;输出信号(显示信号)必须定义为wire型;
◆在测试模块中调用被测试模块,在调用时,应注意端口排列的顺序与模块定义时一致;
◆一般用initial、always过程块来定义激励信号波形;使用系统任务和系统函数来定义输出显示格式;
◆在激励信号的定义中,可使用如下一些控制语句:if-else,for,forever,case,while,begin-end,fork-join等,这些控制语句一般只用在always、initial、function、task等过程块中。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。