verilog 显示相关

来源:互联网 发布:淘宝国际版网址 编辑:程序博客网 时间:2024/06/05 23:51

Verilog本质上也是一门高级语言,因而也提供了丰富打印信息、输出信息的系统函数。<br>
Verilog提供的打印系统函数分为三类:<br>
显示/写系统函数(Display and Write tasks)<br>
脉冲选择监视系统函数(strobed monitoring tasks)<br>
连续监视系统函数(continuous monitoring tasks)<br>
<br>
显示/写系统函数<br>
这类函数包括$display、$displayb、$displayo、$displayh、$write、$writeb、$ writeo、$writeh等八个函数。其使用语法如下:<br>
系统函数名(变量列表);<br>
变量列表就是需要输出的信息,该变量列表可以是变量名、表达式、双引号括起来的字符串、以及这三种形式的组合。变量列表也可以为空。这时,$display会输出一个回车符(就是开始新的一行),而$write则相当于不进行任何操作。<br>
$display系列和$write系列除了一点差别外完全一致,其差异在于$display会在变量列表后面自动增加一个回车符,而$write则没有该功能,完全按照变量列表指示的内容输出。当变量列表为空时,$display输出一个回车符,而$write则相当于不进行任何操作。<br>
Verilog的这些打印系统函数的使用同其他高级语言比如C中的打印函数很类似。这些函数支持“格式化输出”,也是在双引号括起来的变量中加入转义符号实现的。对于变量列表中的变量或者常量,当指定了输出格式时,这八个函数没有差别,都将以指定格式输出其值;当没有指定输出格式时,各函数以默认的形式输出该变量或者常量的值。<br>
下表给出各个函数默认的输出格式:<br>
系统函数 默认制式 例子(a[7:0]=31)<br>
$display、$write 十进制 $write(12,” and ”, a[7:0]);<br>
$displayb、$writeb 二进制 $writeb(12, ” and ”, a[7:0]);<br>
$displayo、$writeo 八进制 $writeo(12, ” and ”, a[7:0]);<br>
$displayh、$writeh 十六进制 $writeh(12, ” and ”, a[7:0]);<br>
<br>
“格式化输出”功能需要使用转义符。除了增加部分跟硬件设计相关的转义符外,Verilog的这些系统函数中的转义符同其他高级语言中的定义和使用基本相同。Verilog的转义符分为两大类:以”\\”引导的和以”%”引导的。通常,以”%”引导的转义符用于指定变量列表中的变量、常量、表达式的格式化输出;以”\\”引导的表示其他的一些格式化输出功能,通常是比较“特殊”的功能,比如输出一个“TAB”,或者输出”\\”本身,以及输出”%”本身等。<br>
<br>
下表给出了Verilog中基本的转义符定义和意义说明:<br>
转义符 意义说明<br>
%d 以及 %D 以十进制格式输出<br>
%b 以及 %B 以二进制格式输出<br>
%o 以及 %O 以八进制格式输出<br>
%h 以及 %H 以十六进制格式输出<br>
%s 以及 %S 以字符串格式输出<br>
%c 以及 %C 以ASCII码格式输出<br>
%v 以及 %V 输出线网类型变量的强度<br>
<font color="#ff00ff">%m 以及 %M 输出层次名</font><br>
<font color="#ff00ff">%t 以及 %T 以当前时间格式输出</font><br>
%e 以及 %E 以指数表示方式输出实数(real型)<br>
%f 以及 %F 以十进制数表示方式输出实数(real型)<br>
%g 以及 %G 以十进制数或者以指数表示方式输出实数。两种输出格式中,哪种占用更少的宽度,就使用哪一种。<br>
\\n 开始新行(“回车”功能)<br>
\\t 输出一个 TAB<br>
\\” 输出 ” 本身<br>
\\\\ 输出 \\ 本身<br>
%% 输出 % 本身<br>
\\xyz xyz表示一个八进制数。\\xyz表示输出八进制数xyz的值对应的ASCII码符号。比如,”\\123”,应该输出的为符号“S”。<br>
<br>
例子2-1给出了这些转义符的基本使用:<br>
// Filename: exe_2_1.v<br>
// This module is writen by YiTurn Zhao<br>
// Module Purpose : $display 和 $write的基本用法<br>
module exe_2_1();<br>
//<br>
reg [7:0] a; <br>
initial begin <br>
a = 31; <br>
abcd = 50;<br>
$display(" Using $display, a = ",a, " And 12 = ",12);<br>
$displayb(" Using $displayb, a = ",a, " And 12 = ",12);<br>
$displayo(" Using $displayo, a = ",a, " And 12 = ",12);<br>
$displayh(" Using $displayh, a = ",a, " And 12 = ",12);<br>
$writeo(" \\nUsing Formatted $writeh, a = %d And 12 = %H",a,12);<br>
$writeh(" Using Formatted $writeh, a = %d",a, " And 12 = %H",12,"\\n");<br>
$display("Print \\"%%\\",\\t\\"%%%%\\" should be used.");<br>
$display("Use %%C or %%c: a's value %d %C",a,a);<br>
$display("Use %%S or %%s: a's value %d %s",a,a);<br>
$display("Use %%E or %%e: 10000.8 can be writen as %e ",10000.8);<br>
$display("Use %%F or %%f: 1.023E+8 can be writen as %f ",1.023E+8);<br>
$display("Use %%G or %%g: 1.023E+8 can be writen as %g ",1.023E+8);<br>
$display("Use \\\\xyz : Character \\101's ASCII value is 3'O101");<br>
$display("Use \\\\xyz : Character \\053's ASCII value is 3'O53");<br>
#200 $finish;<br>
end<br>
<br>
endmodule<br>
<br>
注意:1,在verilog中,转义符一定是使用在双引号括起来的字符串中!<br>
2,”\\”和”%”后跟的不是前述指定的符号时,行为跟仿真器的设计有关。比如,“\\N”实现的不是换行功能,但不同仿真器对其解释不同。同样,对于”\\%”、”%\\”等1364-2001标准未规定的格式,不同仿真器也可能进行不同的处理。严格的说,没有规定的转义表达式应该不能使用,比如“\\%”这一形式。一旦使用,应该通不过编译,并报告错误信息。但是通过几个仿真器的仿真发现,通常,”\\%”是允许的,推广之,发现”\\”后跟的如果不是表格中规定的转义符,”\\”将被忽略,而直接输出之后的信息。比如”\\%”就输出”%”符号,”\\N”就输出”N”符号。但是”%\\”是不允许的,推广之,发现”%”后跟的如果不是表格中规定的转义符,将报告错误。<br>
3,除”%%”外,”%”引导的转义符的使用必须和对应的变量、或者表达式匹配使用。对应于某一个转义符的变量为空时,可以用两个”,”将的空格来表示。参见例2-2。<br>
4,”%C”、”%S”、”\\xyz”等形式的转义符都跟ASCII码有关。”\\xyz”输出值为八进制数”xyz”的ASCII码,它不需要对应的变量(或者常量)列表。”%C”、”%s”也是输出一个ASCII符号,其值为变量列表中对应的变量、常量或者表达式的值,因此需要在变量列表中提供相应的变量、常量或者表达式。<br>
<br>
同其他高级语言相比,Verilog提供了几种跟硬件设计相关的特殊输出格式转义符:%v、%m、%t。<br>
%v用于打印一个线网类型变量的信号强度,它不能打印矢量变量的信号强度,而只能打印标量变量,或者矢量变量的指定位的信号强度。信号强度用3个符号输出表示,前两个符号表示信号强度,而第三个符号表示信号的逻辑值。信号强度和逻辑值的意义分别如下面两个表所示:<br>
信号逻辑值表示:<br>
逻辑值 表示意义<br>
0 表示逻辑0值<br>
1 表示逻辑1值<br>
X 表示逻辑不定态<br>
Z 表示逻辑高阻态<br>
L 表示逻辑0值,或者逻辑高阻态<br>
H 表示逻辑1值,或者逻辑高阻态<br>
<br>
信号强度表示:<br>
标记符 强度名 强度值表示<br>
Su 电源级驱动(Supply drive) 7<br>
St 强驱动(Strong drive) 6<br>
Pu 上拉级驱动(Pull drive) 5<br>
La 大容性(Large capacitor) 4<br>
We 弱驱动(Weak drive) 3<br>
Me 中级容性(Medium capacitor) 2<br>
Sm 小容性(Small capacitor) 1<br>
Hi 高容性(High capacitor) 0<br>
用%v打印一个信号的强度时,前两个符号除了用上表中的信号强度“标志符”表示信号强度外,也可以用两个数字表示信号强度。关于信号强度和逻辑值的建模在后续章节进行详细介绍。<br>
使用%m,可以打印当前打印语句所在的模块层次。<br>
%t通常用于打印当前的仿真时间,当然也可以用于打印其他数据。该转义符表示把对应的变量使用当前使用的时间表示格式进行打印。Verilog提供系统函数$time获得当前的仿真时间信息,该系统函数输出值为64比特表示的整数。Verilog还提供系统函数$timeformat用于设定当前的时间格式。关于$time和$timeformat的使用也放在后续章节说明。<br>
例2-3为这几个转义符简单使用的一个例子。<br>
// Filename: exe_2_3.v<br>
// This module is writen by YiTurn Zhao<br>
// Module Purpose : $display 和 $write的部分特殊功能<br>
<br>
module exe_2_3();<br>
<br>
reg [7:0] a; <br>
integer i;<br>
wire x;<br>
pulldown(x); <br>
initial begin<br>
#2;<br>
$display("%m"); <br>
$display("Simulation Time now is : %t",$time);<br>
$display("%%t Usage 2:%t",200);<br>
$display("x's strength is : %v",x);<br>
end<br>
<br>
exe_2_3_sub exe_2_3_sub();<br>
<br>
endmodule<br>
<br>
module exe_2_3_sub;<br>
wire [1:0] x;<br>
initial begin <br>
# 4; <br>
$display("%m");<br>
$display("Simulation Time now is : %t",$time);<br>
$display("x[1]'s strngth is :%v",x[1]);<br>
end<br>
endmodule<br></div>



