デバイス バイナリのビルド

カーネル コードは、次の図に示すように、C、C++、OpenCL™ C、RTL のいずれかで記述され、カーネル コードをザイリンクス オブジェクト (XO) ファイルにコンパイルして、その XO ファイルをデバイス バイナリ (XCLBIN) ファイルにリンクするとビルドされます。

1: デバイスのビルド プロセス

このプロセスには、次の 2 つの段階があります。

  1. カーネル ソース コードからザイリンクス オブジェクト ファイルをビルドします。
    • C、C++、または OpenCL カーネルの場合は、v++ -c コマンドによりソース コードがザイリンクス オブジェクト (XO) ファイルにコンパイルされます。複数カーネルは、別々の XO ファイルにコンパイルされます。
    • RTL カーネルの場合は、package_xo コマンドによりリンクに使用される XO ファイルが生成されます。詳細は、RTL カーネル を参照してください。
    • Vitis™ HLS ツールで直接カーネル オブジェクト (XO) ファイルを作成することもできます。詳細は、Vitis HLS でのカーネルのコンパイル を参照してください。
  2. コンパイル後、v++ -l コマンドにより 1 つまたは複数のカーネル オブジェクト (XO) がハードウェア プラットフォーム (XSA) とリンクされ、デバイス バイナリ (XCLBIN) ファイルが作成されます。
ヒント: v++ コマンドは、コマンド ラインから、スクリプト内、または make のようなビルド システムで使用でき、また Vitis IDE の使用 に説明されているように、Vitis IDE からも使用できます。

Vitis コンパイラでのカーネルのコンパイル

重要: ツールを実行する前に、Vitis 環境の設定 に説明されているように、コマンド シェルまたはウィンドウを設定します。
xclbin ファイルをビルドする最初の段階は、ザイリンクス Vitis コンパイラを使用してカーネル コードをコンパイルすることです。カーネルを正しくコンパイルするには、複数の v++ オプションを使用する必要があります。次に、vadd カーネルをコンパイルするコマンド例を示します。
v++ -t sw_emu --platform xilinx_u200_xdma_201830_2 -c -k vadd \
-I'./src' -o'vadd.sw_emu.xo' ./src/vadd.cpp

このコマンドでは、次の引数が使用されています。一部の引数は必須です。

  • -t <arg>: ビルド ターゲット で説明するように、ビルド ターゲットを指定します。ソフトウェア エミュレーション (sw_emu) が例として使用されています。オプションです。デフォルトは hw です。
  • --platform <arg>: ビルドのアクセラレータ プラットフォームを指定します。ランタイム機能とターゲット プラットフォームが FPGA バイナリとしてリンクされるので、これは必須です。エンベデッド プロセッサ アプリケーションのカーネルをコンパイルするには、--platform $PLATFORM_REPO_PATHS/zcu102_base/zcu102_base.xpfm のようにエンベデッド プロセッサ プラットフォームを指定します。
  • -c: カーネルをコンパイルします。必須です。カーネルは、2 つの個別の段階でコンパイル (-c) およびリンク (-l) する必要があります。
  • -k <arg>: ソース ファイルに関連付けるカーネルの名前を指定します。
  • -o'<output>.xo': コンパイラで出力される共有オブジェクト ファイルを指定します。オプションです。
  • <source_file>: カーネルのソース ファイルを指定します。複数のソース ファイルを指定できます。必須です。

上記のリストは、使用可能なさまざまなオプションの例です。さまざまコマンド ライン オプションの詳細は、Vitis コンパイラ コマンド を参照してください。さまざまな出力ファイルの生成場所は、v++ コマンドの出力ディレクトリ を参照してください。

Vitis HLS でのカーネルのコンパイル

Vitis コア開発キットの使用モデルはトップダウン手法であり、C/C++ または OpenCL コードから開始して、コンパイルしたカーネルを作成していきます。または、カーネルを直接開発してザイリンクス オブジェクト (XO) ファイルを生成し、v++ を使用してリンクして .xclbin を生成する方法もあります。この方法では、Vitis HLS ツールを使用した C/C++ カーネルを使用するか (このセクションで説明)、Vivado Design Suite を使用した RTL カーネルを使用できます。詳細は、RTL カーネル を参照してください。

RTL または C/C++ でカーネルを直接開発して XO ファイルを生成する方法は、ボトムアップ フローと呼ばれます。この方法では、カーネルのパフォーマンスの検証と最適化の実行は Vitis HLS ツールで実行し、Vitis アプリケーション アクセラレーション フローで使用できるようにザイリンクス オブジェクト ファイルをエクスポートします。このツールの詳細は、Vitis HLS フロー を参照してください。

2: Vitis HLS ボトムアップ フロー

VitisHLS ボトムアップ フローを使用する利点は、次のとおりです。

  • カーネルをメイン アプリケーションとは別に設計、検証、最適化できます。
  • ホスト プログラムとカーネルを共同開発するチーム開発を可能にします。
  • 特定のカーネル最適化は、XO ファイルに保存されます。
  • XO ファイルのコレクションは、ライブラリのように使用および再利用できます。

Vitis HLS でのカーネルの作成

Vitis コア開発キットで使用するために C/C++ からカーネルを生成するには、標準 Vitis HLS プロセスに従いますが、カーネルは Vitis ソフトウェア プラットフォームで動作する必要があるので、標準カーネル要件 (カーネル プロパティ を参照) にも従う必要があります。まず、インターフェイスを AXI メモリ インターフェイスとして記述することが必要です。ただし、スカラー パラメーターは例外で、AXI4-Lite インターフェイスにマップされます。ここで説明する Vitis ボトムアップ フローを使用すると、標準カーネル要件を満たすため、Vitis HLS によりインターフェイス ポートが自動的に定義されます。

HLS カーネルを作成およびコンパイルする手順の概要は、次のとおりです。このプロセスのより詳細な説明は、Vitis HLS フロー資料の 新規 Vitis HLS プロジェクトの作成 を参照してください。

  1. Vitis HLS を起動して統合デザイン環境 (IDE) を開き、FileNew Project をクリックします。
  2. New Vitis HLS Project ウィザードの Project nameでプロジェクト名を指定し、Location でプロジェクトの保存ディレクトリを指定して、Next をクリックします。
  3. Add/Remove Files ページで Add Files をクリックして、カーネル ソース コードをプロジェクトに追加します。Top Function フィールドの Browse ボタンをクリックしてカーネル関数を選択し、Next をクリックします。
  4. C ベース シミュレーション テストベンチがある場合は、Add Files をクリックして指定できます (オプション)。Next をクリックします。
    ヒント: Vitis HLS の資料に説明されるように、テストベンチを使用することを強くお勧めします。
  5. Solution Configuration ページでは、Clock Period にカーネルのクロック周期を指定する必要があります。

  6. Part Selection フィールドの参照ボタン () をクリックして、Device Selection Dialog ダイアログ ボックスを開きます。Boards を選択し、コンパイルしたカーネルのターゲット プラットフォームを選択します。OK をクリックしてプラットフォームを選択し、Solution Configuration ページに戻ります。
  7. Solution ConfigurationFlow Target の下の Vitis Kernel Flow Target ドロップダウン リストを選択し、Finish をクリックして HLS カーネル プロジェクトを作成します。
    重要: プロジェクトからザイリンクス オブジェクト (XO) ファイルを作成するには、Vitis Kernel Flow Target を選択する必要があります。

