英文:
Reference signal name from parent module
问题
我想引用我的模块输入上的一个信号的名称。
例如,目前我写的是这样的。
sigref_checker
#(.reltol(0.0),
.abstol(0.1),
.startTime (111111ps),
.stopTime(911111ps),
._signal("OUT1"),
._ref_signal("OUT2")
)
chk1 (
.signal(OUT1),
.ref_signal(OUT2),
.enable_signal(1'b1)
);
如果 "._signal" 和 "._ref_signal" 能在 chk1 模块内部被推断出来,那就好了,这样我的 chk1 模块会打印:
top.chk1.sig_ref_chk FAIL: OUT1 < OUT2-tol (1.666667 < 1.876363)
而不是:
top.chk1.sig_ref_chk FAIL: signal < ref_signal-tol (1.666667 < 1.876363)
我尝试在模块内部使用宏,但无法从模块内部引用父信号名称。
英文:
I want to reference the name of a signal that is on the input of my module.
For example, currently I write this.
sigref_checker
#(.reltol(0.0),
.abstol(0.1),
.startTime (111111ps),
.stopTime(911111ps),
._signal("OUT1"),
._ref_signal("OUT2")
)
chk1 (
.signal(OUT1),
.ref_signal(OUT2),
.enable_signal(1'b1)
);
It would be nice if "._signal" and "._ref_signal" could be inferred internally in the chk1 module, so that my chk1 module prints:
> top.chk1.sig_ref_chk FAIL: OUT1 < OUT2-tol (1.666667 < 1.876363)
Instead of:
> top.chk1.sig_ref_chk FAIL: signal < ref_signal-tol (1.666667 <
> 1.876363)
I tried using macros inside the module, but I was not able to reference the parent signal name from within the module
答案1
得分: 1
这是您提供的代码的翻译部分:
在您的检查器模块内部,您可以调用 `$getParentName(signal);`。
但更简单的方式可能是创建一个宏来实例化您的检查器模块。
`define sigref_checker_inst(R,A,START,STOP,SIGNAL,REF) \
#(.reltol(R), \
.abstol(A),\
.startTime (START),\
.stopTime(STOP),\
._signal(`"SIGNAL`"),\
._ref_signal(`"REF`")\
)\
chk1 (\
.signal(SIGNAL),\
.ref_signal(REF),\
.enable_signal(1'b1)\
);
请注意,代码中的特殊字符和宏名称保持不变。
英文:
It is possible to do this creating a C function using SystemVerilog's VPI.
int getParentName(char *user data) {
vpiHandle system_h, arg_itr, in_h, , out_h, parent_handle;
s_vpi_value out_s;
// all this code just to get a handle to the function's argument
// and without proper error checking
sys_h = vpi_handle(vpiSysTfCall, NULL);
arg_itr = vpi_iterate(vpiArgument, sys_h);
in_h = vpi_scan(arg_itr);
out_h = vpi_scan(arg_itr);
// now get its parent net
parent_h = vpi_get(vpiHighConn, in_h);
// return the name of the net
out_s.format = vpiStringVal;
out_s.str = vpi_get_str(vpiName,parent_h);
vpi_put_value(out_h,&out_s);
}
Inside your checker module you would call $getParentName(signal);
But it might be just easier to create a macro that instantiates your checker module
`define sigref_checker_inst(R,A,START,STOP,SIGNAL,REF) \
#(.reltol(R), \
.abstol(A),\
.startTime (START),\
.stopTime(STOP),\
._signal(`"SIGNAL`"),\
._ref_signal(`"REF`")\
)\
chk1 (\
.signal(SIGNAL),\
.ref_signal(REF),\
.enable_signal(1'b1)\
);
</details>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论