SDSoC アプリケーションの作成

SDSoC™ アプリケーションは、SDx™ IDE またはコマンド ライン インターフェイスで作成できます。この章では、SDx IDE でのワークスペースの作成、選択したプラットフォーム用のアプリケーション プロジェクトの作成、および使用可能なアプリケーション テンプレートの使用について説明します。コードの編集、ハードウェア アクセラレータ設定の変更、ターゲットをエミュレーションまたはボードに設定する方法についても説明します。IDE の操作をコマンド ラインで実行する方法および GUI のスクリーンショットも示します。

SDx ワークスペースの使用

重要: Linux ホストは、SDSoC™ プラットフォームの開発に強く推奨され、またターゲットの Linux OS をサポートするプラットフォームを作成するには必須です。
  1. スクトップ アイコンまたはコマンド ラインから、次のいずれかの方法で SDx™ IDE を起動します。
    • コマンド プロンプトから次のいずれかのコマンドを使用します。

      sdx

      または

      sdx -workspace <workspace_name>

    • [SDx] アイコンをダブルクリックしてプログラムを開始します。
    • Windows OS の [スタート] メニューから起動します。
  2. SDx IDE が開き、次の図に示すワークスペースを選択するダイアログ ボックスが表示されます。

    図: SDx ワークスペースの指定

重要: SDx コマンドを入力するため新しいシェルを開いた場合は、まず settings64 および setup スクリプトをツール環境に読み込みます。Windows では、コマンド ライン シェルから settings64.bat ファイルを実行します。詳細は、SDSoC 開発環境 リリース ノート、インストール、およびライセンス ガイド を参照してください。

SDx ワークスペースは、プロジェクト、ソース ファイル、ツールでの処理結果を含むフォルダーです。プロジェクトごとに個別のワークスペースを定義したり、プロジェクトのタイプ別にワークスペースを定義したりできます。SDSoC プロジェクトのワークスペースを定義するには、次の手順に従います。

  1. [Browse] ボタンをクリックしてワークスペースを指定するか、[Workspace] フィールドに適切なパスを入力します。
  2. [Use this as the default and do not ask again] をオンにすると、指定したワークスペースがデフォルトになり、今後 SDx を起動したときにこのダイアログ ボックスは表示されなくなります。
  3. [Launch] をクリックします。
    ヒント: 現在のワークスペースを変更するには、SDx IDE で [File] > [Switch Workspace] クリックします。

これで SDx ワークスペースが作成されたので、プロジェクトを含めます。プラットフォームおよびアプリケーション プロジェクトが作成され、SDSoC プラットフォームを作成する SDx ツール フローが記述されます。

SDx IDE は、次のユーザーの選択した 3 つのタイプを使用したワークスペースを作成します。
  • アプリケーション プロジェクト
  • プラットフォーム プロジェクト
  • ライブラリ プロジェクト
次のセクションで、プラットフォームおよびアプリケーション プロジェクトを使用して SDSoC プラットフォーム例を構築する方法を説明します。

アプリケーション プロジェクトの作成

ヒント: サンプル デザインは、SDSoC ツールのインストールに含まれますが、ザイリンクス GitHub リポジトリからもダウンロードできます。詳細は、サンプル デザインの概要を参照してください。
  1. SDx IDE を起動したら、新規プロジェクトを作成できます。[File] > [New] > [SDx Project] をクリックするか、これが最初に SDx IDE を起動した場合であれば、ウェルカム画面で [Create Application Project] をクリックします。
  2. [Create a New SDx Application Project] ページが開きます。
  3. [Create a New SDx Application Project] ページでプロジェクトを名前を指定します。[Project name] フィールドにプロジェクト名を指定します。

    図: [Create a New SDx Application Project] ページ

  4. [Use default location] がデフォルトでオンになっており、プロジェクトは SDx ワークスペースのフォルダーに保存されます。このオプションをオフにすると、[Location] でプロジェクトを保存するディレクトリを選択できます。
  5. ディレクトリを指定すると、[Choose file system] でデフォルト ファイル システム JSch ([default]) または Eclipse Remote File System Explorer ([RSE]) を選択できます。
    重要: プロジェクトのディレクトリとして SDx ワークスペースの親フォルダーを指定することはできません。
  6. [Next] をクリックします。

[Platform] ページには、使用可能なインストール済みプラットフォームが表示されます。追加プラットフォームのインストールの詳細は、『SDAccel 環境リリース ノート、インストール、およびライセンス ガイド』 (UG1238) の「プラットフォーム別パッケージのインストール」を参照してください。

重要: プラットフォームの選択によりこの後のプロセスが決定されるので、プロジェクトには正しいプラットフォームを選択してください。

図: SDSoC プラットフォームの指定

