説明
演算を同時実行できるようにすることにより関数またはループの開始間隔 (II) を短縮します。
パイプライン処理された関数またはループは、<N>
クロック サイクル (<N>
は関数またはループの II) ごとに新しい入力を処理できます。PIPELINE
プラグマのデフォルトの II は 1 で、クロック サイクルごとに 1 つの入力を処理します。開始間隔は、プラグマの II オプションを使用して指定できます。
ループをパイプライン処理すると、次の図に示すように、ループ内の演算が同時実行されるようインプリメントできます。次の図の (A) はデフォルトの順次演算を示しています。各入力は 次の クロック サイクルごとに処理され (II=3)、最後の出力が書き出されるまでに 8 クロック サイクルかかっています。
図 1. ループのパイプライン
重要: ループのパイプラインは、ループ運搬依存を使用することにより回避できます。
DEPENDENCE
プラグマでは、ループ運搬依存を克服し、ループをパイプライン処理できるようにする (またはより短い間隔でパイプラインできるようにする) ための追加情報を提供します。Vivado HLS ツールで指定した II でデザインを作成できない場合は、警告メッセージが表示されて、可能な最短の開始間隔でデザインが作成されます。
警告メッセージを参考にデザインを解析し、必要な開始間隔を満たしてデザインを作成するためにどの手順が必要なのかを判断します。
構文
C ソースの関数の本体またはループ内に配置します。
#pragma HLS pipeline II=<int> enable_flush rewind
説明:
-
II=<int>
- パイプラインの開始間隔を指定します。HLS ツールでは、この指定を満たすことが試みられます。データの依存性によって、実際の開始間隔はこの指定より大きくなることがあります。デフォルトは 1 です。
-
enable_flush
- オプションのキーワードで、パイプラインの入力で有効であったデータが非アクティブになった場合に、データをフラッシュして空にするパイプラインをインプリメントします。 ヒント: この機能は、パイプライン処理された関数でのみサポートされ、パイプライン処理されたループではサポートされません。
-
rewind
- オプションのキーワードで、1 つのループ反復の終了と次の反復の開始の間に一時停止のない連続ループ パイプライン処理 (巻き戻し) をイネーブルにします。巻き戻しは、最上位関数内に 1 つのループしかない (完全なループ ネスト) 場合にのみ効果的です。ループ前のコード部分は、次のようになります。
- 初期化と認識されます。
- パイプラインで一度だけ実行されます。
- 条件演算 (if-else) を含むことはできません。ヒント: この機能は、パイプライン処理されたループでのみサポートされ、パイプライン処理された関数ではサポートされません。
例 1
この例では、関数 foo
が開始間隔 1 でパイプライン処理されます。
void foo { a, b, c, d} {
#pragma HLS pipeline II=1
...
}
注記: II のデフォルト値は 1 なので、II=1 を指定する必要はありません。