SystemVerilog中的Deep Copy概念

嵌入式技术

1368人已加入

描述

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。

 审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分