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

    文章

    1327

    浏览量

    109312
  • System
    +关注

    关注

    0

    文章

    161

    浏览量

    36575
  • 代码
    +关注

    关注

    30

    文章

    4556

    浏览量

    66814

原文标题:SystemVerilog中的Shallow Copy

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

收藏 人收藏

    评论

    相关推荐

    SystemVerilog中的Deep Copy概念

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

    [启芯公开课] SystemVerilog for Verification

    学快速发展,这些趋势你了解吗?SystemVerilog + VM是目前的主流,在未来也将被大量采用,这些语言和方法学,你熟练掌握了吗?对SoC芯片设计验证感兴趣的朋友,可以关注启芯工作室推出的SoC芯片
    发表于 06-10 09:25

    system verilog copy函数的疑问

    ();copy = new();copy_data(copy);endfunctionendclass这中间copy_data函数有一个传参tr,这个tr是传给
    发表于 03-05 11:32

    systemverilog学习教程

    systemverilog的一些基本语法以及和verilog语言之间的区别。
    发表于 04-01 14:24

    关于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

    round robin 的 systemverilog 代码

    大家好,我对一个 round robin 的 systemverilog 代码有疑惑。https://www.edaplayground.com/x/2TzD代码第49和54行是怎么解析呢 ?
    发表于 03-14 19:16

    做FPGA工程师需要掌握SystemVerilog吗?

    在某大型科技公司的招聘网站上看到招聘逻辑硬件工程师需要掌握SystemVerilog语言,感觉SystemVerilog语言是用于ASIC验证的,那么做FPGA工程师有没有必要掌握SystemVerilog语言呢?
    发表于 08-02 20:30

    使用SystemVerilog来简化FPGA接口的连接方式

    FPGA接口的连接方式。    也许很多FPGA工程师对SystemVerilog并不是很了解,因为以前的FPGA开发工具是不支持SystemVerilog的,导致大家都是用VHDL或者Verilog来
    发表于 01-08 17:23

    SystemVerilog有哪些标准?

    SystemVerilog有哪些标准?
    发表于 06-21 08:09

    SystemVerilog的Deep Copy是如何实现的呢

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

    SystemVerilog Assertion Handbo

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

    SystemVerilog的断言手册

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

    SystemVerilog的正式验证和混合验证

    手册的这一部分探讨了使用SystemVerilog进行验证,然后查看了使用SystemVerilog的优点和缺点。
    发表于 03-29 10:32 23次下载

    SystemVerilog在硬件设计部分有哪些优势

    谈到SystemVerilog,很多工程师都认为SystemVerilog仅仅是一门验证语言,事实上不只如此。传统的Verilog和VHDL被称为HDL(Hardware Description
    的头像 发表于 10-19 11:19 458次阅读
    <b class='flag-5'>SystemVerilog</b>在硬件设计部分有哪些优势