ビルド ターゲット

Vitis™ ツールのビルド ターゲットは、コンパイルおよびリンクで作成される FPGA バイナリ (.xclbin) の特性と内容を定義します。ビルド ターゲットには、検証およびデバッグに使用する 2 つのエミュレーション ターゲットと、ザイリンクス デバイスに読み込む FPGA バイナリ (.xclbin) を生成するのに使用されるデフォルトのハードウェア ターゲットの 3 つのビルド ターゲットがあります。

エミュレーション ターゲットのコンパイルは、実際のハードウェア用のコンパイルよりもかなり高速です。エミュレーションはシミュレーション環境で実行され、デバッグのための情報が表示されます。アクセラレータ カードは必要ありません。

表 1. エミュレーション フローとハードウェア実行の比較
ソフトウェア エミュレーション ハードウェア エミュレーション ハードウェア実行
ホスト アプリケーションをカーネルの C/C++ または OpenCL™ モデルを使用して実行。 ホスト アプリケーションをカーネルのシミュレーション済み RTL モデルを使用して実行。 ホスト アプリケーションをカーネルの実際のハードウェア インプリメンテーションを使用して実行。
システムの機能が正しいことを確認。 ホストとカーネルの統合をテスト、パフォーマンス見積もりを取得。 システムが正しく必要なパフォーマンスで実行されることを確認。
ビルド時間が最短であり、デザイン イテレーションを高速に実行可能。 デバッグ機能が最良、コンパイル時間は中程度、カーネルの動作をより良く視覚化。 最終的な FPGA インプリメンテーション、ビルド時間は長いが、実際の正確なパフォーマンスを取得。

ソフトウェア エミュレーション

ソフトウェア エミュレーション (sw_emu) の主な目的は、ホスト プログラムとカーネルが正しく動作することを確認することです。ソフトウェア エミュレーションは、タイミング遅延やレイテンシのモデリングをせずに、純粋関数の実行を提供します。アクセラレータのパフォーマンスを示すものではありません。

カーネル コードは常にコンパイルされ、ネイティブに実行されます。アプリケーションコードは、次のいずれかになります。

  • x86 プロセッサでネイティブにコンパイルおよび実行されます (データセンタープラットフォーム)
  • Arm® プロセッサとのクロスコンパイラで、エミュレーターで実行されます (エンベデッド プラットフォーム)

つまり、ソフトウェア エミュレーションは通常アルゴリズムの調整や機能的な問題のデバッグに使用し、開発者がコードの反復作業をすばやく実行してコードを改善できるようにします。高速コンパイルおよび実行反復を使用したソフトウェア プログラミング モデルが保持されます。

ホスト プログラムとカーネル コードを一緒に実行するため、v++ コンパイラでは、カーネル コードに最小限の変更を加えて FPGA バイナリを作成します。ソフトウェア エミュレーションは、C ベースのカーネル コードを取得し、GCC でコンパイルします。各カーネルを別々の C スレッドとして実行します。1 つのカーネルに複数の計算ユニットがある場合、各 CU は別々のスレッドとして実行されます。このため、ハードウェアの並列実行モデルを模倣します。ただし、各カーネル内では、実行は順番にモデル化されますが、ハードウェア上で実行する場合は、カーネル内に並列処理が存在する可能性があります。ソフトウェア エミュレーション ドライバーは、XRT API をインプリメントし、XRT を実行するユーザー アプリケーションとハードウェア コンポーネントをモデル化するデバイスプロセス間のブリッジとして機能します。

ヒント: RTL カーネルでは、C モデルが関連付けられている場合にソフトウェア エミュレーションがサポートされます。RTL カーネルの開発フロー には、ソフトウェア エミュレーション フローをサポートするため、RTL カーネルに C モデル ファイルを関連付けるオプションが示されています。

次に、ソフトウェア エミュレーションの制限について説明します。

  • グローバル メモリの制限は 16 GB で、シミュレーション目的のため、超過しないようにする必要があります。
  • ソフトウェア エミュレーションは AI エンジン カーネルではサポートされません。
  • ソフトウェア エミュレーションでは、サイド チャネルなしの AXI4-Stream インターフェイスはサポートされません (『Vitis 高位合成ユーザー ガイド』 (UG1399: 英語版日本語版) を参照)。