HLS プロジェクトを作成したら、Run C-Synthesis をクリックして C 合成を実行し、カーネル コードをコンパイルできます。HLS ツール フローの詳細は、Vitis HLS の資料を参照してください。

合成が完了したら、カーネルを XO ファイルとしてエクスポートし、Vitis コア開発キットで使用できます。エクスポートするには、メイン メニューから SolutionExport RTL をクリックします。

ファイル ディレクトリを指定すると、カーネルがザイリンクス オブジェクト (XO) ファイルとしてエクスポートされます。

XO ファイルは、v++ リンク プロセスの入力ファイルとして使用できます。詳細は、カーネルのリンク を参照してください。オブジェクト ファイルは、Vitis IDE プロジェクトの作成 に説明されるように、Vitis IDE のアプリケーション プロジェクトにも追加できます。

ただし、ここで説明するボトムアップ フローで作成された HLS カーネルには、Vitis アプリケーション アクセラレーション開発フローで使用する場合、制限があります。HLS カーネルを使用したアプリケーションでは、ヘッダー ファイルの依存性の重複により問題が発生するので、ソフトウェア エミュレーションはサポートされません。HLS カーネルまたは RTL カーネルのハードウェア エミュレーション フローでは、GDB デバッグはサポートされません。

カーネルを作成する Vitis HLS スクリプト

HLS 合成を Tcl スクリプトから実行する場合、前述のとおり、次のスクリプトを編集して HLS カーネルを作成できます。

# Define variables for your HLS kernel:
set projName <proj_name>
set krnlName <kernel_name>
set krnlFile <kernel_source_code>
set krnlTB <kernel_test_bench>
set krnlPlatform <target_part>
set path <path_to_project>

#Script to create and output HLS kernel
open_project $projName
set_top $krnlName
add_files $krnlFile
add_files -tb $krnlTB
open_solution "solution1"
set_part $krnlPlatform
create_clock -period 10 -name default
config_flow -target vitis
csim_design
csynth_design
cosim_design
export_design -flow impl -format xo -output "./hlsKernel/hlsKernel.xo"

Vitis 環境の設定 の手順に従って環境を設定したら、次のコマンドを使用して HLS カーネル スクリプトを実行します。

vitis_hls -f <hls_kernel_script>.tcl

package_xo を使用した RTL カーネルのパッケージ

RTL で記述されたカーネルは、Vivado ツールで package_xo コマンド ライン ユーティリティを使用してコンパイルされ、ザイリンクス オブジェクト ファイル (XO) が生成されます。このオブジェクト ファイルは、v++ コマンドでのリンク段階で使用されます。詳細は、package_xo コマンド を参照してください。RTL カーネルの作成および package_xo コマンドを使用した XO ファイルの生成については、RTL カーネル を参照してください。

カーネルのリンク

ヒント: ツールを実行する前に、Vitis 環境の設定 に説明されているように、コマンド シェルまたはウィンドウを設定します。

カーネルのコンパイル プロセスでは、カーネルが C/C++、OpenCL C、RTL のいずれで記述されていても、ザイリンクス オブジェクト ファイル (XO) が生成されます。リンク段階では、異なるカーネルからの XO ファイルがプラットフォームにリンクされ、ホスト プログラムで使用される FPGA バイナリ コンテナー ファイル (.xclbin) が作成されます。

コンパイルと同様、リンクにも複数のオプションが必要です。次に、vadd カーネル バイナリをリンクするコマンド例を示します。
v++ -t sw_emu --platform xilinx_u200_xdma_201830_2 --link vadd.sw_emu.xo \
-o'vadd.sw_emu.xclbin' --config ./connectivity.cfg

このコマンドには、次の引数が含まれます。

  • -t <arg>: ビルド ターゲットを指定します。ソフトウェア エミュレーション (sw_emu) が例として使用されています。リンクでは、入力 (XO) ファイルをコンパイルしたときに指定したのと同じ -t および --platform 引数を指定する必要があります。
  • --platform <arg>: カーネルをリンクするプラットフォームを指定します。エンベデッド プロセッサ アプリケーションのカーネルをリンクするには、--platform $PLATFORM_REPO_PATHS/zcu102_base/zcu102_base.xpfm のようにエンベデッド プロセッサ プラットフォームを指定します。
  • --link: カーネルとプラットフォームを FPGA バイナリ ファイル (xclbin) にリンクします。
  • <input>.xo: 入力オブジェクト ファイル。複数のオブジェクト ファイルを .xclbin にビルドできます。
  • -o'<output>.xclbin': 出力ファイルの名前を指定します。リンク段階の出力ファイルは、.xclbin ファイルです。デフォルトの出力ファイル名は a.xclbin です。
  • --config ./connectivity.cfg: v++ コマンドのオプションを定義する設定ファイルを指定します。--config オプションの詳細は、Vitis コンパイラ コマンド を参照してください。
ヒント: さまざまな出力ファイルの生成場所は、v++ コマンドの出力ディレクトリ を参照してください。

リンク プロセスでは、ザイリンクス オブジェクト (XO) ファイルがリンクされるだけでなく、アーキテクチャの重要な詳細も決定されます。特に、ハードウェアにインスタンシエートする計算ユニット (CU) の数、カーネル ポートからグローバル メモリへの接続、CU の SLR への割り当てを指定します。次のセクションでは、これらのビルド オプションのいくつかを説明します。

複数のカーネル インスタンスの作成

デフォルトでは、リンカーによりカーネルから 1 つのハードウェア インスタンスがビルドされます。ホスト プログラムで同じカーネルが複数回実行される場合、インスタンスのデータ処理要件により、ハードウェア アクセラレータ上のカーネルを順次実行する必要があります。これは、全体的なアプリケーション パフォーマンスに影響します。カーネルのリンク段階をカスタマイズすると、1 つのカーネルに対して複数のハードウェア計算ユニットをインスタンシエートできます。これにより、ホスト プログラムでカーネルをオーバーラップさせて複数呼び出すことができ、個別の計算ユニットを実行することによりカーネルを同時実行できます。

1 つのカーネルに対して複数の CU を作成するには、リンク時に v++ 設定ファイルで connectivity.nk を使用します。設定ファイルに必要なオプションを含め、その設定ファイルを v++ コマンド ラインで --config オプションを使用して指定します (Vitis コンパイラ コマンド を参照)。

たとえば、vadd カーネルに対して 2 つのハードウェア インスタンスをインプリメントするには、設定ファイルで次を使用します。
[connectivity]
#nk=<kernel name>:<number>:<cu_name>.<cu_name>...
nk=vadd:2

説明:

