SystemVerilog枚举类型(enumeration)使用

 

枚举类型同数组一样都是一种数据类型,枚举是用于定义一组值,其中每一个值都对应的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属性的名字,而不是值

声明枚举类型时三个注意点

  1. 枚举属性值的数据类型:未指定时默认都是分配32bit的int类型,可以通过bit[2:0]进行指定3bit的类型
  2. 枚举属性的名字:属性名字的话可以使用RED[3]声明三个RED, 分别为RED0, RED1, RED2. 也可以使用RED[3:5]声明名字分别未:RED3, RED4, RED5.
  3. 枚举属性值:声明值的话, 如果没有给初值,那么默认的就是在上一个属性值的基础上加1。如果上一个值不存在那么就直接指定为0.

举例:

  • {RED[3]=5} 直接声明三个RED,分别为RED0, RED1, RED2 对应的值分别为RED0 = 5, RED1= 6, RED2 = 7
  • {RED[3:5]=5} 声明的属性名字分别为 RED3, RED4, RED5. 对应值也是从5开始依次加一。

本文原创,错误之处在所难免!盼指出!