描述
重要: 针对顶层函数上的
M_AXI
接口,不支持 Array_Partition
和 Array_Reshape
编译指示和指令。您可改用 hls::vector
数据类型,如 矢量数据类型 中所述。将阵列分区与垂直阵列映射相结合以创建所含元素更少但字宽更宽的新阵列。
set_directive_array_reshape
命令提供下列功能特性:
- 将阵列拆分为多个阵列(类似
set_directive_array_partition
)。 - 自动按垂直方式重新组合阵列,创建字宽更宽的新阵列。
语法
set_directive_array_reshape [OPTIONS] <location> <array>
-
<location>
是包含阵列变量的位置(格式为function[/label]
)。 -
<array>
是要重塑的阵列变量。
选项
-
-dim <integer>
-
注释: 仅与多维阵列相关。指定要重塑的阵列的维度。
- 如果该值设置为 0,则使用指定选项对所有维度进行分区。
- 设置任何其他值都仅对该值对应的维度进行分区。默认值为 1。
-
-factor <integer>
-
注释: 仅与指定要临时创建的更小的阵列的数量。
block
或cyclic
类型的重塑有关。 -
-object
-
注释: 仅与容器阵列相关。对容器内的对象应用重塑。如果指定该选项,则将重塑对象的所有维度,但将保留容器的所有维度。
-
-type (block|cyclic|complete)
-
-
block
型重塑会从原始阵列的连续块创建更小阵列。这样即可将阵列有效等分为 N 个块,其中 N 为-factor
选项定义的整数,然后使用word-width*N
将 N 个块整合到单一阵列中。默认值为complete
。 -
cyclic
型重塑会通过交织来自原始阵列的元素来创建更小的阵列。例如,如果使用-factor 3
,则将向第 1 个新阵列分配元素 0,向第 2 个新阵列分配元素 1,向第 3 个新阵列分配元素 2,然后再次向第 1 个新阵列分配元素 3。最后一个阵列是将新阵列垂直串联(代码字串联以创建更长的代码字)成单个阵列。 -
complete
型重塑可将阵列分解为临时独立元素,然后将其重新组合为含字宽更宽的单个阵列。对于一维阵列,这等同于创建一个超宽寄存器(如果原始阵列为 N 个 M 位的元素,结果可生成含N*M
位的寄存器)。这是默认方式。
-
-
-off
或off=true
- 为指定变量禁用 ARRAY_RESHAPE 功能特性。
示例 1
将函数 func
中的 8 位阵列 AB[17] 重塑为含 5 个元素的新的 32 位阵列。
由于 4 不是 17 的整数因子,因此:
- 阵列 AB[17] 的索引 17 位于重塑后第五个元素的低八位中。
- 第五个元素的高八位则不使用。
set_directive_array_reshape -type block -factor 4 func AB
将函数 func
中的阵列 AB[6][4] 分区到维度 [6][2] 的新阵列中,其中维度 2 为 2 倍宽度。
set_directive_array_reshape -type block -factor 2 -dim 2 func AB
将函数 func
中的 8 位阵列 AB[4][2][2] 重塑到新的单元素阵列(寄存器)中,其位宽为 4*2*2*8 (= 128)。
set_directive_array_reshape -type complete -dim 0 func AB
示例 2
在您的代码中,可以按阵列的新结构来对已分区的阵列进行寻址,如以下代码示例所示;
struct SS
{
int x[N];
int y[N];
};
int top(SS *a, int b[4][6], SS &c) {...}
set_directive_array_reshape top b -type complete -dim 0
set_directive_interface -mode ap_memory top b[0]