SDSoC のデバッグ機能

このセクションでは、SDx™ 環境で Vivado® Design Suite IDE またはコマンド ラインを使用してデバッグを実行する方法について詳しく説明します。

SDx 環境デバッグ ツール

SDx 環境には、SDSoC 環境デザインをデバッグするためにザイリンクス システム デバッガー (XSDB) が含まれます。

ザイリンクス システム デバッガー (XSDB)

ザイリンクス システム デバッガー (XSDB) では、ザイリンクス hw_server がデバッグ エンジンとして使用されます。

ザイリンクス ソフトウェア開発キット (SDK) は各ユーザー インターフェイス操作を一連の TCF (Target Communication Framework) コマンドに変換し、システム デバッガーからの出力を処理して、デバッグされているプログラムの現在のステートを表示します。ハードウェア上のプロセッサとの通信には、ザイリンクス hw_server が使用されます。システム デバッガーの 1 つのデバッグ コンフィギュレーションで複数のプロセッサを同時にデバッグできます。これが、SDx 環境デザインに推奨されるデバッグ エンジンです。システム デバッガーは、ハードウェアまたは QEMU エンジンで起動できます。

ワークフローは、次の要素で構成されます。

ELF ファイル
ユーザー アプリケーションをデバッグするには、デバッグ用にコンパイルされた ELF ファイルを使用する必要があります。デバッグ ELF ファイルには、デバッガーへの追加のデバッグ情報が含まれ、ソース コードとその元のソースから生成された 2 進数間が直接関連付けられます。詳細は、ビルド コンフィギュレーションを参照してください。
デバッグ コンフィギュレーション
デバッグ セッションを開始するには、SDx 環境でデバッグ コンフィギュレーションを作成する必要があります。このコンフィギュレーションには、実行ファイル名、デバッグするプロセッサ ターゲットなど、デバッグ セッションを開始するのに必要な情報が含まれます。詳細は、デバッグ コンフィギュレーションの設定を参照してください。
SDx の [Debug] パースペクティブ
[Debug] パースペクティブを使用すると、SDx ワークベンチでプログラムのデバッグまたは実行を管理できます。ブレークポイントを設定、実行中のプログラムを一時停止、コードをステップ実行、変数の内容を確認するなど、プログラムの実行を制御できます。

SDx 環境で、コードの修正、実行ファイルの構築、プログラムのデバッグというサイクルを繰り返すことができます。

注記: コンパイル後にソースを編集すると、デバッグ情報がそのソースに直接関連付けられているため、その行番号はステップ実行されなくなります。同様に、最適化されたバイナリをデバッグすると、実行トレース中に予期しないジャンプが発生することがあります。

デバッグ コンフィギュレーションの設定

アプリケーションをデバッグ、実行、およびプロファイリングするには、アプリケーション実行およびデバッグの設定を保存するデバッグ コンフィギュレーションを作成する必要があります。デバッグ コンフィギュレーションを作成するには、[Assistant] ビューで [Debug] ビルド コンフィギュレーションを右クリックし、[Debug] > [Debug Configurations] をクリックします。または、メイン メニューから [Run] > [Debug Configurations] をクリックします。次の図に示す [Debug Configurations] ダイアログ ボックスが開きます。

ヒント: アプリケーション プロジェクトの OS とシステム設定、およびデバッグするアプリケーションのタイプによって、[Debug Configurations] ダイアログ ボックスに含まれるタブは異なります。ここで説明するタブおよびオプションが実際に表示されるものと異なる場合があります。

図: [Debug Configurations] ダイアログ ボックス

[Debug Configurations] ダイアログ ボックスの左側のペインで、[Xilinx SDx Application Debugger] を選択してプロジェクトのデバッグ コンフィギュレーションを作成します。アプリケーション プロジェクトに新しいデバッグ コンフィギュレーションが作成され、コンフィギュレーションを管理する複数のタブが表示されます。

[Main] タブ
[Main] タブのオプションは、現在のアプリケーション プロジェクトのデバッグおよび接続のタイプに応じて自動的に設定されます。たとえば Linux アプリケーションは、Linux デバッグ タイプを使用し、アプリケーションへの接続には Linux エージェントを使用します。
ヒント: ここでデバッグ タイプを変更できますが、それによりデバッグ コンフィギュレーションに関連付けられているアプリケーション プロジェクトもリセットされます。

図: [Debug Configurations] ダイアログ ボックス: [Main] タブ

[Application] タブ

[Application] タブには、プロセッサにダウンロードして実行するコンパイル済みアプリケーション ELF ファイルが表示されます。

図: [Debug Configurations] ダイアログ ボックス: [Application] タブ

[Target Setup] タブ

Linux アプリケーションでは、[Target Setup] タブは空白です。スタンドアロン アプリケーションでは、ハードウェア プラットフォームと、初期化に FSBL (第 1 段階ブートローダー) フローを使用するかどうか (プラットフォームのデバイスを初期化する必要がある場合) を指定できます。

