story · 2022年11月24日 · 北京市

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。

作者: 验证哥布林
来源:数字芯片实验室

推荐阅读

更多数字IC设计技术干货等请关注数字芯片实验室专栏。添加极术小姐姐(微信:aijishu20)微信可申请加入IC设计交流群。
推荐阅读
关注数
12319
内容数
221
前瞻性的眼光,和持之以恒的学习~
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息