パイプラインのフラッシュ
パイプライン処理は、パイプラインにデータが入力され続けられる限り継続して実行されます。処理するデータがなければ、パイプラインは一時停止します。これを次の図に示します。Input Data
Valid
信号が Low になり、有効な入力データがないことが示されています。この信号が High になって処理するデータが新しく入ってきたことを示すと、パイプラインは動作を再開します。
場合によっては、空にできる (フラッシュできる) パイプラインが必要なこともあります。このために、flush
オプションが提供されています。パイプラインをフラッシュすると、パイプラインの開始時にデータ valid
信号によりデータがないことが示されたときに、新しい入力の読み出しが停止し、最後の入力が処理されてパイプラインから出力されるまで、処理が継続されてその後の各パイプライン段が閉鎖されます。
後述するように、ツールは任意のパイプライン処理されたループまたは関数に使用する正しいパイプライン形式を自動的に選択します。ただし、syn.compile.pipeline_style
コンフィギュレーション コマンドを使用してデフォルトのパイプライン形式を指定することで、このデフォルト動作を変更できます。
また、PIPELINE プラグマや指示子を使用して、関数やループのパイプライン形式を指定することもできます。このオプションは、特定のスコープのプラグマまたは指示子に適用され、syn.compile.pipeline_style
割り当てられたグローバル デフォルト設定は変更されません。
stp
および flp
タイプのパイプラインには、作成されたハードウェア パイプラインがさまざまな種類のブロッキング信号を使用してパイプラインを停止させる、標準的なパイプライン ロジックが採用されています。特に物理ステージ数が多く、膨大なデータを処理するパイプラインでは、これらのブロッキング信号によりネットのファンアウト数が大きくなることがよくあります。ファンアウトの大きいネットが作成されると、RTL/論理合成または配置配線時に修正できないタイミング クロージャの問題が発生する主な原因となります。この問題を解決するために、フリーランニング パイプライン (または frp
) と呼ばれる新しいタイプのパイプライン インプリメンテーションが作成されています。フリーランニング パイプラインは、ブロッキング信号で動作するパイプラインを処理するのに最も効果的なアーキテクチャです。その理由は次のとおりです。
- レジスタ イネーブルへのブロッキング信号の接続を完全に排除している
- 完全なフラッシュ可能パイプラインであり、無効なトランザクションをバブリングできる
- ファンアウトを (フロップ間で) 分散させる従来のアーキテクチャとは異なり、ファンアウトを削減できる
- フロップ クローニングのような合成および/または配置配線の最適化には依存しない
- これにより、ファンアウト数の削減と共に、配線長を短縮した構造を実現し、配置配線に役立つ
一方で、このファンアウトの削減には次の理由でコストがかかります。
- ブロッキング出力ポートに必要な FIFO バッファーのサイズにより、追加のリソースが必要となる
- このようなブロッキング出力ポートにおけるマルチプレクサーの遅延
- フォワード プレッシャー トリガーの早期検証による潜在的なパフォーマンスへの影響
frp
) は、DATAFLOW 領域内からのみ呼び出すことができます。frp
形式は、シーケンシャル領域またはパイプライン領域で呼び出されるループには適用できません。パイプラインのタイプ
次の表に、ツールで使用可能な 3 つのタイプのパイプラインの概要を示します。ツールは、任意のパイプライン処理されたループまたは関数に使用する適切なパイプライン形式を自動的に選択します。hls::tasks
を用いてパイプラインを使用すると、デッドロックを回避するためにフラッシュ パイプライン (FLP) 形式が自動的に選択されます。パイプライン制御に大きなファンアウトが必要で、かつその他のフリーランニング要件が満たされている場合、ツールはファンアウト数を制限するためにフリーランニング パイプライン (FRP) 形式を選択します。上記のどちらにも当てはまらない場合は、標準パイプライン (STP) 形式が選択されます。
名前 | ストール パイプライン | フリーランニング/フラッシュ可能パイプライン | フラッシュ可能パイプライン |
---|---|---|---|
ユース ケース |
|
|
パフォーマンスを改善するか、デッドロックを回避するため、フラッシュ可能である必要がある場合 |
プラグマ/指示子 |
#pragma HLS pipeline
style=stp
|
#pragma HLS pipeline
style=frp
|
#pragma HLS pipeline
style=flp
|
グローバル設定 |
syn.compile.pipeline_style=stp (デフォルト) |
syn.compile.pipeline_style=frp
|
syn.compile.pipeline_style=flp
|
欠点 |
|
|
|
利点 |
|
|
|
flp
) には、syn.compile.enable_auto_rewind
コンフィギュレーション コマンドもイネーブルの場合、PIPELINE プラグマまたは指示子で指定された巻き戻し (rewind) オプションを使用できます。