説明
重要:
Array_Partition
および Array_Reshape
プラグマおよび指示子は、最上位関数の M_AXI
インターフェイスではサポートされません。代わりに、ベクター データ型 で説明するように、hls::vector
データ型を使用できます。配列をより小型の配列または個々の要素に分割します。
この分割により、次のようになります。
- 1 つの大型メモリではなく、複数の小型メモリまたは複数のレジスタを含む RTL が生成されます。
- ストレージの読み出しおよび書き込みポートの数が増加します。
- デザインのスループットが向上する可能性があります。
- より多くのメモリ インスタンスまたはレジスタが必要となります。
構文
set_directive_array_partition [OPTIONS] <location> <array>
-
<location>
: 配列変数を含める場所をfunction[/label]
の形式で指定します。 - <
<array>
>: パーティションする配列変数を指定します。
オプション
-
-dim <integer>
-
注記: 複数次元の配列にのみ使用します。配列のどの次元を分割するかを指定します。
- 0 を指定すると、すべての次元が指定したオプションで分割されます。
- その他の値を指定すると、その次元のみが分割されます。たとえば、1 を指定した場合、最初の次元のみが分割されます。
-
-factor <integer>
-
注記: このオプションは、作成する小型配列の数を指定します。
block
またはcyclic
タイプの分割にのみ使用します。 -
-type (block|cyclic|complete)
-
-
block
タイプの分割では、元の配列の連続したブロックから小型配列が作成されます。N が-factor
オプションで定義される整数だとすると、1 つの配列が N 個のブロックに分割されます。 -
cyclic
分割では、元の配列の要素をインターリーブすることにより小型配列が作成されます。たとえば-factor 3
の場合、要素は次のように割り当てられます。- 要素 0 は 1 番目の新しい配列。
- 要素 1 は 2 番目の新しい配列。
- 要素 2 は 3 番目の新しい配列。
- 要素 3 は再び 1 番目の新しい配列。
-
complete
分割では、配列を個々の要素に分割します。1 次元配列の場合は、メモリが個々のレジスタに分割されます。複数次元の配列の場合は、各次元の分割を指定するか、または-dim 0
を使用してすべての次元を分割します。
complete
です。 -
-
-off
またはoff=true
- 指定された変数の ARRAY_PARTITION 機能をディスエーブルにします。
dim
、factor
、またはtype
では動作しません。
例 1
関数 func
の配列 AB[13] を 4 つの配列に分割します。4 は 13 の因数ではないので、次のように分割されます。
- 3 つの配列に要素が 3 個ずつ含まれます。
- 1 つの配列に 4 つの要素 (AB[9:12]) が含まれます。
set_directive_array_partition -type block -factor 4 func AB
関数 func
の配列 AB[6][4] を各次元が [6][2] の 2 つの配列に分割します。
set_directive_array_partition -type block -factor 2 -dim 2 func AB
関数 func
の AB[4][10][6] のすべての次元を個々の要素に分割します。
set_directive_array_partition -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_partition top b -type complete -dim 1
set_directive_interface -mode ap_memory top b[0]
set_directive_interface -mode ap_memory top b[1]
set_directive_interface -mode ap_memory top b[2]
set_directive_interface -mode ap_memory top b[3]