<kernel_name>
複数回インスタンシエートするカーネルの名前を指定します。
<number>
ハードウェアにインプリメントするカーネル インスタンス (CU) の数を指定します。
<cu_name>.<cu_name>...
指定した数のインスタンスの名前を指定します。これはオプションで、指定しない場合の CU のデフォルト名は kernel_1 です。
そして、この設定ファイルを v++ コマンド ラインで指定します。
v++ --config vadd_config.cfg ...

上記の vadd の例では、vadd_1 および vadd_2 という名前の 2 つの vadd カーネル インスタンスが作成されます。

ヒント: 結果は、xclbinutil コマンドを使用して xclbin ファイルの内容から確認できます。xclbinutil ユーティリティ を参照してください。
次の例では、xclbin バイナリ ファイルに、vadd_Xvadd_Y、および vadd_Z という名前の vadd カーネルの CU が 3 つ作成されます。
[connectivity]
nk=vadd:3:vadd_X.vadd_Y.vadd_Z

カーネル ポートのメモリへのマップ

リンク段階では、カーネルのメモリ ポートが DDR、HBM、および PLRAM を含むメモリ リソースに接続されます。デフォルトでは、v++ リンク プロセスで xclbin ファイルが生成されるときに、すべてのカーネル メモリ インターフェイスが同じグローバル メモリ バンク (または gmem) に接続されます。そのため、メモリ バンクとデータを転送できるのは一度に 1 つのメモリ インターフェイスのみなので、カーネルのパフォーマンスはメモリ アクセスにより制限されます。

Vitis コンパイラでは CU がグローバル メモリ リソースに自動的に接続できますが、各カーネル ポート (またはインターフェイス) が接続されているグローバル メモリ バンクを手動で指定することもできます。帯域幅を最大にし、データ転送を最適化して、全体的なパフォーマンスを改善するには、カーネルとメモリを正しく接続することが重要です。デバイスに計算ユニットが 1 つしかない場合でも、入力ポートと出力ポートを別々のバンクに割り当てると、入力データと出力データに同時にアクセスできるようになるので、パフォーマンスを向上できます。

重要: 15 本までのカーネル ポートを 1 つのグローバル メモリ バンクに接続できます。メモリ インターフェイスが 16 個以上ある場合は、ここで説明するように、--conectivity.sp を使用して接続を複数のメモリ バンクに分散する必要があります。

