factory机制的重载
任务与函数的重载
SystemVerilog是一种面向对象的语言。面向对象语言都有一大特征:重载。当在父类中定义一个函数/任务时,如果将其设置为virtual类型,那么就可以在子类中重载这个函数/任务:
重载的最大优势是使得一个子类的指针以父类的类型传递时,其表现出的行为依然是子类的行为。
factory机制最伟大的地方在于其具有重载功能。重载并不是factory机制的发明,前面已经介绍过的所有面向对象的语言都支持函数/任务重载,另外,SystemVerilog还额外支持对约束的重载。只是factory机制的重载与这些重载都不一样。
uvm_component函数
extern static function void set_type_override_by_type(uvm_object_wrapper original_type,
uvm_object_wrapper override_type,
bit replace=1);
这个函数有三个参数,其中第三个参数是replace,将会在下节讲述这个参数。在实际应用中一般只用前两个参数,第一个参数是被重载的类型,第二个参数是重载的类型。
有时候可能并不是希望把验证平台中的A类型全部替换成B类型,而只是替换其中的某一部分,这种情况就要用到set_inst_override_by_type函数。这个函数的原型如下:
extern function void set_inst_override_by_type(string relative_inst_path,
uvm_object_wrapper original_type,
uvm_object_wrapper override_type);
其中第一个参数是相对路径,第二个参数是被重载的类型,第三个参数是要重载的类型。
set_inst_override_by_type("env.o_agt.mon", my_monitor::get_type(), new_monitor::get_type());
无论是set_type_override_by_type还是set_inst_override_by_type,它们的参数都是一个uvm_object_wrapper型的类型参数,这种
参数通过xxx::get_type()的形式获得。
UVM还提供了另外一种简单的方法来替换这种晦涩的写法:字符串。与set_type_override_by_type相对的是set_type_override,它的原型是:
extern static function void set_type_override(string original_type_name,
string override_type_name,
bit replace=1);
set_type_override("bird", "parrot")
与set_inst_override_by_type相对的是set_inst_override,它的原型是:
extern function void set_inst_override(string relative_inst_path,
string original_type_name,
string override_type_name);
set_inst_override("env.o_agt.mon", "my_driver", "new_monitor")
如果在一个无法使用component的地方,如在top_tb的initial语句里,就无法使用。UVM提供了另外四个函数来替换上述的四个函数,这四个函数的原型是:
extern 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 (uvm_object_wrapper original_type,
uvm_object_wrapper override_type,
string full_inst_path);
extern function
void set_type_override_by_name (string original_type_name,
string override_type_name,
bit replace=1);
extern function
void set_inst_override_by_name (string original_type_name,
string override_type_name,
string full_inst_path);
这四个函数都位于uvm_factory类中,其中第一个函数与uvm_component中的同名函数类似,传递的参数相同。第二个对应uvm_component中的同名函数,只是其输入参数变了,这里需要输入一个字符串类型的full_inst_path。这个full_inst_path就是要替换的实例中使用get_full_name()得到的路径值。第三个与uvm_component中的set_type_override类似,传递的参数相同。第四个函数对应uvm_component中的set_inst_override,也需要一个full_inst_path。
如何使用这四个函数呢?系统中存在一个uvm_factory类型的全局变量factory。可以在initial语句里使用如下的方式调用这四个函数:
initial begin
factory.set_type_override_by_type(bird::get_type(), parrot::get_type());
end
在一个component内也完全可以直接调用factory机制的重载函数:
factory.set_type_override_by_type(bird::get_type(), parrot::get_type());
事实上,uvm_component的四个重载函数直接调用了factory的相应函数。
浙公网安备 33010602011771号