返回介绍

3.9 用户定义的类型

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

type_declaration ::=            // 引用自附录A.2.1.3
    typedef data_type type_identifier variable_dimension;
  | typedef interface_instance_identifier.type_identifier type_identifer;
  | typedef [enum|struct|union|class] type_identifier;

语法3-2 — 用户定义的类型(摘录自附录A)

象C语言一样,用户可以使用typedef定义一个新的数据类型。

tyepdef int intP;

这个新类型可以进行如下的实例化操作:

intP a, b;

如果一个类型首先使用空的typedef标识为类型,那么它就可以在其定义之前使用。

typedef foo;
foo f = 1;
typedef int foo;

注意:这种方法不适合于枚举值,枚举类型必须在使用之前定义。

除了不允许层次化地引用用户定义的类型标识符之外,用户定义的类型标识符与数据标识符具有相同的作用范围规则。SystemVerilog允许通过端口引用在接口内定义的类型标识符,只要它们在使用之前在本地重新定义。

interface intf_i;
    typedef int data_t;
endinterface

module sub (intf_i p)
    typedef p.data_t mydata_t;
    my_data_t data;
    // 当'data'连接到上述接口的时候,它的类型是int
endmodule

因为强制类型转换(参见3.14节)中仅允许使用简单类型名,因此对强制类型转换中的复合数据类型必须使用用户定义的类型名。另外,当使用非压缩数组的时候,用户定义的数据类型必须作为类型参数值使用。

有时一个用户定义的类型需要在类型的内容被定义之前声明。这对于由enum、struct、union和class派生出的用户定义类型很有用处。对于这种应用的例子参看11.24节。这种方式通过下列的typedef格式来提供支持。

tyepdef enum type_declaration_identifier;
tyepdef struct type_declaration_identifier;
tyepdef union type_declaration_identifier;
tyepdef class type_declaration_identifier;
tyepdef type_declaration_identifier;

注意:这种方式在11.24节中展示的类耦合定义中很有用,但它不能使用在结构体的耦合定义中,因为结构体是静态声明的,并且不支持结构体的指针。

最后一个形式表明,用户定义类型中的类型不必在提前声明中定义。

在generate内部的typedef不应该定义一个在提前定义范围外的提前定义的真实类型。

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

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

发布评论

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