SystemVerilog是否有支持日志消息精细控制的日志包?
SystemVerilog的日志分级过滤实现方式
SystemVerilog本身的语言标准里并没有内置像VHDL的OSVVM/VUnit那样的日志分级过滤功能,但业内有几种成熟的方案可以实现同样的精细控制:
UVM日志系统(最主流方案)
UVM(通用验证方法学)自带一套完善的日志报告机制,支持多种日志级别:UVM_DEBUG、UVM_INFO、UVM_WARNING、UVM_ERROR、UVM_FATAL(级别权重依次升高)。你可以通过uvm_report_server的相关方法,针对整个测试平台、特定组件或者特定消息ID设置过滤规则:- 比如设置全局过滤阈值为
UVM_WARNING,那么所有UVM_DEBUG和UVM_INFO级别的消息都会被忽略,只输出警告及以上级别的内容; - 也可以单独调整某个组件的日志级别,比如让某个监测器输出
UVM_DEBUG级别的调试信息,而其他组件只保留UVM_INFO及以上。
示例代码片段:
// 在测试用例中设置全局日志过滤 function void build_phase(uvm_phase phase); super.build_phase(phase); uvm_report_server::get_server().set_report_severity_action(UVM_INFO, UVM_NO_ACTION); // 关闭所有INFO级消息 uvm_report_server::get_server().set_report_severity_action(UVM_WARNING, UVM_DISPLAY | UVM_LOG); // 警告消息输出到控制台和日志文件 endfunction- 比如设置全局过滤阈值为
自定义日志包
如果不需要引入UVM这种重框架,可以自己写一个轻量的SystemVerilog包来实现分级过滤:package log_pkg; // 定义日志级别,数值越高优先级越高 typedef enum int {LOG_DEBUG=1, LOG_INFO=2, LOG_WARN=3, LOG_ERROR=4} log_level_e; log_level_e global_filter = LOG_INFO; // 默认过滤DEBUG级消息 function void log(log_level_e level, string msg); if(level >= global_filter) begin $display("[%s] %t: %s", level.name(), $time, msg); end endfunction endpackage // 测试平台中使用 import log_pkg::*; initial begin global_filter = LOG_WARN; // 调整过滤阈值为警告级 log(LOG_DEBUG, "这条调试信息会被过滤"); log(LOG_WARN, "这条警告会被输出"); log(LOG_ERROR, "这条错误信息也会被输出"); end第三方验证框架支持
比如VUnit也支持SystemVerilog,它的日志系统和VHDL版本逻辑一致,支持为消息分配不同级别并设置过滤规则;另外像Cocotb这类验证框架结合SystemVerilog使用时,也能通过其日志系统实现类似的分级控制。
内容的提问来源于stack exchange,提问作者gyuunyuu
相关产品推荐
相关产品推荐

