电子说
factory机制本质是 对SystemVerilog中new函数的重载 ,其带来了如下好处:
// src/ch8/section8.2/8.2.1/correct/my_case0.sv
function void my_case0::print_hungry(bird b_ptr);
b_ptr.hungry();
b_ptr.hungry2();
endfunction
...
function void my_case0::build_phase(uvm_phase phase);
bird bird_inst;
super.build_phase(phase);
set_type_override_by_type(bird::get_type(), parrot::get_type());
bird_inst = bird::type_id::create("bird_inst");
print_hungry(bird_inst);
endfunction
// 打印结果如下:
// "I am a parrot, I am hungry" // virtual函数
// "I am a bird, I am hungry2"
解释如下:
UVM支持连续的重载
set_type_override_by_type(bird::get_type(), parrot::get_type());
set_type_override_by_type(parrot::get_type(), big_parrot::get_type());
注意:调用virtual函数/任务时,会查询这两条记录后,所以经过连续重载bird中调用的virtual函数最后会调用big_parrot中对应函数
替换式的重载:后者的重载记录会替换前者的重载记录
set_type_override_by_type(bird::get_type(), parrot::get_type());
set_type_override_by_type(bird::get_type(), sparrow::get_type());
注意:这里是否替换重载记录可以通过set_type_override_by_type的第三个参数控制,默认情况为1
- 为1时,存在对同一 被重载的类型 的重载记录时,会用当前重载记录 覆盖 前面的重载记录
- 为0时,存在对同一 被仲裁的类型 的重载记录时,不会 用当前重载记录 覆盖 前面的重载记录
全部0条评论
快来发表一下你的评论吧 !