verilog输出函数
Verilog中的$display和$write任务
1、格式
$display(p1,p2, …,pn);
$write(p1,p2, …,pn);
这两个函数和系统任务的作⽤都是⽤来输出信息,即将参数p2到pn按参数p1给定的格式输出。参数p1通常称为:“格式控制”,参数p2⾄pn通常称为“输出列表”。
$display⾃动地在输出后进⾏换⾏,$write则不是这样。如果想在⼀⾏⾥输出多个信息,可以使
⽤$write。如:$display(“%d”,10) 和 $display(“%d\n”,10) 效果相同
在$display和$write中,其输出格式控制是⽤双引号括起来的字符串,它包括以下两种信息:
1、格式说明,由”%”和格式字符组成。它的作⽤是将输出的数据转换成指定的格式输出。格式说明总是由”%”字符开始的。下⾯是⼏种常⽤的输出格式。
(1)、 %h或%H        以⼗六进制的形式输出
(2)、 %d或%D        以⼗进制的形式输出
(3)、 %o或%O        以⼋进制的形式输出
(4)、 %b或%B        以⼆进制的形式输出
(5)、 %c或%C        以ASCII码字符的形式输出
(6)、 %v或%V      输出⽹络型数据信号强度
(7)、 %m或%M      输出等级层次的名字
(8)、 %s或%S        以字符串的形式输出
(9)、 %t或%T        以当前的时间格式的形式输出
(10)、 %e或%E        以指数的形式输出实型数
(11)、%f或%F        以⼗进制的形式输出实型数
(12)、%g或%G        以指数或者⼗进制的形式输出实型数,⽆论何种格式都以较短的结果输出。
(13)、%x  ⼗六进制
(14)、%i    读⼊⼗进制,⼋进制,⼗六进制,在编译时通过数据前置来区分
如:%i0x31 表⽰为⼗六进制  %i031 表⽰为⼋进制 %i31 表⽰为⼗进制
(15)、%u  ⽆符号⼗进制数
2、普通字符,即需要原样输出的字符。其中包括⼀些转义字符,下⾯的字符形式⽤于格式字符串参数中,⽤来显⽰特殊的字符。
(1)、 \n    换⾏
(2)、 \t  相当于按⼀个Tab键
(3)、 \\  反斜杠字符\
(4)、 \”  双引号字符”
(5)、 \0  ⼋进制数代表的字符
(6)、 \0x  ⼗六进制数代表的字符
(7)、 %%  百分符号%
在Verilog中,转义符⼀定是使⽤在双引号括起来的字符串中!
2、%v %m %t
1、%v⽤于打印⼀个线⽹类型变量的信号强度,它不能打印⽮量变量的信号强度,⽽只能打印标量变量,或者⽮量变量的指定位的信号强度。信号强度⽤3个符号输出表⽰,前两个符号表⽰信号强度,⽽第三个符号表⽰信号的逻辑值。信号强度和逻辑值的意义分别如下⾯两个表所⽰:
  信号逻辑值表⽰:
逻辑值表⽰意义
0 表⽰逻辑0值
1 表⽰逻辑1值
X 表⽰逻辑不定态
Z 表⽰逻辑⾼阻态
L 表⽰逻辑0值,或者逻辑⾼阻态
H 表⽰逻辑1值,或者逻辑⾼阻态
  信号强度表⽰:
