描述
重要: 针对顶层函数上的
M_AXI
接口,不支持 syn.directive.array_partition
和 syn.directive.array_reshape
。您可改用 hls::vector
数据类型,如
Vitis 高层次综合用户指南(UG1399) 的“矢量数据类型”中所述。
syn.directive.array_reshape
将阵列分区与垂直阵列映射相结合以创建所含元素更少但字宽更宽的新阵列。
syn.directive.array_reshape
命令提供下列功能特性:
- 将阵列拆分为多个阵列(类似
syn.directive.array_partition
)。 - 自动按垂直方式重新组合阵列,创建字宽更宽的新阵列。
语法
syn.directive.array_reshape=[OPTIONS] <location> <array>
-
<location>
是包含阵列变量的位置(格式为function[/label]
)。 -
<array>
是要重塑的阵列变量。
选项
-
dim=<integer>
- 指定要分区的阵列的维度。
- 该维度仅与多维阵列相关。
- 如果使用 0 值,则使用指定选项对所有维度进行分区。
- 设置任何其他值都仅对该值对应的维度进行分区。例如,如果使用的值为 1,则仅对第 1 个维度进行分区。
-
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
位的寄存器)。这是默认方式。
-
-
factor=<integer>
- 该选项仅用于
block
或cyclic
分区,用于指定要创建的更小的阵列数量。 -
object
-
注释: 仅与容器阵列相关。对容器内的对象应用重塑。如果指定该选项,则将重塑对象的所有维度,但将保留容器的所有维度。
-
off=true
- 为指定变量禁用 ARRAY_RESHAPE 功能特性。
示例 1
将函数 func
中的 8 位阵列 AB[17] 重塑为含 5 个元素的新的 32 位阵列。
由于 4 不是 17 的整数因子,因此:
- 阵列 AB[17] 的索引 17 位于重塑后第五个元素的低八位中。
- 第五个元素的高八位则不使用。
syn.directive.array_reshape=type=block factor=4 func AB
将函数 func
中的阵列 AB[6][4] 分区到维度 [6][2] 的新阵列中,其中维度 2 为 2 倍宽度。
syn.directive.array_reshape=type=block factor=2 dim=2 func AB
将函数 func
中的 8 位阵列 AB[4][2][2] 重塑到新的单元素阵列(寄存器)中,其位宽为 4*2*2*8 (= 128)。
syn.directive.array_reshape=type=complete dim=0 func AB
示例 2
在您的代码中,可以按阵列的新结构来对已重塑的阵列进行寻址,如以下代码示例所示。使用以下指令时:
syn.directive.array_reshape=top b type=complete dim=0
代码结构如下:
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]