ARM技术论坛
直播中

贾虎世

7年用户 1689经验值
私信 关注
[经验]

SystemVerilog中的Deep Copy是如何实现的呢

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。

原作者: 验证哥布林

更多回帖

发帖
×
20
完善资料,
赚取积分