プラットフォームには、ベース ハードウェア デザインを記述するシェル、接続されたアクセラレータで使用されるインターフェイスを宣言するメタデータ、およびオペレーティング システム イメージ (Linux など)、ブートアップ ファイル、ランタイム ファイルなどを含むソフトウェア環境が含まれます。

SDSoC 開発環境では、次のボード用のベース プラットフォームが提供されています。

  • Zynq®-7000
    • zc702
    • zc706
  • Zynq UltraScale+™ MPSoC
    • zcu102
    • zcu104
    • zcu106
    • zed

リポジトリにはカスタム定義またはサードパーティのプラットフォームを追加できます。詳細は、プラットフォームおよびリポジトリの管理を参照してください。

  1. プラットフォームのリストからプロジェクトのターゲット プラットフォームを選択します。[Platoform] ページのプラットフォーム リストの上に、5 つのアイコンがあります。左から右に向かって、プラットフォームのテキスト文字列の検索、カスタム プラットフォームの追加、プラットフォーム リポジトリの管理、新規デバイスまたはプラットフォームの追加、選択したプラットフォームに関する追加情報のリストをそれぞれ実行できます。
  2. 定義済みのインストールされたプラットフォームを選択して [Next] をクリックします。
  3. 次の図に示す [System Configuration] ページが開きます。このページでは、システム コンフィギュレーション ([System Configuration]) とランタイム ([Runtime]) をドロップダウン リストからし選択ます。[System Configuration] ページでは、ハードウェア プラットフォームで実行されるソフトウェア環境を定義します。ハードウェア プラットフォームのプロセッサのオペレーティング システムと使用可能なランタイム設定を指定します。

    図: システム設定の指定

  4. システム コンフィギュレーションを設定する際は、[Domain] をオンにして、Linux ベースのコンフィギュレーションの場合は [Linux Root File System] を指定することもできます。[Linux Root File System] は、ヘッダーを実行して見つけるためにシステムに必要なものを提供する sysroot ディレクトリ構造です。
  5. システム コンフィギュレーション ([System configuration]) を選択して [Next] をクリックすると、次の図に示す [Templates] ページが表示されます。新規プロジェクトのアプリケーション テンプレートを指定します。SDx ツールのインストール エリアの samples ディレクトリに、ソース コードの複数のサンプル テンプレートが含まれます。
  6. 最初は、[Template] ページには [Empty Application] または提供されるアプリケーション テンプレートの 1 つがリストされます。追加の SDx サンプルをダウンロードまたはインストールされているサンプルをアップデートするには、[SDx Examples] ボタンをクリックします。サンプル デザインの概要で説明されているザイリンクス GitHub からサンプルがダウンロードされます。

    図: アプリケーション テンプレート

  7. テンプレート プロジェクトは、SDx ツールとアクセラレーション カーネルについて学ぶため、または新規プロジェクトの基礎として使用できます。テンプレートの選択は必須です。[Empty Application] を選択すると、空のプロジェクトが作成され、ファイルをインポートして、最初からプロジェクトを作成できます。
  8. [Finish] をクリックし、New SDx Project ウィザードを閉じてプロジェクトを開きます。

プロジェクトのインポート

以前にエクスポートしたプロジェクトを、新規プロジェクトのソースとして使用できます。
  1. [File] > [Import] から [Xilinx] > [SDx Project] をクリックするか、ウェルカム画面で [Import Project] をクリックします。

    図: SDx プロジェクトを選択します。

  2. インポート タイプとして [SDx project exported zip file] をオンにします。このオプションを選択すると、エクスポートした ZIP ファイルを指定するダイアログ ボックスが表示されます。[Next] をクリックします。

    図: インポート タイプ

  3. 選択して [Open] をクリックします。ワークスペースに読み込み可能なアプリケーション プロジェクトのリストが表示されます。
    注記: ザイリンクスでは、ワークスペース間でプロジェクトを移動するには、SDx でエクスポートされた ZIP ファイルを使用することをお勧めします。また、これが SDx の最後のリリースであるため、リモート ソースを使用するのではなく、ソースをインポートしてください。

コードの使用

SDx 環境には、GUI ベースの IDE のほか、シェル プロンプトからユーザーの指定したコマンド オプションを使用して sds++ システム コンパイラを起動するコマンド ライン制御も含まれます。

アプリケーション コードには、通常 C/C++ ソース ファイル、C/C++ ヘッダー ファイル、および共有またはスタティックな使用目的に作成されたライブラリが含まれます。SDx ツールでは、C/C++ ソース コードの関数が認識されて、ハードウェア アクセラレータに変換できます。SDx ツールは、関数引数、関数タイプ、およびその他の適用された指示子またはプラグマを解析することで、データ ムーバーおよびパイプライン処理されたデータフローを生成して、データをアクセラレータに送受信できるようにします。典型的なデータ ソースおよびデータ シンクはメモリおよび I/O ストリームです。

