返回介绍

3.10 枚举

发布于 2020-09-09 22:55:44 字数 2391 浏览 1058 评论 0 收藏 0

data_type ::=             // 引用自附录A.2.2.1
    ...
  | enum [enum_base_type] {enum_name_declaration{, enum_name_declaration}}

enum_base_type ::=
    integer_atom_type [signing]
  | integer_vector_type [signing] [packed_dimension]
  | type_identifier [packed_dimension]24enum_name_declaration ::=
    enum_identifier [[integral_number[:integral_number]]][=constant_expression]

语法3-3 — 枚举类型(摘录自附录A)

枚举类型用来声明一组integral类型的命名常量。枚举数据类型能够抽象地声明具有强烈类型含义的变量,在声明的时候不需要声明一个数据类型或数据值,我们可以在以后设计需要更详细定义的时候加入要求的数据类型和值。枚举数据类型还可以使用枚举名字而不是枚举值来方便地引用或显示。

当没有数据类型声明的时候,缺省的数据类型是int。在枚举类型中使用的任何其它数据类型都要求一个显式的数据类型声明。

一个枚举类型定义了一组具有名字的值。在下面的例子中,light1light2被定义成一个匿名(无名字的)枚举int类型,它包含了三个成员:readyellowgreen

enum {red, yellow, green} light1, light2; // 匿名int类型

对于没有显式数据类型的枚举类型或者一个具有显式两态声明的枚举类型,如果将x或z赋值给枚举名字,那么它在语法上是错误的。

// 语法错误:IDLE=2'b00, XX=2'bx <错误>, S1=2'b01, S2=2'b10
enum {IDLE, XX='x, S1=2'b01, S2=2'b10} state, next;

对于一个四态类型(例如integer)的枚举声明,允许包含具有x或z赋值的一个或多个名字。

// 正确:IDLE=0, XX='x, S1=1, S2=2
enum integer {IDLE, XX='x, S1=2'b01, S2=2'b10} state, next;

如果在一个具有x或z赋值的枚举名字后跟着一个未赋值的枚举名字,那么在语法上是错误的。

// 语法错误:IDLE=2'b00, XX=2'bx, S1=??, S2=??
enum integer {IDLE, XX='x, S1, S2} state, next;

值可以被强制转换成integer类型,并且从初始值0开始递增。它还可以被覆盖。

enum {bronze=3, silver, gold} medal; // silver=4, gold=5

在枚举类型中可以设置某些名字的值,而其他的不设置。一个枚举命名常量的可选值是一个确立时的常量表达式(参见5.3节),它可以包含参数、本地参数、genvar、其它枚举命名常量、以及这些类型的常量函数。但不允许使用层次化的名字和const变量。一个没有值的名字被自动地赋值为前一个名字的值的递增。

// c被自动地赋值为8的递增值
enum {a=3, b=7, c} alphabet;

如果一个自动递增的值在相同枚举声明中的其他地方被赋值,那么会产生一个语法错误。

// 语法错误:c和d均被赋值为8
enum {a=0, b=7, c, d=8} alphabet;

如果第一个名字没有赋值,那么它具有0的初始值。

// a=0, b=7, c=8
enum {a, b=7, c} alphabet;

在枚举可表示范围之外的任何枚举编码都是错误的。如果任何一个枚举成员被定义成不同尺寸的常量,那么会产生一个语法错误。

// 正确的声明 – bronze和gold是无尺寸的
enum bit [3:0] {bronze='h3, silver, gold='h5} meda14;

// 正确的声明 – bronze和gold的尺寸是冗余的
enum bit [3:0] {bronze=4'h3, silver, gold=4'h5} meda14;

// bronze和gold成员的声明是错误的
enum bit [3:0] {bronze=5'h13, silver, gold=3'h5} meda14;

// c的声明是错误的,要求至少两位
enum bit [0:0] {a, b, c} alphabet;

赋值中的枚举类型、作为参数的枚举类型以及操作符中的枚举类型的类型检查在3.10.3节中描述。像C一样,枚举类型中没有文本的过载,因此,medalmedal4不能够在相同的范围内定义,因为它们包含了相同的名字。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文