枚舉類型定義了一組具有名稱的值,在沒有指定值時(shí)默認(rèn)是int型數(shù)值。
enum {red, green, blue} light1, light2;
在上面的例子中,沒有指定任何數(shù)據(jù)類型,因此使用默認(rèn)的“int”數(shù)據(jù)類型。所以枚舉類型light1和light2被定義為默認(rèn)類型int的變量,其中包括三個(gè)成員:red, green, blue。由于沒有指定各個(gè)含義的值,所以
red= 0,green= 1,blue= 2
再舉一個(gè)例子
enum integer {IDLE, XX='x, S1='b01, S2='b10} state, next;
這里的數(shù)據(jù)類型是“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,也就是說(shuō)
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.
上面這種寫法就會(huì)導(dǎo)致編譯錯(cuò)誤,因?yàn)閏和d的值都等于8。
enum {a, b=7, c} alphabet;
“a”是第一個(gè)成員,它沒有值。所以,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.
上面這個(gè)示例也會(huì)導(dǎo)致編譯錯(cuò)誤,因?yàn)閞ed=‘h13超出了 bit[3:0]所能夠表示的最大值('hF) 。修改成下面的寫法就沒有問(wèn)題了。
enum bit [3:0] {red=‘d13, green, blue} color;
此時(shí)
red = 13, green = 14, and blue = 15
枚舉類型在設(shè)計(jì)有限狀態(tài)機(jī)時(shí)特別有用。例如,
你可以定義一個(gè)枚舉類型來(lái)描述狀態(tài)機(jī)的狀態(tài):
enum logic [1:0] { IDLE = 2’b00, READ = 2’b01, WRITE = 2’b10, RMW = 2’b11, ILLEGAL = ‘x } current_state,next_state;
因?yàn)轭愋褪恰發(fā)ogic”,所以可以將未知的('x)值分配給enum成員。這樣的'x賦值對(duì)于仿真比較非常有用,而對(duì)于綜合工具而言就進(jìn)行合適的優(yōu)化。該枚舉可以在狀態(tài)機(jī)編碼中使用,如下所示:
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
枚舉類型的變量提供了很多內(nèi)建的方法,方便提取枚舉類型成員的值。

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
在這個(gè)例子中,我們定義了一個(gè)
typedef enum {red, green, blue, yellow} Colors;
Colors有四個(gè)成員,
red= 0, green= 1, blue= 2, yellow= 3
我們首先使用“num()”方法顯示枚舉中的成員數(shù)量。
枚舉中有四名成員。所以,顯示日志顯示
Number of members in Colors = 4.
然后使用方法“frst()”獲取第一個(gè)成員的值。第一個(gè)成員是值為0的“red”,因此打印顯示
First member = 0.
然后我們使用“next(2)”,會(huì)獲取后面第2個(gè)值2.
接下來(lái),我們通過(guò)last()獲得枚舉類型最后一個(gè)成員的值3
Last member # = 3
下面是另一個(gè)簡(jiǎn)單的例子:
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
枚舉類型的成員可以指定范圍

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;
定義一個(gè)包含三個(gè)成員的枚舉類型“cycle”。第一個(gè)“read”;然后是一系列5個(gè)writes,分別是“write0”、“write1”、“write2”、“write3”、“write4”;然后是三個(gè)“intr”的,即“intr6”、“intr7”和“intr8”。
類似的,
enum { readreg[2] = 1, writereg[2:4] = 10 } reg0;
定義一個(gè)包含兩個(gè)成員:
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
審核編輯:劉清
-
VCS
+關(guān)注
關(guān)注
0文章
80瀏覽量
10229 -
狀態(tài)機(jī)
+關(guān)注
關(guān)注
2文章
497瀏覽量
28827
原文標(biāo)題:SystemVerilog中的枚舉類型
文章出處:【微信號(hào):芯片驗(yàn)證工程師,微信公眾號(hào):芯片驗(yàn)證工程師】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
使用枚舉類型表示狀態(tài)機(jī)進(jìn)入死循環(huán)
如何在Go中給GORM模型添加枚舉類型
深入理解java枚舉類型enum用法
枚舉是C語(yǔ)言中的一種基本數(shù)據(jù)類型
go語(yǔ)言枚舉類型怎么用
數(shù)字硬件建模SystemVerilog-枚舉數(shù)據(jù)類型
SystemVerilog中$cast的應(yīng)用
SystemVerilog中的package
SystemVerilog中至關(guān)重要的的數(shù)據(jù)類型
SystemVerilog中至關(guān)重要的結(jié)構(gòu)體和自定義類型

淺析SystemVerilog中的枚舉類型
評(píng)論