在包中获得一次虚拟接口

get virtual interface once in package

我尝试编写一个包,其中包含一些供测试环境使用的常见任务和功能。 例如,

package test_misc_pkg;
`include "uvm_macros.svh"
import uvm_pkg::*;

task wait_rest();
  virtual test_if test_vif;
  if (!uvm_config_db #(virtual test_if)::get(null, "uvm_test_top.env", "test_vif", test_vif))
    `uvm_fatal("NOVIF", "virtual interface should be set")

  @(posedge test_vif.clk);
  //do something...
endtask

endpackage : test_misc_pkg

然后,测试环境可以在 import test_misc_pkg.

之后调用 wait_rest()

但是,如果有其他任务使用相同的 test_vif,我仍然需要在每个任务的开头获取数据库。 我的问题是,我们能不能只在包中获取一次uvm_config_db,让所有任务都可以直接使用test_vif?

或者,还有更好的方法吗?

谢谢。

你可以让你的虚拟接口成为一个全局变量:

package test_misc_pkg;
  `include "uvm_macros.svh"
  import uvm_pkg::*;

  virtual test_if test_vif;

  function void set_vif();
    if (!uvm_config_db #(virtual test_if)::get(null, "uvm_test_top.env", "test_vif", test_vif))
      `uvm_fatal("NOVIF", "virtual interface should be set")
  endfunction

  task wait_rest();
    @(posedge test_vif.clk);
    //do something...
  endtask

endpackage : test_misc_pkg

并编写一个函数(例如set_vif())来为全局虚拟接口赋值。例如,您随后可以在 connect_phase 中调用此函数。不过,这一切似乎都有点不合常规。

如果您想减少调用 uvm_config_db::get() 的开销,您可以测试它是否为 null,然后执行 get。

task wait_rest();
  virtual test_if test_vif; // this is a static variable
  if (test_vif == null) begin
     if (!uvm_config_db #(virtual test_if)::get(null, "uvm_test_top.env", "test_vif", test_vif))
    `uvm_fatal("NOVIF", "virtual interface should be set")
end
  @(posedge test_vif.clk);
  //do something...
endtask