説明
複数の小型の配列を 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 ツールで必要なオフセットが自動的に計算されます。
- 配列変数の要素 0 は、新しいターゲットの要素 <
例 1
次の例では、関数 foo
の配列 array1
および array2
が array3
として指定した 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