SDSoC で生成されるアクセラレータは、PL 内に含めるので、PL リソースに収まる必要があります。詳細は、SDSoC アプリケーションのモデルの実行を参照してください。PS および PL 間のインターフェイスは、ユーザーが設定できます。たとえば、SDx ツールでは、ユーザーの C/C++ ソース コードで設定されたインターフェイス ガイダンスを使用して、自動的に PS-PL 境界間をまたがるデータ ムーバーが生成されます。

SDx プラグマの例を使用して SDx アプリケーションを作成するには、まず [Xilinx] > [SDx Examples] をクリックしてソース ファイルを取得します。その他の例は、SDSoC サンプル GitHub からダウンロードできます。

ソースのインポート

C/C++ ソースのインポート

  1. ファイルを追加するには、[Project Explorer] で src フォルダーを右クリックして [Import Sources] をクリックします。
    重要: ソース ファイルをワークスペースにインポートすると、デフォルトではファイルがワークスペースにコピーされます。これをオフにすることもできます。ワークスペースを削除すると、ファイルへの変更はすべて失われます。
  2. インポートするソース ファイルを指定できる [Import] ダイアログ ボックスが表示されます。インポートされるソースは、アーカイブ、既存プロジェクト、ファイル システム、Git リポジトリなどからのものです。インポートするソース ファイルを選択して [Next] をクリックします。
  3. 表示されるページは、前の手順で選択したソース ファイルの種類によって異なります。次の図は、ファイル システムからソースをインポートした場合の [File system] ページを示しています。

    図: ファイル システムソースのインポート

  4. [File system] ページでは、システム内のフォルダーをナビゲートして、プロジェクトにインポートするファイルを選択できます。複数フォルダーからファイルを選択して、インポート先のフォルダーを指定できます。
    ヒント: 各ハードウェア アクセラレータ関数を個別のファイルに分けることにより、アクセラレータの並列コンパイルが可能となり、SDx でのコンパイル時間を短縮できます。
  5. [Overwrite existing resource without warning] をオンにすると既存ファイルが上書きされ、[Create top-level folder] をオンにするとファイルがソース ファイル構造と同じディレクトリ構造でインポートされます。
    注記: このチェック ボックスがオフ (デフォルト) の場合は、ファイルが [Into folder] オプションにリストされるフォルダーにインポートされます。
  6. Windows OS では、Windows Explorer からドラッグ アンド ドロップして、ファイルを追加できます。Windows Explorer でファイルまたはフォルダーを選択して、SDx IDE の [Project Explorer] ビューで src フォルダーまたは別の適切なフォルダーにドロップします。この場合、次の図のように、ファイルをどのように追加するか尋ねるメッセージが表示されます。

    図: ファイルおよびフォルダーの操作

  7. ファイルおよびフォルダーをプロジェクトにコピー、ファイルへのリンクを追加、または仮想フォルダーのファイルにリンクして元のファイル構造を保持できます。[Configure Drag and Drop Settings] オプションへのリンクもあり、このようなタイプのドラッグ アンド ドロップがデフォルトで処理されるように指定できます。これらの設定には、[Windows] > [Preferences] メニュー コマンドからもアクセスできます。
  8. ソース ファイルをプロジェクトに追加したら、コンフィギュレーション、コンパイル、アプリケーションを実行できます。
    注記: コードを変更した場合は (ハードウェア関数への変更を含む)、ソフトウェアのみのコンパイルを実行し直して、変更によってプログラムに悪影響が出ないかどうかを確認すると有益です。ソフトウェアのみのコンパイルは、フルシステム コンパイルよりもかなり高速です。

C 呼び出し可能な IP ライブラリのインポート

C/C++ ソース ファイルだけでなく、C 呼び出し可能な IP ライブラリ (Arm®.a スタティック ライブラリ ファイルとしてパブリッシュされる) を使用した既存のハードウェア関数もデザインに組み込むことができます。C 呼び出し可能な IP を使用したコード例は、SDSoC インストール ディレクトリの samples/rtl ディレクトリに含まれています。SDx IDE では、独自の C 呼び出し可能な IP ライブラリを作成して追加することもできます。
注記: スタティック ライブラリ (.a ファイル) は、プロジェクトに追加する前に適切な Arm プロセッサ (Cortex™-A9 または Cortex-A53) 用にビルドし直しておく必要があります。C 呼び出し可能 IP に関連するヘッダー ファイル (.h) をプロジェクトに追加するには、次の手順に従います。
  1. [Project Explorer] ビューでプロジェクト名または project.sdx ファイルを右クリックし、[Properties] をクリックします。
  2. [C/C++ Build] > [Settings] > [SDS++ Linker] > [Libraries] をクリックします。
  3. -l ライブラリ リストに <libname_without_leading_lib_text_characters> を追加します。
  4. -L ライブラリ検索パスに <libname.a> オブジェクト ファイルを含むディレクトリを追加します。
  5. [Apply] をクリックします。
  6. [OK] をクリックします。
  7. C 呼び出し可能 IP のヘッダー ファイル (.h/.hpp) がプロジェクト ソース ツリーに含まれていることを確認します。
  8. プロジェクトをビルドします。
