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

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

3天內不再提示

數字硬件建模SystemVerilog-枚舉數據類型

OpenFPGA ? 來源:OpenFPGA ? 作者:OpenFPGA ? 2022-07-01 17:44 ? 次閱讀

數字硬件建模SystemVerilog(十三)-枚舉數據類型

上一節(jié)介紹了已經被淘汰的$unit聲明空間,今天我們來看看一種重要的數據類型-枚舉數據類型。

枚舉數據類型提供了一種聲明變量的方法,該變量可以包含有效值的特定列表。每個值都與一個標簽(確定的用戶自定義名宇)相關聯。枚舉變量用enum關鍵字聲明,后面是用大括號({})括起來的逗號分隔的標簽列表。

在下面的示例中,變量rgb的值可以是RED GREEN BLUE

cf8d2df8-f395-11ec-ba43-dac502259ad0.png

枚舉列表中的標簽是常量,類似于localparam常量。標簽可以是任何名稱。本系列使用大寫字母作為常量的慣例。

枚舉數據類型聲明語法

枚舉數據類型有一個底層數據類型,稱為基類型,可以是任何SystemVerilog內置數據類型或用戶自定義類型。枚舉列表中的每個標簽都有一個與該標簽關聯的邏輯值。

SystemVerilog提供了兩種用于聲明枚舉數據類型的樣式:隱式樣式和顯式樣式。

隱式樣式枚舉聲明

隱式樣式枚舉聲明使用基類型和標簽值的默認值。默認的基本類型是int。標簽的默認值是列表中的第一個標簽的值為0,并且每個后續(xù)標簽的值遞增一。

在以下隱式樣式枚舉聲明中:

enum{WAITE,LOAD,READY}states_e;

states_e是int數據類型的變量,是32位有符號數據類型。這意味著枚舉列表最多可以有2147483648(2^(32-1))個標簽。

列表中的第一個標簽WAITE的值為0,LOAD為l,READY為2。(標簽WAITE故意在末尾拼寫為“E”,以避免與SystemVerilog中保留的關鍵字wait產生混淆或沖突。)

這些默認設置很少適用于硬件建模?;愋蚷nt是2-state類型,這意味著在仿真期間導致X的任何設計問題都不能反映在枚舉變量中?;愋蚷nt的寬度為32位,通常比所表示的硬件所需的向量大得多。標簽值(如0、1和2)不能代表很多其他類型的硬件設計中使用的編碼,例如獨熱碼值、格雷碼或約翰遜計數。

顯式樣式枚舉聲明

顯式樣式枚舉聲明指定基類型和標簽值。以下聲明表示使用一種獨熱編碼的3位寬狀態(tài)變量:

cf996802-f395-11ec-ba43-dac502259ad0.png

顯式樣式枚舉聲明強制使用了幾個語法規(guī)則,可以幫助防止編碼錯誤:

基類型的向量寬度和標簽值的顯式寬度必須相同。允許使用大小不一的文字值(例如WAITE = 1)

每個標簽的值必須是唯一的;兩個標簽不能具有相同的值。

標簽的數量不能超過基本類型的向量寬度所能代表的數量。

無需指定枚舉列表中每個標簽的值。

如果未指定值,則該值將從上一個標簽增加1。在下一個例子中,標簽A顯式地給出了一個值l,B自動給出了遞增為值2,C給出了遞增的值3。D被明確定義為具有13的值,E和F分別被賦予14和15的遞增值。

cfa51206-f395-11ec-ba43-dac502259ad0.png

如果兩個標簽的值相同,則會導致錯誤。以下示例將產生一個錯誤,因為c和D的值相同,都為3:

cfae8ef8-f395-11ec-ba43-dac502259ad0.png

最佳實踐指南4-3
在RTL模型中使用顯式樣式枚舉數據類型聲明,在RTL模型中,基類型和標簽值是指定的,而不是推斷的。

指定基本類型和標簽值有幾個優(yōu)點:它記錄了設計工程師的意圖;它可以更準確地仿真門級行為,并允許更準確的RTL到門級邏輯等價性檢查。

自定義和匿名枚舉數據類型

可以使用typedef將枚舉數據類型聲明為用戶自定義類型,這為使用相同的枚舉值集聲明多個變量或網絡提供了一種便捷的方法。

cfbb1d4e-f395-11ec-ba43-dac502259ad0.png

使用typedef聲明的枚舉數據類型稱為自定義枚舉數據類型。如果未使用typedef,則枚舉數據類型稱為匿名枚舉數據類型。

