FPGA バイナリのビルド

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

1: FPGA のビルド プロセス


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

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

さまざまコマンド ライン オプションの詳細は、Vitis コンパイラ コマンド を参照してください。さまざまな出力ファイルの生成場所は、v++ コマンドからの出力ディレクトリ を参照してください。

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

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

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

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

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

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

Vivado HLS でのカーネルの作成

Vitis コア開発キットで使用するために C/C++ からカーネルを生成するには、『Vivado Design Suite ユーザー ガイド: 高位合成』 (UG902: 英語版日本語版) に説明されている標準 Vivado HLS プロセスに従いますが、カーネルは Vitis ソフトウェア プラットフォームで動作する必要があるので、標準カーネル要件 (カーネル プロパティ を参照) にも従う必要があります。まず、インターフェイスを AXI メモリ インターフェイスとして記述することが必要です。ただし、スカラー パラメーターは例外で、AXI4-Lite インターフェイスにマップされます。

次の例では、関数シグネチャを定義し、HLS INTERFACE プラグマを指定して関数引数のインターフェイス ポートを定義しています。

void krnl_idct(const ap_int<512> *block, const ap_uint<512> *q, 
 ap_int<512> *voutp, int ignore_dc, unsigned int blocks) {
  #pragma HLS INTERFACE m_axi port=block offset=slave bundle=p0 depth=512
  #pragma HLS INTERFACE s_axilite port=block bundle=control
  #pragma HLS INTERFACE m_axi port=q offset=slave bundle=p1 depth=2
  #pragma HLS INTERFACE s_axilite port=q bundle=control
  #pragma HLS INTERFACE m_axi port=voutp offset=slave bundle=p2 depth=512
  #pragma HLS INTERFACE s_axilite port=voutp bundle=control
  #pragma HLS INTERFACE s_axilite port=ignore_dc bundle=control
  #pragma HLS INTERFACE s_axilite port=blocks bundle=control
  #pragma HLS INTERFACE s_axilite port=return bundle=control
HLS カーネルを作成およびコンパイルするには、次の手順に従います。
  1. Vivado HLS を起動して GUI を開き、File > New Project をクリックします。
  2. New Vivado HLS Project ウィザードの [Project Configurations] ページで、Project name にプロジェクト名を入力し、Location でプロジェクトの保存ディレクトリを指定して、Next をクリックします。
  3. [Add/Remove Files] ページで、Add Files をクリックしてカーネルのソース コードを指定し、Top Function にカーネル関数を指定して、Next をクリックします。
  4. C ベース シミュレーション テストベンチがある場合は、Add Files をクリックして指定できます (オプション)。Next をクリックします。
  5. [Solution Configuration] ページで、Clock Period にカーネルのクロック周期を指定します。この設定は必須です。
    3: New Vivado HLS Project ウィザード
  6. [Part Selection] エリアの Browse ボタンをクリックして、[Device Selection Dialog] ダイアログ ボックスを開きます。Boards をクリックし、コンパイルしたカーネルのターゲット プラットフォームを選択します。[OK] をクリックしてプラットフォームを選択し、[Solution Configuration] ページに戻ります。
    4: デバイスの選択
  7. [Solution Configuration] ページで Vitis Bottom Up Flow チェック ボックスをオンにし、Finish をクリックして HLS カーネル プロジェクトを作成します。
    重要: プロジェクトからザイリンクス オブジェクト (.xo) ファイルを作成するには、Vitis Bottom Up Flow をオンにする必要があります。

HLS プロジェクトを作成したら、Run C-Synthesis をクリックして C 合成を実行し、カーネル コードをコンパイルできます。HLS ツール フローの詳細は、『Vivado Design Suite ユーザー ガイド: 高位合成』 (UG902: 英語版日本語版) を参照してください。

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

5: RTL を IP としてエクスポート

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

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

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

カーネルを作成する Vivado 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_sdx -optimization_level none -target xocc
config_export -vivado_optimization_level 0 -vivado_phys_opt none
config_compile -name_max_length 256 -pipeline_loops 64
config_schedule -enable_dsp_full_reg
#source "./hlsKernel/solution1/directives.tcl"
#csim_design
csynth_design
#cosim_design
export_design -rtl verilog -format ip_catalog -xo $path/$krnlName.xo

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

vivado_hls -f <hls_kernel_script>.tcl

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

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

カーネルのリンク

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

カーネルのコンパイル プロセスでは、カーネルが OpenCL、C、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 sw_emu: ビルド ターゲットを指定します。リンクでは、入力ファイル (.xo) をコンパイルしたときに指定したのと同じ -t および --platform 引数を指定する必要があります。
  • --platform xilinx_u200_xdma_201830_2: カーネルをリンクするプラットフォームを指定します。エンベデッド プロセッサ アプリケーションのカーネルをリンクするには、--platform $PLATFORM_REPO_PATHS/zcu102_base/zcu102_base.xpfm のようにエンベデッド プロセッサ プラットフォームを指定します。
  • --link: カーネルとプラットフォームを FPGA バイナリ ファイル (xclbin) にリンクします。
  • vadd.sw_emu.xo: 入力オブジェクト ファイル。複数のオブジェクト ファイルを .xclbin にビルドできます。
  • -o'vadd.sw_emu.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.txt ...

上記の 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 ファイルが生成されるときに、すべてのカーネル メモリ インターフェイスが同じグローバル メモリ バンクに接続されます。そのため、メモリ バンクとデータを転送できるのは一度に 1 つのメモリ インターフェイスのみなので、カーネルのパフォーマンスはメモリ アクセスにより制限されます。

FPGA にグローバル メモリ バンクが 1 つしか含まれていない場合は、これが唯一の方法ですが、すべての Alveo データセンター アクセラレータ カードには複数のグローバル メモリ バンクが含まれています。リンク段階で、どのカーネル ポート (またはインターフェイス) をどのグローバル メモリ バンクに接続するかを指定できます。帯域幅を最大にし、データ転送を最適化して、全体的なパフォーマンスを改善するには、カーネルとメモリを正しく接続することが重要です。デバイスに計算ユニットが 1 つしかない場合でも、入力ポートと出力ポートを別々のバンクに割り当てると、入力データと出力データに同時にアクセスできるようになるので、パフォーマンスを向上できます。

重要: 15 本までのカーネル ポートを 1 つのグローバル メモリ バンクに接続できます。メモリ インターフェイスが 16 個以上ある場合は、ここで説明するように、conectivity.sp を使用して接続を複数のメモリ バンクに分散する必要があります。
カーネル ポートをメモリ バンクにマップするには、次の手順に従います。
  1. カーネル インターフェイスおよびメモリ バンク の手順に従って、カーネル インスタンスに bundle 名を指定します。
  2. v++ のリンク時に、設定ファイルで connectivity.sp オプションを使用して、カーネル ポートを適切なメモリ バンクにマップます。

v++ 設定ファイルで connectivity.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. v++ リンク時に、個別のポートを異なるグローバルメモリ バンクにマップできます。設定ファイルに 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] となります。PLRAM、HBM、HP または MIG メモリをサポートするプラットフォームもあり、その場合は PLRAM[0]、HBM[0]、HP[0] または MIG[0] を使用します。プラットフォームで使用可能なグローバル メモリ バンクに関する情報を取得するには、platforminfo を使用します。詳細は、platforminfo ユーティリティ を参照してください。
      重要: ホスト コードでの DDR バンクの割り当て に示すように、バンク接続のカスタマイズは、ホスト コードにも反映させる必要があります。

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

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

