2010-10-31 22:35:00| 分类: SystemVerilog | 标签: |举报 |字号大中小 订阅
又翻译了一片文章:
类似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 = C | name的值将和C关联 |
name[N] | name0..nameN的值和之后连续的整数相关联 |
name[N] = C | 和以上相同,不过name0的值和C关联 |
name[N:M] | 枚举值nameN..nameM,N可以大于M;也可以小于M |
name[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 would FAIL
$
display
(
"Dynamic cast operation FAILED"
);
枚举类型和标准整数类型之间的互操作是合法的,不需要特别的语法。当参与运算的时候,枚举类型变量会自动向上转型成其他整数类型。
函数名字 | 说明 |
first() | 返回枚举类型的第一个值 |
last() | 返回枚举类型的最后一个值 |
next(int N=1) | 枚举值加N,如果超过范围,将继续从第一个值开始 |
prev(int N=1) | 枚举值减N,如果超过范围,继续回到最后一个 |
num() | 返回枚举类型的取值个数 |
name() | 返回枚举值对应的字符串 |
name()方法在打印调试信息时特别有用。
评论