System verilog 我是否需要在UVM中避免OOMR(模块外引用)代码?

System verilog 我是否需要在UVM中避免OOMR(模块外引用)代码?,system-verilog,uvm,System Verilog,Uvm,我正在设置一个新的UVM代码,并希望在我的UVM代码中生成OOMR代码,我是否需要在UVM中避免OOMR模块外参考代码概念? 如果不需要,我应该在OOMR代码之前和之后检查什么 如果在运行后看到该链接,则会显示一些错误消息 a=u_sub.b; | ncvlog: *E,ILLHIN (add.sv,6|12): illegal location for a hierarchical name (in a package). 为了防止这个问题,我想我必须避免这

我正在设置一个新的UVM代码,并希望在我的UVM代码中生成OOMR代码,我是否需要在UVM中避免OOMR模块外参考代码概念? 如果不需要,我应该在OOMR代码之前和之后检查什么

如果在运行后看到该链接,则会显示一些错误消息

    a=u_sub.b; 
            |
ncvlog: *E,ILLHIN (add.sv,6|12): illegal location for a hierarchical name (in a package).
为了防止这个问题,我想我必须避免这种代码风格。但我不确定我对这个问题了解多少

不确定,但据我所知,一些EDA工具支持这个问题。例如,cadence$xm_mirror、Mentor、VCS

所以我想知道我是否需要避免这些OOMR代码风格?或者我应该只使用EDA工具的帮助。
当我在庞大复杂的uvm代码中遇到类似错误时,如何解决这个问题?

在SystemVerilog包中使用Verilog分层引用或OOMRs是非法的。这是因为首先编译SystemVerilog包,编译方式与SystemVerilog代码的其余部分不同

通常,您将把类放在一个包中。因此,您应该避免在类中使用Verilog分层引用或OOMRs

显然,您需要将类中的代码连接到DUT端口,例如驱动程序和监视器,并且可能还需要探测DUT内部信号。对于每种情况,解决这些问题的方法是不同的

为了连接到DUT端口,大多数人会使用SystemVerilog接口。您在与DUT相同的层次结构级别实例化接口,并以某种方式将接口成员连接到DUT,例如使用Verilog层次结构引用或OOMRs,例如:

interface TB_hook (input bit clk);
  logic Stim, Resp;
  ...
endinterface

module harness;
  bit clk;
  TB_hook DUT_intf (.clk);
  Sys_Top DUT (
    .clk  (clk), 
    .Stim (DUT_intf.Stim),
    .Resp (DUT_intf.Resp), 
    ...
然后,在某些a类驱动程序、监视器或代理中,您可以使用SystemVerilog虚拟接口连接到接口实例。虚拟接口是一种特殊的SystemVerilog变量,它可以存储对接口实例或modport的Verilog分层引用或OOMR。由于必须在运行时分配该值,因此可以在包中编译虚拟接口,但分配该值的代码不能在包中,例如:

class driver;
  virtual TB_hook V;
  task drive (input bit data);
    V.Stim <= data;
但大多数人会使用UVM配置数据库:

module TB_top;
  top_env env;
  ...
  initial begin
    ...
    uvm_config_db #(virtual TB_hook)::set(null, "*", "DUT_intf", harness.DUT_intf);

class driver;
  virtual TB_hook V;
  ...
  function void connect_phase(uvm_phase phase);
    ...
    ok = uvm_config_db#(virtual TB_hook)::get(this, "", "DUT_intf", V);
您可以使用modports和/或时钟模块来增强这项技术

对于探测内部DUT信号,有UVM寄存器层提供的设施。这有一组功能/任务:

uvm_hdl_检查路径–检查hdl路径是否存在 uvm_hdl_存款–将一个值存入RTL uvm_hdl_力–将值强制输入RTL uvm_hdl_force_time–在指定的持续时间内强制值 uvm_hdl_释放–释放强制值 uvm_hdl_release_和_read–释放强制值并读取新值 uvm_hdl_读取–读取RTL值
我不太明白你的问题。您不必避免它,但是您会发现,您不能在EDA示例中的错误消息清楚说明的包中使用我称之为Verilog层次引用的内容。你在问什么?@MatthewTaylor,但你会发现你不能在包中使用我称之为Verilog的分层引用,而我称之为OOMR。是的,这就是我想知道的。如果我遇到了类似的问题,我应该首先检查什么?@MatthewTaylor我可以使用这个接口来解决这个问题包中的Verilog分层引用吗?
module TB_top;
  top_env env;
  ...
  initial begin
    ...
    env.agent.driver.V = harness.DUT_intf;
module TB_top;
  top_env env;
  ...
  initial begin
    ...
    uvm_config_db #(virtual TB_hook)::set(null, "*", "DUT_intf", harness.DUT_intf);

class driver;
  virtual TB_hook V;
  ...
  function void connect_phase(uvm_phase phase);
    ...
    ok = uvm_config_db#(virtual TB_hook)::get(this, "", "DUT_intf", V);