标记符强度名强度值表⽰
Su 电源级驱动(Supply drive) 7
St 强驱动(Strong drive) 6
Pu 上拉级驱动(Pull drive) 5
La ⼤容性(Large caPACitor) 4
We 弱驱动(Weak drive) 3
Me 中级容性(Medium capacitor) 2
Sm ⼩容性(Small capacitor) 1
Hi ⾼容性(High capacitor) 0
⽤%v打印⼀个信号的强度时,前两个符号除了⽤上表中的信号强度“标志符”表⽰信号强度外,也可以⽤两个数字表⽰信号强度。关于信号强度和逻辑值的建模在后续章节进⾏详细介绍。
2、使⽤%m,可以打印当前打印语句所在的模块层次。
3、%t 通常⽤于打印当前的仿真时间,当然也可以⽤于打印其他数据。该转义符表⽰把对应的变量使⽤当前使⽤的时间表⽰格式进⾏打印。Verilog提供系统函数 $time获得当前的仿真时间信息,该系统函数输出值为64⽐特表⽰的整数。Verilog还提供系统函数$timeformat⽤于设定当前的时间格式。关
于$time和$timeformat的使⽤也放在后续章节说明。
可以显⽰全层次路径名,包括模块实例、任务、函数、命名块。
如:可以具体到某个模块的某个函数
如:$display(“%t”,$time) 输出当前的仿真时间
4、如果输出列表中的表达式的值包含不确定的值或⾼阻值,其结果遵循以下原则:
(1)、在输出格式为⼗进制的情况下:
如果表达式的所有位均为不定值,则输出结果为⼩写的x
如果表达式的所有位均为⾼阻值,则输出结果为⼩写的z
如果表达式的部分位为不定值,则输出结果为⼤写的X
如果表达式的部分位为⾼阻值,则输出结果为⼤写的Z
如:$display(“%d”,xxx)  输出为x
$display(“%d”,1x1)  输出为X
⾼阻值类似
(2)、在输出格式为⼗六进制和⼋进制的情况下:
每4位⼆进制数为⼀组代表⼀位⼗六进制数,每3位⼆进制数为⼀组代表⼀位⼋进制数,
规则和(1)类似,举例说明
$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
verilog输出函数
“格式化输出”功能需要使⽤转义符。除了增加部分跟硬件设计相关的转义符外,Verilog的这些系统函数中的转义符同其他⾼级语⾔中的定义和使⽤基本相同。Verilog的转义符分为两⼤类:以”\\”引导的和以”%”引导的。通常,以”%”引导的转义符⽤于指定变量列表中的变量、常量、表达式的格式化输出;以”\\”引导的表⽰其他的⼀些格式化输出功能,通常是⽐较“特殊”的功能,⽐如输出⼀个“TAB”,或者输出”\\”本⾝,以及输出”%” 本⾝等。
下表给出了Verilog中基本的转义符定义和意义说明:
转义符意义说明
%d 以及 %D      以⼗进制格式输出
%b 以及 %B      以⼆进制格式输出
%o 以及 %O      以⼋进制格式输出
%h 以及 %H      以⼗六进制格式输出
%s 以及 %S      以字符串格式输出
%c 以及 %C      以ASCII码格式输出
%v 以及 %V      输出线⽹类型变量的强度
%m 以及 %M      输出层次名
%t 以及 %T      以当前时间格式输出
%e 以及 %E      以指数表⽰⽅式输出实数(real型)
%f 以及 %F      以⼗进制数表⽰⽅式输出实数(real型)
%g 以及 %G      以⼗进制数或者以指数表⽰⽅式输出实数。两种输出格式中,哪种占⽤更少的宽度,就使⽤哪⼀种。
\\n      开始新⾏(“回车”功能)
\\t      输出⼀个 TAB
\\”      输出 ” 本⾝
\\\\      输出 \\ 本⾝
%%      输出 % 本⾝
\\xyz      xyz表⽰⼀个⼋进制数。\\xyz表⽰输出⼋进制数xyz的值对应的ASCII码符号。⽐如,”\\123”,应该输出的为符号“S”。例⼦2-1给出了这些转义符的基本使⽤:
// Filename: exe_2_1.v
// This module is writen by YiTurn Zhao
// Module Purpose : $display 和 $write的基本⽤法
module exe_2_1();
//
reg [7:0] a;
initial begin
a = 31;
abcd = 50;
字符串常量中不能直接包括双引号和反斜杠符号$display(" Using $display, a = ",a, "  And 12 = ",12);
$displayb(" Using $displayb, a = ",a, "  And 12 = ",12);
$displayo(" Using $displayo, a = ",a, "  And 12 = ",12);
$displayh(" Using $displayh, a = ",a, "  And 12 = ",12);
$writeo(" \\nUsing Formatted $writeh, a = %d  And 12 = %H",a,12);
$writeh(" Using Formatted $writeh, a = %d",a, "  And 12 = %H",12,"\\n");
$display("Print \\"%%\\",\\t\\"%%%%\\" should be used.");
$display("Use %%C or %%c: a's value %d %C",a,a);
$display("Use %%S or %%s: a's value %d %s",a,a);
$display("Use %%E or %%e: 10000.8 can be writen as %e ",10000.8);
$display("Use %%F or %%f: 1.023E+8 can be writen as %f ",1.023E+8);
$display("Use %%G or %%g: 1.023E+8 can be writen as %g ",1.023E+8);
$display("Use \\\\xyz : Character \\101's ASCII value is 3'O101");
$display("Use \\\\xyz : Character \\053's ASCII value is 3'O53");
#200 $finish;
end
endmodule
注意:1,在verilog中,转义符⼀定是使⽤在双引号括起来的字符串中!
2,”\\” 和”%”后跟的不是前述指定的符号时,⾏为跟仿真器的设计有关。⽐如,“\\N”实现的不是换⾏功能,但不同仿真器对其解释不同。同样,对于”\\%”、 ”%\\”等1364-2001标准未规定的格式,不同仿真器也可能进⾏不同的处理。严格的说,没有规定的转义表达式应该不能使⽤,⽐如“\\%”这⼀形式。⼀旦使⽤,应该通不过编译,并报告错误信息。但是通过⼏个仿真器的仿真发现,通常,”\\%”是允许的,推⼴之,发现”\\”后跟的如果不是表格中规定的转义符,”\\”将被忽略,⽽直接输出之后的信息。⽐如”\\%”就输出”%”符号,”\\N”就输出”N”符号。但是”%\\”是不允许的,推⼴之,发现”%”后跟的如果不是表格中规定的转义符,将报告错误。
3,除”%%”外,”%”引导的转义符的使⽤必须和对应的变量、或者表达式匹配使⽤。对应于某⼀个转义符的变量为空时,可以⽤两个”,”将的空格来表⽰。参见例2-2。
4,”%C”、 ”%S”、”\\xyz”等形式的转义符都跟ASCII码有关。”\\xyz”输出值为⼋进制数”xyz”的ASCII码,它不需要对应的变量(或者常量)列表。”%C”、”%s”也是输出⼀个ASCII符号,其值为变量列表中对应的变量、常量或者表达式的值,因此需要在变量列表中提供相应的变量、常量或者表达式。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。