[Arguments] タブ

[Arguments] タブでは、デバッグ セッションを起動するのに必要な変数を指定できます。[Variables] をクリックして [Select Variable] ダイアログ ボックスを表示します。

[Environment] タブ

[Environment] タブでは、デバッグ コンフィギュレーションの環境変数を設定します。

図: 環境変数の追加、設定、および編集

デバッグ コンフィギュレーションに新しい環境変数を追加するには、[New] をクリックして値を指定します。[Select] をクリックすると、デバッグ コンフィギュレーションに追加可能な既存の環境変数が表示され、値を変更および設定できます。

[Debug Configuration] ダイアログ ボックスのその他のタブ

[Symbol Files]、[Source]、[Path Map]、および [Common] タブは、XSDB には適用されないアプリケーション特定のアドバンス デバッグ用なので、無視しても問題ありません。

[Target Connections] ビュー

[Target Connections] ビューでは、複数のリモート ターゲットを設定できます。接続されているターゲットが表示され、ターゲット接続を追加または削除するオプションがあります。SDx 環境では、ターゲット接続はハードウェア サーバー エージェントを介して確立されます。リモート ターゲットに接続するには、ターゲットに接続されたリモート ホスト上でハードウェア サーバー エージェントが実行されている必要があります。

アプリケーションがスタンドアロンである場合は、[Hardware Server] を使用します。[Hardware Server] を使用する場合、ボードに JTAG 接続のみが必要です。アプリケーションを SoC 用に Linux 上で実行する場合は、[Linux TCF Agent] を使用します。[Linux TCF Agent] を使用する場合は、マシンからボードにイーサネット接続が必要です。

詳細は、ハードウェアへの接続 を参照してください。

SDx IDE での Linux アプリケーションのデバッグ

SDx IDE でアプリケーションをデバッグするには、次の手順を使用します。

ボードが JTAG デバッグ コネクタを使用してホスト コンピューターに接続されていることを確認します。ボードとホスト PC 間にはイーサネット接続があります。
  1. 選択した SDSoC プラットフォームのユーザー ガイドに従って、SD カードから起動するアプリケーションを設定します。
  2. [SDx Application Project Settings] で、[Target] を [Hardware] に設定し、[Generate SD card image] チェック ボックスをオンにします。
  3. [Assistant] ビューで [Debug] ビルド コンフィギュレーションを右クリックし、[Set Active] をクリックします。
  4. [Assistant] ビューまたはメイン メニューで [Build] () ボタンをクリックし、デバッグ コンフィギュレーションをビルドします。
  5. ファイル ブラウザーまたはコマンド シェルで、Debug/sd_card フォルダーの内容を SD カードにコピーします。
  6. SD カードをプラットフォームのカード リーダーに挿入し、カードをブートします。
  7. ボードがネットワークに接続されていることを確認し、UART を介してボードと通信するターミナルを使用して、コマンド プロンプトでボードに対して ifconfig eth0 を実行するなどして、IP アドレスを記録します。
  8. [Assistant] ビューで [Debug] ビルド コンフィギュレーションを右クリックし、[Debug] > [Debug Configurations] をクリックして新しいビルド コンフィギュレーションを作成します。
  9. [Xilinx SDx Application Debugger] をダブルクリックするか、右クリックして [New] をクリックします。
  10. [Connection: Linux Agent] の右側にある [New] ボタンをクリックします。
  11. [Target Connection Details] ダイアログ ボックスで、ターゲット名を指定し、ボードの IP アドレスを入力します。[Test Connection] ボタンをクリックしてボードへの接続をテストすることを強くお勧めします。
  12. [Apply] をクリックして設定を保存し、[Debug] をクリックします。
  13. SDSoC 環境の [Debug] パースペクティブに切り替え、デバッグの開始、停止、ステップ実行、ブレークポイントの設定、変数およびメモリの検証などのデバッグ操作を実行します。
SDx IDE でのスタンドアロンまたは FreeRTOS アプリケーションのデバッグ
スタンドアロン (ベアメタル) または FreeRTOS OS で実行中のアプリケーションをデバッグするには、ボードが JTAG デバッグ コネクタを使用してホスト コンピューターに接続されていることを確認し、ボードが JTAG から起動するように設定します。
  1. [Assistant] ビューで [Debug] ビルド コンフィギュレーションを右クリックし、[Set Active] をクリックします。
  2. [Assistant] ビューまたはメイン メニューで [Build] () ボタンをクリックし、デバッグ コンフィギュレーションをビルドします。
  3. [Assistant] ビューで [Debug] ビルド コンフィギュレーションを右クリックし、[Debug] > [Debug Configurations] をクリックして新しいビルド コンフィギュレーションを作成します。
  4. オプション: SDSoC 環境の [Debug] パースペクティブに切り替え、デバッグの開始、停止、ステップ実行、ブレークポイントの設定、変数およびメモリの検証などのデバッグ操作を実行します。
  5. オプション: SDx IDE ツールバーで [Debug] をクリックすると、上記の手順を一気に実行できます。

