《UVM实战》笔记 UVM中的factory机制(重载)

第8章 UVM中的factory机制(重载)

只要是面向对象的语言,都有重载功能。

使用set_type_override_by_type函数可以实现两种不同类型之间的重载,

set_inst_override_by_type函数(并不是希望把验证平台中的A类型全部替换成B类型,而只是替换其中的某一部分)

extern static function void set_type_override_by_type
				(uvm_object_wrapper original_type,   
//第一个参数是被重载的类型,父类
				uvm_object_wrapper override_type,    
//第二个参数是重载的类型。子类
				bit replace=1);
extern function void set_inst_override_by_type(string relative_inst_path,   
  //其中第一个参数是相对路径,
						uvm_object_wrapper original_type,  
                          //第二个参数是被重载的类型,父类
						uvm_object_wrapper override_type);

无论是set_type_override_by_type还是set_inst_override_by_type,它们的参数都是一个uvm_object_wrapper型的类型参数,这种参数通过xxx::get_type()的形式获得。

set_type_override_by_type(bird::get_type(), parrot::get_type());
​​​​​​​//factory机制式的实例化方式

UVM还提供了另外一种简单的方法来替换这种晦涩的写法:字符串。

 set_type_override("bird", "parrot")                             //==set_type_override_by_type
set_inst_override("env.o_agt.mon", "my_driver", "new_monitor"); //==set_inst_override_by_type

注意事项*4:

·第一,无论是重载的类(parrot)还是被重载的类(bird),都要在定义时注册到factory机制中。

·第二,被重载的类(bird)在实例化时,要使用factory机制式的实例化方式,而不能使用传统的new方式

·第三,最重要的是,重载的类(parrot)要与被重载的类(bird)有派生关系。重载的类必须派生自被重载的类,被重载的类必须是重载类的父类。

·第四,component与object之间互相不能重载。虽然uvm_component是派生自uvm_object,但是这两者的血缘关系太远了,远到根本不能重载。从两者的new参数的函数就可以看出来,二者互相重载时,多出来的一个parent参数会使factory机制无所适从。

*8.2.3 复杂的重载

连续重载

set_type_override_by_type(bird::get_type(), parrot::get_type());
set_type_override_by_type(parrot::get_type(), big_parrot::get_type());

替换重载

set_type_override_by_type(bird::get_type(), parrot::get_type());
set_type_override_by_type(bird::get_type(), sparrow::get_type());