描述
重要: 针对顶层函数上的
M_AXI
接口,不支持 syn.directive.array_partition
和 syn.directive.array_reshape
。您可改用 hls::vector
数据类型,如Vitis 高层次综合用户指南(UG1399) 的“矢量数据类型”章节中所述。
syn.directive.array_partition
将阵列分区为更小的阵列或者独立元素。
这种分区方式可以:
- 生成包含多个小型存储器或多个寄存器(而不是一个大型存储器)的 RTL
- 有效增加存储器读写端口数量
- 可能改善设计吞吐量
- 需要更多存储器实例或寄存器
语法
syn.directive.array_partition=[OPTIONS] <location> <array>
-
<location>
是包含阵列变量的位置(格式为function[/label]
)。 -
<array>
是要分区的阵列变量。
选项
-
dim=<integer>
- 指定要分区的阵列的维度。
- 该维度仅与多维阵列相关。
- 如果使用 0 值,则使用指定选项对所有维度进行分区。
- 设置任何其他值都仅对该值对应的维度进行分区。例如,如果使用的值为 1,则仅对第 1 个维度进行分区。
-
type=(block|cyclic|complete)
-
-
block
型分区会从原始阵列的连续块创建更小阵列。这样可将阵列有效分区为 N 个相等的块,其中 N 为-factor
选项定义的整数。 -
cyclic
型分区会通过交织来自原始阵列的元素来创建更小的阵列。例如,如果使用-factor 3
:- 向第 1 个新阵列分配元素 0。
- 向第 2 个新阵列分配元素 1。
- 向第 3 个新阵列分配元素 2。
- 向第 4 个新阵列分配元素 3。
-
complete
分区可将阵列分解为多个独立元素。对于一维阵列,这对应于将存储器解析为独立寄存器。对于多维阵列,请指定每个维度的分区方式,或者使用-dim 0
选项来对所有维度进行分区。
complete
。 -
-
factor=<integer>
- 该选项仅用于
block
或cyclic
分区,用于指定要创建的更小的阵列数量。 -
off=true
- 为指定变量禁用 ARRAY_PARTITION 功能特性。无法搭配
dim
、factor
或type
一起使用。
示例 1
将 func
函数中的 AB[13] 阵列分区为 4 个阵列。由于 4 不是 13 的整数因子,因此:
- 有 3 个阵列各包含 3 个元素。
- 另 1 个阵列包含 4 个元素 (AB[9:12])。
syn.directive.array_partition=func AB type=block factor=4
将 func
函数中的 AB[6][4] 阵列分区为 2 个阵列,每个阵列维度为 [6][2]。
syn.directive.array_partition=func AB type=block factor=2 dim=2
将 func
函数中的 AB[4][10][6] 的所有维度分区为独立元素。
syn.directive.array_partition=func AB type=complete dim=0
示例 2
在您的代码中,可以按分区阵列的新结构来对已分区的阵列进行寻址,如以下代码示例所示。使用以下指令时:
syn.directive.array_partition=top b type=complete dim=1
代码结构如下:
struct SS
{
int x[N];
int y[N];
};
int top(SS *a, int b[4][6], SS &c) {...}
syn.directive.interface mode=ap_memory top b[0]
syn.directive.interface mode=ap_memory top b[1]
syn.directive.interface mode=ap_memory top b[2]
syn.directive.interface mode=ap_memory top b[3]