XSCT (ザイリンクス ソフトウェア コマンド ライン ツール)

SDx 環境などのグラフィカル開発環境は、新規プロセッサの開発を高速化するのに有益です。初心者でも使用できるように、よく使用される関数のほとんどが抽象化され、論理的なウィザードにまとめられています。スクリプトを記述して実行できる機能も重要であり、ツールでの処理を拡張する柔軟性が提供されます。スクリプトは、毎晩実行する回帰テストを開発する際や、開発者がよく使用するコマンド セットを実行する際に特に便利です。

XSCT (ザイリンクス ソフトウェア コマンド ライン ツール) は、SDx 環境のインタラクティブでスクリプト記述可能なコマンド ライン インターフェイスです。XSCT のスクリプト言語は、その他のザイリンクス ツールと同様、Tcl (ツール コマンド言語) に基づきます。XSCT コマンドはインタラクティブに実行でき、またコマンドをスクリプトに記述して自動化することもできます。XSCT では、次の操作を実行できます。

  • ハードウェア、ボード サポート パッケージ (BSP)、およびアプリケーション プロジェクトを作成。
  • リポジトリを管理。
  • チェーン プリファレンスを設定。
  • BSP/アプリケーションをコンフィギュレーションおよびビルド。
  • ハードウェア ターゲットにアプリケーションをダウンロードして実行。
  • Bootgen および program_flash ツールを実行してブート イメージを作成し、フラッシュ メモリに書き込む。

XSCT コマンドの詳細は、『ザイリンクス ソフトウェア コマンド ライン ツール (XSCT) リファレンス ガイド』 (UG1208) を参照してください。

システム エミュレーション

システム エミュレーションは、システム デバッガー上で TCF (Target Communications Framework) サーバーを使用して実行できます。

注記: 現在のところ、カスタム プラットフォームでのエミュレーションはサポートされていません。エミュレーションはザイリンクスが提供するベース プラットフォームでのみサポートされます。

IDE からのシステム エミュレーションの実行

システム エミュレーションでは、システムをビットストリームにコンパイルしてボード上にデバイスをプログラムしなくても、最終的なインプリメンテーションと同レベルの精度で検証できます。システム エミュレーションを使用すると、実際のハードウェアを使用せずにアプリケーションをデバッグできます。パフォーマンスのボトルネックも特定できます。

システム エミュレーションの有効化

システム エミュレーションを有効にするには、[Application Project Settings] ウィンドウで次を実行します。
  1. [Active build configuration] を [Debug] に設定します。
  2. [Target] を [Emulation] に設定します。
  3. エミュレーション モデルを設定します。2 つのエミュレーション モデル モードがあります。
    [Debug]
    RTL 生成およびハードウェア関数を含む IP インテグレーター ブロック デザインからシステムを構築し、デザインのビヘイビアー シミュレーションを実行して、結果を解析しやすいように波形ビューアーに表示します。Vivado Design SuiteVivado シミュレータを使用して波形を解析します。
    [Optimized]
    バッチ モードでビヘイビアー シミュレーションを実行し、波形データなしの結果を返します。[Optimized] モデルの方が高速ですが、[Debug] モデルよりも表示される情報は少なくなります。
    ハードウェア デバッグ情報を取り込まずに、エミュレーションを高速に実行するには、[Optimized] オプションを選択します。システムのハング問題をデバッグする場合は、[Debug] モードを使用して Vivado シミュレータの波形ビューアーで異なる信号のステートを確認します。アプリケーションのみをデバッグする場合は、[Optimized] エミュレーション モデルを使用できます。

    エミュレーションではシステム全体をコンパイルする必要はないので、実行時間を短縮するために [Generate SD card image] はデフォルトでオフになっています。システム エミュレーションを使用すると、全ビットストリーム コンパイルと同レベルの精度でシステムを検証およびデバッグできます。

  4. エミュレーション モデルを指定した後、[Build] ボタン () を使用してシステムをエミュレーション用にコンパイルします。

    ビルド プロセスには、アプリケーション コード、ハードウェア関数のサイズ、選択したオプションによって時間がかかることがあります。ハードウェア関数をコンパイルするため、ツール スタックには SDx 環境、Vivado 高位合成 (HLS) ツール、および Vivado Design Suite が含まれます。