枚舉數據類型標簽序列

有兩種快捷方式可以指定枚舉數據類型列表中具有相似名稱的多個標簽。

cfcf0a70-f395-11ec-ba43-dac502259ad0.png

COUNT_[4] 快捷方式將生成四個標簽,分別為COUNT_0、COUNT_1、COUNT_2和COUNT_3。與COUNT_0關聯的值將默認為0,隨后每個標簽的值將增加一。

第二個快捷方式:指定一系列標簽。

cfdba762-f395-11ec-ba43-dac502259ad0.png

COUNT_[8:11]簡寫符號將生成四個標簽,分別為COUNT_8、COUNT_9、COUNT_10和COUNT_11。與COUNT_8關聯的值被明確定義為8,后續(xù)標簽的值將增加1。

如果范圍中的第一個值小于第二個值,如在COUNT_[8:11]中,則序列將從第一個數字遞增到最后一個數字。如果范圍內的第一個值大于第二個值,如COUNT_[11: 8]中所示,序列將從第一個數字遞減到最后一個數字。

枚舉數據類型標簽作用域

枚舉數據類型列表中的標簽在聲明和使用標簽的范圍內必須是唯一的??梢园杜e數據類型聲明的RTL建模范圍是模塊、接口、包、begin-end塊、任務、函數和$unit聲明空間。

以下代碼片段將導致錯誤,因為枚舉標簽 GO在同一模塊范圍內使用兩次:

cff19b12-f395-11ec-ba43-dac502259ad0.png

可以通過將至少一個枚舉數據類型聲明放在具有自己的名稱范圍的begin-end塊中來糾正上例中的錯誤。

d002c888-f395-11ec-ba43-dac502259ad0.png

如上圖所示為begin-end塊命名不是必需的,但有助于記錄代碼的可讀性和維護性。

從包中導入枚舉數據類型

自定義枚舉數據類型可以在一個包中定義,它允許多個設計塊和驗證代碼使用相同的定義。

筆記
枚舉數據類型定義的顯式導入不會導入該定義中使用的標簽。

使用包的通配符導入是解決此限制的最簡單方法 。通配符導入使包中的所有內容都可用。

從包導入自定義枚舉數據類型定義時,只導入自定義名稱。枚舉列表中的值標簽不會自動導入,并在導入枚舉數據類型名稱的名稱空間中顯示。下面的代碼片段將不起作用。

d013c6c4-f395-11ec-ba43-dac502259ad0.png

為了同時導入枚舉數據類型標簽,必須顯式導入每個標簽,或者必須通配符導入包-通配符導入將使枚舉數據類型名稱和枚舉標簽在import語句的范圍內可見。下面的部分示例顯示了通配符導入的使用。

d030e830-f395-11ec-ba43-dac502259ad0.png

從多個包進行通配符導入時必須小心。如果在多個包中定義了標識符(名稱),并且兩個包都使用通配符導入,則會發(fā)生編譯或細化錯誤。對于這種情況,要使用的標識符必須顯式導入或直接導入。SV包定義中討論了如何使用多個軟件包。

枚舉數據類型分配規(guī)則

大多數SystemVerilog變量類型都是弱類型的,這意味著任何數據類型的值都可以分配給變量,該值將使用SystemVerilog標準中指定的轉換規(guī)則轉換為變量類型。

枚舉類型不在 SV的這個一般原則內。枚舉數據類型變量是半強類型的,這意味著只能為該變量指定特定的數據類型。

只能為枚舉數據類型變量賦值:

枚舉數據類型列表中的標簽。

同一類型的另一個枚舉數據類型變量。也就是說,這兩個變量都是使用相同的自定義或匿名枚舉數據類型定義聲明的。

轉換為自定義枚舉數據類型的值,

使用以下定義和枚舉變量舉例說明這些規(guī)則:

d03e8a80-f395-11ec-ba43-dac502259ad0.png

如下所述,state 和 next_state分配枚舉變量既是合法的也是非法的:

d0487a72-f395-11ec-ba43-dac502259ad0.png

筆記
枚舉數據類型的強類型規(guī)則僅適用于對枚舉變量的賦值。存儲在枚舉變量中的值只是一個值,在表達式(如比較和數學運算)中不受限制地使用。

對枚舉數據類型值的操作。對枚舉數據類型變量執(zhí)行操作時,枚舉變量的值將轉換為枚舉數據類型定義的基類型。操作的結果不再是枚舉數據類型,結果可以分配給常規(guī)的、弱類型的變量,但不能分配回枚舉變量。