次の例は、カーネル インターフェイス コード例に基づいています。まず、カーネル引数を別々のバンドルに割り当てて使用可能なポートを増やし、それらのポートを別々のメモリ バンクに割り当てます。

  1. カーネル コード内で別々バンドルにインタフェースを割り当てます。
    void cnn( int *pixel, // Input pixel
      int *weights, // Input Weight Matrix
      int *out, // Output pixel
      ... // Other input or Output ports
    		   
    #pragma HLS INTERFACE m_axi port=pixel offset=slave bundle=gmem
    #pragma HLS INTERFACE m_axi port=weights offset=slave bundle=gmem1
    #pragma HLS INTERFACE m_axi port=out offset=slave bundle=gmem
    

    メモリ インターフェイス入力 pixelweights に、異なるバンドル名が割り当てらています。これにより、2 つのポートを別々のグローバルメモリ バンクに割り当てることができます。

    重要: bundle= で名前を指定する場合は、--connectivity.sp オプションを使用して特定のメモリ バンクに割り当てることができるように、すべて小文字を使用してください。
  2. コンフィギュレーション ファイルに --connectivity.sp オプションを含め、そのコンフィギュレーション ファイルを、Vitis コンパイラ コマンド で説明されているように、v++ コマンド ラインで --config オプションを使用して指定します。
    たとえば、上記の cnn カーネルの場合は、コンフィギュレーション ファイルで connectivity.sp オプションを次のように指定します。
    [connectivity]
    #sp=<compute_unit_name>.<interface_name>:<bank name> 
    sp=cnn_1.m_axi_gmem:DDR[0]          
    sp=cnn_1.m_axi_gmem1:DDR[1]

    説明:

    • <compute_unit_name>: connectivity.nk オプションで定義されている CU のインスタンス名 (複数のカーネル インスタンスの作成 を参照)、または複数の CU が指定されていない場合は <kernel_name>_1
    • <interface_name>: HLS INTERFACE プラグマで定義される m_axi_bundle 名を含むカーネル ポート名。上記の cnn カーネルの場合、ポートは m_axi_gmem および m_axi_gmem1 です。
      ヒント: ポートがバンドルの一部として指定されていない場合は、<interface_name>m_axi_ なしで port を使用して指定します。
    • <bank_name>: バンク名。4 つの DDR バンクを含むプラットフォームの場合は DDR[0]DDR[1]DDR[2]、および DDR[3] となります。また、メモリを DDR[0:2] などの連続するバンク範囲として指定することもできます。この場合、実行時に XRT によってメモリ バンクが割り当てられます。

      PLRAM、HBM、HP または MIG メモリをサポートするプラットフォームもあり、その場合は PLRAM[0]、HBM[0]、HP[0] または MIG[0] を使用します。プラットフォームで使用可能なグローバル メモリ バンクに関する情報を取得するには、platforminfo を使用します。詳細は、platforminfo ユーティリティ を参照してください。

      DDR メモリ バンクと HBM メモリ バンクの両方を含むプラットフォームでは、別々の AXI インターフェイスを使用して、カーネルが異なるメモリにアクセスできるようにする必要があります。DDR および PLRAM アクセスは、1 つのポートから共有できます。

    • 重要: ホスト コードでの DDR バンクの割り当て に示すように、バンク接続のカスタマイズは、ホスト コードにも反映させる必要があります。

PCIe Slave-Bridge を使用したホスト メモリへの接続

PCIe® Slave-Bridge IP は、カーネルがホスト メモリに直接アクセスできるようにするため、一部のデータセンター プラットフォームで提供されています。デバイス バイナリをメモリに接続するように設定するには、次の --connectivity.sp コマンドで指定されたリンクを変更する必要があります。また、XRT 資料の PCIe スレーブブリッジで説明されているように、アクセラレータ カードのセットアップとホスト アプリケーションを変更する必要もあります。

[connectivity]
## Syntax
##sp=<cu_name>.<interface_name>:HOST[0]
sp=cnn_1.m_axi_gmem:HOST[0]

上記のコマンド構文では、CU 名とインターフェイス名は同じですが、バンク名は HOST[0] にハード コード化されています。

HBM の設定と使用

アルゴリズムの中にはメモリ限界のあるものもあり、DDR ベースの Alveo カードで使用可能な帯域幅 77 GB/s に制限されます。これらのアプリケーションには、HBM (広帯域幅メモリ) ベースの Alveo カードがあり、最大 460 GB/s のメモリ帯域幅がサポートされます。Alveo のインプリメンテーションでは、2 個の 16 層の HBM (HBM2 仕様) スタックが FPGA パッケージに組み込まれ、インターポーザーを使用して FPGA ファブリックに接続されます。次に、2 つの HBM スタックの概略図を示します。

3: 2 つの HBM スタックの概略図

このインプリメンテーションには、次が含まれます。

  • 8 GB の HBM メモリ
  • 32 個の 256 MB の HBM セグメント (擬似チャネル (PC) と呼ばれる)
  • 独立した AXI チャネル (疑似チャネルごとにセグメント分割されたクロスバー スイッチを介して FPGA と通信)
  • 2 つの PC ごとに 2 チャネルのメモリ コントローラー
  • PC 1 つあたり最大 14.375 GB/s の理論上の帯域幅
  • HBM サブシステムの理論上の最大帯域幅 460 GB/s (32 *14.375 GB/s)

各 PC の理論上の最大パフォーマンスは 14.375 GB/s ですが、これは DDR チャネルの理論上の最大パフォーマンスである 19.25 GB/s を下回ります。DDR パフォーマンスよりも優れたパフォーマンスにするには、HBM サブシステムに複数の AXI マスターを効率的に使用する必要があります。プログラマブル ロジックには、32 個の HBM AXI インターフェイスがあり、ビルトイン スイッチを介していずれかの HBM スタックの PC のどのメモリ ロケーションにもアクセスできるので、8 GB メモリ空間全体にアクセス可能です。HBM の詳細は、『AXI High Bandwidth Controller LogiCORE IP 製品ガイド』 (PG276) を参照してください。

注記: ビルトイン スイッチの複雑性および柔軟性のため、特定のメモリ ロケーションまたはスイッチ自体で密集が発生する組み合わせが多数あります。読み出しトランザクションと書き込みトランザクションをインターリーブすると、メモリ コントローラーのタイミング パラメーター (バス ターンアラウンド) が原因で、読み出しのみまたは書き込みのみと比較して効率が低下します。両方の HBM スタックにまたがる書き込みトランザクションもパフォーマンスが低下するため、回避する必要があります。カーネルが限られたメモリにアクセスするようメモリ アクセスを設計し、異なるカーネルのメモリ アクセスを異なる HBM PC に隔離することが重要です。

HBM への接続は HBM Memory Subsystem (HMSS) IP で管理され、すべての HBM PC がイネーブルにされ、XDMA が自動的に HBM (ホスト アクセス用) からグローバル メモリに接続されます。Vitis コンパイラと使用すると、HMSS は --connectivity.sp オプションで指定した必要なメモリ コントローラーとポートのみをアクティベートするように自動的にカスタマイズされ、ユーザー カーネルと XDMA の両方をメモリ コントローラーに接続して、帯域幅とレイテンシが最適になるようにします。詳細および例については、HBM チュートリアルの使用を参照してください。

次の設定ファイルの例では、カーネル入力ポートの in1in2 がそれぞれ HBM PC 0 と 1 に接続され、出力バッファー outHBM PC 3 ~ 4 に書き込まれています。各 HBM PC は 256 MB で、このカーネルのメモリ アクセスは合計 1 GB です。

[connectivity]
sp=krnl.in1:HBM[0]
sp=krnl.in2:HBM[1]
sp=krnl.out:HBM[3:4]
注記: 設定ファイルでは、HBM 擬似チャネルへのマッピングのみが定義されており、各 AXI インターフェイスは使用可能な 32 個の HBM PC の連続したサブセットにのみアクセスする必要があります。HMSS は、適切な HBM ポートを選択してメモリにアクセスし、帯域幅を最大に、レイテンシを最小にします。

HBM ポートは、デバイスの 1 番下の SLR にあります。SSI テクノロジ デバイスの SLR (Super Logic Region) をまたぐ AXI インターフェイスの配置とタイミングの複雑性は、HMSS により自動的に処理されます。デフォルトでは、v++--connectivity.sp または --connectivity.slr オプションを指定せずに、すべてのカーネル AXI インターフェイスが HBM[0] にアクセスし、すべてのカーネルが SLR0 に割り当てられます。ただし、--connectivity.slr オプションを使用すると、カーネルの SLR 割り当てを指定できます。詳細は、計算ユニットの SLR への割り当て を参照してください。

ランダム アクセスおよび RAMA IP

HBM は、順次データ アクセスが必要なアプリケーションではうまく機能しますが、ランダム データ アクセスが必要なアプリケーションでは、アプリケーションの要件 (読み出しと書き込みの比、最小トランザクション サイズ、アドレス指定されるメモリ空間のサイズなど) によって大きく異なります。このような場合、ターゲット プラットフォームに Random Access Memory Attachment (RAMA) IP を追加することで、必要なメモリが 1 つの HBM PC の 256 MB の制限を超えた場合に、ランダム メモリ アクセスの効率を大幅に向上させることができます。詳細は、『RAMA LogiCORE IP 製品ガイド』 (PG310) を参照してください。

ヒント: アプリケーションで RAMA IP を効果的に使用するには、カーネルは複数の HBM PC からメモリにアクセスし、AXI トランザクション ID ポート (AxID) でスタティックな単一の ID を使用するか、ゆっくりと変化する (擬似スタティック) AXI トランザクション ID を使用する必要があります。これらの条件が満たされない場合、RAMA IP により使用されるスレッド作成によるパフォーマンスの向上はそれほどなく、プログラマブル ロジック リソースが無駄に消費されることになります。

次の v++ コマンド オプションを使用して、システム リンク プロセス中にターゲット プラットフォームに RAMA IP を追加し、対象のポートを定義する Tcl スクリプトを指定します。

v++ -l --advanced.param compiler.userPreSysLinkOverlayTcl=<path_to>/user_tcl_file.tcl
このユーザー指定の Tcl スクリプト内には、HMSS リソースを設定する API があります。
hbm_memory_subsystem::ra_master_interface <Endpoint AXI master interface> [get_bd_cells hmss_0]

次の例では、ランダム アクセス用に 2 つの AXI マスター ポート (M00_AXI および M01_AXI) を使用しています。

hbm_memory_subsystem::ra_master_interface [get_bd_intf_pins dummy/M00_AXI] [get_bd_cells hmss_0]
hbm_memory_subsystem::ra_master_interface [get_bd_intf_pins dummy/M01_AXI] [get_bd_cells hmss_0]
validate_bd_design -force

HBM サブシステムによって情報が正しく収集され、ブロック デザインがアップデートされるようにするには、前述のように validate_bd_design コマンドを使用して Tcl スクリプトを終了することが重要です。

PLRAM の設定と使用

Alveo アクセラレータ カードには、HBM DRAM および DDR DRAM メモリ リソースが含まれています。一部のアクセラレータ カードでは、内部 FPGA PLRAM (UltraRAM およびブロック RAM) を追加のメモリ リソースとして使用できます。サポートされるプラットフォームには、通常各 SLR に PLRAM のインスタンスが含まれます。各 PLRAM のサイズとタイプは、カーネルまたは計算ユニットがシステムにリンクされる前に、ターゲット プラットフォームで設定できます。

Tcl スクリプトを使用すると、システム リンクが発生する前に PLRAM を設定できます。Tcl スクリプトの使用は、次のように v++ コマンドラインでイネーブルにできます。
v++ -l --advanced.param compiler.userPreSysLinkOverlayTcl=<path_to>/user_tcl_file.tcl
このユーザーの指定する Tcl スクリプト内には、PLRAM インスタンスまたはメモリ リソースを設定するための API が含まれます。
sdx_memory_subsystem::update_plram_specification <memory_subsystem_bdcell> <plram_resource> <plram_specification>

<plram_specification> は次のエントリを含む Tcl ディクショナリです。次に示すエントリは、プラットフォームの各インスタンスのデフォルト値です。

 { 
	SIZE 128K # Up to 4M 
	AXI_DATA_WIDTH 512 # Up to 512
	SLR_ASSIGNMENT SLR0 # SLR0 / SLR1 / SLR2 
	READ_LATENCY 1 # To optimise timing path 
	MEMORY_PRIMITIVE BRAM # BRAM or URAM 
}

次の例では、PLRAM_MEM00 を 2 MB のサイズに変更して UltraRAM を指定し、PLRAM_MEM01 を 4 MB のサイズに変更して UltraRAM を指定しています。PLRAM_MEM00 および PLRAM_MEM01 は、--conectivity.sp メモリ リソース PLRAM[0] および PLRAM[1] に該当します。

# Setup PLRAM 
sdx_memory_subsystem::update_plram_specification 
[get_bd_cells /memory_subsystem] PLRAM_MEM00 { SIZE 2M AXI_DATA_WIDTH 512 
SLR_ASSIGNMENT SLR0 READ_LATENCY 10 MEMORY_PRIMITIVE URAM} 

sdx_memory_subsystem::update_plram_specification 
[get_bd_cells /memory_subsystem] PLRAM_MEM01 { SIZE 4M AXI_DATA_WIDTH 512 
SLR_ASSIGNMENT SLR0 READ_LATENCY 10 MEMORY_PRIMITIVE URAM} 

validate_bd_design -force
save_bd_design

READ_LATENCY は、メモリ間でカスケードされるパイプラインの段数 (深さ) を指定する重要な属性です。これはデザインによって異なり、プラットフォームのタイミング QoR および最終的なカーネルのクロック レートに影響します。上記の例の PLRAM_MEM01 では、次のようになっています。

  • 必要なメモリは合計 4 MB。
  • 各 UltraRAM は 32 KB (64 ビット幅)。4 MB x 32 KB → 合計 128 個の UltraRAM。
  • 各 PLRAM インスタンスは 512 ビット幅 → 8 個の UltraRAM が必要。
  • 合計 128 個の UltraRAM、8 個の UltraRAM の幅 → 16 個の UltraRAM 深さ。
  • 経験則によれば適切な読み出しレイテンシは深さ/2 + 2 なので、この場合は READ_LATENCY = 10。

これにより、1 つおきの UltraRAM にパイプラインを挿入できるので、次のようになります。

  • UltraRAM 間のタイミング パフォーマンスが向上します。
  • カスケードのためにすべての UltraRAM を同じ UltraRAM 列に配置する必要がないので、配置を柔軟に実行できます。

計算ユニット間のストリーミング接続の指定

Vitis コア開発キットでは、2 つのカーネル間のストリーミングデータ転送がサポートされており、グローバル メモリを介せずに、カーネル間でデータを直接転送できます。ただしこのプロセスは、カーネル間 (K2K) のストリーミング データ転送 に説明されているように、カーネル コード自体にインプリメントし、カーネル ビルド プロセスで指定する必要があります。
注記: フリーランニング カーネルとのストリーミング接続もサポートされます (フリーランニング カーネル を参照)。

カーネルのストリーミング データ ポートは、v++ でのリンク時に --connectivity.sc オプション オプションを使用して接続できます。このオプションは、コマンド ラインで指定するか、Vitis コンパイラ コマンド に説明されるように、--config オプションで指定した config ファイルから指定します。

プロデューサー カーネルのストリーミング出力ポートをコンシューマー カーネルのストリーミング入力ポートに接続するには、v++ コンフィギュレーション ファイルで次のように connectivity.stream_connect オプションを使用します。

[connectivity]
#stream_connect=<cu_name>.<output_port>:<cu_name>.<input_port>:[<fifo_depth>]
stream_connect=vadd_1.stream_out:vadd_2.stream_in

説明:

計算ユニットの SLR への割り当て

現在のところ、データセンター アクセラレータ カード上のザイリンクス デバイスでは、複数の SLR (Super Logic Region) を含むスタックド シリコン デバイスを使用して、グローバル メモリを含むデバイス リソースを提供しています。最高のパフォーマンスにするには、ポートをグローバル メモリ バンクに割り当てる際、カーネル ポートのメモリへのマップ に説明されているように、CU インスタンスを接続されているグローバル メモリと同じ SLR に割り当てることをお勧めします。この場合、カーネル インスタンスまたは CU を手動でグローバル メモリと同じ SLR に割り当て、最高のパフォーマンスが得られるようにします。

CU は、コンフィギュレーション ファイルで connectivity.slr オプションを使用すると、SLR に割り当てることができます。設定ファイルの connectivity.slr オプションの構文は次のとおりです。

[connectivity]
#slr=<compute_unit_name>:<slr_ID>
slr=vadd_1:SLR2
slr=vadd_2:SLR3

説明:

  • <compute_unit_name>: connectivity.nk オプションで定義されている CU のインスタンス名 (複数のカーネル インスタンスの作成 を参照)、または複数の CU が指定されていない場合は <kernel_name>_1
  • <slr_ID>: CU を割り当てる SLR 番号。SLR0、SLR1、という形式で指定します。

CU を SLR に割り当てる場合は、CU ごとに個別に指定する必要がありますが、この割り当て自体は必須ではありません。割り当てた CU が別の SLR にあるグローバル メモリに接続される場合、ツールは自動的に SLR クロッシング レジスタを挿入してタイミング クロージャを達成しやすくします。SLR が割り当てられていない場合は、v++ リンカーで自動的に CU が SLR に割り当てられます。

設定ファイルに SLR 割り当てを含めたら、v++ リンク プロセスで --config オプションを使用して設定ファイルを指定します。
v++ -l --config config_slr.cfg ...

クロック周波数の管理

重要: ここで説明する --clock オプションは、データセンター アクセラレータ カードのレガシ プラットフォームではサポートされません。古いプラットフォームでは、カーネルはプラットフォームのデフォルトの動作周波数で動作します。

一般的に、エンベデッド プロセッサ プラットフォームおよび新しいデータセンター アクセラレータ カードでは、デバイス バイナリで複数のカーネルを異なるクロック周波数のプラットフォームに接続できます。各カーネル、またはカーネル固有のインスタンスは、指定されたクロック周波数または複数のクロックに接続でき、異なるカーネルがプラットフォームで生成された異なるクロック周波数を使用できます。

コンパイル中にカーネル周波数を指定するには、--hls.clock コマンドを使用します。これで、指定した周波数をターゲットにしたカーネルをコンパイルでき、Vitis HLS ツールを使用して指定された周波数でカーネル ロジックの検証できるようになります。これはコンパイル用のインプリメンテーション ターゲットにすぎませんが、最適化とフィードバックができます。

リンク処理中に、カーネルがプラットフォームに接続されてデバイス バイナリをビルドする場合、v++ コマンドの --clock オプション を使用してカーネルのクロック周波数を指定できます。

  1. Vitis コンパイラーを使用して HLS コードをコンパイルします。RTL カーネルの場合は、手順 2 に進みます。
    v++ -c -k <krnl_name> --hls.clock freqHz:<krnl_name>
    注記: Vitis HLS カーネルがコンパイルされる頻度を変更するには、--hls.clock arg:kernelName を使用します。arg は Hz である必要があります (たとえば 250 MHz は 250000000Hz です)。
  2. リンク中に、カーネル内の各クロック信号のクロック周波数またはクロック ID を次のコマンドで指定します。
    v++ -l ... --clock.freqHz <freqHz>:kernelName.ap_clk

クロック ID を指定する場合、カーネル周波数はプラットフォーム上の指定されたクロックの周波数で指定されます。クロック周波数を指定すると、プラットフォームはプラットフォーム クロックをスケーリングして、指定された周波数を作成しようとします。場合によっては、クロック周波数はある程度の近似でしか達成できないことがあります。この場合、--clock.tolerance または --clock.default_tolerance を指定して、許容範囲を示すことができます。指定されたクロック周波数を許容範囲内でスケーリングできない場合、警告メッセージが表示され、カーネルがデフォルトのクロックに接続されます。

Vivado 合成およびインプリメンテーション結果の管理

ヒント: このトピックでは、『ザイリンクス FPGA および SoC 用 UltraFast 設計手法ガイド』 (UG949) に説明されている Vivado Design Suite ツールおよび設計手法を理解していることが必要です。

Vitis 環境では、ほとんどの場合、CU をハードウェア プラットフォームにリンクし、FPGA バイナリ (xclbin) を生成する際、プログラマブル ロジック領域の合成およびインプリメンテーションのプロセスは完全に隠されています。アプリケーション開発者はハードウェア開発プロセスを意識する必要はなく、ロジックの配置や配線遅延などの制約を管理する必要もありません。Vitis ツールでは、FPGA インプリメンテーション プロセスのほとんどが自動化されています。

ただし、特に大型デザインをインプリメントするときなど、Vitis コンパイラで運用される合成およびインプリメンテーション プロセスを一部制御する必要がある場合もあります。そのため、v++ 設定ファイルまたはコマンド ラインでオプションを指定することにより、Vitis ツールでこれらを制御できるようになっています。次に、Vivado 合成およびインプリメンテーション結果を制御するメソッドの一部を示します。

  • --vivado オプションを使用して Vivado ツールを管理する。
  • 複数のインプリメンテーション ストラテジを使用して、困難なデザインでタイミング クロージャを達成する。
  • -to_step および -from_step オプションを使用して、コンパイルまたはリンクを特定の段階まで実行し、デザインを手動で操作して、その段階から再開する。
  • Vivado プロジェクトをインタラクティブに編集し、その結果を FPGA バイナリの生成に使用する。

-vivado および -advanced オプション

--vivado オプション (--vivado オプション を参照) および --advanced オプション (--advanced オプション を参照) を使用すると、標準の Vivado 合成またはインプリメンテーションにさまざまな制御を適用できます。

  1. カスタム デザイン制約またはスクリプト化された操作を含む Tcl スクリプトを渡します。

    XDC デザイン制約をデザインのオブジェクトに割り当てる Tcl スクリプトを作成し、その Tcl スクリプトを合成およびインプリメンテーション ステップの PRE および POST Tcl スクリプト プロパティを使用して Vivado ツールに渡すことができます。Tcl スクリプトの詳細は、『Vivado Design Suite ユーザー ガイド: Tcl スクリプト機能の使用』 (UG894) を参照してください。合成ステップは 1 つですが、インプリメンテーションには、『Vivado Design Suite ユーザー ガイド: インプリメンテーション』 (UG904) に説明されているように複数のステップがあります。Vivado ツール用の Tcl スクリプトをステップの前に実行するか (PRE)、後に実行するか (POST) を指定できます。Tcl スクリプトを割り当てることができるステップは、SYNTH_DESIGNINIT_DESIGNOPT_DESIGNPLACE_DESIGNROUTE_DESIGNWRITE_BITSTREAM です。

    ヒント: さらに、--vivado.prop run.impl_1.steps.phys_opt_design.is_enabled=1 オプションを使用してイネーブルにできるオプションのステップがいくつかあります。イネーブルにすると、これらのステップにも Tcl PRE および POST スクリプトを指定できるようになります。

    次に、Tcl PRE および POST スクリプトの割り当て例を示します。

    --vivado.prop run.impl_1.STEPS.PLACE_DESIGN.TCL.PRE=/…/xxx.tcl

    この例では、PLACE_DESIGN ステップの前に実行するスクリプトを指定しています。コマンド ラインの各要素は、次のとおりです。

    • --vivado: Vivado ツールの指示子を指定する v++ のコマンド ライン オプションです。
    • prop プロパティ設定を渡すことを示すキーワードです。
    • run.: run プロパティを渡すことを指定するキーワードです。
    • impl_1.: run の名前です。
    • STEPS.PLACE_DESIGN.TCL.PRE: 指定する run プロパティです。
    • /.../xx.tcl: プロパティ値を指定します。
    ヒント: --advanced および --vivado オプションはどちらも v++ コマンド ラインで指定するか、コンフィギュレーション ファイルで指定してそのコンフィギュレーション ファイルを --config オプションで指定します。上記の例はコマンド ラインで指定する方法、下の例は設定ファイルで指定する方法を示します。詳細は、Vitis コンパイラのコンフィギュレーション ファイル を参照してください。
  2. run、ファイル、ファイルセットなどのデザイン オブジェクトにプロパティを設定します。
    これは上記の Tcl スクリプトを渡すのと似ていますが、この場合は複数のデザイン オブジェクトの異なるプロパティに値を渡します。たとえば、Performance_Explore のように特定のインプリメンテーション ストラテジを使用して、配置中のグローバル バッファー挿入をディスエーブルにするには、次のようにプロパティを定義します。
    [vivado]
    prop=run.impl_1.STEPS.OPT_DESIGN.ARGS.DIRECTIVE=Explore
    prop=run.impl_1.STEPS.PLACE_DESIGN.ARGS.DIRECTIVE=Explore
    prop=run.impl_1.{STEPS.PLACE_DESIGN.ARGS.MORE OPTIONS}={-no_bufg_opt}
    prop=run.impl_1.STEPS.PHYS_OPT_DESIGN.IS_ENABLED=true
    prop=run.impl_1.STEPS.PHYS_OPT_DESIGN.ARGS.DIRECTIVE=Explore
    prop=run.impl_1.STEPS.ROUTE_DESIGN.ARGS.DIRECTIVE=Explore

    上記の例では、インプリメンテーション run の STEPS.XXX.DIRECTIVE プロパティさまざまなステップに Explore という値を割り当てています。これらのプロパティを定義する構文は、次のとおりです。

    <object>.<instance>.property=<value>

    説明:

    • <object>: デザイン run、ファイル、またはファイルセット オブジェクトを指定します。
    • <instance>: オブジェクトの特定のインスタンスを指定します。
    • <property>: 割り当てるプロパティを指定します。
    • <value>: プロパティの値を指定します。

    この例では、オブジェクトは run、インスタンスはデフォルトのインプリメンテーション run (impl_1)、プロパティはさまざまなステップ名の引数で、この場合は DIRECTIVE、IS_ENABLED、および {MORE OPTIONS} です。コマンドの 構文の詳細は、--vivado オプション を参照してください。

  3. Vivado インプリメンテーション プロセスでオプションのステップを有効にする。

    ビルド プロセスは、Vivado 合成とインプリメンテーションを実行してデバイス バイナリを生成します。インプリメンテーション ステップの中には、デフォルトのビルド プロセスの一部として有効にして実行されるものもあれば、オプションで任意に有効にできるものもあります。

    オプションのステップは、--list_steps コマンドを使用するとリストでき、ます。これには、 vpl.impl.power_opt_designvpl.impl.post_place_power_opt_designvpl.impl.phys_opt_design、および vpl.impl.post_route_phys_opt_design が含まれます。

    オプションのステップは、--vivado.prop オプションを使用するとイネーブルにできます。たとえば、PHYS_OPT_DESIGN ステップをイネーブルにするには、コンフィギュレーション ファイルに次を含めます。

    [vivado]
    prop=run.impl_1.steps.phys_opt_design.is_enabled=1
    

    前述のようにオプションのステップが有効になっている場合、次の「--to_step または --from_step の実行実行」に示す -from_step/-to_step コマンドの一部として指定するか、--linkhook オプション の説明に従って、そのステップの前または後に Tcl スクリプトが実行されるようにします。

  4. パラメーターをツールに渡して処理を制御します。
    --vivado オプションでも、Vivado ツールにパラメーターを渡すことができます。パラメーターは、ツールを起動する前にツールの機能または動作を設定します。パラメーターを指定する構文は、次のとおりです。
    --vivado.param <object><parameter>=<value>

    キーワード param は、デザイン オブジェクトのプロパティではなく、Vivado ツールのパラメーターを渡すことを示します。適用するオブジェクト (<object>)、指定するパラメーター (<parameter>)、割り当てる値 (<value>) も指定する必要があります。

    次の例では、現在の Vivado プロジェクト writeIntermedateCheckpoints を値 1 で渡して、このブール型パラメーターをイネーブルにしています。

    --vivado.param project.writeIntermediateCheckpoints=1
  5. 合成およびインプリメンテーション中に生成されるレポートを管理する。
    重要: Vivado ツールで生成されるレポートをカスタマイズする際、v++ コマンド ラインで --save-temps も指定し、合成およびインプリメンテーション中に生成される一時ファイルおよびレポートが保存されるようにします。

    また、Vitis ツールのビルド プロセスの一部として実行する際は、Vivado ツールで生成される標準レポート以外の追加レポートを生成および保存すると有益な場合があります。生成されるレポートをカスタマイズするには、--advanced.misc オプションを次のように使用します。

    [advanced]
    misc=report=type report_utilization name synth_report_utilization_summary steps {synth_design} runs {__KERNEL__} options {}
    misc=report=type report_timing_summary name impl_report_timing_summary_init_design_summary steps {init_design} runs {impl_1} options {-max_paths 10} 
    misc=report=type report_utilization name impl_report_utilization_init_design_summary steps {init_design} runs {impl_1} options {} 
    misc=report=type report_control_sets name impl_report_control_sets_place_design_summary steps {place_design} runs {impl_1} options {-verbose} 
    misc=report=type report_utilization name impl_report_utilization_place_design_summary steps {place_design} runs {impl_1} options {} 
    misc=report=type report_io name impl_report_io_place_design_summary steps {place_design} runs {impl_1} options {} 
    misc=report=type report_bus_skew name impl_report_bus_skew_route_design_summary steps {route_design} runs {impl_1} options {-warn_on_violation} 
    misc=report=type report_clock_utilization name impl_report_clock_utilization_route_design_summary steps {route_design} runs {impl_1} options {} 
    

    コマンド ラインの構文は、次の例を使用して説明します。

    misc=report=type report_bus_skew name impl_report_bus_skew_route_design_summary steps {route_design} runs {impl_1} options {-warn_on_violation} 
    
    misc=report=
    --advanced.misc オプション (--advanced オプション を参照) を指定し、Vivado ツールのレポート設定を定義します。残りのコマンド ラインは、『Vivado Design Suite Tcl コマンド リファレンス ガイド』 (UG835) に説明されている create_report_config Tcl コマンドのオプションを、名前と値のペアで指定しします。
    type report_bus_skew
    -report_type オプションに関連しており、レポート タイプを report_bus_skew に指定します。ほとんどの report_* Tcl コマンドをレポート タイプとして指定できます。
    name impl_report_bus_skew_route_design_summary
    -report_name オプションに関連しており、レポートの名前を指定します。これはレポートのファイル名ではありません。レポート名はツールで自動生成されるので、通常このオプションはスキップできます。
    steps {route_design}
    -steps オプションに関連しており、レポートを適用する合成およびインプリメンテーション ステップを指定します。レポートが各ステップで再生成されるようにレポートを複数のステップで使用するよう指定できます。その場合、レポート名は自動的に付けられます。
    runs {impl_1}
    -runs オプションに関連しており、レポートを適用するデザイン run の名前を指定します。
    options {-warn_on_violation}
    レポートを生成するときに使用する report_* Tcl コマンドのオプションを指定します。この例では、-warn_on_violationreport_bus_skew コマンドの機能です。
    重要: 指定したオプションが指定したレポート タイプに正しく適用可能なものであることはチェックされません。無効なオプションを指定すると、レポートが実行されたときにエラーが返されます。

タイミング クロージャのための複数のインプリメンテーション ストラテジの実行

困難なデザインでは、複数の異なるストラテジを使用して Vivado インプリメンテーションを複数回繰り返すことで、タイミング クロージャを達成できます。このトピックでは、ハードウェア ビルド (-t hw) で複数のインプリメンテーション ストラテジを同時に起動する方法と、問題のなかった実行を見つけて使用し、デバイス バイナリを生成してビルドを完了する方法について説明します。

--vivado オプション で説明されるように、--vivado.impl.strategies コマンドを使用すると、1 つのビルド パスに実行する複数のストラテジを指定できます。コマンド ラインは、次のようになります。

v++ --link -s -g -t hw --platform xilinx_zcu102_base_202010_1 -I . \
--vivado.impl.strategies "Performance_Explore,Area_Explore" -o kernel.xclbin hello.xo

上記の例の場合、Performance_Explore および Area_Explore ストラテジが Vivado ビルド内で同時に実行され、どの結果がベストなのかを確認できます。ALL を指定すると、ツール内で使用可能なすべてのストラテジを実行するようにを指定できます。

このオプションは、次の形式のコンフィギュレーション ファイルでも決定できます。

#Vivado Implementation Strategies
[vivado]
impl.strategies=Performance_Explore,Area_Explore

Vitis コンパイラは、最初に完了したタイミングを満たす実行結果を自動的に選択し、そのビルド プロセスを続行して、デバイス バイナリを生成します。ただし、すべての実行が完了するまで待機し、完了した実行からベストの結果を選択してから、ツールに続行するように指示することもできます。これには、次のように --advanced.compiler 指示子を使用する必要があります。

[advanced]
param=compiler.multiStrategiesWaitOnAllRuns=1

また、すべてのインプリメンテーション ストラテジが完了した後で、その結果を手動で確認することもできます。この後、to_step を使用して Vivado をインタラクティブに起動する方法 で説明するように、--reuse_impl オプションを使用してインプリメンテーション実行のいずれかの結果を使用します。

to_step を使用して Vivado をインタラクティブに起動する方法

Vitis コンパイラでは、ビルド プロセスを --to_step で指定した段階を終了してから停止し、デザインまたはファイルを手動で変更して、--from_step で指定した段階からビルドを再開できます。--from_stepVitis コンパイラに --to_step で中断した段階からコンパイルを再開するように指示します。--to_step および --from_step については、Vitis コンパイラの一般オプション を参照してください。

重要: --to_step および --from_step オプションはシーケンシャル ビルド オプションで、v++ --link --from_stepv++ --link --to_step で同じプロジェクト ディレクトリを使用する必要があります。

Vitis コンパイラには、特定のビルド ターゲットのコンパイルまたはリンクで指定可能な段階をリストする --list_steps オプションもあります。たとえば、ハードウェア ビルドのリンク プロセスの段階をリストするには、次のコマンドを使用します。

v++ --list_steps --target hw --link

このコマンドを実行すると、Vitis コンパイラのハードウェア ビルドのリンク プロセスで実行されるデフォルトの段階とオプションの段階がリストされます。デフォルト段階には、system_linkvplvpl.create_projectvpl.create_bdvpl.generate_targetvpl.synthvpl.impl.opt_designvpl.impl.place_designvpl.impl.route_designvpl.impl.write_bitstream などがあります。

オプションの段階には、vpl.impl.power_opt_designvpl.impl.post_place_power_opt_designvpl.impl.phys_opt_designvpl.impl.post_route_phys_opt_design などがあります。
ヒント: -vivado および -advanced オプション で説明したように、オプションの段階は、--from_step または --to_step で指定する前にイネーブルにする必要があります。

インタラクティブ設計での Vivado IDE の起動

たとえば、--to_step コマンドを使用する場合、ビルド プロセスを Vivado 合成まで実行し、Vivado IDE でプロジェクトを開いてデザインの配置配線を手動で実行できます。これには、次のコマンド構文を使用します。

v++ --target hw --link --to_step vpl.synth --save-temps --platform <PLATFORM_NAME> <XO_FILES>
ヒント: 上記の例のように、--to_step を使用する場合は、--save-temps も指定して、ビルド プロセスで作成される一時ファイルを保存する必要があります。

このコマンドは、ハードウェア ビルドのリンク プロセスを指定し、ビルドを合成段階まで実行して、ビルド プロセスで生成される一時ファイルを保存します。

--interactive コマンドを使用すると、Vitis コンパイラで構築されたプロジェクトで Vivado ツールを直接起動できます。これにより、ビルド ディレクトリの <temp_dir>/link/vivado/vpl/prj にある Vivado プロジェクトが開き、デザインをインタラクティブに編集できます。

v++ --target hw --link --interactive --save-temps --platform <PLATFORM_NAME> <XO_FILES>

Vivado IDE をこのモードで起動すると、合成 run またはインプリメンテーション run を開いてプロジェクトを制御できます。タイミング クロージャを達成するため、必要に応じて run の詳細を変更し、異なるインプリメンテーション方法を試してみます。結果をデザイン チェックポイント (DCP) として保存するかプロジェクト ビットストリーム (.bit) を生成し、Vitis 環境で デバイス バイナリを生成するのに使用します。

Vivado IDE 内で DCP を保存したら、ツールを閉じて、Vitis 環境に戻ります。v++ コマンド ラインで以前にインプリメントされた DCP ファイルを使用して xclbin を生成するには、--reuse_impl オプションを適用します。

重要: --reuse_impl オプションはインクリメンタル ビルド オプションで、--reuse_impl を使用して Vitis コンパイラを再開する際は、ビルドを開始する際に指定した --to_step と同じプロジェクト ディレクトリを使用する必要があります。

次のコマンドは、Vivado ツールから指定した DCP ファイルを使用してリンク プロセスを実行し、入力ファイルから project.xclbin を作成します。

v++ --link --platform <PLATFORM_NAME> -o'project.xclbin' project.xo --reuse_impl ./_x/link/vivado/routed.dcp
また、Vivado ツールで生成されたビットストリーム ファイルを使用して、project.xclbin を作成することもできます。
v++ --link --platform <PLATFORM_NAME> -o'project.xclbin' project.xo --reuse_bit ./_x/link/vivado/project.bit

その他の Vivado オプション

次に、v++ コマンド ラインまたは設定ファイルで使用可能な追加のオプションの一部を示します。

  • --export_script/--custom_script で Tcl スクリプトを編集および使用すると、コンパイルまたはリンク プロセスを変更できます。
  • --remote_ip_cache: Vivado 合成用のリモート IP キャッシュ ディレクトリを指定します。
  • --no_ip_cache: Vivado 合成の IP キャッシュをオフにします。これにより、キャッシュ データが消去され、ビルド プロセス中にすべての IP が再合成されます。

レポート生成の制御

v++-R オプション (または --report_level) は、ハードウェア エミュレーションおよびシステム ターゲット用のコンパイルまたはリンクで生成されるレポートの情報レベルを制御します。生成するレポートの数が少ないほうが実行は高速です。

コマンド ライン オプションは次のとおりです。

$ v++ -R <report_level>

<report_level> には、次のいずれかを指定します。

  • -R0: 最小限のレポートを生成し、中間デザイン チェックポイント (DCP) は生成しません。
  • -R1: R0 のレポートと次の情報を生成します。
    • 各カーネルのデザイン特性 (report_failfast)。
    • 最適化後のフル デザインのデザイン特性。
    • その後の確認または Vivado Design Suite で使用するため、最適化後のデザイン チェックポイント (DCP) を保存。
    ヒント: report_failfast は、デバイス使用に関して発生する可能性のある問題、クロック制約の問題、および達成不可能なターゲット周波数 (MHz) を検出するユーティリティです。
  • -R2: R1 のレポートと次の情報を生成します。
    • 各インプリメンテーション段階後に保存された DCP を含む、Vivado ツールで生成された標準レポート。
    • 配置後の各 SLR の特性。
  • -Restimate: Vitis HLS でシステム見積もりレポート (システム見積もりレポートを参照) を強制的に生成します。
    ヒント: このオプションは、ソフトウェア エミュレーション ビルド (-t sw_emu) で有益です。