コマンド ライン フローを使用したデバッグ方法の理解を助けるため、この例ではザイリンクス GitHub の IDCT 例をビルドしてデバッグします。
- ターミナルで、Vitis 環境の設定 で説明されるように環境を設定します。
-
Vitis Examples GitHub リポジトリ全体をクローンして、すべての Vitis 例を入手します。
git clone https://github.com/Xilinx/Vitis_Accel_Examples.git
これにより、IDCT 例を含む Vitis_Examples ディレクトリが作成されます。
- cd コマンドを使用して IDCT 例のディレクトリに移動します。
cd Vitis_Examples/vision/idct/
ホスト コードは src/idct.cpp に含まれており、カーネル コードは src/krnl_idct.cpp の一部です。
-
デバイス バイナリのビルド の手順に従って、ソフトウェア エミュレーション用にカーネル ソフトウェアをビルドします。
-
-g
を使用してv++
コンパイラを実行し、カーネル オブジェクト ファイルをデバッグ用にコンパイルします。v++ -t sw_emu --platform <DEVICE> -g -c -k krnl_idct \ -o krnl_idct.xo src/krnl_idct.cpp
-
-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"
-
-
ホスト プログラムのビルド の手順に従って、GNU コンパイラ チェーン
g++
を使用してホスト コードをデバッグ用にコンパイルします。-
-g
オプションを使用してホスト コード C++ ファイルをデバッグ用にコンパイルします。g++ -c -I${XILINX_XRT}/include -g -o idct.o src/idct.cpp
-
-g
を使用してオブジェクト ファイルをデバッグ用にリンクします。g++ -g -lOpenCL -lpthread -lrt -lstdc++ -L${XILINX_XRT}/lib/ -o idct idct.o
-
-
emconfigutil ユーティリティ で説明されるように、次のコマンドを使用してエミュレーション環境を設定します。
emconfigutil --platform <device>
エミュレーション モード (sw_emu
またはhw_emu
) は、XCL_EMULATION_MODE
環境変数で設定します。これは、C シェルでは次のように指定します。setenv XCL_EMULATION_MODE sw_emu
-
xrt.ini ファイル で説明されるように、ランタイムをデバッグ用に設定する必要があります。ホスト アプリケーションをコンパイルしたディレクトリで、次の内容の xrt.ini ファイルを作成します。
[Debug] app_debug=true
- ホストおよびカーネルで GDB を実行します。次の手順に従うと、コマンド ラインでのデバッグ プロセスを実行できます。これには、Vitis 環境の設定 で説明されるように、3 つのコマンド ターミナルが必要です。
- 最初のターミナルでは、XRT デバッグ サーバーを開始します。XRT デバッグ サーバーは、ホスト コードとカーネル コードの間のトランザクションを処理します。
${XILINX_VITIS}/bin/xrt_server --sdx-url
- 2 つ目のターミナルで、エミュレーション モードを設定します。
setenv XCL_EMULATION_MODE sw_emu
次のコマンドを使用して GDB を実行します。xgdb –-args idct krnl_idct.xclbin
gdb
プロンプトに次のコマンドを入力します。run
- 3 つ目のターミナルで、ソフトウェア エミュレーション モデルを GDB に接続し、デザインをステップ実行できるようにします。別の
xgdb
を開始します。xgdb
- ソフトウェア エミュレーションでのデバッグの場合:
-
gdb
プロンプトに次のコマンドを入力します。file <XILINX_VITIS>/data/emulation/unified/cpu_em/generic_pcie/model/genericpciemodel
注記: GDB では環境変数は展開されないので、<XILINX_VITIS>
を Vitis ソフトウェア プラットフォームのインストールへのパスに置き換える必要があります。
-
- カーネル プロセスに接続します。
target remote :NUM
NUM
は、GDB リスナー ポートとしてxrt_server
から返される値です。
この時点で、ホスト コードとカーネル コードが 2 つの異なる GDB セッションで実行され、GDB でデバッグを通常どおり実行できるようになります。これは、異なるプロセスを処理する場合は一般的です。
重要: 1 つのプロセスが次のブレークポイントに達する前に、もう 1 つのプロセスがブレークポイントに達することがあるということに注意してください。この場合、2 つ目のターミナルで入力を待つ間、1 つ目のターミナルでのデバッグ セッションがハングしているように見えます。 - ソフトウェア エミュレーションでのデバッグの場合:
- 最初のターミナルでは、XRT デバッグ サーバーを開始します。XRT デバッグ サーバーは、ホスト コードとカーネル コードの間のトランザクションを処理します。