logic[2:0]temp;//非枚舉變量
temp = next_state + 1;//合規(guī)的:temp是弱類型的
state = next_state + 1;//非法的:next_state + 1不是枚舉表達式
state++;//非法的:++的結果不是枚舉表達式
state += next_state;//非法的:+=的結果不是枚舉表達式

將表達式強制轉換為枚舉數據類型。任何值都可以強制轉換為自定義枚舉數據類型,然后分配給該枚舉數據類型的變量,即使該值與枚舉定義的某個標簽不匹配,

d05fd550-f395-11ec-ba43-dac502259ad0.png

在RTL建模中,有時需要將非枚舉表達式強制轉換為枚舉數據類型。然而,使用cast運算符(后面將詳細討論)時必須小心。將一個值強制放入不在枚舉列表中的枚舉變量可能會導致錯誤行為;無論是在仿真還是在綜合中。使用強制轉換會給設計工程師帶來負擔,因為要確保枚舉變量中只強制輸入有效值。這與弱類型的正則變量沒有什么不同,設計工程師需要確保指定的值是有效的。

SystemVerilog還有一個cast系統功能,可以自動驗證cast操作的結果。不幸的是,對于RTL設計人員來說,cast不受一些主要綜合編譯器的支持,cast在驗證測試臺上很有用,但不被認為是可綜合的結構體。

枚舉類型的專用系統任務和方法

枚舉數據類型有幾個內置函數,稱為方法methods,用于遍歷枚舉數據類型列表中的值。這些方法會自動處理枚舉數據類型的半強類型性質,這樣做很容易,比如遞增到枚舉數據類型列表中的下一個值,以及跳到列表的開頭或結尾。使用這些方法,不需要知道標簽名稱。

筆記
在撰寫本文時,一些綜合編譯器支持枚舉數據類型方法,但并非所有綜合編譯器都普遍支持。

枚舉數據類型方法對硬件行為建模的用處有限。它們只能通過賦值語句實現的快捷方式。由于枚舉數據類型方法的綜合限制,本文僅簡要介紹了這些方法,并給出了一個簡單的示例。

調用枚舉方法的方法是將方法名附加到枚舉數據類型變量名的末尾,并以句點(.)作為分隔符。這些方法是:

<枚舉變量名>.first-返回指定變量的枚舉列表中第一個成員的值。

<枚舉變量名>.last-返回枚舉列表中最后一個成員的值。

<枚舉變量名>.next(N)-返回枚舉列表中下—個成員的值??梢杂靡粋€整數值作為 next 的參數。在這種情況下, 從枚舉變量的當前位置算起, 返回后面第 N 個成員的值。如果到達了枚舉列表的末尾, 則會返回到列表的開頭。如果枚舉變量的當前值不在枚舉列表中, 則返回列表中第一個成員的值。

<枚舉變量名>.prev(N))-返回枚舉列表中前一個成員的值。同 ne*t 的方法一樣.可以給 prev 指定一個整數參數 。在這種情況下, 從枚舉變量的當前位S算起, 返回前面第 N 個成員的值。如果到達枚舉列表的開頭, 則會返冋到列表的末尾。如果枚舉變量 當前值不在枚舉列表中 , 則返回列表中敁后一個成員的值。

<枚舉變量名>.num-返回變量枚舉列表中的標簽個數。

<枚舉變量名>.name-返回枚舉變里中代表這個值的字符串。如果這個值不在枚舉變M列表中, 則返回一個空字符串。

打印枚舉數據類型。枚舉數據類型值可以打印為標簽的實際值,也可以打印為標簽的名稱。直接打印枚舉數據類型變量將打印枚舉數據類型變量的當前實際邏輯值。使用name方法可以打印表示當前值而不是實際值的標簽。

舉一個使用枚舉方法的例子,這個例子演示了如何使用其中一些枚舉數據類型方法來建模狀態(tài)機序列器。該模型是一個狀態(tài)機,可以設置或清除數據同步標志。如果數據匹配輸入在至少8個連續(xù)時鐘周期內為真,則設置數據同步標志;如果數據匹配輸入在多個連續(xù)時鐘周期內為假,則清除數據同步標志,清除數據同步標志所需的連續(xù)假數據匹配數取決于有多少連續(xù)周期數據匹配為真,

