system verilog-枚举类型enum

  • Post author:
  • Post category:其他


学习中,感觉绿皮书中对枚举的介绍不是很详细,有很多疑惑,因此在此对细节总结一下。

枚举类型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() 枚举常量的名字



版权声明:本文为sinat_41774721原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。