verilog tb文件 美化terminal输出
verilog tb文件 美化terminal输出
在进行建立 verilog仿真时,可以这样定义
module xxx_tb;
reg pass_flag = 1;//定义pass_flag,并初始化为1
integer info_cnt = 0;
integer pass_cnt = 0;
integer error_cnt = 0;`define Info(msg) \$display({"[Info]: ",msg}); \info_cnt = info_cnt + 1;`define Pass(msg) \$display({"\033[92m[Pass]: ",msg, "\033[0m"}); \pass_cnt = pass_cnt + 1;`define Error(msg) \$display({\033[91m[Error]: ",msg, "\033[0m"}); \error_cnt = error_cnt + 1;`define report_all \$display("\033[94m=========================================\033[0m"); \$display("\033[94m======== Simulation Report ==============\033[0m"); \$display("\033[94m=========================================\033[0m"); \$display("\033[99m[Info]: %d\033[0m",info_cnt); \$display("\033[92m[Pass]: %d\033[0m",pass_cnt); \$display("\033[91m[Error]: %d\033[0m",error_cnt); \$display("\033[94mPass Rate:%05.2f%% [ %5d/ %5d]\033[0m",(pass_cnt*100/(pass_cnt+error_cnt)),pass_cnt,(pass_cnt+error_cnt)); \final
beginif(pass_flag)begin$display("\033[92m================================\033[0m");$display("\033[92m======== Pattern Passed ========\033[0m");$display("\033[92m================================\033[0m");endelsebegin$display("\033[92m================================\033[0m");$display("\033[92m================================\033[0m");$display("\033[92m======== Pattern Failed ========\033[0m");$display("\033[92mTotal of %4d Fails were found!\033[0m",error_cnt);end`report_all
end//比对数组,并打印输出,其中$sformatf为system verilog格式化输出函数
task comp_array(input logic [7:0] array0 [],input logic [7:0] array1 [],input logic [7:0] start_addr = 8'h0,input logic [7:0] length = 8'hFF);integer i;for(i = start_addr; i < length ;i = i + 1)beginif(array0[i] !== array1[i])beginpass_flag = 0;`Error($sformatf("-- addr = 0x%2h, rdata = 0x%h, wdata = 0x%h --\n",i,array0[i],array1[i]));endelse`Pass($sformatf("-- addr = 0x%2h, rdata = 0x%h, wdata = 0x%h --\n",i,array0[i],array1[i]));end
endtask//自定义crc8计算函数,可根据自己需求,修改多项式和初始值。
function automatic bit [7:0] crc8_cal(bit[7:0] indata[]);bit [7:0] crc8 = 8'hFF;bit [7:0] din = 0;localparam logic [7:0] POLYNOMIAL = 8'h7;integer ii = 0;integer jj = 0;foreach(indata[jj])begindin = indata[jj];crc8 = crc8 ^ din;for(ii = 0;ii < 8; ii ++)beginif(crc8[7])crc8 = (crc8<<1) ^ POLYNOMIAL;elsecrc8 = crc8<<1;endendreturn crc8;
endfunction
$sformatf
是 SystemVerilog 中的一个非常强大的系统函数,用于格式化字符串。它类似于 C 语言中的 sprintf
函数,可以将数据格式化为字符串。$sformatf
在生成调试信息、日志记录或动态生成字符串时非常有用。
基本语法
$sformatf
的基本语法如下:
string formatted_string = $sformatf(format_string, arg1, arg2, ...);
format_string
:格式化字符串,类似于 C 中的printf
格式化字符串。arg1, arg2, ...
:要格式化的参数。
常见格式化说明符
%d
或%i
:十进制整数。%u
:无符号十进制整数。%x
或%h
:十六进制整数。%o
:八进制整数。%b
:二进制整数。%s
:字符串。%c
:字符。%f
:浮点数。%t
:仿真时间。%%
:输出一个%
字符。
示例
以下是一些使用 $sformatf
的示例:
示例 1:格式化整数
module example;initial beginint a = 42;string formatted_string = $sformatf("The value of a is %d", a);$display("%s", formatted_string);end
endmodule
输出:
The value of a is 42
示例 2:格式化多个参数
module example;initial beginint a = 42;int b = 123;string formatted_string = $sformatf("a = %d, b = %d", a, b);$display("%s", formatted_string);end
endmodule
输出:
a = 42, b = 123
示例 3:格式化字符串和整数
module example;initial beginint a = 42;string name = "John";string formatted_string = $sformatf("Name: %s, Age: %d", name, a);$display("%s", formatted_string);end
endmodule
输出:
Name: John, Age: 42
示例 4:格式化浮点数
module example;initial beginreal r = 3.14159;string formatted_string = $sformatf("The value of r is %f", r);$display("%s", formatted_string);end
endmodule
输出:
The value of r is 3.141590
示例 5:格式化仿真时间
module example;initial begin#10; // 延迟 10 个时间单位string formatted_string = $sformatf("Current simulation time is %t", $time);$display("%s", formatted_string);end
endmodule
输出:
Current simulation time is 10
示例 6:格式化二进制和十六进制
module example;initial beginint a = 42;string formatted_string = $sformatf("Binary: %b, Hex: %h", a, a);$display("%s", formatted_string);end
endmodule
输出:
Binary: 101010, Hex: 2a
注意事项
- 格式化字符串的长度:
$sformatf
会根据格式化的内容动态分配字符串长度,因此不需要预先指定字符串的大小。 - 类型匹配:确保格式化说明符与参数类型匹配,否则可能会导致运行时错误或不正确的输出。
- 调试用途:
$sformatf
常用于生成调试信息,可以方便地将变量值格式化为字符串并输出。
总结
$sformatf
是一个非常灵活且强大的系统函数,适用于各种需要格式化字符串的场景。通过使用 $sformatf
,你可以轻松地将不同类型的数据格式化为字符串,便于调试和日志记录。