Verilog学习笔记基本语法篇(十)········ 常用系统函数
$display 和 $write 任务
格式:
$display (p1,p2,...,pn);
$write (p1,p2,..,pn);
这两个函数和系统的任务作用是用来输出信息,即将参数p2到pn按照参数p1给的格式输出。参数1通常称作“格式控制”,参数p2至pn通常称作输出表列。这两个任务的作用基本相同,但是$display自动的在输出后进行换行,而$write却不是这样。如果想在一行内输出多个信息,可以使用$write。
注意:其输出格式控制是用双引号括起来的字符串,可以包含以下两种信息:
1)格式说明,由“%”和格式字符组成。它的作用是将输出的数据转换成指定的格式输出。格式说明总是从%开始的。常见的几种输出格式
输出格式 | 说明 | 输出格式 | 说明 |
%h或%H | 以十六进制形式输出 | %d或%D | 以十进制形式输出 |
%o或%O | 以八进制形式输出 | %b或%B | 以二进制形式输出 |
%c或%C | 以ASCII码形式输出 | %v或%V | 输出网格型数据信号轻度 |
%m或%M | 输出等级层次名字 | %s或%S | 以字符串的形式输出 |
%e或%E | 以指数形式输出实型数 | %f或%F | 以十进制的形式输出实型数 |
%g或%G |
以指数或者十进制数输出实型数,但是 无论何种格式都以较短的结果输出 |
%t或%T | 输出当前的时间格式 |
2)普通字符,即需要原样输出的字符。其中一些特殊的字符可以通过转换序列来输出:
换码序列 | 功能 | 换码序列 | 功能 |
\n | 换行 | \'' | 双引号字符" |
\t | 横向跳格 | \o | 1-3位八进制数代表的字符 |
\\ | 反斜杠字符 | %% | 百分符号% |
例:
$display("\\\t%%\n\"\123") 其输出结果为: \%
"S
val=101;
$display("val=%h hex val=%d decimal",val,val);
$display("val=%o otal val=%b binary",val,val);
其输出的结果为:
val=00000065 hex val=101 decimal
val=00000000145 otal val=00000000000000000000000001100101 binary
由上式可见,在$siaplay显示中,输出列表中的数据显示宽度是按照输出的格式进行自动调整的。在显示十进制时,输出结果前面的0值用空格来代替。对于其他禁止,输出结果前面的0仍然显示出来。为了消去其他进制有效数字前面的0,可以在%和表示进制的字符串中间插入一个0自动调整显示输出数据宽度的方式。如上式中的$display("val=%0b binary",val); 显示的结果就为val=101
如果在输出列表中表达式的值包含不确定的值或高阻值,其结果遵循以下规则:
1)输出为十进制的情况下:
a)如果表达式值的所有位均为不定值,则输出结果为小写的x;
b)如果表达式中所有的位均为高阻值,则输出结果为小写的z;
c)如果表达式值的部分位为不定值,则输出结果为大写的X;
d)如果表达式值的部分为高阻值,则输出的结果位大写的Z;
2)输出为十六进制和八进制的情况下:
a)每4位二进制数为一组代表一位十六进制数,每3位二进制数为一组代表一位八进制数。
b)如果表达式值相对应的某进制的所有位均为不定值,则输出为小写的x;
c)如果表达式值相对应的某进制数的所有位均为高阻值,则输出小写的z;
d)如果表达式值相对应的某进制数的部分位为不定值,则该位输出的结果为大写的X;
e)如果表达式值相对性的某进制数的部分位位高阻值,则该位输出的结果为大写的Z;
3)对于二进制的情况:
表达式的值每一位的输出结果都用0,1,x,z表示。
和$display 和 $write相似的还有$strobe,这个任务除了与$display有一点区别外,其他的非常相似。如果许多其他语句和$display在同一个时间单位执行,那么这些语句与$display任务的执行顺序是不确定的。如果使用$strobe,该语句总是在相同时刻的其他赋值语句执行完之后才执行,因此$strobe提供了一种同步机制,它可以在同一时钟沿赋值的其他语句在执行之后才会显示数据。
文件输出
1)打开文件:
文件可以用系统任务$fopen打开,用法:
文件句柄=$fopen("文件名");
任务$fopen返回一个被称作多通道描述符(multichannel descriptor)的32位值。多通道描述符中只有一位被设置成1。标准输出有一个多通道描述符,其最低位(第0位)被设置成1.标准输出也称作通道0,标准输出一直是开放的。以后对$fopen的每一次调用开辟一个新的通道,并且返回一个设置了第一位,第二位等,直到32位描述符的第30位。第31位是保留为。信号通道与多通道描述符中被设置为1的位相对应。
2)写文件:
写文件可以利用$fdisplay、$fmonitor实现。用法:
$fdisplay(文件描述符,p1,p2,..pn)
$fmonitor(文件描述符,p1,p2,...pn)
p1,p2,pn可以是变量,信号名或者带引号的字符串。文件描述符是一个多通道描述符,他可以是一个文件句柄或者多个文件句柄的按位组合。Verilog会把输出写到与文件描述符中值为1 的文件中。
Ex;
1 interger handle1,handle2,handle3;
2 //标准输出是打开的,descrpitor=32'h0000_0001(bit 0 set 1)
3 initial
4 begin
5 handle1=$fopen("file1.out"); //handle1=32'h0000_0002(bit 1 set 1)
6 handle2=$fopen("file2.out"); //handle2=32'h0000_0004(bit 2 set 1)
7 handle3=$fopen("file3.out"); //handle3=32'h0000_0008(bit 3 set 1)
8 end
9 integer des1.des2.des3;
10 initial
11 begin
12 des1=handle1|1; //des1=32'h0000_0003
13 $fdisplay(des1,"display 1") //write to file1.out and std.out
14
15 des2=handle1|handle2; //des1=32'h0000_0006
16 $fdisplay(des2,"display 2") //write to file1.out and file2.out
17
18 des3=handle3; //des1=32'h0000_0006
19 $fdisplay(des3,"display 3") //write to file3.out
20 end
3)关闭文件
文件可以用系统任务$fclose来关闭。用法:
$fclose(文件描述符); 如:$fclose(handle1);文件一旦被关闭,多通道描述符中的相应位被设置为0,下一次的fopen的调用可以重用这一位。