描述
收集结构体的数据字段并将其组合到字段更宽的单一标量中。
AGGREGATE 编译指示用于将任一结构体的所有元素都组合到一个单宽矢量中,以允许同时读取和写入该结构体的所有成员。可根据结构体元素的声明顺序推断出生成的新字宽标量的位对齐方式。结构体的第一个元素取矢量的 LSB,最后一个元素则与矢量的 MSB 对齐。
如果结构体包含阵列,那么 AGGREGATE 编译指示执行的操作与 ARRAY_RESHAPE 类似,可将重构的阵列与结构体中的其他元素组合在一起。在该结构体内部声明的所有阵列都将全部分区并重构为单一大宽度标量,与其他标量元素封装在一起。
重要: 在含大型阵列的结构体对象上使用 AGGREGATE 优化时,应谨慎处理。如果某个阵列包含 4096 个类型为 int 的元素,则将导致矢量(和端口)宽度达 4096 × 32 = 131072 位。Vitis HLS 工具可以创建此 RTL 设计,但是逻辑综合在 FPGA 实现期间很可能无法完成其布线。
语法
将编译指示布局在要聚合的结构体变量定义附近:
#pragma HLS aggregate variable=<variable> compact=<arg>
其中:
-
variable=<variable>
- 指定要组合的变量。
-
compact=[bit | byte | none | auto]
- 指定已聚合的结构体的对齐方式。可选设置包括:按位级对齐、按字节级对齐、无对齐或者由工具自动判定对齐方式(默认行为)。
示例 1
将函数 func
内含 3 个 8 位字段 (typedef struct {unsigned char R, G, B;} pixel
) 的结构体指针 AB
聚合到一个新的 24 位指针内并按位级对齐。
typedef struct{ unsigned char R, G, B; } pixel; pixel AB; #pragma HLS aggregate variable=AB compact=bit
示例 2
将含 3 个 8 位字段(R、G 和 B)的结构体阵列 AB[17]
聚合到一个含 17 个元素的 24 位新阵列内。
typedef struct{ unsigned char R, G, B; } pixel; pixel AB[17]; #pragma HLS aggregate variable=AB