3.8.系统函数和任务 Verilog HDL语言中共有以下一些系统函数和任务: $bitstoreal, $rtoi, $display, $setup, $finish, $skew, $hold, $setuphold, $itor,$strobe, $period, $time, $printtimescale, $timefoemat, $realtime, $width, $real tobits, $write, $recovery, 在Verilog HDL语言中每个系统函数和任务前面都用一个标识符$来加以确认。 这些系统函数和任务提供了非常强大的功能。有兴趣的同学可以参阅附录: Verilog语言参考手册。下面对一些常用的系统函数和任务逐一加以介绍。 3.8.1.$display和$write任务 格式: $display(p1,p2,....pn); $write(p1,p2,....pn); 这两个函数和系统任务的作用是用来输出信息,即将参数p2到pn按参数p1给定的格式输出。 参数p1通常称为“格式控制”,参数p2至pn通常称为“输出表列”。这两个任务的作用基本相同。 $display自动地在输出后进行换行,$write则不是这样。如果想在一行里输出多个信息,可以使用$write。 在$display和$write中,其输出格式控制是用双引号括起来的字符串,它包括两种信息: · 格式说明,由"%"和格式字符组成。它的作用是将输出的数据转换成指定的格式输出。 格式说明总是由“%”字符开始的。对于不同类型的数据用不同的格式输出。表一中给出了常用的几种输出格式。 表一 输出格式 | | | | | | | | | | | | | | | | | | | | | | | | | 以指数或十进制数的形式输出实型数 无论何种格式都以较短的结果输出 |
· 普通字符,即需要原样输出的字符。其中一些特殊的字符可以通过表二中的转换序列来输出。 下面表中的字符形式用于格式字符串参数中,用来显示特殊的字符。 表二: 在$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 hex101 decimal rval=00000000145octal 00000000000000000000000001100101 binary rval has e asciicharacter value pd strength valueis StX current scope isdisp e is ascii valuefor 101 simulation time is0 输出数据的显示宽度 在$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 withmaximum size=%d=%h",r1,r1); $display("Printing withminimum 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,以确保明确的输出显示格式。
|