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

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

3天內不再提示

淺析SystemVerilog中的枚舉類型

芯片驗證工程師 ? 來源:芯片驗證工程師 ? 作者:驗證哥布林 ? 2022-10-13 09:44 ? 次閱讀

枚舉類型定義了一組具有名稱的值,在沒有指定值時默認是int型數值。

enum {red, green, blue} light1, light2;

在上面的例子中,沒有指定任何數據類型,因此使用默認的“int”數據類型。所以枚舉類型light1和light2被定義為默認類型int的變量,其中包括三個成員:red, green, blue。由于沒有指定各個含義的值,所以

red= 0,green= 1,blue= 2

再舉一個例子

enum integer {IDLE, XX='x, S1='b01, S2='b10} state, next;

這里的數據類型是“integer”,這意味著可以將“x”和“z”值分配給枚舉成員。

enum {bronze=3, silver, gold} medal;

以bronze = 3作為初始值。因此,silver等于4,gold等于5

enum {a=3, b=7, c} alphabet;

顯式de為“a”和“b”賦值,因此,c將取b = 7后的值。所以c等于8,也就是說

enum {a=0, b=7, c, d=8} alphabet;

Synopsys– VCS:
Error-[ENUMDUPL] Duplicate labels in enum
The enum label 'd' has the value 4'd8 which is duplicate of enum label 'c' in the declared enum.

上面這種寫法就會導致編譯錯誤,因為c和d的值都等于8。

enum {a, b=7, c} alphabet;

“a”是第一個成員,它沒有值。所以,a等于0。因此,

a = 0, b = 7, c = 8
enum bit [3:0] {red=‘h13, green, blue} color;

Synopsys– VCS:
Error-[ENUMRANGE] Enum label outside value range
The enum label 'red' has the value 'h00000013 which is outside the range of
the base type of the declared enum, which is 4 bit unsigned.

上面這個示例也會導致編譯錯誤,因為red=‘h13超出了 bit[3:0]所能夠表示的最大值('hF) 。修改成下面的寫法就沒有問題了。

enum bit [3:0] {red=‘d13, green, blue} color;

此時

red = 13, green = 14, and blue = 15

枚舉類型在設計有限狀態(tài)機時特別有用。例如,
你可以定義一個枚舉類型來描述狀態(tài)機的狀態(tài):

enum logic [1:0] { IDLE = 2’b00,
 READ = 2’b01,
 WRITE = 2’b10,
 RMW = 2’b11,
 ILLEGAL = ‘x } current_state,next_state;

因為類型是“l(fā)ogic”,所以可以將未知的('x)值分配給enum成員。這樣的'x賦值對于仿真比較非常有用,而對于綜合工具而言就進行合適的優(yōu)化。該枚舉可以在狀態(tài)機編碼中使用,如下所示:

always @(posedge clk, negedge reset)
 if (!reset) 
    current_state <= IDLE;
 else 
    current_state = next_state;
 
 always @* begin
 …
 case (current_state)
    IDLE : if (rdy) next_state = READ;
    READ : if (go) next_state = WRITE;
    …
 endcase
end

Enumerated-Type Methods

枚舉類型的變量提供了很多內建的方法,方便提取枚舉類型成員的值。

46811fa6-4a48-11ed-a3b6-dac502259ad0.png

module enum_methods;
 typedef enum { red, green, blue, yellow } Colors;
 Colors c; 
 initial begin
    $display("Number of members in Colors = %0d",c.num); 
    c = c.frst( );
    $display("First member # = %0d",c); 
    c = c.next(2); 
    $display("c = %0d",c); 
    c = c.last ( );
    $display("Last member # = %0d",c);
    $display( "%s : %0d", c.name, c );
 end
 endmodule

Simulation log:

run -all;
# KERNEL: Number of members in Colors = 4
# KERNEL: First member # = 0
# KERNEL: c = 2
# KERNEL: Last member # = 3
# KERNEL: yellow : 3
# KERNEL: Simulation has fnished. There are no more test vectors to simulate.
exit

在這個例子中,我們定義了一個

typedef enum {red, green, blue, yellow} Colors;

Colors有四個成員,

red= 0,
green= 1,
blue= 2,
yellow= 3

我們首先使用“num()”方法顯示枚舉中的成員數量。

枚舉中有四名成員。所以,顯示日志顯示

Number of members in Colors = 4.

然后使用方法“frst()”獲取第一個成員的值。第一個成員是值為0的“red”,因此打印顯示

First member = 0.

然后我們使用“next(2)”,會獲取后面第2個值2.

接下來,我們通過last()獲得枚舉類型最后一個成員的值3

Last member # = 3

下面是另一個簡單的例子:

module datatype1;
 enum bit [3:0] {red, green, blue=5} color; 
 int i1;
 initial
begin
    i1 = green; 
    $display ("color.name = %s", color.name);
    $display ("red=%s green=%d blue=%d",color.
name,green,blue); //OK
    $display ("red=%d green=%d blue=%d",red,green,blue); //OK
 end
 endmodule

Simulation log:

i1 = 1
color.name = red
red=red green= 1 blue= 5
red= 0 green= 1 blue= 5

 V C S S i m u l a t i o n R e p o r t

Enumerated Type withRanges

枚舉類型的成員可以指定范圍

470ad94e-4a48-11ed-a3b6-dac502259ad0.png

module datatype1;
typedef enum { read=10, write[5], intr[6:8] } cycle;
enum { readreg[2] = 1, writereg[2:4] = 10 } reg0;
initial
begin
   $display ("read=%0d
", read);
   $display ("write0=%0d write1=%0d write2=%0d write3=%0d 
write4=%0d
", write0,write1,write2,write3,write4); 
   $display ("intr6=%0d, intr7=%0d intr8=%0d
",intr6, 
intr7, intr8);
   $display ("readreg0=%0d readreg1=%0d
",readreg0, 
readreg1);
   $display ("writereg2=%0d writereg3=%0d writereg4=%0d
n",writereg2, writereg3, writereg4);
end
endmodule
typedef enum { read=10, write[5], intr[6:8] } cycle;

定義一個包含三個成員的枚舉類型“cycle”。第一個“read”;然后是一系列5個writes,分別是“write0”、“write1”、“write2”、“write3”、“write4”;然后是三個“intr”的,即“intr6”、“intr7”和“intr8”。

類似的,

enum { readreg[2] = 1, writereg[2:4] = 10 } reg0;

定義一個包含兩個成員:

readreg0和readreg1,

writereg2, writereg3和writereg4。

下面是仿真log

read=10
write0=11 write1=12 write2=13 write3=14 write4=15
intr6=16, intr7=17 intr8=18
readreg0=1 readreg1=2
writereg2=10 writereg3=11 writereg4=12
V C S S i m u l a t i o n R e p o r t




審核編輯:劉清

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

    關注

    0

    文章

    78

    瀏覽量

    9537
  • 狀態(tài)機
    +關注

    關注

    2

    文章

    489

    瀏覽量

    27391

原文標題:SystemVerilog中的枚舉類型

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

收藏 人收藏

    評論

    相關推薦

    使用枚舉類型表示狀態(tài)機進入死循環(huán)

    在定義狀態(tài)機的狀態(tài)時,除了可以使用宏(define)或者參數(parameter)聲明定義外,還可以使用枚舉類型
    的頭像 發(fā)表于 11-07 17:46 ?776次閱讀
    使用<b class='flag-5'>枚舉</b><b class='flag-5'>類型</b>表示狀態(tài)機進入死循環(huán)

    如何在Go給GORM模型添加枚舉類型

    GORM是一個流行的Go ORM,它允許我們定義結構體來表示數據庫表,并提供一個接口來執(zhí)行CRUD操作。枚舉在編程是一個有用的特性,它允許我們定義一個變量可以取的固定值集。在這篇文章,我們將探索如何向GORM模型添加
    的頭像 發(fā)表于 11-28 15:36 ?1177次閱讀

    詳細講解c語言enum枚舉類型

    詳細講解C語言enum枚舉類型在實際應用,有的變量只有幾種可能取值。如人的性別只有兩種可能取值,星期只有七種可能取值。在 C 語言中對這樣取值比較特殊的變量可以定義為枚舉
    發(fā)表于 12-21 23:22

    深入理解java枚舉類型enum用法

    ; StringFRI = Fri; StringSAT = Sat; StringSUN = Sun; } 語法(定義) 創(chuàng)建枚舉類型要使用 enum 關鍵字,隱含了所創(chuàng)建的類型都是 java.lang.Enum 類
    發(fā)表于 09-27 11:49 ?0次下載

    枚舉是C語言中的一種基本數據類型

    在C語言中,枚舉類型是被當做 int 或者 unsigned int 類型來處理的,所以按照 C 語言規(guī)范是沒有辦法遍歷枚舉類型的。不過在一
    的頭像 發(fā)表于 09-25 15:45 ?8545次閱讀
    <b class='flag-5'>枚舉</b>是C語言中的一種基本數據<b class='flag-5'>類型</b>

    go語言枚舉類型怎么用

    、 java 等,都有原生支持。在 go ,大家卻找不到 enum 或者其它直接用來聲明枚舉類型的關鍵字。從熟悉其它編程語言的開發(fā)者轉用 go 編程,剛開始會比較難接受這種情況。其實,如果你看到如何在 go 中表示
    的頭像 發(fā)表于 09-02 09:43 ?5074次閱讀

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

    上一節(jié)介紹了已經被淘汰的$unit聲明空間,今天我們來看看一種重要的數據類型-枚舉數據類型。
    的頭像 發(fā)表于 07-01 17:44 ?1547次閱讀

    SystemVerilog枚舉類型的使用建議

    SystemVerilog枚舉類型雖然屬于一種“強類型”,但是枚舉
    的頭像 發(fā)表于 09-01 14:20 ?1513次閱讀

    SystemVerilog$cast的應用

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

    SystemVerilog的struct

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

    SystemVerilog至關重要的的數據類型

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

    SystemVerilog至關重要的結構體和自定義類型

    在上一篇文章《SystemVerilog至關重要的的數據類型,介紹了枚舉類型的本質和使用語
    的頭像 發(fā)表于 01-21 17:18 ?1810次閱讀
    <b class='flag-5'>SystemVerilog</b><b class='flag-5'>中</b>至關重要的結構體和自定義<b class='flag-5'>類型</b>

    枚舉類型的簡單擴展學習

    定義枚舉類型的值只能是整型常量,正數、負數和零都可以,但不可以是浮點數
    的頭像 發(fā)表于 05-25 15:45 ?572次閱讀

    Java枚舉的特點及用法

    在 Java 枚舉出現之前,通常會使用常量類來表示一組固定的常量值,直到Java 1.5之后推出了枚舉,那么枚舉類型有哪些特點,它比常量類又好在哪里呢。 本文將分析一下
    的頭像 發(fā)表于 09-30 10:02 ?1140次閱讀

    枚舉有多大?c語言枚舉end的作用是什么?

    枚舉有多大?c語言枚舉end的作用是什么? 枚舉在C語言中是一種常見的數據類型,用于定義一組相互關聯(lián)的常量或者變量。它通常用于表示一系列可能的取值,使得程序更加易讀和易維護。在C語言中
    的頭像 發(fā)表于 01-19 14:19 ?446次閱讀