RM新时代网站-首页

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

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

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

SystemVerilog語言中的Upcasting和Downcasting概念解析

芯片驗(yàn)證工程師 ? 來源:芯片驗(yàn)證工程師 ? 作者:驗(yàn)證哥布林 ? 2022-11-24 09:58 ? 次閱讀

要想理解清楚SystemVerilog語言中的Upcasting和Downcasting概念,最好的方式從內(nèi)存分配的角度理解。

57c37406-6b24-11ed-8abf-dac502259ad0.png

class “e”擴(kuò)展自class “c”,class “c”又繼承自class “a”。同時(shí),class “b”擴(kuò)展自class “a.”

如果我們執(zhí)行了下面的代碼:

 a a1; //base class variable
 e e1;
 e1 = new;
 a1 = e1; //assigning extended object handle 'e1' to base class variable 'a1'

當(dāng)我們實(shí)例化'e1 = new()'時(shí),同時(shí)我們實(shí)例化了class e, class c和class a。

將擴(kuò)展對(duì)象句柄“e1”賦值給基類句柄a1,就是一個(gè)“upcast”。

這意味著,如果你此時(shí)你訪問“a1.i”,實(shí)際上訪問到的就是上面class a所占用的內(nèi)存空間。

換句話說,“a1.i”、“c1.i”和“e1.i”實(shí)際上是不同的內(nèi)容。

SystemVerilog支持Upcasting,即將擴(kuò)展類句柄直接賦值給基類句柄。

 a a1;
 e e1;
 a1 = new;
 e1 = a1; //ILLEGAL

在上面的例子中,我們實(shí)例化了對(duì)象a1,此時(shí)會(huì)為對(duì)象a1分配內(nèi)存空間,但是此時(shí)并沒有為對(duì)象c1和對(duì)象e1分配內(nèi)存空間。

所以,如果此時(shí)我們賦值“e1 = a1”是不允許的,因?yàn)閑1并沒有一個(gè)合適的物理空間去指向。

這種就是downcasting的概念,只能通過$cast()進(jìn)行檢查之后(如果a1確實(shí)指向了一個(gè)足夠的內(nèi)存空間e1就可以賦值)才能完成賦值。

$cast(e1,a1); //dynamic casting

首先看一個(gè)將子類句柄賦值給父類的示例:

class p_class;
bit [31:0] p_Var;
function void display();
$display("p_Var = %0d",p_Var);
endfunction
endclass

class c_class extends p_class;
bit [31:0] c_Var;

function void display( );
super.display( );
$display("c_Var = %0d",c_Var);
endfunction
endclass

module top;
initial begin
p_class p;
c_class c = new( );
c.p_Var = 10;
c.c_Var = 20;
//assigning child class handle to parent class variable
p = c;
c.display( );
end
endmodule

在這個(gè)例子中,我們聲明了一個(gè)父類“p_class”和其擴(kuò)展類“c_class.”

然后賦值c_class中的屬性 c.p_Var和c.c_Var,最后進(jìn)行upcasting,打印信息如下:

p_Var = 10
c_Var = 20
 V C S S i m u l a t i o n R e p o r t

因?yàn)槲覀冊(cè)趯?shí)例化c_class時(shí),同樣為其父類p_class分配了內(nèi)存空間。

相反,如果我們將父類句柄賦值給子類句柄

c = p

會(huì)得到一個(gè)編譯錯(cuò)誤

Error-[SV-ICA] Illegal class assignment
testbench.sv, 32
"c = p;"
Expression 'p' on rhs is not a class or a compatible class and hence cannot
be assigned to a class handle on lhs.
Please make sure that the lhs and rhs expressions are compatible.

我們?cè)倏匆粋€(gè)upcast的示例:

class animals;
 string color = "white";
 function void disp;
 $display("color = %s", color);
 endfunction
 endclass
 
 class bufalo extends animals;
 string color = "black";
 function void disp;
 $display("color = %s", color);
 endfunction
 endclass
 
 program tb;
 initial begin
 animals p;
 bufalo c;
 c = new( ); //allocate memory for c
 //this will allocate memory for both 'c' and 'p'
 p = c; //upcasting
 p.disp;
 c.disp;
 end
 endprogram

仿真log:

color = white
color = black

$fnish at simulation time 0
 V C S S i m u l a t i o n R e p o r t

在上面的例子中,雖然我們只是實(shí)例化了擴(kuò)展類bufalo,但是同時(shí)也為父類animals分配的內(nèi)存空間,所以打印了

color = white
color = black




審核編輯:劉清

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

    關(guān)注

    0

    文章

    113

    瀏覽量

    8224

