[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的问题。