结构体 - 2022.1 Chinese

Vitis 高层次综合用户指南 (UG1399)

Document ID
UG1399
Release Date
2022-06-07
Version
2022.1 简体中文

代码中的结构体(例如,内部变量和全局变量)默认情况下处于解聚 (disaggregated) 状态。这些结构体解聚为对应每个成员元素的独立对象。创建的元素数量和类型取决于结构体本身的内容。结构体阵列作为多个阵列来实现,每个结构体成员都具有独立的阵列。

重要: 默认情况下,用作为顶层函数的结构体将聚合,如 接口上的结构体 中所述。

或者,您可使用 AGGREGATE 编译指示或指令将某一结构体的所有元素都集合到单宽矢量中。这样即可同时读写结构体的所有成员。聚合后的结构体将按需填充,以在 4 字节边界上对齐各元素,如 结构体填充与对齐 中所述。该结构体的成员元素按 C/C++ 语言代码中所示顺序置于该矢量内:结构体的第一个元素对齐矢量的 LSB,结构体的最后一个元素对齐矢量的 MSB。结构体中的任意阵列都分区到独立阵列元素中,并按从低到高的顺序置于矢量内。

提示: 对含大型阵列的结构体使用 AGGREGATE 编译指示时,应谨慎处理。如果某个阵列包含 4096 个类型为 int 的元素,则将导致矢量(和端口)宽度达 4096 * 32 = 131072 位。虽然 Vitis HLS 可创建此 RTL 设计,但 Vivado 在实现期间很可能无法完成其布线。

使用 AGGREGATE 指令创建的单宽矢量支持在单一时钟周期内访问更多数据。在单一时钟周期内访问数据时,Vitis HLS 会自动展开使用此数据的所有循环(前提是可提高吞吐量)。循环可全部或部分展开以创建足够的硬件以便在单一时钟周期内使用更多数据。此功能可使用 config_unroll 命令和 tripcount_threshold 选项来加以控制。在以下示例中,循环次数小于 16 的任何循环都将自动展开(前提是可提高吞吐量)。

config_unroll -tripcount_threshold 16

如果结构体包含阵列,那么 AGGREGATE 指令执行的操作与 ARRAY_RESHAPE 类似,可将重构的阵列与结构体中的其它元素组合在一起。但是,使用 AGGREGATE 对结构体进行最优化后,就无法对该结构体再进行分区或重构。AGGREGATE、ARRAY_PARTITION 与 ARRAY_RESHAPE 指令互斥。