理论教育 VerilogHDL仿真支持语句-实战经验

VerilogHDL仿真支持语句-实战经验

时间:2023-11-20 理论教育 版权反馈
【摘要】:Verilog HDL仿真支持语句包括initial块语句、系统任务、系统函数和编译指令。系统任务和系统函数是Verilog HDL中预先定义的任务和函数,主要用途是在设计仿真过程中完成信息显示、仿真监视、模拟控制等工作任务。因此,在一般情况下,使用$display或$write命令来显示数据信息比较便于观察。

VerilogHDL仿真支持语句-实战经验

Verilog HDL仿真支持语句包括initial块语句、系统任务、系统函数和编译指令。关于initial块语句前面已介绍,下面介绍系统任务、系统函数和编译指令。

系统任务和系统函数是Verilog HDL中预先定义的任务和函数,主要用途是在设计仿真过程中完成信息显示、仿真监视、模拟控制等工作任务。系统任务和系统函数都是以$为首字符构成标识符的,如$display、$write、$time(注意,$与其后的保留字单词之间不能有空格)等。下面介绍用途比较广泛的信息显示系统任务($display和$write)、仿真监视系统任务($monitor)、暂停仿真系统任务($stop)、结束仿真系统任务($finish)和模拟时间函数($time和$realtime)。

1)信息显示系统任务($display和$write)

信息显示系统任务用于仿真过程中在标准输出设备(如显示器、打印机等)上显示字符串、表达式或变量的数值。信息显示系统任务名包括$display或$write(默认的,以十进制形式显示数据)、$displayb或$writeb(以二进制形式显示数据)、$displayh或$writeh(以十六进制形式显示数据)和$displayo或$writeo(以八进制形式显示数据)。信息显示语句的格式为

信息显示系统任务名(显示列表);

其中,“显示列表”中列出被显示的信息。例如:

$disp lay("hello!"); //显示“hello!”字符串

$disp lay($time); //显示当前时间

$display和$write功能相同,主要区别在于:用$display命令完成一条语句的信息显示后能自动换行,从新的一行开始显示下一条语句的信息;而用$write命令完成一条语句的信息显示后不会换行,继续在同一行显示下一条语句的信息。

模拟仿真时信息显示的数据是64位二进制数。例如,使用$displayb或$writeb(二进制信息显示格式)显示数据“0”时,显示设备(显示器或打印机)上显示64个“0”;使用$displayh或$writeh(十六进制信息显示格式)显示数据“0”时,显示设备上显示16个“0”;使用$display或$write(十进制信息显示格式)显示数据“0”时,显示设备上显示1个“0”。因此,在一般情况下,使用$display或$write命令来显示数据信息比较便于观察。

在显示列表中显示对象的格式还可以用“%”符号来定义,主要包括:

①%d或%D——以十进制格式显示数据。

②%b或%B——以二进制格式显示数据。

③%h或%H——以十六进制格式显示数据。

④%o或%O——以八进制格式显示数据。

⑤%s或%S——显示字符串。

⑥%e或%E——以科学计数法格式显示实数

例如

$display("a=%d",a); //以十进制格式显示变量a的数值

2)仿真监视系统任务($monitor)

仿真监视系统任务是在仿真过程中对字符串、表达式或变量的数值显示进行监视,只要被监视的数据对象的数值发生变化,立即显示变化后的结果。

$monitor任务的格式与$display任务完全相同,但$display任务仅对显示列表中的内容执行一次显示,而$monitor任务用于激活显示列表中的显示对象,在不同激励语句的触发下不断显示对象的信息,直至执行$stop任务或$finish任务才停止监视。

例6-25 用$display任务编写4输入端与非门的测试程序。编写的4输入端与非门测试程序(display_test.v)如下:

程序中使用initial块语句来完成仿真条件的设置,程序中的“#1”表示延迟1个基本单位时间,“#10”表示延迟10个基本单位时间。程序执行时显示的信息为(www.daowen.com)

# hello!0 a=x b=x c=x d=x,y=x

例6-26 用$monitor任务编写4输入端与非门的测试程序。编写的4输入端与非门测试程序(monitor_test.v)如下:

程序执行时显示的信息为

#hello!0 a=x b=x c=x d=x,y=x

#hello!10 a=0 b=0 c=0 d=0,y=x

#hello!11 a=0 b=0 c=0 d=0,y=1

#hello!20 a=0 b=0 c=0 d=1,y=1

#hello!30 a=1 b=1 c=1 d=1,y=1

#hello!31 a=1 b=1 c=1 d=1,y=0

display_test.v和monitor_test.v两个源程序中是完全相同的4输入端与非门仿真测试设计程序语句,a、b、c和d是测试输入端,y是测试输出端。在display_test.v源程序中,用$display系统任务显示信息,因此仅一次性地显示该命令的显示列表中的信息(其中的“x”表示未知数据)。用$monitor命令显示信息时,不仅显示了显示列表中的信息,而且不断监视显示列表中数据对象的变化,在任何数据对象发生变化后,立即显示变化后的信息,直至遇到$finish命令才结束显示。

对monitor_test.v源程序执行的显示结果解释如下:

①显示结果“#hello!0 a=x b=x c=x d=x,y=x”表示time=0个单位时间时,数据对象a、b、c、d和y的数据未知。

②显示结果“#hello!10 a=0 b=0 c=0 d=0,y=x”表示time=10个单位时间时,数据对象a、b、c、d分别被赋值0、0、0、0,与非门需要1个单位时间(#1)输出y才能出现新的数据,因此此时的y仍然是未知数据。

③显示结果“#hello!11 a=0 b=0 c=0 d=0,y=1”表示time=11个单位时间时数据对象a、b、c、d和y的数据,经过1个单位时间后输出y出现了新的数据。

④显示结果“#hello!20 a=0 b=0 c=0 d=1,y=1”表示time=20个单位时间时,数据对象a、b、c、d分别被赋值0、0、0、1,输出y仍然为1(不变)。

⑤显示结果“#hello!30 a=1 b=1 c=1 d=1,y=1”表示time=30个单位时间时数据对象a、b、c、d和y的数据。

⑥显示结果“#hello!31 a=1 b=1 c=1 d=1,y=0”表示time=31个单位时间时数据对象a、b、c、d和y的数据,因为经过1个单位时间,输出y出现了新的数据。用仿真结果可以验证与非门的功能,即只有输入a、b、c、d全部为1(高电平),输出y才为0(低电平),输入的其余组合都会使输出y为1。

3)暂停仿真系统任务($stop)

$stop系统任务用于暂停仿真,进入仿真软件的命令交互模式。

4)结束仿真系统任务($finish)

$finish系统任务用于结束仿真。

5)模拟时间函数($time和$realtime)

$time系统函数执行时根据系统任务(如$display、$write、$monitor等)的格式要求,返回一个64位整型模拟时间,对小数部分自动进行四舍五入处理;而$realtime系统函数执行时返回一个32位实型(十进制数格式)模拟时间,其输出格式与系统任务规定的格式无关。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