C 呼び出し可能 IP ライブラリを作成および使用する詳細は、C 呼び出し可能な IP ライブラリを参照してください。

ハードウェア アクセラレーション用の関数の選択

最初のタスクは、ハードウェアで実行すると全体的なアプリケーション パフォーマンスが大幅に向上する、ハードウェアにインプリメントするのに適したアプリケーション コードの部分を特定することです。

アクセラレーションする関数をマークする前に、まずソフトウェアをプロファイリングする必要があります。特にハードウェア、CPU、およびメモリ間でデータをストリーミングして計算と通信をオーバーラップさせることができる場合は、外部制御ロジックが限られた演算負荷の高い自己完結型の関数から開始することをお勧めします。SDSoC 環境インストールに含まれるプラットフォームの 1 つにアプリケーションをビルドして実行すると、Arm プロセッサの演算負荷の高い関数を特定できます。

SDSoC 環境に含まれる各プラットフォームにはビルド済みの SD カード イメージが含まれ、ハードウェア プラットフォームにアクセラレーション用に選択された関数がない場合は、この SD カード イメージからアプリケーション コードをブートおよび実行できます。この方法でアプリケーションを実行すると、元のアプリケーション コードをプロファイルして、どれをアクセラレーションするかを特定できます。

アプリケーションのプロファイルについては、プロファイリングおよび最適化を参照してください。詳細は、『SDSoC 環境プロファイリングおよび最適化ガイド』 (UG1235) も参照してください。

ハードウェアに移動する関数を指定したら、ウィンドウの [Add Hardware Functions] から関数を選択できます。

ヒント: 編集エリアにウィンドウが開いていない場合は、[Project Explorer] ビューから <project>.sdx ファイルをダブルクリックするか、プロジェクトを右クリックして [Add Hardware Function] をクリックすると開くことができます。

プロジェクト ウィンドウの [Hardware Functions] ボタン をクリックして、プログラムに含まれている関数のリストを表示します。[Add Hardware Functions] ダイアログ ボックスが表示され、デフォルトで main 関数のコールグラフの関数リストから 1 つまたは複数の関数が選択できます。

図: [Add Hardware Functions] ダイアログ ボックス

[Add Hardware Functions] ダイアログ ボックスでハードウェア アクセラレーション用の関数を選択して [OK] をクリックします。

関数のリストは、プロジェクト ウィンドウの [Options] パネルで定義されるように [Root function] から始まり、デフォルトでは main に設定されています。[Root function] は、[Browse] () をクリックし、別のルートを選択すると変更できます。

関数は、次の図に示すように [SDx Application Project Setttings] の [Hardware Functions] に表示されます。

図: [Hardware Function] パネル

ヒント: [Add Hardware Function] ダイアログ ボックスにあるはずの関数が見当たらない場合、[Project Explorer] ビューでそのソース ファイルを見つけ、ソースのアウトラインを展開し、関数を右クリックして [Toggle HW/SW] をクリックします。

CPU で実行するために最適化されている関数をプログラマブル ロジックに移動するときは、通常コードを変更して全体的なパフォーマンスを改善する必要があります。詳細は、『SDSoC 環境プログラマ ガイド』 (UG1278) の「ハードウェア関数のプログラム」セクションを参照してください。

xfOpenCV ライブラリを使用するアクセラレータの場合は、[Project Explorer] ビューでプロジェクト内の関連するヘッダー ファイルを右クリックして [Toggle Hardware] をクリックします。詳細は、ザイリンクス OpenCV ユーザー ガイド を参照してください。

クロック周波数の選択

ハードウェア関数を選択したら、その関数を実行するためのクロック周波数またはデータ モーション ネットワーク クロックを選択する必要があることがあります。

各プラットフォームでは 1 つまたは複数のクロック ソースがサポートされており、クロック ソースはSDSoC 環境プラットフォーム開発ガイド で説明されるように、プラットフォーム開発者により定義されます。ハードウェア関数のクロック周波数を設定すると、ハードウェア関数ロジックのクロック設定と関連するデータ ムーバーも指定されます。データ モーション ネットワークのクロック周波数を設定すると、axi_lite 制御バスに使用されるクロックも指定されます。デフォルトでは、データ モーション ネットワークとシステム生成中に生成されたハードウェア アクセラレータはクロックを共有します。データ モーション ネットワークのクロックとハードウェア関数のクロックは、SDx IDE またはコマンドラインから選択できます。