カーネルのストリーミング データ ポートを接続するには、設定ファイルで connectivity.stream_connect オプションを使用し、v++ リンク時に --config オプションで設定ファイルを指定します (Vitis コンパイラ コマンド を参照)。

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

[connectivity]
#stream_connect=<cu_name>.<output_port>:<cu_name>.<input_port>
stream_connect=vadd_1.stream_out:vadd_2.stream_in
説明:
この設定ファイルをリンク時に v++ コマンド ラインで指定します。
v++ -l --config vadd_config.txt ...

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

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

CU の SLR への割り当ては、設定ファイルで connectivity.slr オプションを使用し、v++ コマンド ラインで --config オプションで指定すると、v++ リンク プロセスで実行されます。設定ファイルの 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 ごとに個別に指定する必要がありますが、この割り当て自体は必須ではありません。SLR が割り当てられていない場合は、v++ リンカーで自動的に CU が SLR に割り当てられます。

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

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

概要

ヒント: このトピックでは、『UltraFast 設計手法ガイド (Vivado Design Suite 用)』 (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) に説明されているように複数の段階があります。Tcl スクリプトを Vivado ツールである段階の前に実行するか (PRE)、後に実行するか (POST) を指定できます。Tcl スクリプトを割り当てることができる段階は、SYNTHESISINIT_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.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>: プロパティの値を指定します。
  3. パラメーターをツールに渡して処理を制御します。
    --vivado オプションでも、Vivado ツールにパラメーターを渡すことができます。パラメーターは、ツールを起動する前にツールの機能または動作を設定します。パラメーターを指定する構文は、次のとおりです。
    --vivado.param <object><parameter>=<value>

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

    次の例では、現在の Vivado プロジェクト writeIntermedateCheckpoints を渡しており、値は 1 でこのパラメーターをイネーブルにしています。
    --vivado.param project.writeIntermediateCheckpoints=1
  4. 合成およびインプリメンテーション中に生成されるレポートを管理する。
    重要: 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 コマンドの機能です。
      重要: 指定したオプションが指定したレポート タイプに正しく適用可能なものであることはチェックされません。無効なオプションを指定すると、レポートが実行されたときにエラーが返されます。

