html duplicate id reference_为什么使用type_id::create创建object无法传入name参数?

8d1cca2df022cf8a05c860d18a2f7a6f.png

今天在仿真实验时遇到一个有趣的问题。通过type_id::create创建object需要传入字符串name,但是测试发现,在new function中打印显示传入的name,始终是默认值。

class 

Result:

reporter [CREATE] obj1 type [obj1] created

看起来“o1”并没有传进new函数,因此打印了默认值。

通过查看UVM源码,找到以下代码(uvm_object_defines.svh):

// m_uvm_object_create_func

看起来现在的代码走到了`else分支。

通过补充set_name function,验证了猜想:

function 

Result:

reporter [CREATE] obj1 type [obj1] created
reporter [SET_NAME] obj1 type [o1] set

这样看似乎解决了这个问题。不过如果能走第一个分支,似乎就不存在这个问题了。

之后再次经过搜索代码以及查看仿真工具设置,澄清了这个问题。

首先,我使用的仿真器默认使用UVM1.1d,在这个版本的UVM中,默认不会开UVM_NO_DEPRECATED这个define,因此没有define UVM_OBJECT_MUST_HAVE_CONSTRUCTOR(uvm_macros.svh),从而在上文编译处走`else分支。

//

其次,在UVM1.2中,已经要求默认define UVM_OBJECT_MUST_HAVE_CONSTRUCTOR。这一点可以在UVM1.2 Release Notes Mantis 4518中看到。

371cada03a35e0f78bfd76536b9f392b.png

并且还附上了解释:

https://verificationacademy.com/verification-methodology-reference/uvm/docs_1.2/html/files/overviews/relnotes-txt.html#Why_uvm_object_constructors_are_now_mandatory​verificationacademy.com

UVM 1.2 Release Notes

UVM 1.2 Release Notes​verificationacademy.com

基本上和上文所述一致,即UVM推荐在uvm_object类的new函数中使用name参数,但是一旦使用之后,通过new("o1")直接例化object,和通过type_id::create("o1")造成的结果可能是不一致的。如果在new函数中需要使用name参数,这种不一致性就可能造成令人困扰的结果。

同时,解释中还提到在UVM1.3中,将只保留修改后这种正确的方式。

e0b06e40eb514d9272c7d8146f5fe0bf.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值