Systemverilog枚举类型 ---转自ic designer

来源:互联网 发布:使命召唤9剧情知乎 编辑:程序博客网 时间:2024/06/05 06:11

Systemverilog枚举类型  

 

又翻译了一片文章:

来源:http://systemverilog.co/wiki/Enumerations

枚举类型

目录Contents:

 

  • 1枚举类型的声明
  • 2将整数强制下转型为枚举类型
  • 3将枚举强制上转型为整数类型
  • 4枚举类型的方法
  • 5参考文献

 

枚举类型的声明

 

类似C/C++,Systemverilog枚举类型提供了一种更严格的整数类型,属于基本整数类型(int)的子类型. 枚举变量的值只能是枚举声明类型的一种。

enum {RED, GREEN, BLUE} color1, color2;

以上声明完成了两件事情。 (*)定义了RED, GREEN和BLUE分别为0,1,2.同时定义了变量color1和color2。这两个变量是强类型,只能取值0,1,2.

另外,Systemverilog允许用户定义枚举类型的基类型是2态或者4态整型。注意在C/C++中,不允许用户定义枚举类型的基类型,永远都是int.

enum bit [1:0] {RED, GREEN, BLUE} color1, color2;

// 4态枚举类型

enum logic [1:0] {IDLE, UNKNOWN=`x, TRISTATE=`z, S1=2`b01, S2=2`b10} state, next;

实际使用中,关键字enum几乎总是和typedef一起使用

typedef enum {RED, GREEN, BLUE} BasicColors;

可以通过name[N]或者name[N:M]自动定义枚举类型的索引范围,下列表格累出了枚举类型的各种格式:

语法说明name此name将和下一个整数值相关联name = Cname的值将和C关联name[N]name0..nameN的值和之后连续的整数相关联name[N] = C和以上相同,不过name0的值和C关联name[N:M]枚举值nameN..nameM,N可以大于M;也可以小于Mname[N:M] = C和以上相同,name0的值和C关联

由于枚举属于整数类型,Systemverilog允许枚举变量声明为rand/randc. 当声明围randc的时候,尽量使用最少的bit数以提高效率[1]。这点注意看参考文献 。。

 

将整型向下转型到枚举类型

 

枚举类型是强类型,因此,枚举变量不能够被赋值为另一个整数类型值,除非显示的转型(静态转型或者动态转型)。静态转型不会去检查赋值是否满足枚举取值范围的限制范围,而动态转型会检查,除非很明确知道取值范围满足要求,否则请使用动态转型。

使用类型转换对枚举变量赋值

typedef enum {MON, TUE, WED, THU, FRI, SAT, SUN} Weekday;

Weekday day1 = WED;  // no type conversion required

day1 = 2;            // illegal type conversion

day1 = Weekday’(2);    // OK

day1 = Weekday'(10);   // legal out of range assignment forced by static cast

if (! $cast(day1, 10)) // legal dynamic cast operation that wouldFAIL

$display("Dynamic cast operation FAILED");

 

将枚举类型向上转型到整形。

 

枚举类型和标准整数类型之间的互操作是合法的,不需要特别的语法。当参与运算的时候,枚举类型变量会自动向上转型成其他整数类型

 

枚举类型的方法

 

函数名字说明first()返回枚举类型的第一个值last()返回枚举类型的最后一个值next(int N=1)枚举值加N,如果超过范围,将继续从第一个值开始prev(int N=1)枚举值减N,如果超过范围,继续回到最后一个num()返回枚举类型的取值个数name()返回枚举值对应的字符串


name()方法在打印调试信息时特别有用

 

参考文献:

  1. ↑ Srinivas Venkataraman,VerificationOnWeb (VoW), 2009, "SystemVerilog tip: watch out enum and randc",  08-AUG-2010
原创粉丝点击