在包中获得一次虚拟接口
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
我尝试编写一个包,其中包含一些供测试环境使用的常见任务和功能。 例如,
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