syn.directive.array_reshape - 2024.1 日本語

Vitis 高位合成ユーザー ガイド (UG1399)

Document ID
UG1399
Release Date
2024-07-03
Version
2024.1 日本語

説明

重要: syn.directive.array_partition および syn.directive.array_reshape は、最上位関数の M_AXI インターフェイスではサポートされません。代わりに、 『Vitis 高位合成ユーザー ガイド』 (UG1399) の「ベクター データ型」で説明するように、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
注記: コンテナー配列にのみ使用します。
コンテナー内のオブジェクトを再形成します。このオプションを指定すると、オブジェクトのすべての次元が再形成されますが、コンテナーの次元はすべて保持されます。
off=true
指定された変数の ARRAY_RESHAPE 機能をディスエーブルにします。

例 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]