pragma HLS array_map - 2019.2 Japanese

Vitis 統合ソフトウェア プラットフォームの資料: アプリケーション アクセラレーション開発 (UG1393)

Document ID
UG1393
Release Date
2020-02-28
Version
2019.2 Japanese

説明

複数の小型の配列を 1 つの大型の配列にまとめ、ブロック RAM リソースを削減します。

通常は、pragma HLS array_map コマンド (同じ instance= ターゲット) を使用して、複数の小型の配列を 1 つの大型の配列に組み合わせします。この大型の配列は、1 つの大型メモリ (RAM または FIFO) リソースに配置できます。

各配列は、ブロック RAM または UltraRAM (デバイスでサポートされる場合) にマップされます。FPGA で提供される基本ブロック RAM の単位は 18K です。小型の配列の多くで 18K がフルに使用されない場合、小型の配列を 1 つの大型の配列にマップすることでブロック RAM リソースを効率的に使用できます。

ヒント: ブロック RAM が 18K を超える場合は、それらが複数の 18K 単位に自動的にマップされます。

ARRAY_MAP プラグマでは、複数の小型の配列を 1 つの大型の配列にマップするのに次の 2 つの方法がサポートされています。

水平マップ
元の配列を連結して新しい配列を作成します。物理的には、要素数の多い 1 つの配列にインプリメントされます。
垂直マップ
元の配列を連結して新しい配列を作成します。物理的には、要素数の多い 1 つの配列にインプリメントされます。

配列はプラグマが指定された順に、次のものから連結されます。

  • 水平マップの場合はターゲット要素 0。
  • 垂直マップの場合はビット 0。

構文

C ソースの配列変数が定義されている関数内に配置します。

#pragma HLS array_map variable=<name> instance=<instance> \
<mode> offset=<int>

説明:

variable=<name>
必須の引数で、新しいターゲット配列 <instance> にマップする配列変数を指定します。
instance=<instance>
配列の結合先である新しい配列の名前を指定します。
<mode>
配列マップを horizontal または vertical に指定します (オプション)。
  • デフォルトの <mode> は水平マップ (holizontal) で、配列は要素の多い新しい配列に連結されます。元の N 配列のリマップには、1 ポートのブロック RAM で N サイクルまたは 2 ポートのブロック RAM でシーリング (N/2) サイクル必要です。
  • 垂直マップ (vertical) では、ワード数が多い新しい配列に連結されます。元の N 配列のリマップは、上記の水平マップに似ていますが、同じインデックスが使用された場合は 1 サイクルのみ必要です。
offset=<int>
水平マップにのみ適用されます。配列を新しい配列 <instance> にマップする前に適用するオフセット値を整数で指定します。次に例を示します。
  • 配列変数の要素 0 は、新しいターゲットの要素 <int> にマップされます。
  • ほかの要素は新しいターゲットの <int+1>、<int+2> などにマップされます。
    重要: オフセット値が指定されていない場合は、配列要素の重複を避けるため、Vivado HLS ツールで必要なオフセットが自動的に計算されます。

例 1

次の例では、関数 foo の配列 array1 および array2array3 として指定した 1 つの配列にマップされます。

void foo (...) {
int8 array1[M];
int12 array2[N];
#pragma HLS ARRAY_MAP variable=array1 instance=array3 horizontal
#pragma HLS ARRAY_MAP variable=array2 instance=array3 horizontal
...
loop_1: for(i=0;i<M;i++) {
array1[i] = ...;
array2[i] = ...;
...
}
...
}

例 2

次の例では、関数 foo の配列 A[10] および B[15] を、新しい 1 つの配列 AB[25] にマップしています。

  • 要素 AB[0] は A[0] と同じになります。
  • 要素 AB[10] は B[0] と同じになります (offset= オプションが使用されていないため)。
  • 配列 AB[25] のビット幅は A[10] または B[15] の最大ビット幅になります。
#pragma HLS array_map variable=A instance=AB horizontal
#pragma HLS array_map variable=B instance=AB horizontal

例 3

次の例では、配列 C と D を垂直マップで連結し、C と B を結合したビット幅の新しい配列 CD にまとめています。CD の要素数は、元の配列 C または D の最大数になります。

#pragma HLS array_map variable=C instance=CD vertical
#pragma HLS array_map variable=D instance=CD vertical