使用可能なプラットフォーム クロックは、[SDx Application Project Settings][General] オプションで [Platform] リンクをクリックすると表示できます。これには、使用可能なクロック周波数を含めたプラットフォームの詳細が表示されます。

図: SDx IDE - [General]

重要: 選択したクロックが高速な場合は、ハードウェア システムでインプリメントできないものもあるので注意してください。この問題が発生した場合は、クロック周波数を削減します。

関数のクロックは、[SDx Application Project Settings][Hardware Functions] に表示されます。

次の図の madd のように、リストから 1 つの関数を選択し、[Clock Frequency] 列をクリックして、プルダウン メニューからクロック周波数を選択します。

図: 関数のクロック周波数の選択

データ モーション クロック周波数は、[SDx Application Project Settings][Options] パネルの [Data motion network clock frequency] プルダウン メニューから指定できます。[Data motion network clock frequency] メニューにプラットフォームで使用可能なクロックがリストされます。

図: データ モーション ネットワーク クロック周波数

コマンド ライン オプション

次の例のように、クロック周波数はコマンド ラインでハードウェア アクセラレータかデータ モーション ネットワークに設定できます。

コマンド ラインから関数のクロック周波数を設定するには、クロック ID (clkid) を使用します。

$ sds++ -c mmult.cpp -o mmult.o -sds-pf zcu102 -sds-hw mmult mmult.cpp -clkid 1 -sds-end
C 呼び出し可能 IP ライブラリでハードウェア関数のクロック周波数を設定するには、-ac オプションを使用します。
$ sds++ -lmyIpLib -ac myAc:3 -o main.elf main.o
データ モーション クロック周波数を選択するには、コマンドラインで -dmclkid オプションを使用します。次に例を示します。
$ sds++ -sds-pf zcu102 -dmclkid 1

次のコマンドを使用すると、プラットフォームに使用可能なクロックを確認して、クロック ID を決定できます。

$ sds++ -sds-pf-info <platform_name>

ZCU102 プラットフォームの例として、sds++ -sds-pf-info zcu102 コマンドを実行すると、次のように表示されます。クロック ID およびその周波数が宣言されたシステム クロックごとに表示されます。使用可能なシステム コンフィギュレーションおよびシステム ポート インターフェイスのリストも表示されます。

Platform Information
====================
Name: zcu102

Device
------
 Architecture: zynquplus
       Device: xczu9eg
      Package: ffvb1156
  Speed grade: -2

System Clocks
-------------
  Clock ID   Frequency
 ----------|------------
            1199.880127
         0    74.992500
         1    99.990000
         2   149.985000
         3   199.980000
         4   299.970000
         5   399.960000
         6   599.940000

Platform:    zcu102 (<SDx_Install_Dir>/platforms/zcu102)

Description: 
A basic platform targeting the ZCU102 evaluation board, which includes
4GB of DDR4 for the Processing System, 512MB of DDR4 for the Programmable
Logic, 2x64MB Quad-SPI Flash and an SDIO card interface. More information
at https://www.xilinx.com/products/boards-and-kits/ek-u1-zcu102-g.html
    
Available system configurations:
  a53_linux (a53_linux)
  a53_standalone (a53_standalone)
  r5_standalone (r5_standalone)
 
System Ports
 
Use the system port name in a sysport pragma, for example 
#pragma SDS data sysport(parameter_name:system_port_name)
 
System Port Name (Vivado BD instance name, Vivado BD port name)
ps_e_S_AXI_HPC0_FPD (ps_e, S_AXI_HPC0_FPD)
ps_e_S_AXI_HPC1_FPD (ps_e, S_AXI_HPC1_FPD)
ps_e_S_AXI_HP0_FPD (ps_e, S_AXI_HP0_FPD)
ps_e_S_AXI_HP1_FPD (ps_e, S_AXI_HP1_FPD)
ps_e_S_AXI_HP2_FPD (ps_e, S_AXI_HP2_FPD)
ps_e_S_AXI_HP3_FPD (ps_e, S_AXI_HP3_FPD)

SDSoC プロジェクトのビルド

ソース コードを追加して、アクセラレーションする関数を特定し、アクセラレータとデータ ムーバー クロック周波数を選択したら、ハードウェア ターゲットまたはエミュレーション ターゲット用にビルドできます。

ハードウェア ターゲットの場合は、ハードウェア ターゲットの指定 を参照してください。

エミュレーション ターゲットの場合は、システム エミュレーションのターゲット指定 を参照してください。

次のセクションでは、ハードウェア プロジェクト ビルドをターゲットにする SDx プロジェクトについて説明します。