システム エミュレーターの実行

  1. エミュレーション ターゲットを作成したら、[Xilinx] > [Start/Stop Emulator] をクリックしてシステム エミュレーターを実行します。または、[Assistant] ビューでアプリケーションを右クリックし、[Start/Stop Emulator] をクリックします。
  2. [Start/Stop Emulator] ダイアログ ボックスが開いたら、エミュレーション モードを指定します。
    • [Debug] を選択すると、波形を表示するかしないかを指定してエミュレーションを実行できます。
    • [Optimized] を選択すると、[Show Waveform] チェック ボックスボックスは無効になります。


    [Start/Stop Emulator] ダイアログ ボックスには、[Project] (プロジェクト名)、[Configuration] (ビルド コンフィギュレーション)、[Show Waveform] (波形表示) オプションが含まれます。[Show Waveform] をオフにすると、ソース コードの print 文の結果も含め、すべてのシステム メッセージが [Emulation Console] ビューに表示されます。これらの中には、ハードウェア関数に送受信される値が含まれることがあるほか、アプリケーションが問題なく実行されたことを示すメッセージが表示され、PL で実行されるソース コードと PS で実行されるコンパイル済みハードウェア関数が論理的に問題なかったことが確認できるようになっています。[Show Waveform] オプションをオンにすると、コンソール ウィンドウで波形ウィンドウと同じ機能が使用できるようになり、RTL のビヘイビアー シミュレーションも実行できます。RTL 波形ウィンドウには、時間の経過に応じたハードウェア関数の信号値が表示されます。[Show Waveform] をオンにする場合、エミュレーションの開始前に信号を手動で波形ウィンドウに追加しておく必要があります。

  3. [Scope] ウィンドウでデザイン階層を確認します。
  4. [Object] ウィンドウで監視する信号を右クリックして、その信号を波形ウィンドウに追加します。
  5. [Run All] ツールバー ボタンをクリックして、波形ウィンドウのアップデートを開始します。Vivado シミュレータの波形ウィンドウの詳細は、『Vivado Design Suite ユーザー ガイド: ロジック シミュレーション』 (UG900) を参照してください。
    注記: RTL 波形を表示して実行すると、実行時間は長くなりますが、ハードウェア関数の動作を詳細に解析できます。
    ヒント:

    システム エミュレーションは、[Project Explorer] ビューでアクティブ プロジェクトを右クリックし、次のコマンドをクリックしても開始できます。

    • [Run As] > [Launch on Hardware]
    • [Debug As] > [Launch on Hardware]

    エミュレーターを [Debug As] メニューから起動すると、パースペクティブが [Debug] パースペクティブに変更され、ウィンドウおよびビューがプロジェクトのデバッグに適した配置になります。

エミュレーション出力の表示

  1. システム エミュレーターを実行すると、コンソール ウィンドウにプログラム出力が表示されます。[Show Waveform] オプションを選択した場合は、Vivado IDE でシミュレータが起動します。

    必要に応じて波形ウィンドウに波形を追加します。[Run All] をクリックしてシミュレーションを開始します。

  2. エミュレーターを実行してデバッグ セッションを起動するには、[Assistant] ビューでデバッグ コンフィギュレーションを右クリックして [Debug As] > [Launch on Emulator (SDx Application Debugger)] をクリックします。
  3. [Confirm Perspective Switch] ダイアログ ボックスが表示されます。[Yes] をクリックして [Debug] パースペクティブに切り替えます。

  4. [Debug] パースペクティブでアプリケーションが起動し、プログラムの実行が main 関数で停止します。アプリケーション コードの実行を再開するには、[Resume] をクリックします。

    アプリケーション コードの実行が開始します。次の図に示すように、[Emulation Console] にアプリケーション コードの出力が表示されます。



    Vivado 波形ウィンドウにさまざまな信号のステータスが表示されます。ハードウェア関数の適切な応答も RTL 波形に表示されます。コードの実行中の一時停止でも、ボードで実行される FPGA と同様、RTL 波形は続けて実行されてアップデートされます。



  5. エミュレーションを停止するには、[Xilinx] > [Start/Stop Emulator] をクリックして [Stop] をクリックします。
    ヒント: エミュレーションのデモのサンプル プロジェクトを参照するには、[Emulation Example] テンプレートを使用して新しい SDx 環境プロジェクトを作成します。プロジェクトの README.txt ファイルには、SDx IDE およびコマンド ラインの両方でエミュレーションを実行する手順が含まれています。

コマンド ラインからのシステム エミュレーションの実行

SDx IDE を使用せずにデザインを作成するには、一般的なコマンド ライン フローで個別の SDx コマンドを使用してプロジェクトを構築およびコンパイルするか、makefile フローを使用します。次のスクリプト例では、TARGET でエミュレーション用にコンパイルするよう定義しています。
# FPGA Board Platform (Default ~ zcu102)
PLATFORM := zcu102

# Run Target:
#   hw  - Compile for hardware
#   emu - Compile for emulation (Default)
TARGET := emu
エミュレーション モードでは、次のスクリプト例に示すように、次の 2 つのオプションのいずれかを選択できます。
debug
確認およびデバッグ用 PL ハードウェア エミュレーションから波形データを取り込みます。
optimized
ハードウェア デバッグ情報を取り込まずに、エミュレーションを高速に実行します。
# Target OS:
#     linux (Default), standalone
TARGET_OS := linux

