枚举类型定义了一组具有名称的值,在没有指定值时默认是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 = 8enum 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
枚举类型在设计有限状态机时特别有用。例如,
你可以定义一个枚举类型来描述状态机的状态:
enum logic [1:0] { idle = 2’b00, read = 2’b01, write = 2’b10, rmw = 2’b11, illegal = ‘x } current_state,next_state;
因为类型是“logic”,所以可以将未知的('x)值分配给enum成员。这样的'x赋值对于仿真比较非常有用,而对于综合工具而言就进行合适的优化。该枚举可以在状态机编码中使用,如下所示:
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; … endcaseend
enumerated-type methods
枚举类型的变量提供了很多内建的方法,方便提取枚举类型成员的值。
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; initialbegin 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 = 1color.name = redred=red green= 1 blue= 5red= 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 with ranges
枚举类型的成员可以指定范围
module datatype1;typedef enum { read=10, write[5], intr[6:8] } cycle;enum { readreg[2] = 1, writereg[2:4] = 10 } reg0;initialbegin $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=%0dn,writereg2, writereg3, writereg4);endendmoduletypedef 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=10write0=11 write1=12 write2=13 write3=14 write4=15intr6=16, intr7=17 intr8=18readreg0=1 readreg1=2writereg2=10 writereg3=11 writereg4=12v c s s i m u l a t i o n r e p o r t
iPhone 12发布后 网友:我的小6还能再战3年
4010A系列电参数测量仪的特点及应用范围
无边框3.0+双摄+骁龙835,这样的努比亚Z13,我喜欢!
过温RTC在设计工业或交通系统中的应用
超薄LED背光源实现方案
浅析SystemVerilog中的枚举类型
惠威AW-85无线降噪耳机评测 怎么样
“中国芯”迅速崛起
行业方案|医疗器械行业全链数字化解决方案
CDNLive日本发布新技术,Tom Beckley
智意天目X660扫地机器人评测 这就是家庭智能设备诞生的原因
戴尔科技第三财季总净营收为234.82亿美元
为什么需要BI报表它有什么好处
什么原因导致了5G网速失衡 全球毫米波频谱现状分析
OcleanSE+青春版评测 感受不一样的刷牙体验
红米Note 8正式推出了全新配色星云紫
不要担心,现在也有不少职业是人工智能无法取代的
Microchip推出首款64KB闪存16位单片机
把windows系统安装在移动固态硬盘里,随身携带,随需随用
基于MCS-51单片机和步进电机实现锅炉筒壁孔加工控制系统的设计