学习中,感觉绿皮书中对枚举的介绍不是很详细,有很多疑惑,因此在此对细节总结一下。
枚举类型enum是System Verilog中使用频率极高的数据类型之一,验证中作内置判断类型。
enum的语法
使用typedef便于用户自定义枚举类型的共享使用,可以用一个枚举类型来声明多个变量,
如果枚举类型没有伴随typedef,那么该枚举类型是一个匿名枚举类型。
1.如果枚举没有初始化,默认是int 型,则从第一个标识符开始,顺次赋给标识符0、1、2 …
initial begin
typedef enum {st1, st2, st3} state_s;
//state_s是一个枚举类型变量
//st1,st2,st3是枚举常量
state_s state, next_state;
$display("state -> %0d, %0d, %0d", st1, st2, st3);
end
输出:
state -> 0, 1, 2
数组形式
typedef enum {st1, st2[2], st3} state_s;//定义枚举类型变量
state_s state1; //实例化枚举变量
$display("%0d, %0d, %0d", st20,st21,st22);
输出:
1,2,3
注意:定义的枚举值st1、st2、st3类似于parameter,在当前命名空间域具有独占性,
不能被定义过也不能重新用于枚举。
例如:
parameter str1;
typedef enum {st1, st2} state_s;
2.枚举变量可以取枚举以外的的值,用枚举类型state_s做强制类型转换
typedef enum {st1, st2, st3} state_s;//定义枚举类型变量
state_s state1; //实例化枚举变量
state1 = st1;
$display("state1 = %0d", state1);
state1 = state_s'(5);
$display("state1 = %0d", state1);
输出:
state1 = 0
state1 = 5
3.枚举类型的转换
- 枚举类型的缺省类型为双状态int
- 可以将枚举类型赋值给非枚举变量,即 int = enum
- 不可将整形变量直接赋给枚举变量,必须做类型转化,即 enum = T’(int);
4.设置枚举类型
typedf enmu logic[1:0] {str0 = 2'b00, str1 = 2'b01, str2 = 2'b10} state_s;
state_s state, state1;
state1 = st1;
$diaplay("state1 = %0d, state = %0d",state1, state);
state1 = state_s'(5);
#display("state1 = %0d", state1);
输出:
state1 = 1, state = x
state1 = 5
logic是四值逻辑变量类型,因为state没有初始化,所以state是默认的x状态。
5.枚举类型函数
函数 | 含义 |
---|---|
first() | 返回第一个枚举常量 |
last() | 返回最后一个枚举常量 |
next() | 返回下一个枚举常量 |
next(N) | 返回以后第N个枚举常量 |
prev() | 返回前一个枚举变量 |
pre(N) | 返回以前第N个枚举变量 |
num() | 枚举常量的个数 |
name() | 枚举常量的名字 |