嵌入式技术
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。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !