枚举类型同数组一样都是一种数据类型,枚举是用于定义一组值,其中每一个值都对应的name,本文主要记录为什么使用枚举,怎么定义一组枚举值,怎么使用枚举类型,以及声明枚举类型时需要注意的三个点。
为什么使用枚举
主要目的是使得代码简洁性更高,可读性更强。另外枚举类型中内置了一些方法可以很方便的访问类型中的值。
例如直接声明红绿灯的三种状态:
GREEN = 2'b00;
RED = 2'b01;
BLUE = 2'b10;
使用SystemVerilog的枚举类型声明:
typedef enum bit[1:0] {GREEN, RED, BLUE} lights; // 默认给定GREEN = 2'b00, RED = 2'b01, BLUE = 2'b10;
可以看到这里声明的过程由三行变成了一行;然后在使用时我们需要先创建一个枚举类型,如lights light; 然后使用light.first()方法直接访问到GREEN的值。(共有六种方法)
怎么定义一个枚举类型
typedef enum bit[1:0] {GREEN, YELLOW, RED} light
定义一个枚举类型,其中的三种不同属性分别使用2bit的值来储存。
GREEN = 2’b00, YELLOW = 2’b01, RED = 2’b10
默认都是在前面的基础上直接加1,但是也可以直接对里面的属性赋予初始值,如{GREEN = 0, YELLOW = 1, RED = 2}
怎么创建一个枚举类型实例,枚举类型里面有那些方法,怎么调用方法?
- 定义一个枚举类型:typedef enum {yellow,green,blue} colors;
- 创建一个实例:colors color;
- 调用方法:color.first() 调用第一个属性的值,输出0.
- 常用方法:
- first() 第一个属性值
- last() 最后一个属性值
- next() 下一个值(最后一个的下一个是倒数第二个)
- prev() current属性前面的值(从后往前数,最后一个的prev()为第一个)
- num() 返回枚举里面属性的个数
- name() 指向current属性的名字,而不是值
声明枚举类型时三个注意点
- 枚举属性值的数据类型:未指定时默认都是分配32bit的int类型,可以通过bit[2:0]进行指定3bit的类型
- 枚举属性的名字:属性名字的话可以使用RED[3]声明三个RED, 分别为RED0, RED1, RED2. 也可以使用RED[3:5]声明名字分别未:RED3, RED4, RED5.
- 枚举属性值:声明值的话, 如果没有给初值,那么默认的就是在上一个属性值的基础上加1。如果上一个值不存在那么就直接指定为0.
举例:
- {RED[3]=5} 直接声明三个RED,分别为RED0, RED1, RED2 对应的值分别为RED0 = 5, RED1= 6, RED2 = 7
- {RED[3:5]=5} 声明的属性名字分别为 RED3, RED4, RED5. 对应值也是从5开始依次加一。
本文原创,错误之处在所难免!盼指出!