圖4-1顯示了該狀態(tài)機的狀態(tài)流。狀態(tài)機可以遞增或遞減的計數器。計數器統計已發(fā)生的連續(xù)數據匹配數,最多為16。請注意,對于大多數狀態(tài),計數器要么遞增1,要么遞減2。next和prev枚舉數據類型方法可以非常簡潔地仿真這種遞增或遞減行為,但某些綜合編譯器可能不支持這種方法。

圖4-1:置信計數器(confidence counter))狀態(tài)機的狀態(tài)圖 d06dbcba-f395-11ec-ba43-dac502259ad0.png 示例4-5:對置信計數器狀態(tài)機使用枚舉數據類型方法

//
//Book,"RTLModelingwithSystemVerilogforASICandFPGADesign"
//byStuartSutherland
//
//Statemachinemodelforaconfidencecountermodeledusing
//enumeratedtypemethods.
//
//Copyright2016,StuartSutherland.Allrightsreserved.
//
//Version1.0
//

`begin_keywords"1800-2012"http://useSystemVerilog-2012keywords
moduleconfidence_counter
(inputlogicdata_matches,compare_en,rstN,clk,
outputlogicdata_synched
);
timeunit1ns/1ns;

typedefenumlogic[3:0]{COUNT[0:15]}states_enum_t;

states_enum_tCurState,NextState;

//sequentialblock
always_ff@(posedgeclk,negedgerstN)
if(!rstN)CurState<=?COUNT0;
????else???????CurState?<=?NextState;

??//?next?state?combination?logic?block
??always_comb?begin
????if?(!compare_en)
??????NextState?=?CurState;??//?not?comparing?(no?state?change)
????else?if?(data_matches)???//?compare_en?&&?data_matches
??????case?(CurState)
????????COUNT15?:?;?//?can't?increment?past?15
????????default:?NextState?=?CurState.next;??//?increment?by?1
??????endcase
????else?????????????????????//?compare_en?&&?!data_matches
??????case?(CurState)
????????COUNT0?:?;?//?can't?decrement?below?0
????????COUNT1?:?NextState?=?CurState.prev(1);??//?decrement?by?1
????????default:?NextState?=?CurState.prev(2);??//?decrement?by?2
??????endcase
??end

??//?register?output?block
??always_ff?@(posedge?clk,?negedge?rstN)
????if?(!rstN)
??????data_synched?<=?0;
????else
??????begin
????????if?(CurState?==?COUNT8)
??????????data_synched?<=?1;
????????else?if?(CurState?==?COUNT0)
??????????data_synched?<=?0;
??????end
endmodule:?confidence_counter
`end_keywords

沒有枚舉數據類型的傳統Verilog編碼風格

Verilog語言在成為SystemVerilog之前沒有枚舉數據類型。要為數據值創(chuàng)建標簽,必須定義一個parameter或localparam常量來表示每個值,并為該常量指定一個值?;蛘?,可以使用'define宏定義一組宏名稱,每個名稱都有特定的值。

使用parameter創(chuàng)建標簽的一些示例如下:

d0814ba4-f395-11ec-ba43-dac502259ad0.png

請注意,在使用parameters時,state和nex_state變量是reg類型的通用變量,而不是枚舉變量。這些通用變量是弱類型的,這意味著任何值都可以分配給變量。使用弱類型的賦值規(guī)則,以下賦值語句是合法賦值,但屬于功能性錯誤:

d0920b2e-f395-11ec-ba43-dac502259ad0.png

這種編碼錯誤可能是枚舉數據類型變量的語法錯誤。使用傳統的Verilog風格的參數和通用變量類型并不能防止像這樣的意外編碼錯誤。

SystemVerilog(十二)-$unit聲明空間

d0b18ecc-f395-11ec-ba43-dac502259ad0.jpg

SystemVerilog(十一)-SystemVerilog 包

原文標題:SystemVerilog(十三)-枚舉數據類型

文章出處:【微信公眾號:OpenFPGA】歡迎添加關注!文章轉載請注明出處。

審核編輯:彭靜

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

    關注

    8

    文章

    7030

    瀏覽量

    89038
  • 硬件
    +關注

    關注

    11

    文章

    3328

    瀏覽量

    66224
  • 軟件包
    +關注

    關注

    0

    文章

    104

    瀏覽量

    11597

原文標題:SystemVerilog(十三)-枚舉數據類型

