Vitis HLS プロセスの概要

Vitis HLS はプロジェクト ベースです。プロジェクトにはそれぞれ 1 セットの C コードが含まれ、複数のソリューションを含めることができます。各ソリューションに異なる制約および最適化指示子を設定できます。Vitis HLS の GUI で、各ソリューションの結果を解析および比較できます。

次に、典型的なデザイン フローでの合成、最適化、解析の手順を示します。

  1. 新しい Vitis HLS プロジェクトを作成します。
  2. C シミュレーションを使用してコードを検証します。
  3. 高位合成を実行して RTL 結果を作成します。
  4. レイテンシ、開始間隔 (II)、およびスループットを確認して結果を解析します。
  5. 最適化を実行し、必要に応じて繰り返します。
  6. C/RTL 協調シミュレーションを使用して結果を検証します。

Vitis HLS は、デフォルトのツール設定、デザイン制約、および指定した最適化プラグマまたは指示子に基づいてソリューションをインプリメントします。最適化指示子を使用すると、内部ロジックと I/O ポートのインプリメンテーションを変更および制御して、ツールのデフォルト動作を変更できます。

C/C++ コードは次のように合成されます。

  • 最上位関数の引数は、Vitis HLS により自動的に RTL I/O ポート インターフェイスに合成されます。インターフェイス合成の管理 で説明するように、ツールが作成するデフォルト インターフェイスは、ターゲット フロー、関数引数のデータ型と方向、デフォルトのインターフェイス モード、インターフェイスを手動で定義したユーザー指定の INTERFACE プラグマまたは指示子などによって作成されます。
  • 最上位 C/C++ 関数のサブ関数は RTL デザインの階層のブロックに合成されます。
    • 最終的な RTL デザインには、元の最上位 C 関数階層と 1 対 1 で対応するモジュールまたはエンティティの階層が含まれます。
    • Vitis HLS は、パフォーマンスを向上するため、必要に応じて、サブ関数を上位の関数または最上位関数に自動的にインライン展開します。
    • この自動インライン機能は、サブ関数に INLINE プラグマを使用するか、ソリューションで set_directive_inline を使用して、OFF に設定するとオフにできます。
    • デフォルトでは、C サブ関数を呼び出すごとに RTL モジュールの同じインスタンスが使用されます。ただし、ALLOCATION プラグマを指定するか、set_directive_allocation をソリューションで使用すると、RTL モジュールの複数のインスタンスをインプリメントしてパフォーマンスを改善できます。
  • C 関数のループは、パフォーマンスを向上するため、デフォルトでは展開されず、パイプライン処理されます。
    • Vitis HLS ツールでは、最上位ループをパイプライン処理するために入れ子のループを展開する場合と同様に、ソリューションのパフォーマンスが向上しなければループは展開されません。ループが展開されない場合、合成でそのループの 1 反復に対してロジックが作成され、RTL デザインでループの各反復に対してこのロジックが順に実行されます。ループが展開されると、ループのすべての反復を並列実行できますが、より多くのデバイス リソースが消費されます。
    • ループは、UNROLL プラグマまたは set_directive_unroll コマンドを使用して手動で展開できます。
    • ループは、有限ステート マシンの細粒度インプリメンテーション (ループ パイプライン) またはより粗い粒度のハンドシェイク ベースのインプリメンテーション (データフロー) を使用して、パイプライン処理することもできます。
  • コード内の配列は、最終的な FPGA デザインではブロック RAM、LUT RAM、または UltraRAM に合成されます。
    • 配列が最上位関数インターフェイスに含まれる場合、高位合成ではその配列がデザイン外のブロック RAM にアクセスするポートとしてインプリメントされます。
    • このデフォルト割り当ては、使用されるメモリ タイプを設定するか、ARRAY_PARTITION または ARRAY_RESHAPE プラグマ、あるいは関連する set_directive_array コマンドを使用して読み出し/書き込み転送を設定することにより変更できます。
重要: Vitis HLS では、プラグマまたは指示子を特定のスコープ (関数/ループ/領域) に指定すると、前述のツールのデフォルト動作を変更できます。この場合、現在のスコープでプラグマやコンフィギュレーションを指定すると、反復数の少ないループの自動パイプラインなどのデフォルト動作が適用されないことがあります。

合成後にさまざまなレポートで結果を解析して、結果の品質を確認します。結果を解析したら、プロジェクトにソリューションを追加して、さまざまな制約および最適化指示子を指定し、合成してその結果を解析します。異なるソリューションの結果を比較すると、どの制約または指示子が有益であるかがわかります。このプロセスは、デザインが必要なパフォーマンス特性になるまで繰り返すことができます。複数のソリューションを使用することで、前のソリューションは保持したままで開発を進めることができます。