无法使用 uvm_hdl_force 强制使用经过验证的路径的信号?

问题描述

我正在尝试从 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 语句来解决这个问题