set_type_override_by_type其overrid_type必须是original_type的子类,现在碰到一个case:
原本有一个父类base_sequence。
其它子类的sequence都是从这个base_sequence里面引出来的。
后来,design基本属性有变化,本来想直接再extends出一个子类,然后用set_type_override_by_type去overrid父类,理所当然的想到其它子类就会继承到这个变化 。结果失败了!
从结果来看,通过子类去override父类以达到更改其它兄弟类是办不到的。这个属性一开始就应该规划到sequence_item里面去。只是在做testplan时为了针对不同sequence方便统一constraint少写几行代码,现在看来是划不来的。
另附另外解釋,似乎可以解決這一問題,直接兄弟類之前進行重載:
set_type_override_by_type(child_a.get_type(), child_b.get_type())
UVM中factory机制的重载
UVM提供以下函数实现override:
set_type_override()
set_inst_override()
set_type_override_by_type()
set_inst_override_by_type()
以上四个函数只能在component中使用,tb_top(与uvm_test_top是相互独立的两棵树)中无法使用,只能使用下面四个:
factory.set_type_override_by_type()
factory.set_inst_override_by_type()
factory.set_type_override_by_name()
factory.set_inst_override_by_name()
其中*inst*是针对部分指定的object/component进行override,*type*针对所有override。
张强的书中提到使用factory重载有四个前提如下:
1. 注册到factory中(uvm_object/component_utils())
2. 使用factory机制即代理类type_id::create()方式实例化,而不是new()的方式。
3. 重载类与被重载类是派生关系,或有多重重载时,最终重载类与最初被重载类是派生关系。
4. component与object不能互相重载。
针对上述第三点,需要指出的是两个平行的类(即派生自同一个父类)的也是可以互相重载的,只是被重载的类requested_class不能使用requested_class::type_id::create()的方式实例化,而要使用factory.create_object/component_by_name/type的方式实例化。因为SV在进行类型检查时会创建一个容器,前者制定了该容器的类型为requested_class,进行override时该容器不能放非派生类的override_class。而后者使用factory.create_object/component_by_name/type()函数实例化会创建uvm_object/component类型的容器,该容器为最基本的基类(相对于requested_class来说),因此改了类型的容器能够放下被重载类,在重载时也就不会报错。(上述容器即句柄,实质是可以将子类句柄指向父类。)
实例化重载类时,type_id会先去factory的表中查找是否有重载记录,若无,则执行requested_class的new();若有则执行override_class的new().分配物理空间。