説明
タスク レベルのパイプライン処理をイネーブルにして関数およびループを重複できるようにし、RTL インプリメンテーションでの同時実行性を増加してデザイン全体のスループットを向上します。
C 記述では、すべての演算が順次に実行されます。pragma HLS
allocation
などのリソースを制限する指示子を指定しない場合、Vivado HLS ツールではレイテンシを最小限に抑え、同時実行性を向上するように処理されます。ただし、データ依存性のためにこれが制限されることがあります。たとえば、配列にアクセスする関数またはループは、完了する前に配列への読み出し/書き込みアクセスをすべて終了する必要があります。そのため、そのデータを消費する次の関数またはループの演算を開始できません。データフロー最適化を使用すると、前の関数またはループがすべての演算を完了する前に、次の関数またはループの演算を開始できるようになります。
データフロー最適化を指定した場合、HLS ツールで順次関数またはループ間のデータフローが解析され、プロデューサー関数またはループが完了する前にコンシューマー関数またはループの演算を開始できるように、ピンポン RAM または FIFO に基づいてチャネルが作成されます。これにより関数またはループを並列実行でき、レイテンシが削減されて RTL のスループットが向上します。
開始間隔 (II) (関数またはループの開始から次の関数またはループの開始までのサイクル数) が指定されていない場合は、HLS ツールで開始間隔が最小になるようにし、データが使用可能になったらすぐに演算を開始できるようにすることが試みられます。
config_dataflow
コマンドは、データフロー最適化で使用されるデフォルトのメモリ チャネルと FIFO の深さを指定します。詳細は、
『Vivado Design Suite ユーザー ガイド: 高位合成』 (UG902) を参照してください。DATAFLOW 最適化が機能するようにするには、デザイン内でデータが 1 つのタスクから次のタスクに流れる必要があります。次のコーディング スタイルを使用すると、HLS ツールで DATAFLOW 最適化が実行されなくなります。
- シングル プロデューサー コンシューマー違反
- タスクのバイパス
- タスク間のフィードバック
- タスクの条件付き実行
- 複数の exit 条件を持つループ
詳細は、 『Vivado Design Suite ユーザー ガイド: 高位合成』 (UG902) を参照してください。
最後に、DATAFLOW 最適化には階層インプリメンテーションはありません。サブ関数またはループに DATAFLOW 最適化が有益な可能性のあるタスクが含まれる場合、DATAFLOW 最適化をそのループまたはサブ関数に適用するか、サブ関数をインライン展開する必要があります。
構文
XCL_DATAFLOW 属性は、関数定義またはループ定義の前に指定します。
__attribute__((xcl_dataflow))
例
次の例では、関数 foo
内にデータフロー最適化を指定しています。
__attribute__((xcl_dataflow))
void foo ( a, b, c, d ) {
...
}
関連項目
- pragma HLS dataflow
- 『Vivado Design Suite ユーザー ガイド: 高位合成』 (UG902)