Verilog HDL语法-常用系统任务

$display和$write

$display和\write是Verilog HDL中的两种主要的输出任务。并且这两个系统任务的语法格式都相同。语法格式如下:

$display("<format_specifiers>",<signal1, signal2, ..., signal3>);
$write("<format_specifiers>",<signal1, signal2, ..., signal3>);

<format_specifiers>通常被称为格式控制,<signal1, signal2, …, signal3>被称为信号输出列表。用法与c语言中的输出函数基本一致。

$display和$write的区别:
$display在输出信息时带有行结束字符,即自动的在输出后进行换行;
$write在输出特定信息时不自动换行。如果想在一行里输出多个信息,可以使用$write。

格式控制:
格式控制由%和格式字符组成。其作用是将输出的数据转换成指定的格式输出。
下表是几种常用的输出格式:

格式输出说明
%h或%H以十六进制数的形式输出
%d或%D以十进制数的形式输出
%o或%O以八进制的形式输出
%b或%B以二进制的形式输出
%c或%C以ASCII码字符的形式输出
%v或%V输出网络型数据信号强度
%m或%M输出等级层次的名字
%s或%S以字符串的形式输出
%t或%T以当前的时间格式输出
%e或%E以指数的形式输出实型数
%f或%F以十进制的形式输出实型数
%g或%G以指数或十进制数的形式输出实型数

还有一些特殊字符的输出格式如下:

换码序列功能
\n换行
\t横向跳格(即跳到下一个输出区)
\\反斜杠字符\
\"双引号字符"
\o1到3位八进制数代表的字符
%%百分符号%

注意:
在使用$display输出变量时,总是用变量的最大可能值所占的位数来显示当前值。用十进制格式输出当前结果时有效数值前面的0用空格代替。其他进制,前面的0仍然会被显示出来。
可以在%个表示进制的字符间插入一个0,这时候$display会自动调整显示位宽,总是用最小的位宽来显示变量的当前值。
例如:

$display("d=%0d, h=%0h", data, addr);

$monitor

$monitor也是用于信号输出显示的系统任务。

$monitor的语法格式:

$monitor("<format_specifiers>", <signal1, signal2, ..., signaln>);

$monitor会监控并输出参数列表中的变量值(或者表达式的值)。每当参数列表中的变量(或表达式)的值发生变化的时候,$monitor就会将参数列表中的变量(或表达式)的值输出一次。
如果同一时刻两个或多个参数的值发生变化,则在该时刻只输出显示一次。

$monitoron和$monitoroff

$monitoron和$monitoroff任务的作用是通过打开和关闭监控标志来控制监控任务$monitor的启动和停止。
$monitoroff任务用于关闭监控标志,停止监控任务;$monitoron的作用与之相反。通常在通过$monitoron启动$monitor时,不管$monitor参数列表中的值是否发生变化,总是立刻输出显示当前时刻参数列表中的值。缺省情况下,控制标志在仿真的起始时刻已经被打开。
在多模块调试的情况下,许多模块中都调用了$monitor,但因为任何时刻只能有一个$monitor其作用,因此需要配合$monitoron和$monitoroff使用,把需要监控的模块用$monitoron打开,在监视完毕后及时用$monitoroff关闭,以便$monitor可以被其他模块使用。

$time和$realtime

使用$time和$realtime都可以得到当前的仿真时间。这两个函数被调用后都会返回当前时刻相对于仿真开始时刻的时间量值。不同的是,$time函数以64位整数值得形式返回仿真时间;而$realtime函数则以实型数据返回仿真时间。

$time

$time返回的时间是以模块的仿真时间尺度为基准的。下面举例说明:

`timescale 10ns/1ns 
module test; 
	reg set; 
	parameter p=1.6; 
	initial 
		begin 
			$monitor($time,,"set=",set); 
			#p set=0; 
			#p set=1; 
		end 
endmodule

输出结果为:
0 set=x
2 set=0
3 set=1

在这个例子中,模块test想在时刻为16ns时设置寄存器set为0,在时刻为32ns时设置寄存器set为1。但是由$time记录的set变化时刻却和预想的不一样。这是由下面两个原因引起的:

  1. $time显示时刻受时间尺度的影响。在上面的例子中,时间尺度是10ns,因为$time输出的时刻总是时间尺度的倍数,这样将16ns和32ns输出为1.6和3.2。
  2. 因为$time总是输出整数,所以在将经过尺度比例变换的数字输出时,要先进行取整。在上面的例子中,1.6和3.2经取整后为2和3输出。注意:时间的精确度并不影响数字的取整。
    补充说明:时间精度可以使仿真的时间精确到1ns,这样就可以在16ns和32ns时完成对set的赋值。只是在输出仿真时间时是以时间单位(这里是10ns)为标准的。

$realtime

是$realtime返回的时间数字是一个实型数,该数字也是以时间尺度为基准的。下面举例说明:

`timescale10ns/1ns 
module test; 
	reg set; 
	parameter p=1.55; 
	initial 
		begin 
			$monitor($realtime,,"set=",set); 
			#p set=0; 
			#p set=1; 
		end 
