集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 1646|回复: 3

Verilog HDL 的$display和$write任务

[复制链接]
afei6969 发表于 2021-3-28 23:25:51 | 显示全部楼层 |阅读模式
格式:
$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 横向跳格(即跳到下一个输出区)
\\ 反斜杠字符\
\" 双引号字符"
\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(十六进制)、
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,以确保明确的
输出显示格式。
zhangyukun 发表于 2021-3-29 10:43:27 | 显示全部楼层
Verilog HDL 的$display和$write任务
zxopenluyutong 发表于 2021-3-29 10:45:01 | 显示全部楼层
Verilog HDL 的$display和$write任务
dameihuaxia 发表于 2021-4-11 15:06:51 | 显示全部楼层
erilog HDL 的$display和$write任务
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

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

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

GMT+8, 2024-11-1 13:27 , Processed in 0.078498 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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