文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    淺析System Verilog中的整數數據類型

    Data TypesVerilog提供了reg和wire數據類型,但是對于功能驗證來說遠遠不夠,所以SystemVerilog提供了很多更加豐富的數據類型,下面將一一介紹。我們先來考古下,一開始
    發(fā)表于 10-11 14:15

    數字硬件建模SystemVerilog-歸約運算符

    介紹歸約運算符對單個操作數的所有位執(zhí)行運算,并返回標量(1位)結果。表5-9列出了歸約運算符。表5-9:RTL建模的歸約運算符歸約運算符包括一個NAND和一個NOR運算符,這是按位運算符所沒有
    發(fā)表于 10-20 15:03

    vhdl數據類型

    ,它包括實數類型、整數類型枚舉類型和時間類型。 復合類型(COMPOSITE TYPE):可以
    發(fā)表于 03-30 15:59 ?11次下載

    go語言枚舉類型怎么用

    go 語言枚舉類型是這么用的?在什么場景下會用到枚舉?本文對 go 語言枚舉做了詳細講解。 枚舉,是一種重要的
    的頭像 發(fā)表于 09-02 09:43 ?5184次閱讀

    SystemVerilog硬件功能如何進行建模

    本文定義了通常用于描述使用SystemVerilog硬件功能進行建模的詳細級別的術語。
    的頭像 發(fā)表于 03-30 11:42 ?1730次閱讀

    數字硬件建模SystemVerilog-網絡

    每個SystemVerilog網絡類型都有特定的語義規(guī)則,這些規(guī)則會影響多個驅動程序的解析方式。雖然所有網絡類型都表示硅行為,但并非所有網絡類型都可以用標準ASIC和FPGA技術表示。
    的頭像 發(fā)表于 05-09 09:26 ?2017次閱讀

    數字硬件建模SystemVerilog-結構體

    默認情況下,結構體會被非壓縮的。這意味著結構體的成員被視為獨立變量或常量,并以一個共同的名稱分組在一起。SystemVerilog沒有指定軟件工具應該如何存儲非壓縮結構體的成員。不同的軟件工具具對于結構體的存儲分布也是不同的。
    的頭像 發(fā)表于 06-30 09:54 ?1072次閱讀

    SystemVerilog枚舉類型的使用建議

    SystemVerilog枚舉類型雖然屬于一種“強類型”,但是枚舉類型還是提供了一些“不正經”
    的頭像 發(fā)表于 09-01 14:20 ?1719次閱讀

    淺析SystemVerilog中的枚舉類型

    枚舉類型定義了一組具有名稱的值,在沒有指定值時默認是int型數值。
    的頭像 發(fā)表于 10-13 09:44 ?1633次閱讀

    SpinalHDL中Bundle數據類型的轉換

    SpinalHDL中Bundle與SystemVerilog中的packed struct很像,在某些場景下,與普通數據類型之間的連接賦值可以通過asBits,assignFromBits來實現。
    的頭像 發(fā)表于 10-17 09:51 ?1331次閱讀

    關于有符號數據類型的示例

    我們學習一下Systemverilog中的有符號數據類型的賦值。
    的頭像 發(fā)表于 10-17 14:40 ?1036次閱讀

    SystemVerilog中至關重要的的數據類型

    對于剛接觸SV的小伙伴來說,SV有幾種不怎么能引起關注,但在實際工作中又經常會用到的數據類型。它們就是枚舉(enumeration)、結構體(structures)和自定義類型(typedef
    的頭像 發(fā)表于 01-21 17:14 ?816次閱讀
    <b class='flag-5'>SystemVerilog</b>中至關重要的的<b class='flag-5'>數據類型</b>

    SystemVerilog-網絡

    System Verilog提供兩組通用的數據類型:網絡和變量(nets 和 variables)。網絡和變量同時具有類型數據類型特性。類型表示信號為網絡或變量,
    的頭像 發(fā)表于 02-09 14:42 ?752次閱讀
    <b class='flag-5'>SystemVerilog-</b>網絡

    S71500-硬件數據類型介紹

    硬件數據類型硬件數據類型由 CPU 提供??捎?b class='flag-5'>硬件數據類型的數目取決于 CPU。
    的頭像 發(fā)表于 05-16 09:21 ?5530次閱讀
    S71500-<b class='flag-5'>硬件數據類型</b>介紹

    S71500 硬件數據類型的常量

    硬件數據類型硬件數據類型由 CPU 提供。可用硬件數據類型的數目取決于 CPU。 根據硬件配置中設置的模塊存儲特定硬件數據類型的常量。在用
    的頭像 發(fā)表于 05-16 09:24 ?1239次閱讀
    S71500 <b class='flag-5'>硬件數據類型</b>的常量