説明
演算を同時実行できるようにすることにより関数またはループの開始間隔 (II) を短縮します。パイプラインのデフォルト タイプは config_compile -pipeline_style
コマンドで定義しますが、PIPELINE プラグマまたは指示子の方が優先されます。
パイプライン処理された関数またはループは、<N>
クロック サイクル (<N>
は関数またはループの II) ごとに新しい入力を処理できます。II=1 でクロック サイクルごとに新しい入力が処理されます。開始間隔は、プラグマの II オプションを使用して指定できます。
PIPELINE プラグマまたは指示子を使用すると、Vitis HLS はデフォルトで指定されたクロック周期制約に従ってデザインの最小 II を生成します。II
オプションが指定されていなければ、II の達成よりもタイミングの達成に重点が置かれます。
Vitis HLS ツールで指定した II でデザインを作成できない場合は、警告メッセージが表示されて、可能な最短の開始間隔でデザインが作成されます。
警告メッセージを参考にデザインを解析し、必要な開始間隔を満たしてデザインを作成するためにどの手順が必要なのかを判断します。
ループをパイプライン処理すると、次の図に示すように、ループ内の演算が同時実行されるようインプリメントできます。図の (A) はデフォルトの順次演算を示しています。各入力は 3 クロック サイクルごとに処理され (II=3)、最後の出力が書き出されるまでに 8 クロック サイクルかかっています。(B) は読み出し間に 1 サイクル (II=1)、最後の書き込みまでに 4 サイクルかかっています。
構文
C ソースの関数の本体またはループ内に配置します。
#pragma HLS pipeline II=<int> off rewind style=<value>
説明:
-
II=<int>
- パイプラインの開始間隔を指定します。HLS ツールでは、この指定を満たすことが試みられます。データの依存性によって、実際の開始間隔はこの指定より大きくなることがあります。
-
off
- オプションのキーワードで、指定のループまたは関数のパイプライン処理をオフにします。
config_compile -pipeline_loops
を使用してグローバルにループをパイプライン処理した場合に、特定のループのパイプラインのみをディスエーブルにするために使用します。 -
rewind
- オプションのキーワードで、パイプライン処理されたループを巻き戻してパフォーマンスを改善 で説明するように、巻き戻しをイネーブルにします。これにより、1 つのループ反復の終了と次の反復の開始の間に一時停止のない連続ループ パイプライン処理がイネーブルになります。巻き戻しは、最上位関数内に 1 つのループしかない (完全なループ ネスト) 場合にのみ効果的です。ループ前のコード部分は、次のようになります。
- 初期化として処理されます。
- パイプラインで一度だけ実行されます。
- 条件演算 (if-else) を含むことはできません。ヒント: この機能は、パイプライン処理されたループでのみサポートされ、パイプライン処理された関数ではサポートされません。
-
style=<stp | frp | flp>
- 指定した関数またはループに使用するパイプライン処理のタイプを指定します。パイプライン形式の詳細は、パイプラインのフラッシュとパイプラインのタイプを参照してください。パイプライン処理のタイプは次のとおりです。
-
stp
- ストール パイプライン。入力データが使用可能になった場合にのみ実行され、それ以外の場合は停止します。これがデフォルト設定で、ループおよび関数のパイプラインの両方に対して Vitis HLS で使用されるパイプラインのタイプです。フラッシュ可能パイプラインが必要ない場合に使用してください。たとえば、ストールによるパフォーマンスやデッドロック問題がない場合に使用します。
-
flp
- パイプラインをフラッシュ可能パイプラインに定義します。このタイプのパイプラインは、パイプラインのイテレーション間でリソースを共有できないので、通常より多くのリソースを消費し、II も長くなります。
-
frp
- フリーランニング、フラッシュ可能パイプライン。入力データが使用可能でなくても実行されます。パイプライン制御信号のファンアウトが削減されたためにタイミングを改善する必要がある場合や、パフォーマンスを改善してデッドロックを回避する必要のある場合などに使用します。ただし、このパイプライン形式により、データがなくてもパイプライン レジスタにクロックが供給されるので、消費電力が増加する可能性があります。
重要: これは示唆であり、ハード制約ではありません。ツールにより、パイプライン処理を有効にするためのデザイン条件が確認されます。ループが特定の形式に従っていない場合は、必要に応じてデフォルト タイプ (stp
) に戻されます。 -
例
この例では、関数 func
が開始間隔 1 でパイプライン処理されます。
void func { a, b, c, d} {
#pragma HLS pipeline II=1
...
}