[UVM源代码研究] UVM中在使用field_automation时如果加入了条件控制时无法正常使用copy/clone

文章探讨了在UVM中,当使用field_automation加入条件控制时,copy和clone功能的失效问题。作者提供了三种解决方法:避免条件控制、重写do_copy函数以补充未复制的字段,以及重写copy函数以全面控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[UVM源代码研究] UVM中在使用field_automation时如果加入了条件控制时无法正常使用copy/clone

引言

这个标题相当长,实在没有想到怎么去言简意赅的表达,这是本人今天刚刚遇到的一个问题,有时我们的driver需要支持pipeline就需要把收到get_next_item收到的包备份起来,这时候就会用到内置的函数clone或者copy,在不override这两个函数的情况下,只能通过field_automation里的flag来控制各个字段在调用内置函数时的行为,需不需要copy可以通过UVM_NOCOPY来控制,但是如果field_automation添加了条件控制,那就带来新的问题了。

问题描述

在transaction中有如图1所示的field_automation的定义

图1 transaction中field_automation代码段截图

在这里插入图片描述

而我们在driver中收到包之后clone一份的代码如图2所示

图2 driver中收包clone代码段截图

在这里插入图片描述

driver里收到包之后会存到mailbox中等到总线空闲时再发包,这里我们需要看下UVM源代码中clone函数的定义,如图3所示

图3 src/base/uvm_object.svh中clone函数的定义

在这里插入图片描述

可以看到本质上也是调用了copy函数,只不过多了1008行一个开辟空间的代码,也就是我们在前面的文章里提到的clone=new+copy,那么问题就来了,这里copy调用的实际上是新new的这个tmp变量中的copy函数,即transaction里定义的copy函数,如果用户没有override do_copy函数的话(do_copy是UVM源代码留给用户使用的一个hook),那么调用的就是UVM源代码中的copy函数,如图4所示

图4 src/base/uvm_object.svh中copy和do_copy函数的定义

在这里插入图片描述

可以看到UVM源代码中并没有实现do_copy()函数,只是在copy()函数中调用了do_copy(),如果用户没有override也就不做任何内容。

图4中的核心代码就是1035行的__m_uvm_field_automation函数,关于这个函数的详细介绍见我之前的文章:[UVM源代码研究] UVM的field_automation实现的print()函数如何灵活控制打印数组元素的数量

可以认为这个函数就是将调用copy函数的object里的field_automation没有添加UVM_NOCOPY的field进行copy操作。

这里我们发现问题了,结合图1,虽然我们要copy的对象中extended_en=1,但是我们调用copy函数的对象(即在clone函数中新创建的)默认值extended_en是0,那么根据field_automation的控制,extended_id这个变量压根没有被field_automation注册,自然也就不会执行任何copy、pack等等行为,自然也就没法达到我们预期的效果了,所以添加打印信息我们可以看到driver收到的包以及clone之后的包如图5图6所示,extended_id没有成功复制。

图5 driver收到的包

在这里插入图片描述

图6 clone之后的包

在这里插入图片描述

解决方法

1. field_automation慎用条件控制

这个只是逃避了可能存在的风险,但是并没有从本质上解决问题。不用条件控制虽然解决了copy出错的情况,但是后续如果想要使用compare和print等函数时,就是一刀切的处理了,由此可能引发更多的问题,所以除非特别清楚使用场景,否则不推荐。

2. 重写do_copy函数

这个从本质上解决问题了,图4我们看到不管我们是否override do_copy()函数,UVM源代码在执行copy()的时候都会执行__m_uvm_field_automation函数,等于说do_copy()相当于在原有copy内容之后的一点补充,说白了就是field_automation没有copy的内容进行补充,那么问题就迎刃而解了,do_copy()代码如图7所示

图7 do_copy()函数实例

在这里插入图片描述

由于是override,do_copy()的函数原型必须严格按照UVM源代码规定的参数、返回值来定义,这样就可以从根本上解决条件控制field_automation导致的copy失败或copy错误的问题,这个do_copy()函数不仅可以补充没有copy的field,还可以对copy出错的结果进行覆盖,原理是一样的,就是利用了do_copy()函数在__m_uvm_field_automation函数后执行的特点。

3. 重写copy()函数

这个就更加暴力了,就是不管你field_automation里是怎么控制UVM_COPY的注册的,我直接替换掉copy函数,这个所需的代码量要比do_copy()大很多,也没有太多技巧可言,这里就不展开介绍了。

总结

本文从UVM源代码实现的角度解决了UVM中在使用field_automation时如果加入了条件控制时无法正常使用copy/clone的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值