1. 结构体#
结构包含具有不同大小的不同数据类型,这些数据类型分组在一个结构体名称下。默认情况下,结构体最初是未压缩的形式,但我们可以使用“packed”关键字将其转换为压缩结构。结构与普通数组不同,因为数组仅使用相同类型和大小的元素,而结构体使用不同的数据类型。使用“struct”关键字声明的非压缩结构。
下图显示了 System Verilog 中不同类型的结构体。
结构体类型
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;
下图显示了非压缩结构的数据对齐情况。
‘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;
下图展示了压缩结构体的数据对齐情况。
“字节”占用 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;
非压缩联合体的数据对齐:
下图展示了非压缩联合体的数据对齐
图显示“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 ;
非压缩联合体的数据对齐:
下图展示了压缩联合体的数据对齐
该图显示使用位数据类型和 8 位大小。在打包联合内部,所有成员应该是相同类型的元素和相同的大小。这里为所有联合成员分配了 8 位大小。
3. 结构体和联合体的区别#
结构体 | 联合体 |
---|---|
struct关键字用于创建结构体变量 | union关键字用于定义联合体变量 |
一次处理不同类型的元素 | 一次处理单一类型的元素 |
每个结构元素单独获取内存 | 每个元素分别地共享内存空间 |
其他元素改变时,元素的值不会改 | 元素值改变时,该元素值也会改变 |
结构体变量大小等于或大于元素之和 | 联合体变量的大小与最大数据类型的大小相同 |