# Emulation Mode:
#     debug     - Include debug data
#     optimized - Exclude debug data (Default)
EMU_MODE := optimized

コマンド プロンプトに「make」と入力してプログラムをビルドします。波形をシミュレータで表示するには、_sds ディレクトリを含むレベルに移動し、「sdsoc_emulator -graphic-xsim」と入力します。これにより、次の図に示すように Vivado シミュレータが起動します。

すべてのプラットフォームで使用可能なハードウェア実行機能

システム エミュレーションは、ザイリンクス ベースのプラットフォームで実行されているアプリケーション プロジェクトでしか使用できませんが、ハードウェア実行フローは SDSoC プロジェクトのターゲットであるどのプラットフォームでも実行できます。ハードウェア実行フローとは、ハードウェア プラットフォーム上で協調実行されるエンベデッド プロセッサ オペレーティング システム、アプリケーション コード、およびハードウェア関数です。ハードウェアで実行可能なデバッグには、次のタイプがあります。
注記: ハードウェア デバッグには、Vivado ハードウェア マネージャーで信号の解析用にハードウェアをインストルメント化することも含まれます。ハードウェアをインストルメント化するため、アプリケーションを特別の命令を含めてビルドする必要があります。

ChipScope を使用した SDSoC でのハードウェア デバッグ

最終的なシステム イメージを生成して SDx 環境で実行したら、エンベデッド プロセッサ OS、アプリケーション コード、およびアクセラレーションされたハードウェア関数を含むシステム全体が実際のハードウェア上で正しく実行されるかを検証し、必要なデバッグ操作を実行できます。ChipScope™ は、Vivado IDE を使用してハードウェアでデザインをデバッグするために使用します。ハードウェアとソフトウェアのクロスプローブには、SDx 環境および Vivado ツール スイートの詳細な知識が必要です。

このデバッグ手順を使用すると、ターゲット プラットフォームへの接続、プロセッサの接続、プロセッサのブート、およびハードウェアのシステム イメージでのプログラムに関連する問題を発見できます。また、アプリケーション コードとハードウェア関数間のデータのやり取り (プロトコル違反)、複数のハードウェア関数とアプリケーション コードとの検証に関する問題を検出できる可能性があります。

さらに、システム パフォーマンス メトリクスも取得でき、その結果作業の焦点がデバッグからパフォーマンスの調整に移行する場合もあります。SDx 環境では、ハードウェア アクセラレータおよびアダプターのインターフェイスでのトランザクションを解析するため、ハードウェアをインストルメント化できます。また、デザインのハードウェア部分もデバッグできます。

--dk を使用したアクセラレーションされた関数のデバッグのイネーブル

デザインの実行を視覚的に表示することは、アプリケーションがハングするような困難な問題をデバッグするために重要です。System ILA デバッグ コアを使用すると、トランザクション レベルでアクセラレーションされたカーネルやハードウェアで実行される関数などを表示できます。System ILA コアでは、特定の AXI トラフィックをキャプチャして表示させることもできます。

System ILA コアは、既存の SDx 環境デザインのハードウェア全体にインスタンシエートしてそのデザイン内でデバッグ機能をイネーブルにするか、コンパイラで自動的に挿入されるようにできます。sds++ コンパイラには、デバッグおよびパフォーマンス監視用に System ILA コアをインターフェイスでハードウェア関数に接続するための -–dk オプションがあります。-–dk オプションを使用して System ILA IP コアの挿入をイネーブルにします。

 --dk arg <[protocol|chipscope|list_ports]:<compute_unit_name>:<interface_name>>

次に、-–dk オプションを使用した例を示します。

sds++ -c --dk chipscope:vadd_cu0:s_axi_control --dk chipscope:vadd_cu0:m_axi_gmem

次に、デバッグ コアを挿入する makefile の例を示します。

APPSOURCES = main.cpp mmult.cpp madd.cpp
EXECUTABLE = mmultadd.elf

PLATFORM = zc702
CLKID   = 
DMCLKID = 
SDSFLAGS = -sds-pf ${PLATFORM} ${DMCLKID} \
	-sds-hw mmult mmult.cpp ${CLKID} -sds-end \
	-sds-hw madd madd.cpp ${CLKID} -sds-end \
	-debug-port mmult:A \
        -debug-port madd:C \
        --dk chipscope:madd_1:A \
        --dk chipscope:madd_1_if:ap_ctrl
	

CC = sds++ ${SDSFLAGS}

CFLAGS = -O3 -c
CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)"
LFLAGS = -O3

OBJECTS := $(APPSOURCES:.cpp=.o)
DEPS := $(OBJECTS:.o=.d)

