如何让sigref_checker模块自动推断输入信号的父模块信号名?
解决Verilog模块自动获取父模块信号名用于打印的问题
Verilog/SystemVerilog模块内部无法直接获取端口外部连接的信号名(这属于设计层次的元信息,运行时模块无法访问),所以必须在实例化时把信号名以字符串形式传递给模块参数。最省心的方式是用宏定义自动生成实例化代码,避免手动重复输入信号名。
步骤1:定义辅助宏和实例化宏
// 辅助宏:把信号名转成字符串 `define STRINGIFY(x) `"x`" // 封装sigref_checker的实例化逻辑,自动传递信号名字符串 `define INST_SIGREF_CHECKER(INST_NAME, SIG, REF_SIG, RELTOL, ABSTOL, START, STOP) \ sigref_checker \ #(.reltol(RELTOL), \ .abstol(ABSTOL), \ .startTime(START), \ .stopTime(STOP), \ ._signal(`STRINGIFY(SIG)), \ ._ref_signal(`STRINGIFY(REF_SIG)) \ ) \ INST_NAME ( \ .signal(SIG), \ .ref_signal(REF_SIG), \ .enable_signal(1'b1) \ );
步骤2:用宏快速实例化模块
不用再手动写两次信号名,直接调用宏:
`INST_SIGREF_CHECKER(chk1, OUT1, OUT2, 0.0, 0.1, 111111ps, 911111ps)
步骤3:模块内部使用参数打印
在sigref_checker模块里,直接用_signal和_ref_signal这两个字符串参数打印:
// 示例打印语句(根据你的实际逻辑调整变量) $display("%m.sig_ref_chk FAIL: %s < %s-tol (%f < %f)", _signal, _ref_signal, signal, ref_signal - abstol);
这样就能得到你想要的输出:
top.chk1.sig_ref_chk FAIL: OUT1 < OUT2-tol (1.666667 < 1.876363)
注意事项
- 宏定义要放在实例化代码之前,确保工具能正确展开;
- 不同仿真工具对字符串转义的支持可能略有差异,如果
`"x"```不生效,可以尝试`"x"`或者""x""``; - 如果用SystemVerilog,也可以考虑用UVM的层次路径函数,但宏的方式更轻量,不需要依赖UVM框架。
内容的提问来源于stack exchange,提问作者Ricardo Silvestre
相关产品推荐
相关产品推荐

