0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

SystemVerilog中的Shallow Copy

芯片验证工程师 来源:芯片验证工程师 作者:芯片验证工程师 2022-11-21 10:32 次阅读

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会复制对象中所有的属性,包括类中其他的对象句柄,注意只能复制类中的对象句柄,而不能复制类中其他的对象实例。

f36bf2b2-688a-11ed-8abf-dac502259ad0.png

在上图中,我们声明了一个类“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再次分配内存空间。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog
    +关注

    关注

    28

    文章

    1351

    浏览量

    110088
  • System
    +关注

    关注

    0

    文章

    165

    浏览量

    36939
  • 代码
    +关注

    关注

    30

    文章

    4786

    浏览量

    68565

原文标题:SystemVerilog中的Shallow Copy

文章出处:【微信号:芯片验证工程师,微信公众号:芯片验证工程师】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    SystemVerilog的Deep Copy概念

    shallow copy只能复制类的对象句柄,如果我们还想为这个对象句柄实例化,并复制其中的内容呢?
    发表于 11-22 09:23 431次阅读

    SystemVerilog的Virtual Methods

    SystemVerilog多态能够工作的前提是父类的方法被声明为virtual的。
    发表于 11-28 11:12 704次阅读

    SystemVerilog的“const”类属性

    SystemVerilog可以将类属性声明为常量,即“只读”。目的就是希望,别人可以读但是不能修改它的值。
    发表于 11-29 10:25 2137次阅读

    SystemVerilog的联合(union)介绍

    SystemVerilog ,联合只是信号,可通过不同名称和纵横比来加以引用。
    的头像 发表于 10-08 15:45 1398次阅读
    <b class='flag-5'>SystemVerilog</b><b class='flag-5'>中</b>的联合(union)介绍

    关于SV扩展类的copy函数的疑问

    最近在学习systemverilog,读的是经典教材《SystemVerilog for Verification》Chris Spear写的。8.5.1节对象的复制搞不明白是啥意思。代码如下
    发表于 04-07 14:28

    如何用questasim进行systemverilog仿真

    刚接触systemverilog,最近在采用questasim10.1版本进行仿真时,发现貌似questasim不支持扩展类的操作?代码如下:`timescale 1ns/1nsmodule
    发表于 04-11 09:44

    SystemVerilog的Deep Copy是如何实现的呢

    shallow copy只能复制类的对象句柄,如果我们还想为这个对象句柄实例化,并复制其中的内容呢?那就是deep copy的概念了。deep c
    发表于 11-25 11:17

    SystemVerilog的断言手册

    SystemVerilog Assertion Handbook1 ROLE OF SYSTEMVERILOG ASSERTIONSIN A VERIFICATION METHODOLOGY
    发表于 07-22 14:12 20次下载

    SystemVerilog$cast的应用

    SystemVerilog casting意味着将一种数据类型转换为另一种数据类型。在将一个变量赋值给另一个变量时,SystemVerilog要求这两个变量具有相同的数据类型。
    的头像 发表于 10-17 14:35 2852次阅读

    SystemVerilog的操作方法

    SystemVerilog提供了几个内置方法来支持数组搜索、排序等功能。
    的头像 发表于 10-31 10:10 2825次阅读

    SystemVerilog可以嵌套的数据结构

    SystemVerilog除了数组、队列和关联数组等数据结构,这些数据结构还可以嵌套。
    的头像 发表于 11-03 09:59 1599次阅读

    SystemVerilog的struct

    SystemVerilog“struct”表示相同或不同数据类型的集合。
    的头像 发表于 11-07 10:18 2455次阅读

    SystemVerilog的Semaphores

    SystemVerilogSemaphore(旗语)是一个多个进程之间同步的机制之一,这里需要同步的原因是这多个进程共享某些资源。
    的头像 发表于 12-12 09:50 3373次阅读

    带你了解SystemVerilog的关联数组

    SystemVerilog,我们知道可以使用动态数组实现数组元素个数的动态分配,即随用随分
    的头像 发表于 06-09 09:46 7463次阅读
    带你了解<b class='flag-5'>SystemVerilog</b><b class='flag-5'>中</b>的关联数组

    Systemverilog的Driving Strength讲解

    systemverilog,net用于对电路连线进行建模,driving strength(驱动强度)可以让net变量值的建模更加精确。
    的头像 发表于 06-14 15:50 1572次阅读
    <b class='flag-5'>Systemverilog</b><b class='flag-5'>中</b>的Driving Strength讲解