ハードウェア ターゲットの指定

  1. [Build] ボタン () をクリックするか、[Project Explorer] ビューでプロジェクト名を右クリックして [Build Project] をクリックします。
  2. [Assistant] ビューで [Debug [Hardware]] または [Release [Hardware]] を右クリックしてビルドを開始します。
  3. [Debug [Hardware]] を右クリックし、[Build] をクリックします。

    図: [Assistant] ビュー

    オンにしたプロジェクト オプションでビットストリームおよびブータブル SD カード イメージが生成されます。ビルド プロセスでは、コンパイル ログ ファイルとデータ モーション ネットワーク レポートも生成され、[Assistant] ビューからアクセスできます。

  4. ビルド プロセスの結果、ターゲット ボードでブートおよび実行するための SD カード ファイルが生成されます。[Assistant] ビューで生成されたファイルを右クリックして [SD Card Image] > [Open] > [Open in File Browser] をクリックすると、ファイルを表示できます。

    図: ビルドの結果

  5. SDx では、コンパイル プロセスの詳細なレポートが作成され、Debug/_sds/reports ディレクトリに保存されます。これらのファイルには、[Project Explorer] ビューまたは [Assistant] ビューからアクセスできます。次の図に、[Project Explorer] ビューで reports ディレクトリを展開し、sds.log コンパイル ログ ファイルを表示したところを示します。

    図: コンパイル ログ

アクセラレータを作成するために IDE で実行される同等のシステム コンパイラ コマンドを示すログ ファイルの抜粋が、行列乗算および行列加算例の一部として追加されています (次を参照)。-sds-pf オプションでプラットフォームが指定され、-sds-hw-sds-end ハードウェア関数オプションの間に各アクセラレーション関数の関数名とその定義ソース ファイルが指定されています。アクセラレータのクロック ID も、-clkid オプションを設定することで、ハードウェア関数オプション内で選択されています。

madd() 関数のコンパイル:

sds++ -Wall -O0 -g -I../src -c -fmessage-length=0 -MTsrc/madd.o\
 -MMD -MP -MFsrc/madd.d -MTsrc/madd.o -o src/madd.o ../src/madd.cpp\
 -sds-hw mmult mmult.cpp  -clkid 1 -sds-end\
 -sds-hw madd madd.cpp  -clkid 1 -sds-end\
 -sds-sys-config a53_linux -sds-proc a53_linux -sds-pf zcu102

main() 関数のコンパイル:

sds++ -Wall -O0 -g -I ../src -c -fmessage-length=0 -MTsrc/main.o\
 -MMD -MP -MFsrc/main.d -MTsrc/main.o -o src/main.o ../src/main.cpp\
 -sds-hw mmult mmult.cpp  -clkid 1 -sds-end\
 -sds-hw madd madd.cpp  -clkid 1 -sds-end\
 -sds-sys-config a53_linux -sds-proc a53_linux -sds-pf zcu102

mmult() 関数のコンパイル:

sds++ -Wall -O0 -g -I../src -c -fmessage-length=0 -MTsrc/mmult.o\ 
 -MMD -MP -MFsrc/mmult.d -MTsrc/mmult.o -o src/mmult.o ../src/mmult.cpp\ 
 -sds-hw mmult mmult.cpp -clkid 1 -sds-end\ 
 -sds-hw madd madd.cpp -clkid 1 -sds-end\ 
 -sds-sys-config a53_linux -sds-proc a53_linux -sds-pf zcu102

コンパイルされたオブジェクト ファイルは、この後 SDx ツールでリンクされ、行列乗算と行列加算の例 (アプリケーション コードとアクセラレーション関数を開始するコードを含む) に対して 1 つの実行ファイルが生成されます。この実行ファイルは、-sds-sys-config および -sds-proc オプションで指定されるように、Linux をターゲットにします。

オブジェクト ファイルをリンクして実行ファイル (ELF) と SD カード用のブート ファイルを生成します。

sds++ --remote_ip_cache /tmp/sdx_workspace/ip_cache -o project_one.elf\
 ./src/madd.o ./src/main.o ./src/mmult.o\
 -dmclkid 1 -sds-sys-config a53_linux\
 -sds-proc a53_linux -sds-pf zcu102

XP オプション: Vivado ビルドを制御するアドバンス機能

sds++ システム コンパイラは自動的に Vivado® デザイン ツールを起動してハードウェア システムをインプリメントしますが、Vivado ツール オプションに精通したユーザーの場合は、コマンド ラインで引数を渡して、フローをさらにカスタマイズすることもできます。sds++ システム コンパイラの -xp オプションを使用すると、parameter-value または property-value のペアを Vivado に渡してアクセラレータのインプリメンテーションを指定できます。

次は、Vivado 合成オプションを指定する例です。

sds++ <command_options> -xp "vivado_prop:run.synth_1.STEPS.SYNTH_DESIGN.TCL.POST=<full path to postsynth.tcl>"