--to_step または --from_step の実行

Vitis コンパイラでは、ビルド プロセスを指定した段階で停止し、デザインまたはファイルを手動で変更して、指定した段階からビルドを再開できます。Vitis コンパイラの --to_step はビルド プロセスを指定した段階まで実行することを指定し、--from_step オプションはビルド プロセスを開始する段階を指定します (Vitis コンパイラの一般オプション を参照)。

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

このコマンドを実行すると、Vitis コンパイラのハードウェア ビルドのリンク プロセスで実行されるデフォルトの段階とオプションの段階がリストされます。デフォルトの段階には、ssystem_link、vpl、vpl.create_project、vpl.create_bd、vpl.generate_target、vpl.synth、 vpl.impl.opt_design、vpl.impl.place_design、vpl.impl.route_design、vpl.impl.write_bitstream などがあります。

オプションの段階には、vpl.impl.power_opt_design、vpl.impl.post_place_power_opt_design、vpl.impl.phys_opt_design、vpl.impl.post_route_phys_opt_design などがあります。
ヒント: オプションの段階は、--from_step または --to_step で指定する前にイネーブルにする必要があります。たとえば、PHYS_OPT_DESIGN 段階をイネーブルにするには、設定ファイルに次を含めます。
[vivado]
prop=run.impl_1.steps.phys_opt_design.is_enabled=1

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

--to_step コマンドを使用すると、たとえばビルド プロセスを Vivado 合成まで実行し、Vivado IDE でプロジェクトを開いてデザインの配置配線を手動で実行できます。これには、次のコマンドを使用します。
v++ --target hw --link --to_step vpl.synth --save-temps --platform <PLATFORM_NAME> <XO_FILES>
重要: Vivado ツールで必要となる一時ファイルを保存するには、--to_step を使用する際に --save-temps も指定する必要があります。

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

Vitis コンパイラでビルドされたプロジェクト (ビルド ディレクトリの _x/link/vivado/vpl/prj) で直接 Vivado ツールを起動できます。Vivado IDE をこのモードで起動すると、合成 run またはインプリメンテーション run を開いてプロジェクトを制御できます。タイミング クロージャを達成するため、必要に応じて run の詳細を変更し、異なるインプリメンテーション方法を試してみます。結果はデザイン チェックポイント (DCP) として保存して、Vitis 環境で FPGA バイナリを生成するのに使用できます。

Vivado IDE 内で DCP を保存したら、ツールを閉じて、Vitis 環境に戻ります。v++ コマンド ラインで以前にインプリメントされた DCP ファイルを使用して xclbin を生成するには、--reuse_impl オプションを使用します。次のコマンドは、Vivado ツールからの指定した DCP ファイルを使用してリンク プロセスを実行し、入力ファイルから project.xclbin を作成します。
v++ --link --platform <PLATFORM_NAME> -o'project.xclbin' project.xo --reuse_impl ./_x/link/vivado/routed.dcp

その他の Vivado オプション

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

  • --export_script/--custom_script: HLS Tcl スクリプトを編集および使用してコンパイル プロセスを変更します。
  • --interactive: v++ 環境内から Vivado IDE をプロジェクトを読み込んで起動します。
  • --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: Vivado HLS でシステム見積もりレポート (システム見積もりレポートを参照) を強制的に生成します。
    ヒント: このオプションは、ソフトウェア エミュレーション ビルド (-t sw_emu) で有益です。