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的调用可以重用这一位。

posted @ 2016-09-23 15:01  SYoong  阅读(8977)  评论(0编辑  收藏  举报