この例では、-xp オプションで Vivado Tcl ファイルの合成後の実行を指定しています。-xp オプションは、1 つのシステム コンパイラ呼び出しに対してのみ指定できます。

ただし、合成およびインプリメンテーション ストラテジでは、sds++ コマンドが直接 -impl-strategy および -synth-strategy オプションを使用するので、-xp オプションは使用されません。

次に例を示します。

sds++ <command_options> -synth-strategy <strategy_name>
sds++ <command_options> -impl-strategy <strategy_name>
sds++ <command_options> -synth-strategy <strategy_name> -impl-strategy <strategy_name>

IDE を使用する場合、-xp オプションは SDS++ リンカー設定 に示すように、[Miscellaneous] オプションの下のビルド コンフィギュレーションに追加できます。

詳細は、次の資料を参照してください。

システム エミュレーションのターゲット指定

ハードウェア関数を特定したら、ロジックをコンパイルし、システム全体 (PS および PL) をザイリンクス ベース プラットフォーム (zc702、zc706、zcu102、zcu104、zcu106 など) 上でエミュレーションを使用して検証します。システム エミュレーションを使用すると、ビットストリームなしで、全ビットストリーム コンパイルと同レベルの精度でシステムを検証およびデバッグできます。これにより、デザイン イテレーション時間が削減され、デバッグ サイクルをすばやく繰り返すことができます。

システム エミュレーションを有効にするには、編集エリアで [Target] フィールドの [Emulation] をオンにします。

図: エミュレーション ターゲット

システム エミュレーションには、[Debug] モードと [Optimized] モードがあります。これらのモードは、[Emulation model] で指定します。

[Debug]
RTL 生成およびハードウェア関数を含む Vivado IP インテグレーター ブロック デザインからシステムを構築し、デザインのビヘイビアー シミュレーションを実行して、結果を解析しやすいように波形ビューアーに表示します。コードに論理的な問題がある場合は、このオプションを使用してください。
[Optimized]
バッチ モードでビヘイビアー シミュレーションを実行し、波形データなしの結果を返します。[Optimized] の方が速いのですが、[Debug] モードよりも表示される情報は少なくなります。

PL ハードウェア エミュレーションから波形データを取り込んで確認およびデバッグするには、[Debug] プルダウン メニュー オプションを選択します。ハードウェア デバッグ情報を取り込まずに、エミュレーションを高速に実行するには、[Optimized] オプションを選択します。

エミュレーション オプションを指定したら、[Build] () コマンドをクリックしてアクティブなビルド コンフィギュレーションをコンパイルします。[Build] コマンドにより、システム コンパイラが起動され、アプリケーション プロジェクトが構築されます。ビルド コンフィギュレーションには、次の 2 つのコンフィギュレーションがあります。

[Debug]
ソフトウェア デバッグで使用されるプロジェクトがコンパイルされます。コンパイラからはデバッガーで使用される追加情報が生成されるので、デバッグがやりやすくなり、コードをステップ スルーできるようになります。
[Release]
コンパイラでコード サイズとアプリケーションの実行時間の削減が試みられます。これにより、デバッグ コードが取り除かれるので、このモードではデバッグはできません。
ヒント: [Debug] と [Release] モードは、ソフトウェア コードがコンパイルされる方法を指定するもので、ハードウェア関数のコンパイルおよびインプリメンテーションには影響しません。

[Assistant] ビューで [Debug[Emulation]] > [Build] をクリックすると、ビルドを開始できます。

システム エミュレーションが完了すると、次の図に示すように、[Assistant] ビューにデータ モーション ネットワーク レポート ([Data Motion Network Report]) とコンパイル ログ ([Compilation Log]) がリストされます。

図: [Assistant] ビューの表示

ハードウェア エミュレーションのビルド プロセスには、アプリケーション コード、ハードウェア関数のサイズ、選択したオプションによって時間がかかることがあります。ハードウェア関数をコンパイルするため、ツール スタックには SDxVivado HLS、および Vivado シミュレータが含まれます。

システムがエミュレーション用にコンパイルされたら、[Xilinx] > [Start/Stop Emulator] メニュー コマンドまたはコマンド ラインから sdsoc_emulator を使用してシステム エミュレーターを起動できます。

[Start/Stop Emulator] ダイアログ ボックスでエミュレーション モードに [Debug] を選択すると、波形の有無を指定してエミュレーションを実行できます。エミュレーション モードを [Optimized] に設定すると、[Show waveforms] チェック ボックスは無効になり、変更できません。

図: [Start/Stop Emulator] ダイアログ ボックス

[Show Waveform] をオフにすると、ソース コードの print 文の結果も含め、すべてのシステム メッセージが [Emulation Console] ビューに表示されます。これらの中には、ハードウェア関数に送受信される値が含まれることがあるほか、アプリケーションが問題なく実行されたことを示すメッセージが表示され、PL で実行されるソース コードと PS で実行されるコンパイル済みハードウェア関数が機能的に正しいことを確認できます。

