pragma HLS array_partition - 2022.1 Chinese

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

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

描述

重要: 针对顶层函数上的 M_AXI 接口,不支持 Array_PartitionArray_Reshape 编译指示和指令。您可改用 hls::vector 数据类型,如 矢量数据类型 中所示。

将阵列分区为更小的阵列或者独立元素,并提供下列特性:

  • 生成包含多个小型存储器或多个寄存器(而不是一个大型存储器)的 RTL。
  • 有效增加存储器读写端口数量。
  • 可能改善设计吞吐量。
  • 需要更多存储器实例或寄存器。

语法

将 C 语言源代码中的编译指示置于定义阵列变量的函数边界内。

#pragma HLS array_partition variable=<name> \
type=<type>  factor=<int>  dim=<int>

其中:

variable=<name>
必要实参,用于指定要分区的阵列变量。
type=<type>
(可选)指定分区类型。默认类型为 complete。支持以下类型:
cyclic
循环分区会通过交织来自原始阵列的元素来创建更小的阵列。该阵列按循环进行分区,具体方式是在每个新阵列中放入一个元素,然后回到第一个阵列以重复该循环直至阵列完全完成分区为止。例如,如果使用 factor=3
  • 向第 1 个新阵列分配元素 0。
  • 向第 2 个新阵列分配元素 1。
  • 向第 3 个新阵列分配元素 2。
  • 向第 4 个新阵列分配元素 3。
block
块分区会从原始阵列的连续块创建更小阵列。这样可将阵列有效分区为 N 个相等的块,其中 N 为 factor= 实参定义的整数。
complete
完全分区可将阵列分解为多个独立元素。对于一维阵列,这对应于将存储器解析为独立寄存器。这是默认 <type>
factor=<int>
指定要创建的更小的阵列数量。
重要: 对于 complete 型分区,不指定该因子。对于 block 和 cyclic 型分区,需指定 factor=
dim=<int>
指定要分区的多维阵列的维度。针对含 <N> 维的阵列,指定范围介于 0 到 <N> 之间的整数:
  • 如果使用 0 值,则使用指定的类型和因子选项对多维阵列的所有维度进行分区。
  • 任意非零值均表示只对指定维度进行分区。例如,如果使用的值为 1,则仅对第 1 个维度进行分区。

示例 1

此示例使用 block 分区将 13 个元素的阵列 AB[13] 分区为 4 个阵列:

#pragma HLS array_partition variable=AB type=block factor=4
提示: 由于 4 不是 13 的整数因子,因此:
  • 其中 3 个新阵列各含 3 个元素
  • 另 1 个阵列则包含 4 个元素 (AB[9:12])

示例 2

此示例分区将二维阵列 AB[6][4] 的维度 2 分区为 2 个维度为 [6][2] 的新阵列:

#pragma HLS array_partition variable=AB type=block factor=2 dim=2

示例 3

此示例将二维 in_local 阵列的第二个维度分区为各独立元素。

int in_local[MAX_SIZE][MAX_DIM];
#pragma HLS ARRAY_PARTITION variable=in_local type=complete dim=2

示例 4

在您的代码中,可以按阵列的新结构来对已分区的阵列进行寻址,如以下代码示例所示。

struct SS
{
  int x[N];
  int y[N];
};
  
int top(SS *a, int b[4][6], SS &c) {
#pragma HLS array_partition type=complete dim=1 variable=b
#pragma HLS interface mode=ap_memory port = b[0]
#pragma HLS interface mode=ap_memory port = b[1]
#pragma HLS interface mode=ap_memory port = b[2]
#pragma HLS interface mode=ap_memory port = b[3]