pragma HLS allocation - 2024.1 日本語

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

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

説明

インプリメントされたカーネルでのリソースの割り当てを制限する制限を指定します。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 のサブ関数に含まれる乗算器には適用されません。

ヒント: サブ関数のインプリメンテーションに使用される乗算器の数を制限するには、そのサブ関数に ALLOCATION プラグマを指定するか、サブ関数を 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