コマンド ライン デバッグの例 - 2020.2 Japanese

Vitis 統合ソフトウェア プラットフォームの資料: アプリケーション アクセラレーション開発 (UG1393)

Document ID
UG1393
Release Date
2021-03-22
Version
2020.2 Japanese
コマンド ライン フローを使用したデバッグ方法の理解を助けるため、この例ではザイリンクス GitHub の IDCT 例をビルドしてデバッグします。
  1. ターミナルで、Vitis 環境の設定 で説明されているように環境を設定します。
  2. Vitis Examples GitHub リポジトリ全体をクローンして、すべての Vitis 例を入手します。
    git clone https://github.com/Xilinx/Vitis_Accel_Examples.git

    これにより、IDCT 例を含む Vitis_Examples ディレクトリが作成されます。

  3. cd コマンドを使用して IDCT 例のディレクトリに移動します。
    cd Vitis_Examples/vision/idct/

    ホスト コードは src/idct.cpp に含まれており、カーネル コードは src/krnl_idct.cpp の一部です。

  4. デバイス バイナリのビルド の手順に従って、ソフトウェア エミュレーション用にカーネル ソフトウェアをビルドします。
    1. -g を使用して v++ コンパイラを実行し、カーネル オブジェクト ファイルをデバッグ用にコンパイルします。
      v++ -t sw_emu --platform <DEVICE> -g -c -k krnl_idct \
      -o krnl_idct.xo src/krnl_idct.cpp
    2. -g を指定してカーネル オブジェクト ファイルをリンクします。
      v++ -g -l -t sw_emu --platform <DEVICE> -config config.cfg \
      -o krnl_idct.xclbin krnl_idct.xo
      --config オプションは、Vitis コンパイラのコンフィギュレーション ファイル で説明されているように、ビルド プロセスの指示子を含むコンフィギュレーション ファイル config.cfg を指定します。コンフィギュレーション ファイルの内容は次のとおりです。
      kernel_frequency=250
      
      [connectivity]
      nk=krnl_idct:1:krnl_idct_1
      
      sp=krnl_idct_1.m_axi_gmem0:DDR[0]
      sp=krnl_idct_1.m_axi_gmem1:DDR[0]
      sp=krnl_idct_1.m_axi_gmem2:DDR[1]
      
      [advanced]
      prop=solution.hls_pre_tcl='src/hls_config.tcl"
  5. ホスト プログラムのビルド の手順に従って、GNU コンパイラ チェーン g++ を使用してホスト コードをデバッグ用にコンパイルします。
    注記: エンベデッド プロセッサ ターゲット プラットフォームでは、Arm 用のコンパイルおよびリンク で説明するように、GNU Arm クロス コンパイラを使用します。
    1. -g オプションを使用してホスト コード C++ ファイルをデバッグ用にコンパイルします。
      g++ -c -I${XILINX_XRT}/include -g -o idct.o src/idct.cpp 
    2. -g を使用してオブジェクト ファイルをデバッグ用にリンクします。
      g++ -g -lOpenCL -lpthread -lrt -lstdc++ -L${XILINX_XRT}/lib/ -o idct idct.o
  6. emconfigutil ユーティリティ に説明されているように、次のコマンドを使用してエミュレーション環境を設定します。
    emconfigutil --platform <device>
    エミュレーション モード (sw_emu または hw_emu) は、XCL_EMULATION_MODE 環境変数で設定します。これは、C シェルでは次のように指定します。
    setenv XCL_EMULATION_MODE sw_emu
  7. xrt.ini ファイル に説明されているように、ランタイムをデバッグ用に設定する必要があります。ホスト アプリケーションをコンパイルしたディレクトリで、次の内容の xrt.ini ファイルを作成します。
    [Debug]
    app_debug=true
    
  8. ホストおよびカーネルで GDB を実行します。次の手順に従うと、コマンド ラインでのデバッグ プロセスを実行できます。これには、Vitis 環境の設定 に説明されているように、3 つのコマンド ターミナルが必要です。
    1. 最初のターミナルでは、XRT デバッグ サーバーを開始します。XRT デバッグ サーバーは、ホスト コードとカーネル コードの間のトランザクションを処理します。
      ${XILINX_VITIS}/bin/xrt_server --sdx-url
    2. 2 つ目のターミナルで、エミュレーション モードを設定します。
      setenv XCL_EMULATION_MODE sw_emu
      次のコマンドを使用して GDB を実行します。
      xgdb –-args idct krnl_idct.xclbin
      gdb プロンプトに次のコマンドを入力します。
      run
    3. 3 つ目のターミナルで、ソフトウェア エミュレーションまたはハードウェア エミュレーション モデルを GDB に接続し、デザインをステップ実行できるようにします。ここでは、ソフトウェア エミュレーションとハードウェア エミュレーションの実行に違いがあります。どちらのフローでも、別の xgdb を起動します。
      xgdb
      • ソフトウェア エミュレーションでのデバッグの場合:
        • gdb プロンプトに次のコマンドを入力します。
          file <XILINX_VITIS>/data/emulation/unified/cpu_em/generic_pcie/model/genericpciemodel
          注記: GDB では環境変数は展開されないので、<XILINX_VITIS>Vitis ソフトウェア プラットフォームのインストールへのパスに置き換える必要があります。
      • ハードウェア エミュレーションでのデバッグの場合:
        1. xrt_server の一時ディレクトリ /tmp/sdx/$uid を見つけます。
        2. このデバッグ セッションの DWARF ファイルを含む xrt_server プロセス ID (PID) を検索します。
        3. gdb プロンプトで次のコマンドを実行します。
          file /tmp/sdx/$uid/$pid/NUM.DWARF
      • どちらのエミュレーションでも、カーネル プロセスに接続します。
        target remote :NUM

        NUM は、GDB リスナー ポートとして xrt_server から返される値です。

      この時点で、ホスト コードとカーネル コードが 2 つの異なる GDB セッションで実行され、GDB でデバッグを通常どおり実行できるようになります。これは、異なるプロセスを処理する場合は一般的です。

      重要: 1 つのプロセスが次のブレークポイントに達する前に、もう 1 つのプロセスがブレークポイントに達することがあるということに注意してください。この場合、2 つ目のターミナルで入力を待つ間、1 つ目のターミナルでのデバッグ セッションがハングしているように見えます。