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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 719|回复: 7

[求助] UVM clone, 如果两个成员句柄指向同一个对象, 只能复制其中一个

[复制链接]
发表于 2023-10-22 19:50:35 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 liutang2010 于 2023-10-22 19:58 编辑

代码如图

微信图片_20231022193602.jpg
微信图片_20231022193548.jpg



结果只能复制obj1?这是啥原因
微信图片_20231022193610.jpg





发表于 2023-10-24 15:26:35 | 显示全部楼层
这里核心原因是obj2没有使用type_id::create()注册进去factory机制里面,所以clone函数在这里对obj2并不工作。。直接句柄赋值并不会代替你进行factory注册,而调用clone和print函数的过程,类XACT里面你又不自己重写新的clone函数,用本来的clone函数调用之后又不重新再赋值一次句柄,凭啥它能起效?
两种解决办法:一是将init()里面的obj2直接句柄赋值改成type_id::create()注册以及obj2对obj1进行clone;二是将tr2对tr1的clone之后再进行一次tr2.obj2对tr1.obj2的句柄赋值。。。
factory机制的基础理解不牢,case close
发表于 2023-10-24 18:05:06 | 显示全部楼层
uvm里面有一个类uvm_copy_map,类里面有一个m_map[],用来实现字典的功能。
存在一个全局的uvm_copy_map uvm_global_copy_map = new,专门用来记录copy操作里面的映射关系。
copy操作的源码部分是:
...
if ((rhs!==null)&&uvm_global_copy_map.exist(rhs)) begin
    return;
end
...
uvm_global_copy_map.set(rhs,this);
// do copy here
...
你的代码里面tr1.clone的时候调用了2次__m_uvm_field_automation(),第一次__m_uvm_field_automation(obj1,UVM_COPY,"")的时候map表里面还没有这组映射关系,所以if不成立,把这组句柄-对象写到了表里面,再执行了copy操作。第二次__m_uvm_field_automation(obj2,UVM_COPY,"")的时候,由于这两个句柄指向同一个对象,所以if成立,copy函数直接返回了,不再执行下面的复制操作,导致obj2的值是初始值0。
发表于 2023-10-24 18:06:45 | 显示全部楼层


G7ngko 发表于 2023-10-24 18:05
uvm里面有一个类uvm_copy_map,类里面有一个m_map[],用来实现字典的功能。
存在一个全局的uvm_copy_map uv ...


所以我认为clone函数对obj2是工作的,只是不产生任何效果而已。
 楼主| 发表于 2023-10-29 15:47:24 | 显示全部楼层
本帖最后由 liutang2010 于 2023-10-29 15:49 编辑


qsh123_123 发表于 2023-10-24 15:26
这里核心原因是obj2没有使用type_id::create()注册进去factory机制里面,所以clone函数在这里对obj2并不工 ...


有没有注册是由`uvm_field 宏决定的,和type_id::create没有关系。type_id::create只是用于在调用type_override_by..函数后决定创建什么类型的对象而已,用new一样是可以clone的,代码如图。
obj2不需要单独调用new或type_id::create。你说的第一种方法,obj2既然都clone了obj1,那都是两个不同对象了,自然是可以clone的。感觉还是得自己写个do_copy
捕获.JPG 捕获2.JPG
 楼主| 发表于 2023-10-29 16:05:32 | 显示全部楼层


G7ngko 发表于 2023-10-24 18:05
uvm里面有一个类uvm_copy_map,类里面有一个m_map[],用来实现字典的功能。
存在一个全局的uvm_copy_map uv ...


所以我理解的是相同的成员对象应该只能被copy一次。对于对象,其成员是句柄数组的情形,就很难确定是不是有两个句柄指向同一个对象。所以还是得自己写个clone。。。
发表于 2023-10-30 11:33:11 | 显示全部楼层
发表于 2024-1-22 10:22:19 | 显示全部楼层
new()中的name和类名不一致?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-5-1 22:20 , Processed in 0.030701 second(s), 8 queries , Gzip On, Redis On.

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