.PHONY: all clean ultraclean

all: ${EXECUTABLE}

${EXECUTABLE}: ${OBJECTS}
	${CC} ${LFLAGS} $^ -o $@ 

-include ${DEPS}

%.o: %.cpp
	${CC} ${CFLAGS} $^ -o $@

clean:
	${RM} ${EXECUTABLE} ${OBJECTS} ${DEPS}

ultraclean: clean
	${RM} ${EXECUTABLE}.bit 
	${RM} -rf _sds sd_card

–debug-port オプションは、アクセラレータの System ILA を挿入する関数名と引数名を指定します。下位レベルの --dk オプションは、ブロック デザイン インスタンスとポート名を再作成するために使用する Tcl ファイルを指定します。次に例を示します。

  • -debug-port mmult:A--dk chipscope:mmult_1:A と同じですが、sds++ コマンドではブロック デザインの再作成に使用される Tcl ファイルに含まれるインスタンスとポート名が判断されます。
    注記: Tcl ファイルは、Vivado Design Suite のアクセラレータを含むハードウェア プラットフォームのブロック デザインを再作成するために SDx 環境で使用されます。
  • --xp param:compiler.userPostSysLinkTcl=<user_tcl_file> を使用して <user_tcl_file> に IP インテグレーターの Tcl コマンドを指定すると、システムのリンク後、合成前にブロック図の System ILA の後処理を実行できます。
    注記: 上級ユーザーは、ILA 設定を Tcl コマンドを使用して変更できます。通常、必要に応じて ILA で追加のプローブおよびインターフェイスを有効にして、同じクロック ドメインのほかの信号をデバッグできます。このようにすると、FPGA のロジック リソースを削減できます。また、この機能を使用して ILA のチェーンをクロス トリガーすることも可能です。
  • --dk は、アクセラレータおよびアダプター ポート用に System ILA を挿入する場合に使用できます。このオプションを使用すると、アダプター ポートを確認できます。デザインをビルドしたら、『Vivado Design Suite ユーザー ガイド: プログラムおよびデバッグ』 (UG908) に説明するように、Vivado ハードウェア マネージャーを使用してデザインをデバッグできます。
ビルド設定へのフラグの追加
SDx IDE で作業している場合は、次に示すように、ビルド設定で前述のシステム オプションを追加できます。
  1. [Assistant] ビューで [Debug] または [Release] ビルド コンフィギュレーションを右クリックし、[Settings] をクリックします。
  2. [Build Configuration Settings] ダイアログ ボックスで [Edit Toolchain Settings] リンクをクリックします。
  3. [Properties for <application_name>] ダイアログ ボックスの [Tool Settings] タブで、[SDS++ Linker] > [Miscellaneous] をクリックします。
  4. [Linker Flags] フィールドに必要なデバッグ フラグを追加します。

    ヒント: [Tool Settings] タブの上部に [Configuration] フィールドがあり、設定を適用するビルド ([Debug]、[Release]、または [All]) を選択できます。

    コンパイラおよびリンカー オプションの詳細は、SDx コマンドおよびユーティリティ リファレンス ガイド を参照してください。

ハードウェア デザインの解析

適切な System ILA インスタンスを含めてデザインをビルドしたら、次の手順を実行して Vivado デザインを開いて解析できます。
  1. デバッグ可能な信号を確認するには、[Project Explorer] ビューで [Debug/Release] > [_sds] > [p0] > [vivado] > [prj] フォルダーに移動します。

  2. prj.xpr をダブルクリックします。デザインが Vivado IDE で開きます。
  3. Vivado IDE で、Flow Navigator の [IP インテグレーター] → [Open Block Design] をクリックします。

  4. [Designs] ウィンドウで system_ila_x のインスタンスを見つけます。

  5. [Design] ウィンドウで System ILA インスタンスを選択し、ブロック デザインでハイライトします。

  6. System ILA に接続されているインターフェイス ネットを選択し、SDx IDE で指定したインターフェイスに接続されていることを確認します。

Vivado ハードウェア マネージャーを使用したデザインのデバッグ

