RM新时代网站-首页

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

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

SystemVerilog中的Shallow Copy

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

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

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

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

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

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

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

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

shallow copy會復(fù)制對象中所有的屬性,包括類中其他的對象句柄,注意只能復(fù)制類中的對象句柄,而不能復(fù)制類中其他的對象實(shí)例。

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

在上圖中,我們聲明了一個類“PCI” 和2個類句柄“p1” 和“p2”。

我們實(shí)例化“p1”,如上圖所示分配的物理地址空間是0xffff,屬性addr和data的初始值都是0。

然后別分別賦值addr為‘h12,data為‘h56。

shallow copy p1到p2,會分配一個新的物理地址空間0xf0f0。并且將p1中的“addr”和“data”復(fù)制給p2。

p2 = new p1;

我們改變p2中addr為34,data為78。因?yàn)槭遣煌膶ο髮?shí)例,所以p2不會影響到p1。

假如我們想要復(fù)制的類中還有一個類對象,情況會怎樣?

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并在任務(wù)“PCIM”中實(shí)例化。

因此,PCIc現(xiàn)在擁有一個PCIChild類型的對象句柄。

后面我們聲明兩個類型為PCITop的變量“PCI1”和“PCI2”,并實(shí)例化PCI1。然后我們將PCI1的shallow copy到PCI2中(PCI2 = new PCI1;)。

在打印的log中我們可以發(fā)現(xiàn)PCI2中“addrTop”和“dataTop”修改不會反映到PCI1,而對PCI2中對象PCIc的修改會反映到PCI1。

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

這是因?yàn)閟hallow copy只復(fù)制了類中的對象句柄,而沒有為對象PCI2.PCIc再次分配內(nèi)存空間。

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

    關(guān)注

    28

    文章

    1351

    瀏覽量

    110074
  • System
    +關(guān)注

    關(guān)注

    0

    文章

    165

    瀏覽量

    36928
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4779

    瀏覽量

    68521

原文標(biāo)題:SystemVerilog中的Shallow Copy

文章出處:【微信號:芯片驗(yàn)證工程師,微信公眾號:芯片驗(yàn)證工程師】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    SystemVerilog的Deep Copy概念

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

    SystemVerilog的Virtual Methods

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

    SystemVerilog的“const”類屬性

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

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

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

    關(guān)于SV擴(kuò)展類的copy函數(shù)的疑問

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

    如何用questasim進(jìn)行systemverilog仿真

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

    SystemVerilog的Deep Copy是如何實(shí)現(xiàn)的呢

    shallow copy只能復(fù)制類的對象句柄,如果我們還想為這個對象句柄實(shí)例化,并復(fù)制其中的內(nèi)容呢?那就是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的應(yīng)用

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

    SystemVerilog的操作方法

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

    SystemVerilog可以嵌套的數(shù)據(jù)結(jié)構(gòu)

    SystemVerilog除了數(shù)組、隊(duì)列和關(guān)聯(lián)數(shù)組等數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)還可以嵌套。
    的頭像 發(fā)表于 11-03 09:59 ?1593次閱讀

    SystemVerilog的struct

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

    SystemVerilog的Semaphores

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

    帶你了解SystemVerilog的關(guān)聯(lián)數(shù)組

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

    Systemverilog的Driving Strength講解

    systemverilog,net用于對電路連線進(jìn)行建模,driving strength(驅(qū)動強(qiáng)度)可以讓net變量值的建模更加精確。
    的頭像 發(fā)表于 06-14 15:50 ?1561次閱讀
    <b class='flag-5'>Systemverilog</b><b class='flag-5'>中</b>的Driving Strength講解
    RM新时代网站-首页