UVM 覆盖方法
一、概述
工厂提供的便利—覆盖
覆盖机制可以将其原来所属的类型替换为另外一个新的类型。
在覆盖之后,原本用来创建原属类型的请求,将由工厂来创建新的替换类型。
覆盖带来的便利:
1.无需再修改原始代码,继而保持了原有代码的封装性;
2. 新的替换类型必须与被替换类型相兼容,否则稍后的句柄赋值将失败,所以使用继承。//新定义的类型必须继承于原有的类型。
做顶层修改时,非常方便!
1.允许灵活的配置,例如可使用子类来覆盖原本的父类;
2.可使用不同的对象来修改其代码行为。
要想实现覆盖特性,原有类型和新类型均需要注册。
当使用create()来创建对象时:
1.工厂会检查,是否原有类型被覆盖
2.如果是,那么它会创建一个新类型的对象
3.如果不是,那么它会创建一个原有类型的对象
覆盖发生时,可以使用“类型覆盖”或者"实例覆盖"
1.类型覆盖指,UVM层次结构下的所有原有类型都被覆盖类型所替换。
2.实例覆盖指,在某些位置中的原有类型会被覆盖类型所替换。
二、覆盖方法
set_type_override()
static function void set_type_override(uvm_object_wrapper override_type,bit replace=1);
- uvm_object_wrapper override_type
它并不是某一个具体实例的句柄,实际上是注册过后的某一个类在工厂中注册时的句柄。怎么找到它呢?就使用new_type::get_type()。 - bit replace
1:如果已经有覆盖存在,那么新的覆盖会替代旧的覆盖。
2:如果已经有覆盖存在,那么该覆盖将不会生效。 - set_type_override是一个静态函数
orig_type::type_id::set_type_override(new_type::get_type())
orig_type是原有的类型,new_type是新的类型
set_inst_override()
static function void set_inst_override(uvm_object_wrapper override_type,string inst_path,uvm_component parent=null);
- string inst_path指向的是组件结构的路径字符串
- uvm_component parent=null
如果缺省,表示使用inst_path内容为绝对路径
如果有值传递,则使用{parent.get_full_name(),"",inst_path}来作为目标路径。 - orig_type::type_id::set_inst_override(new_type::get_type(),“orig_i