SDx 環境アプリケーションにデバッグ コアを挿入したら、Vivado ハードウェア マネージャーに接続して ILA (Integrated Logic Analyzer) コアのトランザクションを確認します。ハードウェア マネージャーを使用してターゲット ボードに接続するには、次の手順を実行します。
  1. Vivado Design Suite を起動します。
  2. [Tasks] セクションで [Open Hardware Manager] をクリックします。または、SDx IDE から次の Vivado プロジェクトを開きます。
    <application_project_name>/Debug/_sds/p0/vivado/prj/prj.xpr
    次の図に示すように、Vivado Flow Navigator[Program and Debug] > [Open Hardware Manager] > [Open Target] > [Open New Target] をクリックします。

  3. 次の図に示す Open New Hardware Target ウィザードが開きます。[Next] をクリックします。

  4. [Hardware Server Settings] ページで [Connect to] ドロップダウン リストから [Remote server] または [Local server] を選択します。[Remote Server] を選択した場合は、[Host name] にホスト名を入力して [Port] に正しいポート番号を入力します。この例では、[Local server] を選択します。

  5. [Next] をクリックします。[Select Hardware Target] ページが開き、ボードに存在するターゲットがリストされます。
  6. [Next] をクリックします。[Open Hardware Target Summary] ページが開き、サーバー名、接続するポート、ターゲット、および動作周波数が表示されます。

  7. [Finish] をクリックします。次の図に示すように Hardware Manager 環境が開きます。

  8. これで、Vivado ハードウェア マネージャーを使用してデザインで実行中の ILA に接続できるようになります。ツールの詳細は、『Vivado Design Suite ユーザー ガイド: プログラムおよびデバッグ』 (UG908) を参照してください。

ハードウェア/ソフトウェア イベントのトレース

イベント トレースを使用すると、アクセラレータおよびデータ転送のソフトウェア設定、アクセラレータおよびデータ転送のハードウェア実行など、各フェーズを視覚的に確認できます。アプリケーションをトレースすると、ある期間におけるイベント間の関連を記録するログが生成されます。トレースの目標は、何がいつ発生するか、イベントがどれくらい続くのかなどを確認することで、デバッグ実行をしやすくすることにあります。

ソフトウェア イベント トレースでは、ハードウェア関数に自動的にスタブが挿入され、ハードウェア関数呼び出しに関連するソフトウェア制御イベントが検出されます。記録されたイベント タイプには、ハードウェア アクセラレータ、データ転送、およびハードウェア/ソフトウェア同期イベントの設定と初期化が含まれます。

AXI4-Stream 接続を介するデータ転送を使用したアクセラレータのハードウェア イベント トレースは、sds++ システム コンパイラの -trace オプションを使用してイネーブルにすることもできます。リンカーを -trace オプションを指定して起動すると、ハードウェア関数の RTL インプリメンテーションにハードウェア モニター IP コアが挿入され、アクセラレータの開始と停止、およびデータ転送期間が監視されます。

ハードウェア デバッグと同様、ハードウェアへの接続で説明しているように、イベント トレースには SDSoC 環境プラットフォームをホスト コンピューターに接続する必要があります。イベント トレースを実行するには、[Debug] または [Release] ビルド コンフィギュレーションを使用してホストから SDx IDE でアプリケーションを実行します。

ハードウェア/ソフトウェア システムのランタイム操作

システム コンパイラでは、ハードウェア関数を Vivado 高位合成 (HLS) ツールを使用して IP にクロスコンパイルするか、SDSoC 環境プラットフォーム開発ガイド で説明するように C 呼び出し可能 IP としてリンクすることにより、ハードウェア関数がインプリメントされます。

各ハードウェア関数の呼び出しサイトは、ハードウェア アクセラレータの実行を管理するスタブ関数を呼び出すように書き換えられます。次の図に、ハードウェア関数を書き換えた例を示します。左側が元のコード、右側が新しい関数名で書き換えられたハードウェア関数呼び出しです。

図: ハードウェア関数呼び出しサイトの書き換え



スタブ関数は、ハードウェア アクセラレータを初期化し、関数引数に必要なデータ転送を開始して、アクセラレータと関連のデータ転送がすべて完了するまでプログラム内の適切なポイントで待機することによりハードウェアとソフトウェアを同期します。たとえば、ハードウェア関数 foo()foo.cpp で定義されている場合書き換えられたコードはそのプロジェクトのビルド設定の _sds/swstubs/foo.cpp に生成されます。次のスタブ コードでは、ハードウェア用にマークされたユーザー関数を置き換えています。この関数はアクセラレータを開始し、アクセラレータからのデータの送受信を開始し、転送が終了するまで待機します。

