1.my_env如下:
`ifndef MY_ENV__SV
`define MY_ENV__SV
class my_env extends uvm_env;
my_driver drv;
function new(string name = "my_env", uvm_component parent);
super.new(name, parent);
endfunction
virtual function void build_phase(uvm_phase phase);
super.build_phase(phase);
drv = my_driver::type_id::create("drv", this);
endfunction
`uvm_component_utils(my_env)
endclass
`endif
1)line 14:只有使用factory 注册过的类(uvm_component_utils),才能使用这种方式例化;才能使用重载。 new也能例化,但不能重载,不知道为什么,看源代码应该知道。上周有人问我,为什么不用new,现在知道了,嘻嘻!!
2)验证平台的组件都应该使用:type_name::type_id::create的方式例化。
3)type_id不是什么数字之类的id,就是个类型,看源码就知道了,以后再写。
4)create传了两个参数,自己的名字和parent。和 new 是一样的,是不是create 就是调用了new?
5)长出树叶my_driver类型的drv需要在build_phase中实现。
2.UVM树的结构如下:
1)在my_env 和my_driver中各存在一个build_phase。先执行my_env的,在执行my_driver的,从树根到树叶。my_driver 的build_phase第一句就是super.build_phase(phase),所以一定是先执行父类的。
2)整棵树的build_phase执行完后,在执行后面的phase。
3.my_driver从树根变成树叶,所以config_db也要改变。run_testy也变成了my_env。
initial begin
run_test("my_env");
end
initial begin
uvm_config_db#(virtual my_if)::set(null, "uvm_test_top.drv", "vif", input_if);
end
1)uvm_test_top变成了uvm_test_top.drv。
2)如果例化的名字是my_drv,那 set的第二个参数为uvm_test_top.my_drv。