shallow copy只能复制类中的对象句柄,如果我们还想为这个对象句柄实例化,并复制其中的内容呢?
那就是deep copy的概念了。
deep copy是通过声明自定义的copy函数来实现的,这个自定义的复制函数会复制类中所有对象实例中内容。
下面的实例就实现了一个deep copy函数。
module class_TOP( );
class PCIChild;
logic [7:0] burstC;
function new (logic [7:0] burst);
burstC = burst;
endfunction
endclass : PCIChild
class PCITop;
logic [31:0] addrTop;
logic [31:0] dataTop;
PCIChild PCIc;
function new(logic [31:0] addr, logic [31:0] data, logic
[7:0] burst);
PCIc = new(burst); //instantiate PCIc
addrTop = addr;
dataTop = data;
endfunction
function void copy (PCITop p);
addrTop = p.addrTop;
dataTop = p.dataTop;
PCIc.burstC = p.PCIc.burstC;
endfunction
function void disp (string instName);
$display("[%s] addr = %h data = %h burst=%h", instName, addrTop, dataTop, PCIc.burstC);
endfunction
endclass : PCITop
PCITop PCI1, PCI2;
initial begin;
PCI1 = new (32'h 0000_00f, 32'h f0f0_f0f0, 8'h12);
PCI1.disp("PCI1");
PCI2 = new (1,2,3);
PCI2.copy(PCI1); //deep copy PCI1 into PCI2
PCI2.disp("PCI2"); //copied content displayed
PCI2.addrTop = 32'h1234_5678;
PCI2.dataTop = 32'h5678_abcd;
PCI2.PCIc.burstC = 8'h 9a;
PCI2.disp("PCI2");
PCI1.disp("PCI1");
end
endmodule
仿真log:
[PCI1] addr = 000000ff data = f0f0f0f0 burst=12
[PCI2] addr = 000000ff data = f0f0f0f0 burst=12
[PCI2] addr = 12345678 data = 5678abcd burst=9a
[PCI1] addr = 000000ff data = f0f0f0f0 burst=12
V C S S i m u l a t i o n R e p o r t
上面的例子中,我们实现了一个自定义的“copy”函数 |
function void copy (PCITop p);
addrTop = p.addrTop;
dataTop = p.dataTop;
PCIc.burstC = p.PCIc.burstC;
endfunction
通过一个copy函数我们不仅会复制类中的属性,还复制了类中其他对象句柄指向的内容。
PCI2.copy(PCI1); //deep copy PCI1 into PCI2
结果就是PCI1中的对象PCIc和PCI2中的对象PCIc,最终指向不同的内存空间。
所以当我修改PCI2.PCIc.burstC,不会反映到PCI1.PCIc.burstC。
原作者: 验证哥布林
|