在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 4592|回复: 1

重载与UVM factory 机制

[复制链接]
发表于 2016-5-13 18:59:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
重载


面向对象的语言都有重载的特征。重载的优势就是可以使得子类实例以父类类型指针传递后,还能表现出子类的行为特性。(使用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~。

                               
登录/注册后可看大图
发表于 2016-7-15 18:02:30 | 显示全部楼层
多年的老司机,从你的笔记里面解开了一个以前只能花大功夫绕过的难题,
谢谢啦。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-9-21 19:52 , Processed in 0.017018 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表