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树的结构如下:

UVM:2.3 为验证平台加入各个组件->2.3.2 加入env_父类

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。