问题描述
我正在尝试从 uvm 序列中强制发送信号。我正在使用 uvm_hdl_force 方法。
我的语法,从我的 uvm 序列中的任务中运行是:
if( !uvm_hdl_force ("ex_top.ent_lvl1.ent_lvl2.signalname",1'b1);
`uvm_fatal("CM_BUSY_SEQ","uvm_hdl_force failure of signalname")
我发现这总是失败。
我已经验证了路径,如果我运行 uvm_hdl_check_path("ex_top.ent_lvl1.ent_lvl2.signalname") 它返回 1,表明路径存在。鉴于我不确定为什么强制失败或我应该检查什么?
如果有比我正在尝试的方法更好的方法,我也愿意接受其他强制高信号的方法。
这是一个混合代码设计。顶层是 verilog,低层模块包括我试图强制的特定信号所在的模块是 VHDL。
谢谢
解决方法
从解决方案所提供的代码片段中,将致命的包裹到 begin-end
。由于 ;
将意味着行尾,从而终止 if 子句。或者,如果您不想使用 begin-end
,请不要将 ;
放在 if 子句之后。
// this ; invokes end of condition,to be safe wrap the fatal to begin end
// |
// V
if( !uvm_hdl_force ("tb_top.test",1'b1));
`uvm_fatal("CM_BUSY_SEQ","uvm_hdl_force failure of signalname")
// |
// |
// V
if( !uvm_hdl_force ("tb_top.test",1'b1)) begin
`uvm_fatal("CM_BUSY_SEQ","uvm_hdl_force failure of signalname")
end
// Or without ;
if( !uvm_hdl_force ("tb_top.test",1'b1))
`uvm_fatal("CM_BUSY_SEQ","uvm_hdl_force failure of signalname")
此外,大多数工具都支持它们自己的用于强制值的系统任务:
- Xcelium
$xm_force(string path,string value)
- Questa
$signal_force(string path,string value)
这些任务可能有更多参数,但我建议您在工具的参考手册中查找它们。
,目前我已经通过从 uvm_hdl_force 转移到传统的 force 语句来解决这个问题