SystemVerilog 语法(2)struct、enum、union 的使用

目录

struct

enum

union


struct

struct 是一种用户自定义的数据类型,它可以包含多个不同类型的成员变量,类似于 C 语言中的结构体。struct 可以用于描述复杂的数据结构,方便数据的组织和访问。

定义 struct 的语法如下:

struct struct_name {
    data_type member1;
    data_type member2;
    ...
};

struct_name:结构体的名称

member1、member2:结构体的成员变量

data_type:成员变量的数据类型。

例如,下面是一个包含三个成员变量的 struct:

struct person {
    string name;
    int age;
    float height;
};

可以使用以下语法来声明一个 struct 类型的变量:

person   p1;

也可以在声明时初始化成员变量:

person p2 = {"Tom", 20, 1.75};

访问 struct 的成员变量可以使用 “.” 操作符:

p1.name = "Jack";
p1.age = 25;
p1.height = 1.8;

struct 还可以嵌套定义,例如:

struct address {
    string street;
    string city;
    string state;
};

在 person 中嵌套 address,如下:

struct person {
    string name;
    int age;
    address addr;
};

这样,person 结构体中的 addr 成员变量就是一个嵌套的 address 结构体。

访问 addr 的成员变量可以使用 “.” 操作符:

person p3 = {"Lucy", 30, {"Main St.", "New York", "NY"}};
p3.addr.street = "Broadway";
p3.addr.city = "Los Angeles";
p3.addr.state = "CA";

enum

enum 是一种数据类型,用于定义一组有限的命名常量。它可以用于表示状态机的状态、寄存器的位域、错误码等。

以下是一个简单的 enum 定义示例:

enum logic [3:0] {
    IDLE,
    READ, 
    WRITE, 
    ERROR
} state;

这个 enum 定义了一个名为 state 的变量,它有 4 个可能的值:IDLE、READ、WRITE 和ERROR。每个值都用一个 4 位的二进制数表示,范围是 0 到 15。

enum 类型还可以使用关键字 typedef 定义为一个新的数据类型,例如:

typedef enum logic [1:0] {
    RED, 
    YELLOW, 
    GREEN
} traffic_light_t;

这个定义将 traffic_light_t 定义为一个新的数据类型,它只能取三个值:RED、YELLOW 和 GREEN。

在调用时以 traffic_light_t 为定义数据类型,如下,定义了当前状态和次态,其状态只能为 enum 中所列举的三种。

traffic_light_t  state; 
traffic_light_t  next_state;

union

union 是一种数据类型,它允许在同一内存位置存储不同类型的数据。它类似于 C 语言中的 union,但是在 SystemVerilog 中,它可以包含任何类型的数据,包括结构体和数组。

以下是一个简单的 union 示例:

typedef union packed {
  logic [7:0] byte;
  struct packed {
    logic [3:0] nibble1;
    logic [3:0] nibble2;
  } nibbles;
} my_union;

在这个示例中,我们定义了一个名为 my_union 的 union。它有两个成员:byte 和 nibbles。byte 是一个 8 位逻辑类型,而 nibbles 是一个包含两个 4 位逻辑类型的结构体。

我们可以使用以下方式来访问 union 的成员:

my_union u;
u.byte = 8'hAB;
u.nibbles.nibble1 = 4'hA;
u.nibbles.nibble2 = 4'hB;

在这个示例中,我们首先创建了一个名为 u 的 my_union 类型的变量。然后,我们将 8'hAB 赋值给 byte 成员,将 4'hA 和 4'hB 分别赋值给 nibbles 结构体的两个成员。

需要注意的是,当我们访问 union 的成员时,我们只能访问最后一次赋值的成员。

例如,如果我们首先将 8'hAB 赋值给 byte,然后将 4'hA 和 4'hB 分别赋值给 nibbles 结构体的两个成员,那么我们只能访问 nibbles 成员,而不能访问 byte 成员。

总之,union 是一种非常有用的数据类型,它允许在同一内存位置存储不同类型的数据。它可以用于实现多态性和位域等功能。

猜你喜欢

转载自blog.csdn.net/m0_61298445/article/details/129876314
今日推荐