下面是verilog示例,它将在终端屏幕上显示一些值。


initial begin
$timeformat(-9,1,"ns",12);
$display(" Time Clk Rst Ld SftRg Data Sel");
$monitor("%t %b %b %b %b %b %b", $realtime,
clock, reset, load, shiftreg, data, sel);
end

关键字 $display在终端屏幕上输出引用的附加的说明文字(“。。。”).关键字$monitor操作不同。因为它的输出是事件驱动的。例中的变量$realtime(由用户赋值到当前的仿真时间)用于触发信号列表中值的显示。信号表由变量 $realtime开始,跟随其他将要显示的信号名(clock, reset, load等)。以%开始的关键字包含一个格式描述的表,用来控制如何格式化显示信号列表中的每个信号的值。格式列表是位置确定的。每个格式说明有序地与信号列表中的信号顺序相关。比如%t说明规定了$realtime的值是时间格式。并且第一个%b说明符格式化clock的值是二进制形式。verilog提供附加的格式说明,比如%h用于说明十六进制,%d说明十进制,%c说明显示为八进制。


定义了打印仿真时间的格式。$timeformat 用于连接格式说明符%t。

语法 
$timeformat[( Units, Precision, Suffix, MinFieldWidth )]; 

规则 
-  Unit 是 0 到-15 之间的整数值,表示打印的时间的单位:0 表示秒,-3 表示毫秒,-6 表示微秒。-9 表示毫微秒; -12 表示微微秒; -15 表示毫微微秒;中间值也可以使用:例如-10表示100ps单位。
-  Precision 是在小数点后面要打印的小数位数。
-  Suffix 是在时间值后面打印的一个字符串。
-  MinFieldWidth 是打印的最小数量字符,包括前面的空格。如果要求更多字符,那么打印的字符更多。
-  如果没有指定变量,默认地使用下面的值:Units:仿真精度;Precision:0;Suffix:空字符串;MinFieldWidth:20 个字符。

提示 
用`timescale $timeformat 和$realtime (带%t)指定和显示仿真时间,用$display $monitor 或其他显示任务。

举例

  1. $timeformat(-10, 2, " x100ps", 20);    // 20.12 x100ps

原创粉丝点击