提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
。
一、浅复制
我们知道采用sv中的new()函数就可以实现对象的创建,同样的对于对象的复制可以利用new来实现。
如:class zhangsan;
bit [3:0] data, addr;
endclass
zhangshan A, B; //声明两个句柄
initial begin
A = new; //创建一个对象
B = new A; //将A对象 复制一份给B对象
end
那如果对于张三这个类当中还有其他类的句柄时,此时采用复制函数new只能复制高一级的对象内容,对于低一级的对象不能被复制。
如果浅复制了含有类句柄的类,则当更改类句柄类中对象的值之后,在高一级类当中也是可以看的到的,相当于两个高一级的类对象共享一个低一级对象。
二、深复制
1.编写自己的copy函数
由于浅复制复制的完备性较差,不能很好赋值低一级类当中的内容,因而这里引出了深复制。
class lisi;
bit [3:0] addr, data;
zhangsan A;
static int count = 0;
int id = 0;
function new
A = new;
id = count ++;
endfunction
function lisi copy;//定义一个类方法
copy = new();
copy.addr = addr; //类方法中的变量赋值为当前类中的变量
endfunction
function lisi copy;
copy = new();
copy.addr = addr;
copy.data = data;
copy.A = A.copy();
id = count ++;
endfunction
endclass
class zhangsan;
int C,D;
function zhangsan copy();
copy = new();
copy.A = A;
copy.B = B;
endfunction
endclass
总结
通过在类中定义一个类copy函数,当调用此函数时,由于本身含有实例化,及复制的作用,可以很有效地完成深度复制的工作。