You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 19:02:08