一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

SystemVerilog中的類的繼承

芯片驗證工程師 ? 來源:芯片驗證工程師 ? 作者:芯片驗證工程師 ? 2022-11-15 09:47 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

繼承是基于類的面向?qū)ο?a href="http://www.www27dydycom.cn/v/tag/1315/" target="_blank">編程(object-oriented pro - gramming)的最重要特性之一。

擴展類,簡言之,就是基類的擴展。

擴展類繼承了基類的所有屬性和方法,并且支持在繼承類中重寫基類的屬性和方法以及新增更多的屬性和方法。

所以,繼承類的好處是什么?

1、繼承類對基類的復用+改進
2、基類的改動能很快地影響到所有繼承類,減少公共代碼的修改

例如,可以定義一個名為EthernetPacket的基類。然后定義擴展類,如EtherErrorPacket、EtherLatencyPacket等,除了繼承基類的屬性,還可以根據(jù)需要新增更多的新屬性和方法。

module class_TOP( );

class base;
logic [31:0] data1;
logic [31:0] data2;
logic [31:0] busx;

function void bus;
busx = data1 | data2;
endfunction

function void disp;
$display("From Base Class :: busx OR = %h", busx);
endfunction

endclass : base

class ext extends base;
logic [31:0] data3; //add a new property
function new ( );
$display("Call base class method from extended class - 
super.disp");
super.disp;
endfunction

function void bus; //redefne function 'bus' of class 'base'
busx = data1 & data2 & data3;
//data1,data2 inherited from class 'base'
endfunction

function void disp; //redefne function 'disp' of 
class 'base'
$display("From Extended Class :: busx AND = %h",busx);
endfunction

endclass : ext

initial begin
base b1;
ext e1;
b1 = new;
e1 = new;
b1.data1 = 32'h ffff_0000;
b1.data2 = 32'h 0000_ffff;
b1.bus;
b1.disp( );
e1.data1 = 32'h 0101_1111;
e1.data2 = 32'h 1111_ff;
e1.data3 = 32'h 1010_1010;
e1.bus;
e1.disp( );
end
endmodule

仿真log:

Call base class method from extended class - super.disp
From Base Class :: busx OR = xxxxxxxx
From Base Class :: busx OR = ffffffff
From Extended Class :: busx AND = 00001010
 V C S S i m u l a t i o n R e p o r t

在class “base”中,我們定義了屬性data1、 data2和busx,然后又定義了2個functions “bus”和“disp”

由于我們沒有顯式地定義構(gòu)造函數(shù)new(),所以變量data1, data2和busx都會被初始化成“x”態(tài) 。

class “ext”是class “base”的繼承類,所以類“ext”自然也會有屬性“data1,” “data2,” 和“busx”。

同時我們在類“ext”中額外聲明了屬性“data3”,并且覆蓋了父類中函數(shù)“bus”和“disp”的聲明。

在上面的例子中,我們在擴展類"ext"中的構(gòu)造函數(shù)中通過關鍵字“super.”來調(diào)用父類中聲明的函數(shù)。所以會打?。?/p>

From Base Class :: busx OR = xxxxxxxx

在initial語句塊中,我們賦值父類中的屬性,然后打印出“busx.”(即data1 | data2)。然后修改擴展類中的屬性,然后打印出“busx.”(覆蓋過的函數(shù)data1 & data2 & data3)

仿真的log也證明了父類的函數(shù)被成功地覆蓋掉了。

每一個class 都會有一個構(gòu)造函數(shù)new()(隱式或者顯式的),在擴展類的構(gòu)造函數(shù)中,第一件事就是要去調(diào)用父類的構(gòu)造函數(shù)“super.new( )”。然后如果你忘了在擴展類的構(gòu)造函數(shù)中添加,編譯仿真工具也會自動幫你添加的。

一般來說不需要顯式地添加super.new(),但是如果構(gòu)造函數(shù)帶參數(shù),那么必須要顯式地添加supoer.new()

Inheritance Memory Allocation

還是那句話,理解一個語言的很多特性都需要從內(nèi)存分配的角度去理解。

如果需要完全理解擴展類,就需要理解基類和擴展類中的屬性和函數(shù)的內(nèi)存分配。

module class_TOP( );
 class aa;
 int i1;
 function funAA;
 endfunction
 endclass : aa
 
 class bb extends aa;
 int i1;
 function funBB;
 endfunction
 endclass : bb
 
 initial begin
 bb b;
 b = new( );
 end
 endmodule


在上面的例子中,雖然我們只是調(diào)用了擴展類的構(gòu)造函數(shù)“b = new( ),” ,但是實際上,我們不僅分配的類“bb”的內(nèi)存空間,還分配了基類“aa”的內(nèi)存空間,即使變量名稱一樣。

93d6f52a-6436-11ed-8abf-dac502259ad0.png

這個同名的變量需要通過作用域(不同的內(nèi)存分配)進行區(qū)分。

審核編輯:湯梓紅

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

    關注

    29

    文章

    1367

    瀏覽量

    112259
  • System
    +關注

    關注

    0

    文章

    166

    瀏覽量

    37807

原文標題:SystemVerilog中的類的繼承

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    SystemVerilog構(gòu)造函數(shù)new

    systemverilog,如果一個沒有顯式地聲明構(gòu)造函數(shù)(new()),那么編譯仿真工具會自動提供一個隱式的new()函數(shù)。這個new函數(shù)會默認地將所有屬性變量。
    發(fā)表于 11-16 09:58 ?3961次閱讀

    SystemVerilog的Virtual Methods

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

    關于Java繼承的問題

    在Java,繼承是面向?qū)ο缶幊?b class='flag-5'>中的一個重要概念,它允許一個(稱為子類或派生繼承另一個
    的頭像 發(fā)表于 09-30 10:48 ?800次閱讀

    淺析多繼承派生的虛基

    繼承派生與基有何關系?多繼承派生與虛基有何關系?
    發(fā)表于 09-30 06:26

    python繼承

    的同時,又可以根據(jù)需要進行修改、拓展。繼承的語法結(jié)構(gòu)是class 子類(父):1. 單繼承舉個例子:下面的代碼。先是定義了一個 People
    發(fā)表于 03-08 16:40

    什么是繼承?

    什么是繼承?繼承是子類利用父定義的方法和變量就像它們屬于子類本身一樣. class Car {   int color_number;&n
    發(fā)表于 04-28 14:26 ?762次閱讀

    Java繼承與派生

    對于面向?qū)ο蟮某绦蛟O計語言來說,毫無疑問是其最重要的基礎。抽象、封裝、繼承、多態(tài)這四大特性都離不開,只有存在,才能體現(xiàn)面向?qū)ο缶幊痰奶攸c,今天我們就來了解一些
    發(fā)表于 09-27 10:55 ?0次下載
    Java<b class='flag-5'>類</b>的<b class='flag-5'>繼承</b>與派生

    構(gòu)造函數(shù)()繼承的方式與實驗

    繼承:利用構(gòu)造函數(shù)()繼承的方式 : JS是沒有的概念的 , 把JS
    發(fā)表于 11-24 15:26 ?732次閱讀

    C++繼承訪問級別學習總結(jié)(二)

    上一篇文章我們介紹了c++繼承學習總結(jié);今天我們繼續(xù)來分享c++繼承
    的頭像 發(fā)表于 12-24 16:10 ?981次閱讀

    python繼承詳解

    和方法的同時,又可以根據(jù)需要進行修改、拓展。 繼承的語法結(jié)構(gòu)是 class 子類(父): 1. 單繼承 舉個例子:下面的代碼。先是定義了一個 People
    的頭像 發(fā)表于 03-08 16:40 ?3401次閱讀

    怎樣在Java實現(xiàn)多繼承

    Java是一種面向?qū)ο蟮闹辉试S單繼承的語言,那么怎樣在Java實現(xiàn)多繼承呢? 2 方法 1. 多層繼承 如果要直接繼承
    的頭像 發(fā)表于 02-17 14:55 ?1534次閱讀

    簡述繼承

    繼承:一個繼承另一個,自動擁有這個的屬性和方法,類似于包含與被包含的關系。被
    的頭像 發(fā)表于 02-17 15:00 ?1318次閱讀
    簡述<b class='flag-5'>類</b>的<b class='flag-5'>繼承</b>

    Python繼承詳解

    在 Python ,繼承是一種重要的面向?qū)ο缶幊谈拍?。通過繼承,我們可以定義一個新的,它繼承了現(xiàn)有
    的頭像 發(fā)表于 04-20 16:56 ?1548次閱讀

    Python繼承的基本規(guī)則

    繼承規(guī)則 與其他基于的語言一樣,可以通過繼承組合多個定義。 定義可以擴展(或繼承)多個其他
    的頭像 發(fā)表于 09-20 14:24 ?757次閱讀

    java子類可以繼承的什么

    Java是一種面向?qū)ο蟮木幊陶Z言,它支持繼承的概念。繼承是面向?qū)ο缶幊痰娜筇匦灾?,它允許一個(稱為子類或派生繼承另一個
    的頭像 發(fā)表于 08-20 11:02 ?2359次閱讀