[Show Waveform] オプションをオンにすると、コンソール ウィンドウと同じ機能が使用できるようになるほか、PL に含まれる iP のビヘイビアー シミュレーションが XSim ツールで実行されて波形ウィンドウに表示されます。波形ウィンドウには、時間の経過に応じたハードウェア関数の信号値が表示されます。

[Show Waveform] をオンにする場合、エミュレーションの開始前に信号を手動で波形ウィンドウに追加しておく必要があります。[Scopes] ウィンドウを使用してデザイン階層を確認し、[Object] ウィンドウで監視する信号を選択し、右クリックでその信号を波形ウィンドウに追加します。[Run] > [Run All] をクリックし、波形ウィンドウのアップデートを開始します。Vivado シミュレータの波形ウィンドウの詳細は、『Vivado Design Suite ユーザー ガイド: ロジック シミュレーション』 (UG900) を参照してください。

注記: RTL 波形を表示して実行すると、実行時間は長くなりますが、ハードウェア関数の動作を詳細に解析できます。

システム エミュレーションを開始するには、[Project Explorer] ビューでアクティブ プロジェクトを選択し、右クリックで [Run As] > [Launch on Emulator] メニュー コマンド、または [Debug As] > [Launch on Emulator] メニュー コマンドをクリックします。エミュレーターを [Debug As] メニューから起動すると、パースペクティブが [Debug] パースペクティブに変更され、ウィンドウおよびビューがプロジェクトのデバッグに適した配置になります。パースペクティブの変更に関する詳細は、SDx GUI の理解を参照してください。

コンソール ウィンドウにプログラム出力が表示されます。[Show Waveform] オプションを選択した場合は、RTL 波形のハードウェア関数にも該当する反応が表示されます。コードの実行中の一時停止でも、ボードで実行される FPGA と同様、RTL-PL 波形は続けて実行されてアップデートされます。

エミュレーションは [Xilinx] > [Start/Stop Emulator][Stop] をクリックすると停止できます。

次の図に、クイック エミュレーション (QEMU) コンソールを使用したシステム エミュレーションのセッションを示します。

図: QEMU コンソール

波形オプションを選択して [Run All] をクリックすると、次の図に示すように PL 波形が表示されます。

図: 波形ウィンドウ

[Assistant] ビューで [Debug] > [Run] > [Launch on Emulator (SDx Application Debugger)] を右クリックします。

エミュレーションの詳細は、 SDSoC 環境デバッグ ガイド を参照してください。

ヒント: エミュレーションのデモのサンプル プロジェクトを生成するには、[Emulation Example] テンプレートを使用して新しい SDx プロジェクトを作成します。プロジェクトの README.txt ファイルには、SDx GUI およびコマンド ラインの両方でエミュレーションを実行する手順が含まれています。

SDSoC ライブラリのビルド

ライブラリを使用すると、1 つまたは複数のアクセラレーション関数を共有ファイルまたはスタティックにリンクされたファイルに含めることができます。ライブラリ プロジェクトを作成するには、SDx IDE メニューから [File] > [New] > [SDx Library Project] をクリックします。共有ライブラリ フローでは、SDx またはコマンド ラインで SDSoC アプリケーションにリンク可能なライブラリ ファイルが生成されます。SDSoC ライブラリ フローは、gcc/g++ で使用するためにライブラリをエクスポートするのに使用します。このライブラリを使用すると、ハードウェアでアクセラレーションされた関数を呼び出すことができます。C 呼び出し可能 IP ライブラリ フローは、Vivado でパッケージされた IP ブロックを SDSoC アプリケーションにリンクするために使用します (C 呼び出し可能な IP ライブラリ を参照)。

図: ライブラリ タイプの指定

共有ライブラリ

共有ライブラリには行列共有ライブラリ テンプレートが提供されており、SDx IDE で乗算および加算の例が提供されています。このライブラリでは、共有ライブラリに含まれるエントリ ポイントが異なる 3 つの関数を、ソフトウェア アプリケーションから呼び出す方法を示します。

SDx IDE で処理されたアプリケーション ビルドの結果を実行する際は、ライブラリ プロジェクトの sd_card ディレクトリに含まれる BOOT.BIN ファイルを使用してボードをブートする必要があります。このファイルに、アクセラレーション ハードウェア関数が含まれます。

コマンド ラインを使用する場合は、例は <SDx_Install_Dir>/samples/libmatrix ディレクトリに含まれます。libmatrix 例には、スタティック ライブラリおよび共有ライブラリのビルド方法と、ライブラリのアプリケーションでの使用方法を示す makefile が含まれます。

共有ライブラリのビルドの詳細は、『SDSoC 環境プログラマ ガイド』 (UG1278) を参照してください。