返回介绍

5.8.1 等价类型

发布于 2020-09-09 22:55:46 字数 2419 浏览 1085 评论 0 收藏 0

如果两个数据类型符合下列的归纳定义,那么它们是等价的。如果两个数据类型不符合下列的归纳定义,那么它们就是不等价的。

  1. 在每一个范围内,任何内建类型都等价于它本身的每一个其它的具体值。
  2. 一个简单的typedef或者重命名了一个内建的或用户定义类型的类型参数覆盖在类型标识符作用范围内等价于那个内建的或用户定义的数据类型。
typedef bit node;    // 'bit'与'node'是等价类型
typedef type1 type2; // 'type1'与'type2'是等价类型
  1. 一个匿名的枚举、结构体、或联合体类型在相同的声明语句中声明的变量间是等价的。
struct {int A; int B;} AB1, AB2; // AB1, AB2具有等价的类型
struct {int A; int B;} AB3;      // AB3与AB1在类型上不等价
  1. 针对于枚举、非压缩结构体、非压缩联合体或类的typedef等价于其本身以及在类型标识符作用范围内使用这个类型声明的变量。
typedef struct {int A; int B;} AB_t;
AB_t AB1;
AB_t AB2;      // AB1与AB2具有等价的类型

typedef struct {int A; int B;} otherAB_t;
otherAB_t AB3; // AB3与AB1或AB2在类型上不等价
  1. 如果压缩数组、压缩结构体、以及内建的integral类型的总位数相同,只要成员都是两态或四态,或者都是有符号或无符号的,那么它们是等价的。注意:如果压缩结构体或联合体的任意一位是四态的,那么整个结构体或联合体就被认为是四态的。
typedef bit signed [7:0] BYTE; // 等价于byte类型
typedef struct packed signed {bit[3:0] a, b;} uint8;
                              // 等价于byte类型
  1. 如果非压缩数组类型具有等价的元素类型并且具有相同的形状,那么它们是等价的。形状指的是数组的维数以及每一维中元素的数目,并不是真实的维数范围。
bit [9:0] A[0:5];
bit [1:10] B[6];
typedef bit [10:1] uint10;
uint10 C[6:1];          // A, B以及C具有等价的类型
typedef int anint[0:0]; // anint在类型上与int不等价
  1. 显式地为一个类型加入signed或unsigned修饰符不会改变类型的缺省符号,也不会产生一个不等价的类型。然而,为了能够等价,符号必须匹配。
typedef bit unsigned ubit; // 等价于bit的类型
  1. 应用于在一个包中声明的枚举、非压缩结构体、非压缩联合体或一个类类型的typedef总是等价于其本身,而不管类型导入的范围如何。

一个类型标识符的作用范围包括层次化的实例范围。这也就意味着内部声明了用户定义类型的每一个实例都产生了一个唯一的类型。为了在相同模块、接口、或程序的多个实例间具有类型等价性,一个类型必须在比模块、接口、或程序声明更高层次的编译单元范围内声明,或者从一个包中导入。

虽然包声明不需要在相同的编译单元内,然而下面的例子假设它们都处于一个编译单元。

package p1;
    typedef struct {
        int A;
    } t_1;
endpackage

typedef struct {
    int A;
} t_2;

module sub();
    import p1:t_1;
    parameter type t_3 = int;
    parameter type t_4 = int;
    typedef struct {int A;} t_5;
    t_1 v1; t_2 v2; t_3 v3; t_4 v4; t_5 v5;
endmodule

module top();
    typedef struct {int A;} t_6;
    sub #(.t_3(t_6)) s1();
    sub #(.t_3(t_6)) s2();

    initial begin
        s1.v1 = s2.v1; // 合法的 - 两个类型均来自于包p1(规则8)
        s1.v2 = s2.v2; // 合法的 - 两个类型均来自于$unit(规则4)
        s1.v3 = s2.v3; // 合法的 - 两个类型均来自于top(规则2)
        s1.v4 = s2.v4; // 合法的 - 两个类型均为int(规则1)
        s1.v5 = s2.v5; // 非法的 - 类型来自于s1和s2(规则4)
    end
endmodule

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

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

发布评论

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