説明
インプリメントされたカーネルでのリソースの割り当てを制限する制限を指定します。ALLOCATION プラグマまたは指示子を使用すると、特定の関数、ループ、または演算をインプリメントするのに使用される RTL インスタンスおよびハードウェア リソースの数を制限できます。ALLOCATION プラグマは関数の本体、ループ、またはコード領域内に指定します。
たとえば、C ソース コードに foo_sub
という関数のインスタンスが 4 つある場合、ALLOCATION プラグマを使用して最終 RTL で foo_sub
のインスタンスを 1 つだけにできます。C 関数の 4 つのインスタンスすべてが、同じ RTL ブロックを使用してインプリメントされます。これにより関数で使用されるリソースは削減されますが、これらのリソースが共有されるので、パフォーマンスが低下することがあります。
下の例に示すように、関数名の代わりに関数ポインターを指定すると、ALLOCATION にテンプレート関数を指定することもできます。
加算、乗算、配列読み出し、書き込みなどの C コードでの演算も、ALLOCATION プラグマを使用して制限できます。
構文
<type>
(operation または function) は、allocation
キーワードの後に指定する必要がありまます。#pragma HLS allocation <type> instances=<list>
limit=<value>
説明:
-
<type>
- 次のいずれかを指定します。
-
function
-
instances=
にリストされた関数に適用されることを指定します。関数には、次の条件を満たす元の C または C++ コードの関数を指定できます。-
pragma HLS inline
またはset_directive_inline
コマンドによりインライン展開されていない。 - Vitis HLS ツールで自動的にインライン展開されていない。
-
-
operation
-
instances=
にリストされた演算に適用されることを指定します。
-
-
instances=<list>
- C コードからの関数名または演算子名を指定します。
ALLOCATION
プラグマを使用して制限可能な演算のリストは、config_op コマンドを参照してください。 -
limit=<value>
- カーネルで使用されるインスタンスの制限を指定します (オプション)。
例 1
デザインに関数 foo
のインスタンスが複数含まれているとします。この例では、ハードウェア カーネルの RTL における foo
のインスタンス数を 2 に制限しています。
#pragma HLS allocation function instances=foo limit=2
例 2
次の例では、関数 my_func
のインプリメンテーションに使用される乗算演算の数を 1 に制限しています。この制限は、my_func
外にある乗算器、または my_func
のサブ関数に含まれる乗算器には適用されません。
my_func
にインライン展開します。void my_func(data_t angle) {
#pragma HLS allocation operation instances=mul limit=1
...
}
例 3
次に示すように、ALLOCATION プラグマはテンプレート関数にも使用できます。通常は関数名に基づいて識別されますが、テンプレート関数は関数ポインターに基づきます。
template <typename DT>
void foo(DT a, DT b){
}
// The following is valid
#pragma HLS ALLOCATION function instances=foo<DT>
...
// The following is not valid
#pragma HLS ALLOCATION function instances=foo