目录
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 是一种非常有用的数据类型,它允许在同一内存位置存储不同类型的数据。它可以用于实现多态性和位域等功能。