1.前面使用过uvm_driver,uvm_env 当做树根。但在实际应用的UVM验证平台中,env 并不是树根。树根是一个基于uvm_test派生的class。base_test为例:
`ifndef BASE_TEST__SV
`define BASE_TEST__SV
class base_test extends uvm_test;
my_env env;
function new(string name = "base_test", uvm_component parent = null);
super.new(name,parent);
endfunction
extern virtual function void build_phase(uvm_phase phase);
extern virtual function void report_phase(uvm_phase phase);
`uvm_component_utils(base_test)
endclass
function void base_test::build_phase(uvm_phase phase);
super.build_phase(phase);
env = my_env::type_id::create("env", this);
uvm_config_db#(uvm_object_wrapper)::set(this,
"env.i_agt.sqr.main_phase",
"default_sequence",
my_sequence::type_id::get());
endfunction
function void base_test::report_phase(uvm_phase phase);
uvm_report_server server;
int err_num;
super.report_phase(phase);
server = get_report_server();
err_num = server.get_severity_count(UVM_ERROR);
if (err_num != 0) begin
$display("TEST CASE FAILED");
end
else begin
$display("TEST CASE PASSED");
end
endfunction
`endif
2)report_phase根据UVM_ERROR 的数量来打印不同的信息。一些日志分析工具根据打印的信息判断DUT是否通过了某个测试用例的检查。report_phase是UVM内建的一个phase,在main_phase结束后执行。
3)还可以设置平台的超时退出时间。
4)通过config_db 设置验证平台中的某些参数的值。
2.层次结果变为:
3.top_tb中run_test参数由my_env 变为base_test;config_db的路径也要改变:
initial begin
run_test("base_test");
end
initial begin
uvm_config_db#(virtual my_if)::set(null, "uvm_test_top.env.i_agt.drv", "vif", input_if);
uvm_config_db#(virtual my_if)::set(null, "uvm_test_top.env.i_agt.mon", "vif", input_if);
uvm_config_db#(virtual my_if)::set(null, "uvm_test_top.env.o_agt.mon", "vif", output_if);
end