《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());