原文標(biāo)題:SystemVerilog中的Upcasting和Downcasting

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語言中多級(jí)指針的概念和使用方法

    多級(jí)指針在C語言中是一種特殊的指針類型,它可以指向其他指針的指針。
    發(fā)表于 08-16 16:16 ?1078次閱讀

    C語言中指針的基本概念和用法

    在C語言中,指針是一項(xiàng)重要的概念,它允許我們直接訪問和操作內(nèi)存地址。
    發(fā)表于 08-17 15:30 ?756次閱讀

    C語言中枚舉的基本概念和常見用法

    在C語言中,枚舉是一種方便組織和表示一組相關(guān)常量的工具。枚舉類型有助于提高代碼的可讀性和可維護(hù)性。本文將介紹C語言枚舉的基本概念、語法和用法,以及一些高級(jí)技巧。
    發(fā)表于 08-17 15:32 ?1448次閱讀

    基于Rust語言中的生命周期

    Rust是一門系統(tǒng)級(jí)編程語言具備高效、安和并發(fā)等特,而生命周期是這門語言中比較重要的概念之一。在這篇教程中,我們會(huì)了解什么是命周期、為什么需要生命周期、如何使用生命周期,同時(shí)我們依然會(huì)使用老朋友
    的頭像 發(fā)表于 09-19 17:03 ?897次閱讀

    SystemVerilog設(shè)計(jì)語言

    SystemVerilog 是過去10年來多方面技術(shù)發(fā)展和實(shí)際試驗(yàn)的結(jié)晶,包括硬件描述語言(HDL)、硬件驗(yàn)證語言(HVL)、SystemC、Superlog和屬性規(guī)范語言。它們都從技
    發(fā)表于 09-07 09:55 ?1173次閱讀

    基于SystemVerilog語言的驗(yàn)證方法學(xué)介紹

    文章主要介紹《VMM for SystemVerilog》一書描述的如何利用SystemVerilog語言,采用驗(yàn)證方法學(xué)以及驗(yàn)證庫開發(fā)出先進(jìn)驗(yàn)證環(huán)境。文章分為四部分,第一部分概述了用Syst
    發(fā)表于 05-09 15:22 ?52次下載
    基于<b class='flag-5'>SystemVerilog</b><b class='flag-5'>語言</b>的驗(yàn)證方法學(xué)介紹

    C語言中的關(guān)鍵字

    C語言中的入門教程
    發(fā)表于 10-14 16:24 ?3次下載

    SystemVerilog語言介紹匯總

    作者:limanjihe ?https://blog.csdn.net/limanjihe/article/details/83005713 SystemVerilog是一種硬件描述和驗(yàn)證語言
    的頭像 發(fā)表于 10-11 10:35 ?2390次閱讀

    詳細(xì)介紹go語言中的閉包的實(shí)現(xiàn)

    什么是閉包? 什么場(chǎng)景下會(huì)用閉包 ? 本文對(duì) go 語言中的閉包做了詳細(xì)介紹。 閉包是由函數(shù)及其相關(guān)引用環(huán)境組合而成的實(shí)體(即:閉包=函數(shù)+引用環(huán)境)。 Go中的閉包 閉包是函數(shù)式語言中概念
    的頭像 發(fā)表于 10-20 16:18 ?1853次閱讀

    帶你了解go語言中的閉包

    概念,沒有研究過函數(shù)式語言的用戶可能很難理解閉包的強(qiáng)大,相關(guān)的概念超出了本書的范圍。Go語言是支持閉包的,這里只是簡(jiǎn)單地講一下在Go語言中
    的頭像 發(fā)表于 11-02 15:27 ?2442次閱讀

    IEEE SystemVerilog標(biāo)準(zhǔn):統(tǒng)一的硬件設(shè)計(jì)規(guī)范和驗(yàn)證語言

    IEEE SystemVerilog標(biāo)準(zhǔn):統(tǒng)一的硬件設(shè)計(jì)規(guī)范和驗(yàn)證語言
    發(fā)表于 08-25 15:52 ?1次下載

    go語言中怎么使用HTTP代理

    go語言中怎么使用HTTP代理。
    的頭像 發(fā)表于 09-01 14:41 ?2412次閱讀

    Systemverilog event的示例

    event是SystemVerilog語言中的一個(gè)強(qiáng)大特性,可以支持多個(gè)并發(fā)進(jìn)程之間的同步。
    的頭像 發(fā)表于 10-17 10:21 ?1550次閱讀

    FPGA學(xué)習(xí)-SystemVerilog語言簡(jiǎn)介

    SystemVerilog是一種硬件描述和驗(yàn)證語言(HDVL),它基于IEEE1364-2001 Verilog硬件描述語言(HDL),并對(duì)其進(jìn)行了擴(kuò)展,包括擴(kuò)充了 C語言 數(shù)據(jù)類型、
    的頭像 發(fā)表于 12-08 10:35 ?2147次閱讀

    簡(jiǎn)述C語言中指針重點(diǎn)

    在C語言中一個(gè)函數(shù)可以返回一個(gè)整型值、字符值、實(shí)型值等,也可以返回指針型的數(shù)據(jù),即地址,其概念與以前類似,只是返回的值的類型是指針類型。
    的頭像 發(fā)表于 03-10 15:28 ?598次閱讀
    RM新时代网站-首页