当前位置: 首页 > news >正文

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

注意事项

  1. 格式化字符串的长度$sformatf 会根据格式化的内容动态分配字符串长度,因此不需要预先指定字符串的大小。
  2. 类型匹配:确保格式化说明符与参数类型匹配,否则可能会导致运行时错误或不正确的输出。
  3. 调试用途$sformatf 常用于生成调试信息,可以方便地将变量值格式化为字符串并输出。

总结

$sformatf 是一个非常灵活且强大的系统函数,适用于各种需要格式化字符串的场景。通过使用 $sformatf,你可以轻松地将不同类型的数据格式化为字符串,便于调试和日志记录。

http://www.dtcms.com/a/286581.html

相关文章:

  • Webpack 项目构建优化详解
  • 雪豹大模型驱动效率革命 华鼎冷链科技重构餐饮供应链神经网络
  • 进程 线程 并发 并行
  • 安达发|从救火到未雨绸缪:APS生产计划排产软件重塑制造业“危机免疫力“
  • 2025年6月电子学会全国青少年软件编程等级考试(Python一级)真题及答案
  • 添加DNS解析记录时,提醒记录冲突是怎么回事?
  • Python练习2-格式化输出基本数据类型及变量的详细使用
  • Aqara 携手西门子西碳迹SiTANJI,发布亚马逊 CPF 绿标解决方案标杆案例
  • 根据用户id自动切换表查询
  • c语言笔记---结构体
  • 浏览器元素定位工具-项目源码免费领取
  • 萤石摄像头C++SDK应用实例
  • 前端笔记之 async/await 异步编程详解
  • 面试高频题 力扣 695.岛屿的最大面积 洪水灌溉(FloodFill) 深度优先遍历 暴力搜索 C++解题思路 每日一题
  • Python网络爬虫之selenium库
  • 第九章 基础设施更新工程
  • 语音控制操作板:人机交互的未来趋势
  • 企业级异常处理方案:Spring Boot自定义异常全局拦截实战
  • 多线程的认识
  • 深入Java注解:从内置到元注解与自定义实战指南
  • 变量提升知识总结
  • 前后端数据交互,关于表单数据传输问题
  • 图机器学习(11)——链接预测
  • Linux和git常用命令
  • TF-IDF(Term Frequency - Inverse Document Frequency)
  • RFID技术赋能智慧物流:实现搬运环节的精准化与高效化
  • 【PTA数据结构 | C语言版】多叉堆的上下调整
  • 【LeetCode 2163. 删除元素后和的最小差值】解析
  • 上市公司-企业超额商誉数据(2005-2023年)-实证数据
  • 《C++继承深度引擎:从内存布局到多态全景拆解》​