在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

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

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

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

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

class “e”擴展自class “c”,class “c”又繼承自class “a”。同時,class “b”擴展自class “a.”

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

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

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

將擴展對象句柄“e1”賦值給基類句柄a1,就是一個“upcast”。

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

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

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

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

在上面的例子中,我們實例化了對象a1,此時會為對象a1分配內存空間,但是此時并沒有為對象c1和對象e1分配內存空間。

所以,如果此時我們賦值“e1 = a1”是不允許的,因為e1并沒有一個合適的物理空間去指向。

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

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

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

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

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

然后賦值c_class中的屬性 c.p_Var和c.c_Var,最后進行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

因為我們在實例化c_class時,同樣為其父類p_class分配了內存空間。

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

c = p

會得到一個編譯錯誤

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.

我們再看一個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

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

color = white
color = black




審核編輯:劉清

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

    關注

    0

    文章

    113

    瀏覽量

    8284

原文標題:SystemVerilog中的Upcasting和Downcasting

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

收藏 人收藏

    評論

    相關推薦

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

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

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

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

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

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

    基于Rust語言中的生命周期

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

    SystemVerilog設計語言

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

    基于SystemVerilog語言的驗證方法學介紹

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

    C語言中的關鍵字

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

    SystemVerilog語言介紹匯總

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

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

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

    帶你了解go語言中的閉包

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

    IEEE SystemVerilog標準:統(tǒng)一的硬件設計規(guī)范和驗證語言

    IEEE SystemVerilog標準:統(tǒng)一的硬件設計規(guī)范和驗證語言
    發(fā)表于 08-25 15:52 ?1次下載

    go語言中怎么使用HTTP代理

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

    Systemverilog event的示例

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

    FPGA學習-SystemVerilog語言簡介

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

    簡述C語言中指針重點

    在C語言中一個函數可以返回一個整型值、字符值、實型值等,也可以返回指針型的數據,即地址,其概念與以前類似,只是返回的值的類型是指針類型。
    的頭像 發(fā)表于 03-10 15:28 ?622次閱讀
    主站蜘蛛池模板: 特级毛片a级毛免费播放| 97色在线播放| caoporn97人人做人人爱最新| 久久天天躁夜夜躁狠狠| 80s国产成年女人毛片| 免费观看成人毛片| 美女网站视频一区| 日本三级吹潮| 女人张开双腿让男人桶爽免| 性久久久久久久久久| bt天堂在线最新版在线| 日本操穴| 国产色综合天天综合网| 日日碰狠狠添天天爽五月婷| 最色网在线观看| 亚洲午夜一区| 99pao在线视频精品免费| 午夜在线播放视频| 亚洲国产午夜精品理论片的软件| 国产一卡二卡3卡4卡四卡在线| 欧美日a| 欧美一区二区三区成人看不卡| 人人干人人看| 欧美性videofree精品| 四虎www成人影院免费观看| 一级片高清| 天天噜噜色| 久久这里只有精品1| 猛操网| 都市激情综合| 天天干亚洲| 午夜看片网| 夜间视频在线观看| 免费高清在线观看a网站| 女bbbbxxxx视频| 欧美成人性高清观看| re99热| 天天好比网| 美女黄页黄频| 仙踪林欧美另类视频| jinv在线视频|