コードの合成
プロジェクトを合成するには、C
Synthesis ツールバー ボタン をクリックするか、 をクリックします。
C/C++ コードは RTL インプリメンテーションに合成されます。合成プロセス中は、メッセージが [Console] ビューに表示され、vitis_hls.log ファイルに保存されます。
INFO: [HLS 200-1470] Pipelining result : Target II = 1, Final II = 4, Depth = 6.
INFO: [SCHED 204-11] Finished scheduling.
INFO: [HLS 200-111] Elapsed time: 19.38 seconds; current allocated memory: 397.747 MB.
INFO: [BIND 205-100] Starting micro-architecture generation ...
INFO: [BIND 205-101] Performing variable lifetime analysis.
INFO: [BIND 205-101] Exploring resource sharing.
INFO: [BIND 205-101] Binding ...
INFO: [BIND 205-100] Finished micro-architecture generation.
INFO: [HLS 200-111] Elapsed time: 0.57 seconds; current allocated memory: 400.218 MB.
INFO: [HLS 200-10] ----------------------------------------------------------------
INFO: [HLS 200-10] -- Generating RTL for module 'dct'
GUI では、メッセージに追加情報へのリンクが含まれることもあります。リンクは青色の下線でハイライトされており、クリックすると、ヘルプ メッセージ、ソース コード ファイル、または追加情報を含む資料などが開きます。メッセージをクリックすると、そのメッセージが表示される理由と回避策が表示されます。
合成が終了すると、次の図に示すように、最上位関数の合成サマリ レポートが情報エリアに表示されます。
合成サマリ レポートに表示されるパフォーマンス メトリクスを確認すると、デザインが要件を満たしているかどうかをすばやく判断できます。合成レポートには、次のパフォーマンス メトリクスに関する情報が含まれます。
- [Issue Type]
- 問題のタイプ。
- [Latency]
- 関数がすべての出力値を計算するのに必要なクロック サイクル数。
- [Initiation interval (II)]
- 関数が新しい入力データを受信できるようになるまでのクロック サイクル数。
- [Loop iteration latency]
- ループの 1 反復を完了するのにかかるクロック サイクル数。
- [Loop iteration interval]
- ループの次の反復でデータの処理が開始するまでのクロック サイクル数。
- [Loop latency]
- ループのすべての反復を実行するのにかかるサイクル数。
- [Resource Utilization]
- ルックアップ テーブル (LUT)、レジスタ、ブロック RAM、DSP48 など、FPGA で使用可能なリソースに基づいてデザインをインプリメントするのに必要なハードウェア リソースの量。
複数のソリューションで [Run C Synthesis] を実行すると、[Console] ビューに各ソリューションの合成ログが表示されます。合成が終了すると、Vitis HLS は合成サマリではなく、すべての合成済みソリューションの合成結果を比較するレポート比較結果が表示されます。次に、そのレポート例の一部を示します。
C 合成の出力
合成が終了すると、solution フォルダー内に syn フォルダーが作成されます。このフォルダーには、次のものが含まれます。
- verilog および vhdl フォルダーには出力 RTL ファイルが含まれます。
- 最上位ファイル名は、合成の最上位関数と同じ名前になります。
- RTL ファイルは、より上位の関数にインライン展開されていないサブ関数ごとに 1 つ作成されます。
- ブロック RAM やパイプライン乗算器などのサブブロックをインプリメントするための追加の RTL ファイルが含まれる場合もあります。
- report フォルダーには、最上位関数のレポート ファイルと、Vitis HLS で上位関数にインライン展開されていないサブ関数ごとに 1 つのレポート ファイルが含まれます。最上位関数のレポートには、デザイン全体の詳細が含まれます。
合成ランタイムおよび容量の改善
Vitis HLS では、演算が階層別にスケジューリングされます。ループ内の演算がスケジューリングされてから、ループ、サブ関数、関数を使用する演算がスケジューリングされます。Vitis HLS の実行時間は、次のような場合に増加します。
- スケジューリングするオブジェクトが多い。
- 自由度および可能性が多く、確認に時間がかかる。
Vitis HLS では、オブジェクトがスケジューリングされます。オブジェクトが浮動小数点の乗算または単一のレジスタであっても、スケジューリングされるのはオブジェクトです。浮動小数点の乗算は終了に複数サイクルかかる可能性があり、インプリメントに多くのリソースが使用されますが、スケジューリングのレベルでは 1 つのオブジェクトとして扱われます。
ループの展開および配列の分割を実行すると、スケジューリングするオブジェクト数が増えるので、実行時間が長くなる可能性があります。関数をインライン展開する場合も、この階層レベルでスケジューリングするオブジェクト数が増えるので、実行時間が長くなります。これらの最適化は、パフォーマンスを満たすために必要な場合もありますが、単純にすべての配列を分割したり、すべてのループを展開したり、すべての関数をインライン展開すると、実行時間が長くなる可能性があるので、注意が必要です。これらの最適化は、前述の最適化ストラテジを使用し、注意して適用してください。
パフォーマンスを達成するために配列を分割する必要がある場合は、config_array_partition に throughput_driven オプションを使用して、スループット要件に基づいて配列を分割してみてください。
ループを展開する必要がある場合、または上位階層で PIPELINE 指示子が使用されて自動的にループが展開される場合は、ループ本体を別の関数にしてみます。これにより、ループが展開されたときにロジックのコピーが複数作成されるのではなく、すべてのロジックが 1 つの関数に含まれるようになります。定義された階層のオブジェクトが 1 セットであれば、スケジューリングは高速になります。展開されたループがパイプライン領域で使用される場合は、この関数をパイプライン処理するようにしてください。
コードの自由度も実行時間に影響することがあります。Vitis HLS では、スループットが最も大きく、レイテンシが最も短く、エリアが最小のデザインを見つけることが試みられます。Vitis HLS の制約を増やすと、試すオプションが少なくなるので、実行時間が短くなります。コード内のスコープ (ループ、関数または領域) に対してレイテンシ制約を使用することを考慮してください。LATENCY 指示子を同じ最小値および最大値で設定すると、そのスコープ内で可能性のある最適化の検索が減少します。