verilog初始-系统任务
1.$display和$wirte
格式:
$display(“format”,var1,var2,…,varn);
$write(“format”,var1,var2,…,varn);
这两个函数用来输出信息,var1、var2和varn按format给定的格式输出。
$display自动在输出后进行换行,而$write输出后不会换行,需要添加\n手动换行。如果想在一行里输出多个信息,可以使用$write。
- format,由%和格式字符组成,作用是将输出的数据转换成制定的格式输出。格式说明总是由%开始,如下是常用的集中输出格式:
输出格式 | 说明 |
---|---|
%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 | 相当于按下一个Tab键 |
\ | 反斜杠字符| |
" | 双引号字符" |
\o | 1-3位八进制数代表的字符 |
%% | 百分号% |
如: |
$display("%t\t%d",$time,led);
$display("%s is ascii value for 101",101);
$display("%h",led);
其输出结果为:
335544310000 0
e is ascii value for 101
0
注:
- 可以通过在%和表示进制的字符中间插入一个0自动调整显示输出数据宽度的方式。如:
$display(“d=%0h a=%0h”,data,addr); - 在输出格式为十进制的情况下:
- 如果表达式值的所有位均为不定值,则输出结果为小写的x;
- 如果表达式值的所有位均为高阻值,则输出结果为小写的z;
- 如果表达式值的部分为为不定值,则输出结果为大写的X;
- 如果表达式值的部分为为高阻值,则输出结果为大写的Z。
如:
$display(“%d”,1’bx);//输出结果为x
$display(“%h”,8’bx0_1100);//输出结果为Xc
$display(“%h”,12’bx110_z001_0110_xxxx_zzzz);//输出结果为XZ6xz
2 文件输出
verilog的结果通常输出到标准输出和文件verilog.log中。可以将verilog的输出重新定向到选择的文件。
1.打开文件
$fopen(“文件名”);
任务$fopen返回一个被称为多通道描述符的32位值。多通道描述符中只有一位被设置为1。标准输出也称为通道0,是一个多通道描述符,标准输出一直生效。对$fopen的每一次调用打开一个新的通道,并且返回一个设置了第1位、第2位等,直到32位描述符的第30位。第31位是保留位。通道号与多通道描述符中被设置为1的位相对应。
如:
//多通道描述符
integer handle1,handle2,handle3;//声明3个32位整型变量
//标准输出是打开的,descriptor=32’h0000_0001;(第0位置1)
intial
begin
handle1=$fopen("file1.out");//handle1=32'h0000_0002(bit1=1)
handle2=$fopen("file2.out");//handle2=32'h0000_0004(bit2=1)
handle3=$fopen("file3.out");//handle3=32'h0000_0008(bit3=1)
end
多通道描述符的优点在于可以有选择地同时写多个文件。
2.写文件
- $fdisplay
用法:
$fdisplay(文件描述符,p1,p2,…,pn); - $fmonitor
$fmonitor(文件描述符,p1,p2,…,pn);
其中,p1,p2,…,pn可以是变量、信号名或者带引号的字符串。文件描述符是一个多通道描述符,可以是一个文件句柄或多个文件句柄按位的组合。verilog会把输出写到与文件描述符中值为1的位相关联的所有文件中。
如:
integer desc1,desc2,desc3;//声明三个文件描述符
initial
begin
desc1=handle1 | 1;//desc1=32'h0000_0003
$fdisplay(desc1,"Display 1");//写到文件file1.out和标准输出stdout
desc2=handle1 | handle2;//desc1=32'h0000_0006
$fdisplay(desc2,"Display 2"); //写到文件file1.out和file2.out
desc3=handle3;//desc1=32'h0000_0008
$fdisplay(desc3,"Display 3");//只写到文件file3.out
end
3.关闭文件
用法:
$fclose(文件描述符);
如:
$fclose(handle1);
文件一旦被关闭就不能再写入。多通道描述符中的相应位被设置为0,下一次$fopen的调用可以重用这一位。
4.显示层次
%m选项可以显示任何级别的层次。当一个模块的多个实例执行同一段verilog代码时,%m选项会区分哪个模块实例在输出,且显示任务中的%m选项无需参数。
如:
module M;
initial
$display("Displaying in %m");
endmodule
module top;
M m1();
M m2();
M m3();
endmodule
输出结果如下:
Displaying in top.m1
Displaying in top.m2
Displaying in top.m3
5.选通显示
选通显示由关键字$strobe系统任务完成。$strobe提供了一种同步机制,可以确保所有在同一时钟沿赋值的其他语句在执行完毕之后才显示数据。
如:
always @(posedge clock)
begin
a = b;
c = d;
end
always @(posedge clock)
$strobe(“displaying a = %b,c=%b”,a,c);//在clock到来时在语句a=b和c=d执行完后才会执行本条语句
6.值变转储文件VCD
值变转储文件是一个ASCII文件,包含仿真时间、范围与信号的定义以及仿真运行过程中信号值的变化等信息。设计中的所有信号或者选定的信号集合在仿真过程中都可以被写入VCD文件。后处理工具可以把VCD文件作为输入并把层次信息、信号值和信号波形显示出来。
verilog提供了系统任务来选择要转储的模块实例或者模块实例信号(
d
u
m
p
v
a
r
s
),选择
V
C
D
文件的名称(
dumpvars),选择VCD文件的名称(
dumpvars),选择VCD文件的名称(dumpfile),选择转储过程的起点和终点(
d
u
m
p
o
n
,
dumpon,
dumpon,dumpoff),选择生成检测点($dumpall)。
如:
initial
$dumpfile("myfile.dmp");//将仿真信息转储到myfile.dmp文件
//转储模块中的信号
initial
$dumpvars;
initial
$dumpvars(1,top);//1表示层次的等级,只转储top下第一层信号,即转储top模块中的变量,而不转储在top中的调用模块中的变量
initial
$dumpvars(2,top.m1);//转储top.m1模块下的两层信号
initial
$dumpvars(0.top.m1);//数0表示转储top.m1模块下面各个层的所有信号
initial
begin
$dumpon;//启动转储过程
#100000 $dumpoff;//过100000个仿真单位时间后,停止转储过程
end
//生成一个检查点,转储所有VCD变量的现行值
initial
$dumpall;