结构体和联合体

1. 结构体#

结构包含具有不同大小的不同数据类型,这些数据类型分组在一个结构体名称下。默认情况下,结构体最初是未压缩的形式,但我们可以使用“packed”关键字将其转换为压缩结构。结构与普通数组不同,因为数组仅使用相同类型和大小的元素,而结构体使用不同的数据类型。使用“struct”关键字声明的非压缩结构。

下图显示了 System Verilog 中不同类型的结构体。

image

结构体类型

1.非压缩结构体 2.压缩结构体

1.1 非压缩结构体#

非压缩结构是默认的结构语法,与普通结构体相同。不同的变量在结构内部保存不同的数据,称为结构成员。结构成员被视为自变量。当我们想给结构体的成员赋值时,可以使’structure name. variable’的方式访问。

赋值给结构体成员:

structure name = ‘{value1, value2, value3};

赋值的替代方法:

structure name = ‘{variable1 : value1 , variable2 : value2 , variable 3 : value3};
该方法一步完成初始化。变量和值可以用冒号“.”分隔。

语法:

struct{
list of different types of variables with sizes
} structure name;

示例:

struct{
string name;
bit[15:0] salary;
byte id;
} employee_s;

下图显示了非压缩结构的数据对齐情况。

image

‘string’ 为 sam 占用 24 位,这里 string 被视为 ascii 字符。然后 16 位表示位[15:0],8 位表示字节。这里比特流大小是 48。未压缩的结构比压缩的结构具有更多的内存占用。

1.2 压缩结构体#

压缩结构体可以使用 Packed 关键字显式完成。它以指定的顺序以连续形式存储结构体的所有成员。在 RTL 代码中,压缩结构体被视为单个向量,结构体中的每个数据类型都表示为位字段。整个结构体在内存中毫无间隙地压缩在一起。只有压缩数据类型(如 bit , logic and integer 数据类型)才允许在压缩结构体中使用。

注意:如果结构体不能表示为向量,则无法压缩。

语法:

typedef struct packed{
list of different types of variables with sizes
} structure name;

示例:

typedef struct packed{
byte id;
bit[7:0]experience;
logic[15:0]salary;
}employee_ details_s;

下图展示了压缩结构体的数据对齐情况。

image

“字节”占用 8 位,位[7:0] 为 8 位,逻辑[15:0] 为 16 位。这里比特流大小为 32 位。封装结构比非封装结构占用空间更小。

1.3 压缩结构和非压缩结构的区别#

压缩结构非压缩结构
struct Packed 关键字用于定义压缩结构struct 关键字用于定义解包结构
由于单 bit 数据声明,内存占用更小更大的内存占用,因为它包含所有数据类型
不能使用字符串数据类型,仅允许使用压缩数据类型和整数数据类型可以使用所有数据类型。
它用在RTL代码中,因为它可以综合代码它不在RTL代码中使用,因为它无法通过综合工具综合
整个结构体压缩在一起,没有内存间隙未压缩结构体没有压缩

2. 联合体#

联合体类似于结构体,但联合体共享内存位置。最大数据类型大小将是联合体中所有成员的内存大小。 “union”关键字用于定义联合体。它们有两种类型:压缩联合体和非压缩联合体。

2.1 非压缩联合体#

非压缩联合体使用关键字“union”关键字。它使用 int、byte、bit、logic 等数据类型。整个联合成员只应采用最大的数据类型大小。在这种情况下,有时整个内存空间可能不会被所有联合体成员使用。一个变量的值更改也会影响联合体内的其他成员。

语法:

union {
list of elements
} Union_name

示例:

union {
int x;
byte y;
} data_u;

非压缩联合体的数据对齐:

下图展示了非压缩联合体的数据对齐

image

图显示“int”占用 32 位,“byte”占用 8 位。但在解压缩的联合体中,所有成员共享内存。这里“int”是最大的数据类型,因此联合体中的所有其他成员共享 32 位。

2.2 压缩联合体#

压缩联合体由“union Packed”关键字定义。它仅使用相同类型的元素,例如具有相同大小的 ‘bit’ 、 ’logic’ 、 ‘reg’ 。这是压缩联合体的限制之一。

语法:

typedef union packed {
list of different elements
} Union_name;

示例:

typedef union packed {
bit [7:0];
bit [7:0];
} abc_u ;

非压缩联合体的数据对齐:

下图展示了压缩联合体的数据对齐

image

该图显示使用位数据类型和 8 位大小。在打包联合内部,所有成员应该是相同类型的元素和相同的大小。这里为所有联合成员分配了 8 位大小。

3. 结构体和联合体的区别#

结构体联合体
struct关键字用于创建结构体变量union关键字用于定义联合体变量
一次处理不同类型的元素一次处理单一类型的元素
每个结构元素单独获取内存每个元素分别地共享内存空间
其他元素改变时,元素的值不会改元素值改变时,该元素值也会改变
结构体变量大小等于或大于元素之和联合体变量的大小与最大数据类型的大小相同