SystemVerilog中指定打印格式
前言:本文主要总结一下SystemVerilog中的占位符,通过合理的使用占位符,可以再log中按自己指定的格式打印信息,方便case分析及debug。
一、指定输出打印格式
在指定输出打印格式时,转义字符“%”后跟格式说明字符用于指定输出打印格式,除了(%m, %l, and %%)以外,每个%所指定的输出打印格式在后面都应该有一个对应的表达式参数。
当存在多个格式说明的时候,格式说明与表达式参数按位置关系形成一一对应。
No. | 占位符 | 意义 |
1 | %d或%D | 以十进制的形式输出 |
2 | %o或%O | 以八进制的形式输出 |
3 | %b或%B | 以二进制的形式输出 |
4 | %h或%H | 以十六进制的形式输出,打印的字母小写或者大写 |
5 | %x或%X | 以十六进制的形式输出 |
6 | %c或%C | 以ASCII码字符的形式输出 |
7 | %s或%S | 以字符串的形式输出 |
8 | %t或%T | 以当前的时间格式的形式输出 |
9 | %e或%E | 以指数的形式输出实型数 |
10 | %f或%F | 以十进制的形式输出实型数 |
11 | %g或%G | 以指数或者十进制的形式输出实型数,无论何种格式都以较短的结果输出 |
12 | %u或%U | Unformatted 2 value data (binary values) |
13 | %z或%Z | Unformatted 4 value data |
14 | %v或%V | Display net signal strength |
15 | %p或%P | Display as an assignment pattern |
16 | %l或%L | Display library binding information,显示库关联关系 |
17 | %m或%M | Display hierarchical name,显示当前模块的层次名 |
注:
- %m和%l分别可以显示打印语句所在当前模块的模块名,和该模块所在的仿真所构建的运行库路径信息,对于调试跟踪来说非常有用,其效果参见以下代码例。
- %t用于打印时间信息,通常跟$time配合使用
- %u和%z常用于$fwrite()函数,用于向文件写入数据;其中%u不区分x和z数据,并将其映射为’0’;而%z严格区分x和z数据,将其分别映射为’x’,‘z’。如果需要保持以及区分x(不确定值)和z(高阻)的话,推荐使用%z。
- %p用于打印聚合表达式,例如解压缩结构,数组和联合(unpacked structure,array,unions),结构体等等,非常方便,其效果如以下代码例所示
`timescale 1ns/1ps
module hvl_top( );
typedef struct packed {
logic bit1;
logic [7:0] byte1;
} packet_t;
packet_t my_packet;
logic x;
logic y = 1'bz;
initial begin
# 100;
$display("[1]: %m: Welcome to SystemVerilog");
$display("[2]: %l: SystemVerilog is very powerful, @%0t(ps)", $realtime());
# 100;
my_packet.bit1 = 1;
my_packet.byte1 = 8'h37;
$display("my_packet = %p, @%0t(ps)", my_packet, $realtime);
$finish();
end
endmodule