void _p0_mmult0(float *A, float *B, float *C) {
   switch_to_next_partition(0);
   int start_seq[3];
   start_seq[0] = 0x00000f00;
   start_seq[1] = 0x00010100;
   start_seq[2] = 0x00020000;  
   cf_send_i(cmd_addr,start_seq,cmd_handle);
   cf_wait(cmd_handle);
   cf_send_i(A_addr, A, A_handle);
   cf_send_i(B_addr, B, B_handle);
   cf_receive_i(C_addr, C, C_handle);
   cf_wait(A_handle);
   cf_wait(B_handle);
   cf_wait(C_handle);

イベント トレースを使用すると、アクセラレータおよびデータ転送のソフトウェア設定、アクセラレータおよびデータ転送のハードウェア実行など、各フェーズを視覚的に確認できます。たとえば、次のスタブ コードはトレース用に記述されています。アクセラレータを開始し、転送を開始し、転送が終了するまで待機するコマンドが記述されています。

void_p0_mmult_0(float *A, float *B, float *C) {
   switch_to_next_partition(0);
   int start_seq[3];
   start_seq[0] = 0x00000f00;
   start_seq[1] = 0x00010100;
   start_seq[2] = 0x00020000;
   sds_trace(EVENT_START);  
   cf_send_i(cmd_addr,start_seq,cmd_handle);
   sds_trace(EVENT_STOP);
   sds_trace(EVENT_START);
   cf_wait(cmd_handle);
   sds_trace(EVENT_STOP);
   sds_trace(EVENT_START);
   cf_send_i(A_addr, A, A_handle);
   sds_trace(EVENT_STOP);
   sds_trace(EVENT_START);
   cf_send_i(B_addr, B, B_handle);
   sds_trace(EVENT_STOP);
   sds_trace(EVENT_START);
   cf_receive_i(C_addr, C, C_handle);
   sds_trace(EVENT_STOP);
   sds_trace(EVENT_START);
   cf_wait(A_handle);
   sds_trace(EVENT_STOP);
   sds_trace(EVENT_START);
   cf_wait(B_handle);
   sds_trace(EVENT_STOP);
   sds_trace(EVENT_START);
   cf_wait(C_handle);
   sds_trace(EVENT_STOP);

ソフトウェア トレース

イベント トレースでは、スタブ関数が自動的に挿入され、ハードウェア関数呼び出しのインプリメンテーションに関連するソフトウェア制御イベントがキャプチャされます。イベントには、次のようなタイプがあります。

  • アクセラレータの設定および開始
  • データ転送設定
  • ハードウェア/ソフトウェア同期バリア (イベントを待つ)

これらのトピックの詳細は、『SDSoC 環境プログラマ ガイド』 (UG1278) を参照してください。

これらのイベントはそれぞれ個別にトレースされ、プログラマブル ロジックへの 1 つの AXI4-Lite 書き込みとなり、ハードウェア イベントと同じグローバル タイマーからのタイムスタンプが付きます。

ハードウェア トレース

SDSoC 環境では、Vivado 高位合成 (HLS) でクロス コンパイルされたアクセラレータのハードウェア イベント トレースと、AXI4-Stream 接続を介したデータ転送がサポートされます。sds++-trace オプションを使用して起動すると、ハードウェア モニター IP コアが生成されたシステムに自動的に挿入され、次のイベント タイプが記録されます。

  • ap_start および ap_done 信号で定義されたアクセラレータの開始および停止。
  • AXI4-Stream ハンドシェイク信号および TLAST 信号で定義されたデータ転送。
これらのイベントはそれぞれ個別に監視され、ソフトウェア イベントで使用されたのと同じグローバル タイマーからのタイムスタンプが付けられます。ハードウェア関数で次のプラグマを使用して明示的に AXI4-Lite 制御インターフェイスが宣言されている場合は、ap_start および ap_done 信号は IP インターフェイスの一部ではないので、トレースできません。
#pragma HLS interface s_axilite port=foo

これらのデバッグ コアでハードウェア リソースがいくらか使用されますが、ZC706 ボードでは 0.1% 未満です。

AXI4-Stream モニター コアには、basic と statistics の 2 つのモードがあります。basic モードでは、単にトレース イベントの生成が開始/停止されます。statistics モードでは、AXI4-Lite インターフェイスが 2 つの 32 ビット レジスタに対して有効になります。オフセット 0x0 のレジスタには現在または今後の転送のワード カウントが、オフセット 0x4 のレジスタには前の転送のワード カウントが示されます。転送が完了ししだい、現在のカウントが前のレジスタに移動されます。デフォルトでは、AXI4-Stream コアは basic モードに設定されます。

ハードウェア トレース モニター コアだけでなく、出力トレース イベント信号は 1 つのインテグレーション コアによりまとめられます。このコアでは、ポート数を 1 ~ 63 に設定できるので、最大で 63 個のモニター コア (アクセラレータまたは AXI4-Stream) がサポートされます。このコアのリソース使用率は、イネーブルになったポートの数、つまり挿入されるモニター コアの数によって異なります。

ZC706 プラットフォームでは、使用可能なハードウェア リソースの約 0.1 ~ 1.0% が使用され、インテグレーション ロジックを含めて約 10% までのメモリが使用されます。

インプリメンテーション フロー

インプリメンテーション フロー中にトレースがオンになっていると、トレース インストルメンテーションがソフトウェア コードに、ハードウェア モニターがハードウェア システムに自動的に挿入されます。この後、ハードウェア システムが (モニター コアも含めて) 合成、インプリメントされ、ビットストリームが生成されます。ソフトウェア トレースは、通常のユーザー プログラムにコンパイルされます。

ハードウェアおよびソフトウェア トレースはハードウェアでタイムスタンプが付けられて 1 つのトレース ストリームにまとめられ、プログラマブル ロジックのバッファーに格納されます。