pragma HLS array_reshape - 2023.2 简体中文

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

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 简体中文

描述

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

ARRAY_RESHAPE 编译指示用于通过增加位宽来对阵列元素进行垂直重映射和串联,以重构此阵列。这样即可减少耗用的块 RAM 数量,同时提供对数据的并行访问。该编译指示能够创建新阵列,其中包含元素数量更少但位宽更大,这样即可在单一时钟周期内访问更多数据。

给定如下代码:

void foo (...) {
int array1[N];
int array2[N];
int array3[N];
#pragma HLS ARRAY_RESHAPE variable=array1 type=block factor=2 dim=1
#pragma HLS ARRAY_RESHAPE variable=array2 type=cyclic factor=2 dim=1
#pragma HLS ARRAY_RESHAPE variable=array3 type=complete dim=1
...
}

ARRAY_RESHAPE 编译指示将阵列转换为下图所示形式。

图 1. ARRAY_RESHAPE 编译指示

语法

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

#pragma HLS array_reshape variable=<name> type=<type>  factor=<int>  dim=<int> off=true

其中:

variable=<name>
必要实参,用于指定要重构的阵列变量。
type=<type>
(可选)指定分区类型。默认类型为 complete。支持以下类型:
cyclic
循环重塑会通过交织来自原始阵列的元素来创建更小的阵列。例如,如果使用 factor=3,则将向第 1 个新阵列分配元素 0,向第 2 个新阵列分配元素 1,向第 3 个新阵列分配元素 2,然后再次向第 1 个新阵列分配元素 3。最后一个阵列是将新阵列垂直串联(代码字串联以创建更长的代码字)成单个阵列。
block
块重塑会从原始阵列的连续块创建更小阵列。这样即可将阵列有效等分为 <N> 个相等的块,其中 <N>factor= 定义的整数,然后使用 word-width*N<N> 个块整合到单一阵列中。
complete
完整重塑可将阵列分解为临时独立元素,然后将其重新组合为含更宽的字的单个阵列。对于一维阵列,这等同于创建一个超宽寄存器(如果原始阵列为 N 个 M 位的元素,结果可生成含 N*M 位的寄存器)。这是默认阵列重塑类型。
factor=<int>
指定当前阵列的拆分量(或者要创建的临时阵列数)。因子为 2 表示将阵列对半拆分,并将位宽加倍。因子为 3 表示将阵列拆分为 3 份,并将位宽变为三倍。
重要: 对于 complete 型分区,不指定该因子。对于 block 和 cyclic 型重塑,需指定 factor=
dim=<int>
指定要分区的多维阵列的维度。针对含 <N> 维的阵列,指定范围介于 0 到 <N> 之间的整数:
  • 如果使用 0 值,则使用指定的类型和因子选项对多维阵列的所有维度进行分区。
  • 任意非零值均表示只对指定维度进行分区。例如,如果使用的值为 1,则仅对第 1 个维度进行分区。
object
仅与容器阵列相关的关键字。指定此关键字时,ARRAY_RESHAPE 编译指示将应用于该容器内的对象,并对容器内的对象的所有维度进行重塑,但容器本身的所有维度都保留不变。不指定关键字时,该编译指示将应用于容器阵列,而不应用于对象。
off=true
为指定变量禁用 ARRAY_RESHAPE 功能特性。

示例 1

使用块映射,将含 17 个元素的 8 位阵列 AB[17] 重塑为含 5 个元素的全新 32 位阵列。

#pragma HLS array_reshape variable=AB type=block factor=4
提示: factor=4 表示阵列应拆分为 4 份,这表示将 17 个元素重塑为含 5 个元素的阵列,位宽增加至原来的 4 倍。在此案例中,最后一个元素 AB[17] 映射到第五个元素的下 8 位,第五个元素的其余部分则为空。

示例 2

将二维阵列 AB[6][4] 重塑为新阵列(维度为 [6][2]),其中维度 2 位宽增至原来的 2 倍。

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

示例 3

将函数 func 中的三维 8 位阵列 AB[4][2][2] 重塑为全新的单元素阵列(寄存器),位宽为 128 位 (4×2×2×8)。

#pragma HLS array_reshape variable=AB type=complete dim=0
提示: dim=0 表示重塑该阵列的所有维度。

示例 4

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

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