描述
重要: 针对顶层函数上的
M_AXI
接口,不支持 Array_Partition
和 Array_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]