集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 1084|回复: 0

Verilog HDL的基本语法

[复制链接]
LYF 发表于 2021-8-13 15:14:12 | 显示全部楼层 |阅读模式
3.8.系统函数和任务
Verilog HDL语言中共有以下一些系统函数和任务:
$bitstoreal, $rtoi, $display, $setup, $finish, $skew, $hold,
49
第三章 Verilog HDL 基本语法
--------------------------------------------------------------------------------------------------------------------------------------------
------
$setuphold, $itor, $strobe, $period, $time, $printtimescale,
$timefoemat, $realtime, $width, $real tobits, $write, $recovery,
在Verilog HDL语言中每个系统函数和任务前面都用一个标识符$来加以确认。这些系统函数和任务提
供了非常强大的功能。有兴趣的同学可以参阅附录:Verilog语言参考手册。下面对一些常用的系统
函数和任务逐一加以介绍。
3.8.1.$display和$write任务
格式:
$display(p1,p2,....pn);
$write(p1,p2,....pn);
这两个函数和系统任务的作用是用来输出信息,即将参数p2到pn按参数p1给定的格式输出。参数p1
通常称为“格式控制”,参数p2至pn通常称为“输出表列”。这两个任务的作用基本相同。$display
自动地在输出后进行换行,$write则不是这样。如果想在一行里输出多个信息,可以使用$write。在
$display和$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 横向跳格(即跳到下一个输出区)
\\ 反斜杠字符\
50
第三章 Verilog HDL 基本语法
--------------------------------------------------------------------------------------------------------------------------------------------
------
\" 双引号字符"
\o 1到3位八进制数代表的字符
%% 百分符号%
在$display和$write的参数列表中,其“输出表列”是需要输出的一些数据,可以是表达式。下面举
几个例子说明一下。
[例1]:module disp;
initial
begin
$display("\\\t%%\n\"\123");
end
endmodule
输出结果为
\%
"S
从上面的这个例子中可以看到一些特殊字符的输出形式(八进制数123就是字符S)。
[例2]:module disp;
reg[31:0] rval;
pulldown(pd);
initial
begin
rval=101;
$display("rval=%h hex %d decimal", rval, rval);
$display("rval=%o otal %b binary", rval, rval);
$display("rval has %c ascii character value",rval);
$display("pd strength value is %v",pd);
$display("current scope is %m");
$display("%s is ascii value for 101",101);
$display("simulation time is %t",$time);
end
endmodule
其输出结果为:
rval=00000065 hex 101 decimal
rval=00000000145 octal 00000000000000000000000001100101 binary
rval has e ascii character value
pd strength value is StX
current scope is disp
e is ascii value for 101
simulation time is 0
输出数据的显示宽度
在$display中,输出列表中数据的显示宽度是自动按照输出格式进行调整的。这样在显示输出数据时,
在经过格式转换以后,总是用表达式的最大可能值所占的位数来显示表达式的当前值。在用十进制数
格式输出时,输出结果前面的0值用空格来代替。对于其它进制,输出结果前面的0仍然显示出来。例
如对于一个值的位宽为12位的表达式,如按照十六进制数输出,则输出结果占3个字符的位置,如按
照十进制数输出,则输出结果占4个字符的位置。这是因为这个表达式的最大可能值为FFF(十六进制)、
51
第三章 Verilog HDL 基本语法
--------------------------------------------------------------------------------------------------------------------------------------------
------
4095(十进制)。可以通过在%和表示进制的字符中间插入一个0自动调整显示输出数据宽度的方式。见
下例:
$display("d=%0h a=%0h",data,addr);
这样在显示输出数据时,在经过格式转换以后,总是用最少的位数来显示表达式的当前值。下面举例
说明:
[例3]:module printval;
reg[11:0]r1;
initial
begin
r1=10;
$display("Printing with maximum size=%d=%h",r1,r1);
$display("Printing with minimum size=%0d=%0h",r1,r1);
end
enmodule
输出结果为:
Printing with maximum size=10=00a:
printing with minimum size=10=a;
如果输出列表中表达式的值包含有不确定的值或高阻值,其结果输出遵循以下规则:
(1).在输出格式为十进制的情况下:
• 如果表达式值的所有位均为不定值,则输出结果为小写的x。
• 如果表达式值的所有位均为高阻值,则输出结果为小写的z。
• 如果表达式值的部分位为不定值,则输出结果为大写的X。
• 如果表达式值的部分位为高阻值,则输出结果为大写的Z。
(2).在输出格式为十六进制和八进制的情况下:
• 每4位二进制数为一组代表一位十六进制数,每3位二进制数为一组代表一位八进制数。
• 如果表达式值相对应的某进制数的所有位均为不定值,则该位进制数的输出的结果为小写的
x。
• 如果表达式值相对应的某进制数的所有位均为高阻值,则该位进制数的输出结果为小写的z。
• 如果表达式值相对应的某进制数的部分位为不定值,则该位进制数输出结果为大写的X。
• 如果表达式值相对应的某进制数的部分位为高阻值,则该位进制数输出结果为大写的Z。
对于二进制输出格式,表达式值的每一位的输出结果为0、1、x、z。下面举例说明:
语句输出结果:
$display("%d", 1'bx); 输出结果为:x
$display("%h", 14'bx0_1010); 输出结果为:xxXa
$display("%h %o",12'b001x_xx10_1x01,12'b001_xxx_101_x01); 输出结果为:XXX 1x5X
注意:因为$write在输出时不换行,要注意它的使用。可以在$write中加入换行符\n,以确保明确的
输出显示格式。
3.8.2.系统任务$monitor

格式:
$monitor(p1,p2,.....,pn);
$monitor;
$monitoron;
$monitoroff;
52
第三章 Verilog HDL 基本语法
--------------------------------------------------------------------------------------------------------------------------------------------
------
任务$monitor提供了监控和输出参数列表中的表达式或变量值的功能。其参数列表中输出控制格式字
符串和输出表列的规则和$display中的一样。当启动一个带有一个或多个参数的$monitor任务时,仿
真器则建立一个处理机制,使得每当参数列表中变量或表达式的值发生变化时,整个参数列表中变量
或表达式的值都将输出显示。如果同一时刻,两个或多个参数的值发生变化,则在该时刻只输出显示
一次。但在$monitor中,参数可以是$time系统函数。这样参数列表中变量或表达式的值同时发生变
化的时刻可以通过标明同一时刻的多行输出来显示。如:
$monitor($time,,"rxd=%b txd=%b",rxd,txd);
在$display中也可以这样使用。注意在上面的语句中,“,,"代表一个空参数。空参数在输出时显示
为空格。
$monitoron和$monitoroff任务的作用是通过打开和关闭监控标志来控制监控任务
$monitor的启动和停止,这样使得程序员可以很容易的控制$monitor何时发生。其中$monitoroff任
务用于关闭监控标志,停止监控任务$monitor,$monitoron则用于打开监控标志,启动监控任务
$monitor。通常在通过调用$monitoron启动$monitor时,不管$monitor参数列表中的值是否发生变
化,总是立刻输出显示当前时刻参数列表中的值,这用于在监控的初始时刻设定初始比较值。在缺省
情况下,控制标志在仿真的起始时刻就已经打开了。在多模块调试的情况下,许多模块中都调用了
$monitor,因为任何时刻只能有一个$monitor起作用,因此需配合$monitoron与$monitoroff使用,
把需要监视的模块用$monitoron打开,在监视完毕后及时用$monitoroff关闭,以便把$monitor 让
给其他模块使用。$monitor与$display的不同处还在于$monitor往往在initial块中调用,只要不
调用$monitoroff,$monitor便不间断地对所设定的信号进行监视。
3.8.3.时间度量系统函数$time
在Verilog HDL中有两种类型的时间系统函数:$time和$realtime。用这两个时间系统函数可以得到
当前的仿真时刻。
• 系统函数$time
$time可以返回一个64比特的整数来表示的当前仿真时刻值。该时刻是以模块的仿真时间尺度为基准
的。下面举例说明。
[例1]:`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变化时刻却和预想的不一样。这是由下面两个原因引起的:
53
第三章 Verilog HDL 基本语法
--------------------------------------------------------------------------------------------------------------------------------------------
------
1) $time显示时刻受时间尺度比例的影响。在上面的例子中,时间尺度是10ns,因为$time
输出的时刻总是时间尺度的倍数,这样将16ns和32ns输出为1.6和3.2。
2) 因为$time总是输出整数,所以在将经过尺度比例变换的数字输出时,要先进行取整。
在上面的例子中,1.6和3.2经取整后为2和3输出。注意:时间的精确度并不影响数字的
取整。
• $realtime系统函数
$realtime和$time的作用是一样的,只是$realtime返回的时间数字是一个实型数,该数字也是以时
间尺度为基准的。下面举例说明:
[例2]: `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
从上面的例子可以看出,$realtime将仿真时刻经过尺度变换以后即输出,不需进行取整操作。所以
$realtime返回的时刻是实型数。
3.8.4.系统任务$finish
格式:
$finish;
$finish(n);
系统任务$finish的作用是退出仿真器,返回主操作系统,也就是结束仿真过程。任务$finish可以带
参数,根据参数的值输出不同的特征信息。如果不带参数,默认$finish的参数值为1。下面给出了对
于不同的参数值,系统输出的特征信息:
0 不输出任何信息
1 输出当前仿真时刻和位置
2 输出当前仿真时刻,位置和在仿真过程中
所用memory及CPU时间的统计
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2024-11-15 19:37 , Processed in 0.056914 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表