0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

SystemVerilog中的Shallow Copy

芯片驗證工程師 ? 來源:芯片驗證工程師 ? 作者:芯片驗證工程師 ? 2022-11-21 10:32 ? 次閱讀

SystemVerilog中的句柄賦值對象復制的概念是有區(qū)別的。

PCI p1;
p1 = new;
PCI p2;
p2 = p1; //class assignment

經過上面的代碼執(zhí)行后,“p1”和 “p2” 最終指向的還是同一個內存空間,也就是說他們指向的是同一個對象實例。

如果你希望將p1的內容原封不同地復制到p2,他們就得是兩個不同的對象實例,即指向不同的內存空間。

 PCI p1;
 p1 = new;
 PCI p2;
 p2 = new p1; //shallow copy

在上面的例子中,“p2”是一個新的對象實例,其中所有屬性值都復制自“p1.”

這在概念上稱為“shallow copy”,這是相對于“deep copy”而言的,具體的區(qū)別我們后面的文章會介紹。

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中我們可以發(fā)現PCI2中“addrTop”和“dataTop”修改不會反映到PCI1,而對PCI2中對象PCIc的修改會反映到PCI1。

PCI2.PCIc.burstC = 8'h 9a;

這是因為shallow copy只復制了類中的對象句柄,而沒有為對象PCI2.PCIc再次分配內存空間。

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Verilog
    +關注

    關注

    28

    文章

    1335

    瀏覽量

    109857
  • System
    +關注

    關注

    0

    文章

    164

    瀏覽量

    36804
  • 代碼
    +關注

    關注

    30

    文章

    4697

    瀏覽量

    68085

原文標題:SystemVerilog中的Shallow Copy

文章出處:【微信號:芯片驗證工程師,微信公眾號:芯片驗證工程師】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    SystemVerilog的Deep Copy概念

    shallow copy只能復制類的對象句柄,如果我們還想為這個對象句柄實例化,并復制其中的內容呢?
    發(fā)表于 11-22 09:23 ?404次閱讀

    SystemVerilog的Virtual Methods

    SystemVerilog多態(tài)能夠工作的前提是父類的方法被聲明為virtual的。
    發(fā)表于 11-28 11:12 ?653次閱讀

    SystemVerilog的“const”類屬性

    SystemVerilog可以將類屬性聲明為常量,即“只讀”。目的就是希望,別人可以讀但是不能修改它的值。
    發(fā)表于 11-29 10:25 ?2043次閱讀

    SystemVerilog的聯(lián)合(union)介紹

    SystemVerilog ,聯(lián)合只是信號,可通過不同名稱和縱橫比來加以引用。
    的頭像 發(fā)表于 10-08 15:45 ?1187次閱讀
    <b class='flag-5'>SystemVerilog</b><b class='flag-5'>中</b>的聯(lián)合(union)介紹

    關于SV擴展類的copy函數的疑問

    最近在學習systemverilog,讀的是經典教材《SystemVerilog for Verification》Chris Spear寫的。8.5.1節(jié)對象的復制搞不明白是啥意思。代碼如下
    發(fā)表于 04-07 14:28

    如何用questasim進行systemverilog仿真

    剛接觸systemverilog,最近在采用questasim10.1版本進行仿真時,發(fā)現貌似questasim不支持擴展類的操作?代碼如下:`timescale 1ns/1nsmodule
    發(fā)表于 04-11 09:44

    SystemVerilog的Deep Copy是如何實現的呢

    shallow copy只能復制類的對象句柄,如果我們還想為這個對象句柄實例化,并復制其中的內容呢?那就是deep copy的概念了。deep c
    發(fā)表于 11-25 11:17

    SystemVerilog的斷言手冊

    SystemVerilog Assertion Handbook1 ROLE OF SYSTEMVERILOG ASSERTIONSIN A VERIFICATION METHODOLOGY
    發(fā)表于 07-22 14:12 ?20次下載

    SystemVerilog$cast的應用

    SystemVerilog casting意味著將一種數據類型轉換為另一種數據類型。在將一個變量賦值給另一個變量時,SystemVerilog要求這兩個變量具有相同的數據類型。
    的頭像 發(fā)表于 10-17 14:35 ?2699次閱讀

    SystemVerilog的操作方法

    SystemVerilog提供了幾個內置方法來支持數組搜索、排序等功能。
    的頭像 發(fā)表于 10-31 10:10 ?2578次閱讀

    SystemVerilog可以嵌套的數據結構

    SystemVerilog除了數組、隊列和關聯(lián)數組等數據結構,這些數據結構還可以嵌套。
    的頭像 發(fā)表于 11-03 09:59 ?1514次閱讀

    SystemVerilog的struct

    SystemVerilog“struct”表示相同或不同數據類型的集合。
    的頭像 發(fā)表于 11-07 10:18 ?2327次閱讀

    SystemVerilog的Semaphores

    SystemVerilogSemaphore(旗語)是一個多個進程之間同步的機制之一,這里需要同步的原因是這多個進程共享某些資源。
    的頭像 發(fā)表于 12-12 09:50 ?3223次閱讀

    帶你了解SystemVerilog的關聯(lián)數組

    SystemVerilog,我們知道可以使用動態(tài)數組實現數組元素個數的動態(tài)分配,即隨用隨分
    的頭像 發(fā)表于 06-09 09:46 ?6981次閱讀
    帶你了解<b class='flag-5'>SystemVerilog</b><b class='flag-5'>中</b>的關聯(lián)數組

    Systemverilog的Driving Strength講解

    systemverilog,net用于對電路連線進行建模,driving strength(驅動強度)可以讓net變量值的建模更加精確。
    的頭像 發(fā)表于 06-14 15:50 ?1399次閱讀
    <b class='flag-5'>Systemverilog</b><b class='flag-5'>中</b>的Driving Strength講解