一、componnet override

要覆盖默认组件:

a)定义一个从默认组件类派生的类
b)执行覆盖
c)build env

应该在test中指定环境覆盖

1.1 type override

第二个参数replace决定是否替换现有的覆盖(replace = 1)

1.2 Instance Overrides

代码中实例覆盖的顺序会影响实例覆盖的应用

一个简单的例子

class my_agt extends uvm_agt;

  `uvm_component_utils(my_agt)
  
  function new(string name,uvm_component parent);
    super.name(name);
  endfunction

  virtual function void build_phase(uvm_phase phase);
    super.build_phase(phase);
    //for debug
    `uvm_info("AGT",$sformatf("%s(%s)",get_full_name(),get_type_name()),UVM_NONE)
  endfunction
  ........

endclass

class my_env extends uvm_env
  `uvm_component_utils(my_env)

  my_agt agt1;
  
  function new(string name,uvm_component parent);
    super.new(name,parent);
    agt1=my_agt::type_id::create("agt1",this);
  endfunction

  virtual function void build_phase(uvm_phase phase);
    super.build_phase(phase);
  endfunction

  task run_phase(uvm_phase phase);
    phase.raise_objection(this);

    #100ps;

    phase.drop_objection(this);
  endtask

  ........
endclass
class agt2 extends my_agt;
  `uvm_component_utils(agt2)

  function new(string name,uvm_component parent);
    super.new(name,parent);
  endfunction

endclass

class my_test extends uvm_test;
  `uvm_component_utils(my_test)
  
  my_env env1;

  function new(string name,uvm_component parent);
    super.new(name,parent);
  endfunction

  virtual function void build_phase(uvm_phase phase);
    super.build_phase(phase);
    env1=my_env::type_id::create("env1",this);
    my_agt::type_id::set_inst_override(agt2::get_type(),"uvm_test_top.env1.agt1");
  endfunction
  ......
endclass

最终运行结果

如果test中override和env1次序调换,结果有误

class agt2 extends my_agt;
  `uvm_component_utils(agt2)

  function new(string name,uvm_component parent);
    super.new(name,parent);
  endfunction

endclass

class my_test extends uvm_test;
  `uvm_component_utils(my_test)
  
  my_env env1;

  function new(string name,uvm_component parent);
    super.new(name,parent);
  endfunction

  virtual function void build_phase(uvm_phase phase);
    super.build_phase(phase);
    my_agt::type_id::set_inst_override(agt2::get_type(),"uvm_test_top.env1.agt1");
    env1=my_env::type_id::create("env1",this);
  endfunction
  ......
endclass

如有不正,欢迎指正

参考:uvm_user_guide

Logo

一站式 AI 云服务平台

更多推荐