Vitis コンパイラ コマンド で説明されるように、ソフトウェア エミュレーション ターゲットは v++ コマンドで -t オプションを使用して指定します。
v++ -t sw_emu ...

GDB デバッガーでは、ホスト アプリケーションとカーネル コードの両方に使用できるほか、ブレーク ポイントを設定したり、printf() を使用して情報やチェックポイントを表示したりできます。ソフトウェア エミュレーション中にホスト アプリケーションまたはカーネルをデバッグする方法は、ソフトウェア エミュレーションでのデバッグ を参照してください。

ハードウェア エミュレーション

ハードウェア エミュレーションは、プログラマブル ロジック デザインの RTL シミュレーションを実行し、PL カーネルはハードウェア プラットフォームのサイクル近似モデルと統合されます。

ハードウェア エミュレーションは、次のタスクに特に役立ちます。

  • C、 C++、または OpenCL カーネルコードから合成された RTL コードが正しく機能するかどうかをチェック
  • 異なるカーネル間または複数の CU 間の相互作用をテスト
  • ハードウェア波形を使用して、カーネルの内部アクティビティを詳細に把握
  • アプリケーションの初期パフォーマンスの見積もりを取得

各カーネルはハードウェア モデル (RTL) にコンパイルされます。ハードウェア エミュレーション中は、カーネルが Vivado ロジック シミュレータで実行され、波形ビューアーでカーネル デザインを確認できます。RTL シミュレータのサポート で説明されるように、サポートされているサードパーティ シミュレータもあります。また、ハードウェア エミュレーションでは、ハードウェア インプリメンテーションのパフォーマンスおよびリソースの見積もりも示されます。

SystemC モデルは、Versal NoC/DDR メモリ、CIPS 、PS ブロック、AI エンジン UltraScale+ MIG DDR メモリ、AXI4 SmartConnect など、ハードウェア プラットフォームで使用される主要 IP 用に提供されています。これらの IP モデルはハードウェア エミュレーション中に使用され、シミュレーションのパフォーマンスと結果を向上させます。

ハードウェア エミュレーションでは、コンパイルおよび実行時間はソフトウェア エミュレーションよりも長くなりますが、詳細でサイクル精度のカーネル アクティビティが表示されます。ザイリンクスでは、ハードウェア エミュレーションの実行時間を妥当なものに抑えるため、小さなデータ セットを使用することをお勧めします。

重要: ハードウェア エミュレーションで使用される DDR メモリ モデルおよびメモリ インターフェイス ジェネレーター (MIG) モデルは、高位シミュレーション モデルです。これらのモデルでは、シミュレーションのパフォーマンスは良いですが、レイテンシには近似値が使用されるので、カーネルのようにサイクル精度ではありません。そのため、プロファイル サマリ レポートに示されるパフォーマンス値は概算でしかないので、異なるカーネル インプリメンテーション間のパフォーマンスを相対的に比較するためのガイダンスとしてのみ使用してください。

Vitis コンパイラ コマンド で説明されているように、ハードウェア エミュレーション ターゲットは v++ コマンドで -t オプションを使用して指定します。

v++ -t hw_emu ...

システム ハードウェア ターゲット

ビルド ターゲットがハードウェアの場合、v++ によりデザインに対して Vivado 合成およびインプリメンテーションが実行され、ザイリンクス デバイス用の FPGA バイナリが生成されます。このビルド ターゲットは、Vitis IDE でソフトウェアまたはハードウェア エミュレーション ターゲットを生成するよりも時間がかかりますが、最終的な FPGA バイナリはアクセラレータ カードのハードウェアまたはエンベデッド プロセッサ プラットフォームに読み込み、アプリケーションを実際の動作環境で実行できます。

Vitis コンパイラ コマンド で説明されているように、システム ハードウェア ターゲットは v++ コマンドで -t オプションを使用して指定します。

v++ -t hw ...