微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微电子和IC设计 > IC验证交流 > 重载与UVM factory 机制

重载与UVM factory 机制

时间:10-02 整理:3721RD 点击:
重载

面向对象的语言都有重载的特征。重载的优势就是可以使得子类实例以父类类型指针传递后,还能表现出子类的行为特性。(使用virtual function/task实现)
SV中额外增加对约束的重载,其实现方式主要有有两种:
1. 使用constraint_mode(0)关闭先前的约束,然后重新randomize_with(新约束)。
2. extends出新的class,在新的class中重新定义新的约束即可。

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("requested_class", this.get_full_name(), name)的方式实例化。因为SV在进行类型检查时会创建一个容器,前者制定了该容器的类型为requested_class,进行override时该容器不能放非派生类的override_class。而后者使用factory.create_object/component_by_name()函数实例化会创建uvm_object/component类型的容器,该容器为最基本的基类(相对于requested_class来说),因此改了类型的容器能够放下被重载类,在重载时也就不会报错。(上述容器即句柄,实质是可以将子类句柄指向父类。)

实例化重载类时,type_id会先去factory的表中查找是否有重载记录,若无,则执行requested_class的new();若有则执行override_class的new().分配物理空间。

factory的调试:factory.print( int all_types=1)参数可为0,1,2 ,default1,打印用户定义的factory参数类。


上述均为笔者近期的学习理解+总结,不足之处欢迎讨论指正O(∩_∩)O~。

多年的老司机,从你的笔记里面解开了一个以前只能花大功夫绕过的难题,
谢谢啦。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top