SV中的深拷贝、浅拷贝与句柄复制
- 句柄复制
只复制句柄,相当于两个句柄指向同一个对象,永远都只有一个对象。
module tb;
class trans1;
int A = 1,B = 2;
function FA();
endfunction
endclass
class trans2;
int A1 = 3,B1 = 4;
trans1 a = new(); // trans2 里边套一个trans1
function FB();
endfunction
endclass
initial begin
trans2 b = new();
// 句柄复制
trans2 c = b;
c.A1 = 13;
c.a.A = 11;
end
endmodule
改了c句柄里边的内容,b句柄里边的内容会同步更改。因为他们都指向了同一个对象。
================================================
2. 深拷贝和浅拷贝都是指拷贝一个对象,而不是句柄。
浅拷贝时,只会拷贝b对象中的 成员变量A1 ,B1的句柄a,而不会拷贝句柄a所指向的对象中的内容;
深拷贝时,不仅仅会拷贝当前b的对象的成员变量,还会拷贝b实例中的a句柄的对象内容,即进行深层次的复制
1) 浅拷贝
module tb;
class trans1;
int A = 1,B = 2;
function FA();
endfunction
endclass
class trans2;
int A1 = 3,B1 = 4;
trans1 a = new(); // trans2 里边套一个trans1
function FB();
endfunction
endclass
initial begin
trans2 b = new();
// 浅拷贝
trans2 d = new b; // d浅拷贝b,只会拷贝b中的变量和a的句柄。
d.A1 = 23; // 更改d句柄指向的trans中的元素
d.a.A = 21; // 更改d句柄指向的trans中a句柄指向的对象的元素
#20;
end
endmodule
很明显,我更改了d句柄指向的trans中的A1,和d句柄指向的trans中a句柄指向的对象的元素A。
最后b中的A1没有发生任何变化。但是b中句柄a中(套中套)的变量****同步变化了,d中的a的值变为21 2,b中也跟着这样变化。
2 ) 深拷贝需要自定义方法。或者用uvm_copy。