endmodule

输出结果为:
0 set=x
1.6 set=0
3.2 set=1

与$time的例子相比,模块的仿真时间单位和时间精度没有变化。所以p设置为1.55时,由于仿真精度的限制并不能在15.5ns完成set=0的赋值操作。而是在16ns时完成这一操作。同样,由于模块仿真精度的限制,也不能在31.5ns时完成set=1的赋值操作,只能在32ns是完成这一操作。有因为$realtime可以返回的时刻是一个实型数,不再需要取整,所以以仿真时间单位为标准输出的就是1.6和3.2。

$finish和$stop

$finish

系统任务$finish的作用是退出仿真器,返回主操作系统,也就是结束仿真过程。任务$finish可以带参数,根据参数的值输出不同的特征信息。语法格式如下:

$finish; 
$finish(n);

如果不带参数,默认$finish的参数值为1。下面给出了对于不同的参数值,系统输出的特征信息:

n取值含义
0不输出任何信息
1输出当前仿真时刻和位置
2输出当前仿真时刻,位置和在仿真过程中所用memory及CPU时间的统计

$stop

$stop任务的作用是把EDA工具(例如仿真器)置成暂停模式,在仿真环境下给出一个交互式的命令提示符,将控制权交给用户。这个任务可以带有参数表达式。根据参数值(0,1或2)的不同,输出不同的信息。参数值越大,输出的信息越多。语法格式如下:

$stop; 
$stop(n);

问题:仿真停止后,怎么继续仿真?

$readmemb和$readmemh

在Verilog HDL程序中有两个系统任务 r e a d m e m b 和 readmemb和 readmembreadmemh用来从文件中读取数据到存贮器(设计的ram)中。这两个系统任务可以在仿真的任何时刻被执行使用,其使用格式共有以下六种:

$readmemb("<数据文件名>",<存贮器名>); 
$readmemb("<数据文件名>",<存贮器名>,<起始地址>); 
$readmemb("<数据文件名>",<存贮器名>,<起始地址>,<结束地址>); 
$readmemh("<数据文件名>",<存贮器名>); 
$readmemh("<数据文件名>",<存贮器名>,<起始地址>); 
$readmemh("<数据文件名>",<存贮器名>,<起始地址>,<结束地址>);

注意:
1.被读取的数据文件的内容只能包含:空白位置(空格,换行,制表格(tab)和form-feeds),注释行(//形式的和//形式的都允许),二进制或十六进制的数字。
2.数字中不能包含位宽说明和格式说明,对于$readmemb系统任务,每个数字必须是二进制数字,对于$readmemh系统任务,每个数字必须是十六进制数字。
3.数字中不定值x或X,高阻值z或Z,和下划线(_)的使用方法及代表的意义与一般Verilog HDL程序中的用法及意义是一样的。
4.数字必须用空白位置或注释行来分隔开。
5.存贮器单元的存放地址范围由系统任务声明语句中的起始地址和结束地址来说明,每个数据的存放地址在数据文件中进行说明。当数据文件被读取时,每一个被读取的数字都被存放到地址连续的存贮器单元中去。当地址出现在数据文件中,其格式为字符“@”后跟上十六进制数。对于这个十六进制的地址中,允许大写和小写的数字。在字符“@”和数字之间不允许存在空白位置。可以在数据文件里出现多个地址。

对于上面六种系统任务格式,需补充说明以下五点:

  1. 如果系统任务声明语句中和数据文件里都没有进行地址说明,则缺省的存放起始地址为该存贮器定义语句中的起始地址。数据文件里的数据被连续存放到该存贮器中,直到该存贮器单元存满为止或数据文件里的数据存完。
  2. 如果系统任务中说明了存放的起始地址,没有说明存放的结束地址,则数据从起始地址开始存放,存放到该存贮器定义语句中的结束地址为止。
  3. 如果在系统任务声明语句中,起始地址和结束地址都进行了说明,则数据文件里的数据按该起始地址开始存放到存贮器单元中,直到该结束地址,而不考虑该存贮器的定义语句中的起始地址和结束地址。
  4. 如果地址信息在系统任务和数据文件里都进行了说明,那么数据文件里的地址必须在系统任务中地址参数声明的范围之内。否则将提示错误信息,并且装载数据到存贮器中的操作被中断。
  5. 如果数据文件里的数据个数和系统任务中起始地址及结束地址暗示的数据个数不同的话,也要提示错误信息。

$random

这个系统函数提供了一个产生随机数的手段。当函数被调用时返回一个32bit的随机数。它是一个带符号的整形数。语法格式为:

$ramdom%<number>;

其中 number>0。它给出了一个范围在(-number+1):(number-1)中的随机数。
使用连接操作符可以得到一个0到number-1之间的随机数:

{$ramdom}%<number>;
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值