説明
重要:
syn.directive.array_partition
および syn.directive.array_reshape
は、最上位関数の M_AXI
インターフェイスではサポートされません。代わりに、「ベクター データ型」で説明するように、hls::vector
データ型を使用できます。
syn.directive.array_reshape
は、配列の分割と垂直配列マップを組み合わせ、要素数が少なくワード数の大きい新しい配列を 1 つ作成します。
syn.directive.array_reshape
コマンドには、次の機能があります。
- 配列を複数の配列に分割 (
syn.directive.array_partition
と同様)。 - 配列を垂直方向に自動的に結合し直し、ワード数の多い新しい配列を作成。
構文
syn.directive.array_reshape=[OPTIONS] <location> <array>
-
<location>
: 配列変数を含める場所をfunction[/label]
の形式で指定します。 -
<array>
: 再形成する配列変数を指定します。
オプション
-
dim=<integer>
- 配列のどの次元を分割するかを指定します。
- 次元は、多次元配列にのみ使用します。
- 0 を指定すると、すべての次元が指定したオプションで分割されます。
- その他の値を指定すると、その次元のみが分割されます。たとえば、1 を指定した場合、最初の次元のみが分割されます。
-
type=(block|cyclic|complete)
-
-
block
再形成では、元の配列の連続したブロックから小型の配列を作成します。これにより、配列が N 個 (N は-factor
オプションで定義されている整数値) のブロックに分割され、その N 個のブロックがword-width*N
で 1 つの配列にまとめられます。デフォルトはcomplete
です。 -
cyclic
再形成では、元の配列の要素をインターリーブすることにより小型の配列を作成します。たとえば、-factor 3
の場合、要素 0 は新しく作成される 1 番目の配列に割り当てられ、要素 1 は 2 番目、要素 2 は 3 番目、要素 3 は 1 番目の配列に割り当てられます。最終的な配列は、新しい配列を 1 つの配列に垂直連結 (ワードを連結してワード数が大きいものを作成) したものになります。 -
complete
再形成では、配列を一時的に個々の要素に分割してから、ワード数の大きい 1 つの配列にまとめます。1 次元配列の場合、これはワード数が非常に大きいレジスタを 1 つ作成するのと同じです (元の配列が N 個の M ビット要素を含む場合、N*M
ビットのレジスタとなる)。これがデフォルトです。
-
-
factor=<integer>
-
block
またはcyclic
分割のみに使用され、作成する小さい配列の数を指定します。 -
object
-
注記: コンテナー配列にのみ使用します。コンテナー内のオブジェクトを再形成します。このオプションを指定すると、オブジェクトのすべての次元が再形成されますが、コンテナーの次元はすべて保持されます。
例 1
関数 func
の 8 ビット配列 AB[17] を、5 つの要素を含む新しい 32 ビット配列 1 つに再形成します。
4 は 17 の因数ではないので、次のように分割されます。
- 配列 AB[17] のインデックス 17 は、形状変更された 5 番目の要素の下位 8 ビットです。
- 5 番目の要素の上位 8 ビットは使用されません。
syn.directive.array_reshape=type=block factor=4 func AB
関数 func
の配列 AB[6][4] を、次元 [6][2] の新しい配列 1 つに分割します。この次元 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) の 1 要素配列 (1 つのレジスタ) に再形成します。
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]