[UVM源代码研究] 谈谈uvm中的浅拷贝(shallow copy)与深拷贝(deep copy)
在开启这个话题前,我们有必要对copy相关的几个基本概念做个简单的介绍。
浅拷贝(shallow)与深拷贝(deep copy)
这是面对对象语言都会涉及的一个基本概念,不仅限于sv和uvm
浅拷贝:拷贝就是拷贝指向对象的指针,意思就是说:拷贝出来的目标对象的指针和源对象的指针指向的内存空间是同一块空间,浅拷贝只是一种简单的拷贝,让几个对象共用一个内存,然而当内存销毁的时候,指向这个内存空间的所有指针需要重新定义,不然会造成野指针错误。
深拷贝:深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响,即指针指向的空间内容也会被复制一份。比较典型的就是Value(值)对象,如预定义类型Int32,Double,以及结构(struct),枚举(Enum)等会自动执行深拷贝,而类类型的对象深拷贝和浅拷贝则不同。
UVM中的的copy和clone
我们先来看下uvm_object中关于copy和clone的相关的定义




我们的出如下结论:
-
copy是个非virtual的没有返回值的函数,所以不能被override,但是copy中调用do_copy函数是个没有返回值的virtual函数,所以我们可以通过override do_copy函数来实现对copy函数的间接override。
-
调用copy前对象一定要事先创建好目标对象,因为调用copy只会对目标对象内部定义的对象使用源对象内部的对象进行深拷贝赋值,而不会对目标对象本身分配空间。
-
clone是个virtual返回值是uvm_object的函数,可以被override,但是返回值是uvm_object类型决定了clone只会需要cast给对应的实际类型,而不能直接赋值。clone返回一个指向源对象类型的uvmobject类型的句柄,所以要保证源对象与目标对象类型一致(通过cast给对应的实际类型,而不能直接赋值。clone返回一个指向源对象类型的uvm_object类型的句柄,所以要保证源对象与目标对象类型一致(通过cast

最低0.47元/天 解锁文章
1383

被折叠的 条评论
为什么被折叠?



