SystemVerilog中的Shallow Copy

systemverilog中的句柄赋值和对象复制的概念是有区别的。
pci p1;p1 = new;pci p2;p2 = p1; //class assignment  
经过上面的代码执行后,“p1”和 “p2” 最终指向的还是同一个内存空间,也就是说他们指向的是同一个对象实例。
如果你希望将p1的内容原封不同地复制到p2,他们就得是两个不同的对象实例,即指向不同的内存空间。
pci p1; p1 = new; pci p2; p2 = new p1; //shallow copy  
在上面的例子中,“p2”是一个新的对象实例,其中所有属性值都复制自“p1.”
这在概念上称为“shallow copy”,这是相对于“deep copy”而言的,具体的区别我们后面的文章会介绍。
shallow copy会复制对象中所有的属性,包括类中其他的对象句柄,注意只能复制类中的对象句柄,而不能复制类中其他的对象实例。
在上图中,我们声明了一个类“pci” 和2个类句柄“p1” 和“p2”。 
我们实例化“p1”,如上图所示分配的物理地址空间是0xffff,属性addr和data的初始值都是0。
然后别分别赋值addr为‘h12,data为‘h56。
shallow copy p1到p2,会分配一个新的物理地址空间0xf0f0。并且将p1中的“addr”和“data”复制给p2。
p2 = new p1;  
我们改变p2中addr为34,data为78。因为是不同的对象实例,所以p2不会影响到p1。
假如我们想要复制的类中还有一个类对象,情况会怎样?
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; task pcim(logic [31:0] addr, logic [31:0] data, logic [7:0] burst); pcic = new(burst); //instantiate pcic addrtop = addr; datatop = data; endtask 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; pci1.pcim(32'h 0000_00f, 32'h f0f0_f0f0, 8'h12); pci1.disp(pci1); pci2 = new pci1; //shallow copy of 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=9a v c s s i m u l a t i o n r e p o r t  
在上面的例子中,我们声明了一个名为pcichild的类,其中含有属性“burstc”。
我们还声明了一个叫做pcitop的类,它有两个属性“addrtop”和“datatop”。
我们在类pcitop中声明类型为pcichild的变量pcic并在任务“pcim”中实例化。
因此,pcic现在拥有一个pcichild类型的对象句柄。
后面我们声明两个类型为pcitop的变量“pci1”和“pci2”,并实例化pci1。然后我们将pci1的shallow copy到pci2中(pci2 = new pci1;)。
在打印的log中我们可以发现pci2中“addrtop”和“datatop”修改不会反映到pci1,而对pci2中对象pcic的修改会反映到pci1。
pci2.pcic.burstc = 8'h 9a;  
这是因为shallow copy只复制了类中的对象句柄,而没有为对象pci2.pcic再次分配内存空间。


基于ARM920T处理器核的图像采集系统设计
2023电机向高能效持续演进,2024集成化趋势继续引领电机高效驱控风向
创维集团再次入围2023中国企业500强
区块链社交聊天系统开发,币圈微信APP开发,社交直播软件开发
缺乏核心专利,中国机器人A、B两面各有难处
SystemVerilog中的Shallow Copy
全球FPC业等手机通信供应商 与华为开启“备胎”战
Seegrid推出视觉引导汽车,可将VGV电池充电过程实现自动化
分布式的产生与定义
用ds1302做时钟电路图详解
启扬安卓智能快递柜中控机解决方案
工业4.0引领制造业步入云端革命
创通联达推出智能模组产品TurboX CM2290/C2290 SOM
浅显易懂地揭开.Net生态系统的神秘面纱!
超声波液位传感器的组成及工作原理
单片机的组成和指令系统与汇编语言程序及CPU和存储器等常见问题说明
中国电信公布其5G套餐资费,从199元到599元不等
一款基于定制ASIC芯片设计的低功耗柔性智能手势识别系统
酷派海外千元智能机出货量同比增长200%以上
PCL中法线空间采样介绍