C 呼び出し可能な IP ライブラリ

このセクションでは、VHDL や Verilog などのハードウェア記述言語で記述された IP ブロックの C 呼び出し可能 IP ライブラリを作成する方法を説明します。ユーザー アプリケーションは、SDSoC™ システム コンパイラを使用してこれらのライブラリとスタティックにリンクできます。IP ブロックは、生成されたハードウェア システムにインスタンシエートされます。SDx™ IDE およびコマンド ラインを使用する方法を示します。

図: C 呼び出し可能ライブラリの作成および使用

SDSoC アプリケーションでは、C 呼び出し可能な IP ライブラリを使用して、VHDL または Verilog などのハードウェア記述言語、あるいは Vivado® HLS などの高位合成 (HLS) ツールを使用して記述されたパッケージ IP にアクセスできます。ハードウェア特定の最適化またはマイクロアーキテクチャは、HDL を使用した方がインプリメントしやすく、C 呼び出し可能なライブラリ内に含めて供給できることもあります。

C 呼び出し可能な IP ライブラリを使用すると、ソフトウェア ライブラリのデザイン再利用の柔軟性が上がり、最適化されたハードウェア IP ブロックのパフォーマンスも上がります。ボトムアップ アプローチを使用すると、個別の IP ブロックを C 呼び出し可能なライブラリに含めるよりも前に設計、インプリメント、およびテストして、広い範囲で使用できるようにできます。ハードウェア アクセラレーション関数のライブラリにより、ハードウェアおよびソフトウェア開発チームは、詳細な下位レベルのインプリメンテーションを意識せずに、機能的なインターフェイスを認識できます。

C 呼び出し可能な IP ライブラリの作成

SDx™ をインストールすると、<SDx_Install_Dir>/samples/rtl ディレクトリに C 呼び出し可能 IP のサンプル デザインが含まれます。これらの例は、シングル ファンクションおよびマルチファンクション アクセラレータ ライブラリを示しており、関数引数がレジスタ、メモリ リファレンス、または AXI ストリーム (axilite_arraycopyaximm_arraycopyaxis_arraycopy) として渡されます。マルチファンクションの例 (mfa_firmfa_scalar128_nonemfa_scalar_axi) は、複数のソフトウェア エントリ ポイントを含む 1 つのアクセラレータを示しています。

C 呼び出し可能 IP ライブラリを作成するには、sdx_pack ユーティリティからの基本サポートを使用して、SDx IDE のライブラリ プロジェクト フローを使用します。sdx_pack のコマンド ライン引数の詳細は、『SDx コマンドおよびユーティリティ リファレンス ガイド』 (UG1279) を参照してください。Vivado でパッケージされた IP 内のインターフェイスは、sdx_pack でハードウェア インターフェイスを含む IP 設定をクエリすると調べることができます。SDx IDE はこの機能を使用して、C 呼び出し可能な IP ライブラリに変換される IP に関連したインターフェイスおよびプルダウン選択肢を使用してメニュー選択をします。

ZCU102 プラットフォームの axis_arraycopy 例を使用して C 呼び出し可能な IP ライブラリを作成する手順は、次のとおりです。axis_arraycopy には、Vivado パッケージの IP と libarraycopy.a ライブラリを作成するのに使用されたファイルが含まれます。arraycopy.hpp ヘッダー ファイルには、パッケージされた IP に含まれるハードウェア関数に関連したソフトウェア関数宣言が含まれます。component.xml には、SDx IDE とライブラリをビルドするために連動する sdx_pack ツールで使用されるメタデータが含まれます。

SDx IDE で C 呼び出し可能なライブラリを作成するには、次の手順に従います。

  1. C 呼び出し可能 IP ライブラリ プロジェクトを作成します。
    • ライブラリはそれぞれ特定の device_familycpu_type、および OS_type タプル用に作成されます。
  2. <SDx_Install_Dir>/samples/rtl ディレクトリからソース ファイルをインポートします。
    • ヘッダーファイルとパッケージされた IP の両方をインポートします。
  3. C 呼び出し可能な IP ライブラリをビルドするために使用する入力ヘッダー ファイル (.hpp) と IP メタデータ ファイル (component.xml) を特定します。
  4. IP をカスタマイズする方法を示します。
  5. C 呼び出し可能な IP ライブラリの各関数の引数をハードウェア IP にマップする方法を指定します。

次に、SDx ダイアログ ボックスを完了する方法を表で示します。

  • 各表の一番上の行には、各タスクを開始する SDx IDE メニューを表示します。
  • [ダイアログ ボックス] 列には、その後に表示されるダイアログ ボックスの名前をリストします。
  • [選択] および [動作] 列には、そのタスクを終了するために設定する必要のあるダイアログ ボックスの項目を示します。

SDx ライブラリ プロジェクト

SDx IDE を起動し、ワークスペース (例: sdx_workspace) を使用して、ライブラリ プロジェクトを作成します ([File] > [New] > [SDx Library Project])。

このプロジェクト名がライブラリ名に使用されます。ライブラリ名は lib<project_name>.a のように lib で始まり、.a で終了します。

表 1. SDx ライブラリ プロジェクト
ダイアログ ボックス 選択またはフィールド名 動作
Project Type Application [Next] をクリックします。
Create a New SDx Project Project name: arraycopy
Use default location オン
  [Next] をクリックします。
Accelerated Library Type Type: C-Callable Library
Platform Name zcu102
  [Next] をクリックします。
System Configuration System configuration: A53_Linux
Runtime: C/C++
Domain: a53_linux
(プリセット) CPU: cortex-a53
(プリセット) OS: linux
  Linux Root File System: オフのまま。
    [Next] をクリックします。
Templates Empty Application [OK] をクリックします。

[Import Source] ダイアログ ボックスのオプション

次の表に、ソースのインポートのメニュー項目を示します。

表 2. [Import Source] ダイアログ ボックスのオプション
ダイアログ ボックス 選択またはフィールド名 動作
File system From directory: samples/rtlaxis_arraycopy ディレクトリを参照します。
[OK] をクリックします。
Files: src/arraycopy.hpp オン
Directory: ip オン
Into folder: arraycopy/src
[OK] をクリックします。

IP カスタマイズの追加

[IP Customization] ウィンドウで [Add IP Customizations] (h の付いたファイル アイコン) をクリックします。次の図および表に、IP カスタマイズの追加方法を示します。

表 3. IP カスタマイズの追加
ダイアログ ボックス 選択またはフィールド名 動作
Add IP Customizations Header File: [Select] をクリックします。
Files: arraycopy.hpp を選択します。
Qualifier: src/src/arraycopy.hpp を選択します。
[OK] をクリックします。
IP Path: [Select] をクリックします。
Files: component.xml を選択します。
Qualifier: src/ip/component.xml を選択します。
[OK] をクリックします。
Accelerator control: Protocol: ap_ctrl_hs
Port:s_axi_lite
Offset:0
Primary Clock: ap_clk 10.0
Derived Clock: 変更なし
IP Parameters 変更なし
[OK] をクリックします。

関数マップの追加

この axis_arraycopy サンプルでは、提供されている samples/rtl/axis_arraycopy/src/Makefile の内容を使用してダイアログ ボックスのオプションが指定されます。

component.xml およびその IP ブロックに関連付けられた register_map.txt ファイル (提供されている場合) もクエリ検索されて、その関数引数をハードウェアにマップする方法を取得できます。

[IP Customization] ウィンドウで [Add Function Mapping] (+ アイコン) をクリックします。

表 4. 関数マップの追加
ダイアログ ボックス 選択またはフィールド名 動作
Add Function Mapping Function name: 右側の + アイコンをクリックします。
arraycopy を選択します。
[OK] をクリックします。
AXILite インターフェイスにマップされる引数および関数戻り値 このインターフェイス タイプの表の上の [Add Function Argument Map] (+ アイコン) をクリックします。
Argument (フィールド内をクリックしてプルダウン メニューを表示) M
AXILite Interface (フィールド内をクリックしてプルダウン メニューを表示) s_axi_lite
Direction (フィールド内をクリックしてプルダウン メニューを表示) IN
Register Info (フィールド内をクリックしてプルダウン メニューを表示) M、オフセット 16
AXIS インターフェイスにマップされる配列引数 このインターフェイス タイプの表の上の [Add Function Argument Map] (+ アイコン) をクリックします。
Argument (フィールド内をクリックしてプルダウン メニューを表示) A
AXIS Interface (フィールド内をクリックしてプルダウン メニューを表示) A
Direction (フィールド内をクリックしてプルダウン メニューを表示) IN
AXIS インターフェイスへマップされるる配列引数 このインターフェイス タイプの表の上の [Add Function Argument Map] (+ アイコン) をクリックします。
Argument (フィールド内をクリックしてプルダウン メニューを表示) B
AXIS Interface (フィールド内をクリックしてプルダウン メニューを表示) B
Direction (フィールド内をクリックしてプルダウン メニューを表示) OUT
[Add Function Mapping] ダイアログ ボックスの設定を終了 [OK] をクリックします。

C 呼び出し可能 IP プロジェクトのビルド

プロジェクトをビルドするため、C 呼び出し可能な IP ライブラリがアプリケーションのビルド出力ディレクトリ (この例の場合、Release ディレクトリ) に lib<application>.a (この例の場合 libarraycopy.a) という名前で生成されます。

C 呼び出し可能な IP ライブラリは、SDx IDE だけでなく、コマンド ラインで sdx_pack ツールを直接起動しても作成できます。axis_arraycopy サンプル デザインに対して SDx IDE で実行した動作と同等の sdx_pack コマンドは、次のとおりです。

sdx_pack -header arraycopy.hpp -lib libarraycopy.a \
-func arraycopy -map A=A:in -map B=B:out -map M=s_axi_lite:in:16 -func-end \
-ip ../ip/component.xml -control ap_ctrl_hs=s_axi_lite:0 \
-primary-clk ap_clk=10.0 -target-family zynquplus \
-target-cpu cortex-a53 -target-os linux \
-verbose
注記: C 呼び出し可能な関数とその引数マップは、sdx_pack 呼び出しの -func および -func-end オプションの間にリストされます。

マルチファンクション アクセラレータ ライブラリ

axis_arraycopy サンプルは、1 つのアクセラレータ関数を含むライブラリです。その他のサンプル、特に mfa_ で始まるサンプルは、マルチファンクション アクセラレータ (MFA) ライブラリで、複数の関数が 1 つの IP ブロックにマップされています。次の場合、mfa_scalar_128_none サンプルの sdx_pack コマンドで libmfa.a が生成されます。

C 呼び出し可能な IP ライブラリには、次のコード例に示すように 8 つの関数が含まれます。アクセラレータ ライブラリは制御プロトコル none を使用しているので、ユーザーが明示的に IP を制御することを意味しています。この MFA サンプルでは、AXI4-Lite インターフェイスにマップする 128 ビットのスカラー関数引数のほか、マスター AXI4-Stream インターフェイスにマップする 128 ビットの配列引数も使用しています。

sdx_pack -header mfa.hpp -I inc -lib libmfa.a \
-func mfa_reset -map inst=s_axi_AXILiteS:in:0x40 -func-end \
-func mfa_init -map inA=inA:in -map inst=s_axi_AXILiteS:in:0x40 -func-end \
-func mfa_copy -map outB=outB:out -map inst=s_axi_AXILiteS:in:0x40 -func-end \
-func mfa_sum -map result=axi_AXILiteS:out:0x2c -map inst=s_axi_AXILiteS:in:0x40 -func-end \
-func mfa_status -map return=axi_AXILiteS:out:0x10 -map inst=s_axi_AXILiteS:in:0x40 -func-end \
-func mfa_status2 -map status=s_axi_AXILiteS:out:0x10 -map inst=s_axi_AXILiteS:in:0x40 -func-end \
-func mfa_result -map result=s_axi_AXILiteS:out:0x2c -func-end \
-func mfa_stop -map inst=s_axi_AXILiteS:in:0x40 -func-end \
-ip ../ip/component.xml -control none \
-add-ip-repo ../dummy_ip  \
-add-ip-repo ../dummy_ip_repo \
-primary-clk ap_clk=10.0 \
-target-family zynquplus -target-cpu cortex-a53 -target-os linux -verbose

C 呼び出し可能なライブラリの MIFA タイプのもう 1 つの例は、mfa_scalar_axi アクセラレータです。このアクセラレータ ライブラリでは、ap_ctrl_hs 制御プロトコルを使用し、AXI4-Lite インターフェイスにマップするスカラー関数引数のほか、マスター AXI4 インターフェイスにマップする配列引数を使用しています。

sdx_pack -header mfa.hpp -I inc -lib libmfa.a \
	-func mfa_reset -map status=s_axi_AXILiteS:out:0x20 -map inst=s_axi_AXILiteS:in:0x34 -func-end \
	-func mfa_init -map inA=s_axi_AXILiteS:in:0x10,m_axi_inA:in -map status=s_axi_AXILiteS:out:0x20 \
          -map inst=s_axi_AXILiteS:in:0x34 -func-end \
	-func mfa_copy -map outB=s_axi_AXILiteS:in:0x18,m_axi_outB:out -map status=s_axi_AXILiteS:out:0x20 \
          -map inst=s_axi_AXILiteS:in:0x34 -func-end \
	-func mfa_sum -map result=s_axi_AXILiteS:out:0x28 -map status=s_axi_AXILiteS:out:0x20 \
          -map inst=s_axi_AXILiteS:in:0x34 -func-end \
	-func mfa_status -map status=s_axi_AXILiteS:out:0x20 -func-end \
	-func mfa_stop -map status=s_axi_AXILiteS:out:0x20 -map inst=s_axi_AXILiteS:in:0x34 -func-end \
	-ip ../ip/component.xml -control AXI=s_axi_AXILiteS:0x0 \
    -primary-clk ap_clk=10.0 \
	-target-family zynquplus -target-cpu cortex-a53 -target-os linux -verbose

mfa_scalar_axi サンプルで使用される AXI4-Lite 制御プロトコル信号のビットレベルの定義を示すレジスタ マップについては、mfa_scalar_axi/ip/register_map.txt ファイルと次の抜粋を参照してください。通常、IP レジスタ マップ情報は IP 開発者から提供されます。

// ==============================================================
// File generated by Vivado(TM) HLS - High-Level Synthesis from C, C++ and SystemC
// Version: 2018.3
// Copyright (C) 1986-2018 Xilinx, Inc. All Rights Reserved.
// 
// ==============================================================

// AXILiteS
// 0x00 : Control signals
//        bit 0  - ap_start (Read/Write/COH)
//        bit 1  - ap_done (Read/COR)
//        bit 2  - ap_idle (Read)
//        bit 3  - ap_ready (Read)
//        bit 7  - auto_restart (Read/Write)
//        others - reserved
// 0x04 : Global Interrupt Enable Register
//        bit 0  - Global Interrupt Enable (Read/Write)
//        others - reserved
// 0x08 : IP Interrupt Enable Register (Read/Write)
//        bit 0  - Channel 0 (ap_done)
//        bit 1  - Channel 1 (ap_ready)
//        others - reserved
// 0x0c : IP Interrupt Status Register (Read/TOW)
//        bit 0  - Channel 0 (ap_done)
//        bit 1  - Channel 1 (ap_ready)
//        others - reserved
// 0x10 : Data signal of inA_offset
//        bit 31~0 - inA_offset[31:0] (Read/Write)
// 0x14 : reserved
// 0x18 : Data signal of outB_offset
//        bit 31~0 - outB_offset[31:0] (Read/Write)
// 0x1c : reserved
// 0x20 : Data signal of status
//        bit 31~0 - status[31:0] (Read)
// 0x24 : Control signal of status
//        bit 0  - status_ap_vld (Read/COR)
//        others - reserved
// 0x28 : Data signal of result
//        bit 31~0 - result[31:0] (Read)
// 0x2c : Data signal of result
//        bit 31~0 - result[63:32] (Read)
// 0x30 : Control signal of result
//        bit 0  - result_ap_vld (Read/COR)
//        others - reserved
// 0x34 : Data signal of inst
//        bit 31~0 - inst[31:0] (Read/Write)
// 0x38 : reserved
// (SC = Self Clear, COR = Clear on Read, TOW = Toggle on Write, COH = Clear on Handshake)

C 呼び出し可能な IP ライブラリの mfa_fir サンプルでは、AXI4-Stream インターフェイス、24 ビット データ型を使用して、制御プロトコルを none に指定した IP パラメーターがインスタンシエートされます。

 ibfir.a: fir.hpp
	sdx_pack -header fir.hpp -lib libfir.a \
	-func fir -map X=S_AXIS_DATA:in -map Y=M_AXIS_DATA:out -func-end \
	-func fir_reload -map H=S_AXIS_RELOAD:in -func-end \
	-func fir_config -map H=S_AXIS_CONFIG:in -func-end \
	-ip ../ip/fir_compiler_v7_2/component.xml -control none \
	-param DATA_Has_TLAST="Packet_Framing" \
	-param M_DATA_Has_TREADY="true" \
	-param Coefficient_Width="8" \
	-param Data_Width="8" \
	-param Quantization="Integer_Coefficients" \
	-param Output_Rounding_Mode="Full_Precision" \
	-param Coefficient_Reload="true" \
    -param Coefficient_Structure=Non_Symmetric \
    -primary-clk aclk_intf=10.0 \
	-target-family zynquplus -target-cpu cortex-a53 -target-os linux -verbose

C 呼び出し可能な IP ライブラリの注意点

  1. TYPE *a または TYPE &a の関数引数は OUTPUT スカラーに変換されます。
  2. 配列は TYPE a[N] or TYPE a[] と宣言する必要があります。
  3. 関数戻り値型には、TYPE: TYPE* 形式のスカラーのみが使用できます。TYPE& は使用できません。
  4. C 呼び出し可能な IP ライブラリのヘッダー ファイルにはパラメーターに MACRO を使用する SDS プラグマは含めることができません。#pragma sds data copy (A[0:SIZE]) は、SIZE がマクロの場合 (この場合 #define SIZE 16 は使用できません。
  5. マルチファンクション アクセラレータ (MIFA) の関数呼び出しはオーバーラップできません。これは、ハードウェアに IP インスタンスが 1 つしかないからです。このため、MIFA 関数周辺の async プラグマはリスクが高いので、ランタイム中にオーバーラップの可能性がまったくない場合を除いてはお勧めしません。
  6. 引数サイズは、ソフトウェア宣言引数とハードウェア ポート ペア間で同じにする必要があります。<project_name>/Release/reports/sdx_pack.html レポート ファイルを使用すると、ライブラリにインプリメントされた引数サイズ、オフセット、およびバス インターフェイスを確認できます。
  7. サポートされる AXI4-Lite インターフェイスは、最上位 IP ごとに 1 つまでです。
  8. C 呼び出し可能関数の場合、ライブラリをビルドする際に sdx_pack を使用してすべてのプラグマを適用する必要があります。ライブラリのビルド後にヘッダー ファイルに追加されたプラグマは、ツールで無視されます。

sdx_pack コマンド

次に、sdx_pack コマンドの例を示します。

sdx_pack -header <header.h/pp>-ip <component.xml>
[-param <name>="value"] [configuration options]

次の表に、sdx_pack ツールの詳細を示します。

表 5. sdx_pack コマンド オプション
オプション 説明
-header header.h/.hpp

(必須)

関数プロトタイプを含むヘッダー ファイル (.h, .hpp)。sdx_pack.hpp ファイルの場合は C++ 形式のライブラリを、.hファイルの場合は C 形式のライブラリを生成します。

ライブラリごとに使用できるのは、最上位ヘッダー ファイル 1 つだけです。

最上位ヘッダー ファイルには、-I オプションを使用してその他のヘッダー ファイルを含めることができます。
-ip component.xml

(必須)

Vivado パッケージ IP へのパス。ライブラリごとに 1 つの最上位 IP のみ。最上位 IP ファイルは、-add-ip-repo オプションを使用すると、その他の IP ブロックを開始できます。
-control protocol [=port [:offset]] (必須) IP 制御プロトコル オプション:
  • ap_ctrl_hs

    AXI4-Lite 制御レジスタに基づいた自動制御プロトコルで、通常はオフセット 0x0 (例: -control ap_ctrl_hs=s_axi_AXILiteS:0)

  • none

    IP を明示的に制御するユーザー アプリケーション (例: -control none)

-func function_name -map swName= hwNAME:direction[:offset[aximm_name:direction]] -func-end (必須)

C 呼び出し可能な IP ファンクションのリストを指定します。各関数は -func および -func-end オプション間にリストされます。関数引数は -map オプションで各 IP ポートにマップされます。

この後、-map オプションが次のように使用されます。

  • AXI4-Lite インターフェイスへの Scalars マップ。
    • 入力スカラー (例: int a) を -map a=s_axi_AXILiteS:in:offset でマップ。
    • 出力スカラー (例: int *a または int &a) を -map a=s_axi_AXILiteS:out:offset でマップ。
    • 関数戻りのスカラー (戻り型はスカラーにしかできない) を -map return=s_axi_AXILiteS:out:offset でマップ。
  • AXI4AXI4-Stream、または AXI4-Lite インターフェイスへ Arrays をマップ。配列は 1 次元にする必要があります (例: int a[N] または int a[])。
    • AXI4-map a=s_axiAXILiteS:in:offset,a_hwName:direction でマップ。control=none の場合は使用不可。

      最初の部分はアドレスに、2 つ目の部分はデータ ポートにマップされます。

    • AXI4-Stream-map a=a_hwName:direction. でマップ。
    • AXI4-Lite-map a=s_axi_AXILiteS:in:offset でマップ。配列は 1 次元で定数サイズにする必要があります。
-param name="value" IP パラメーターをインスタンシエートする IP パラメーターの名前と値のペア。ペアごとに 1 つの -param オプションを使用します。
-lib libname 生成されたライブラリの名前に指定した libname を使用します。デフォルトでは lib header.a が使用されます。
-I path -header オプションで名前を付けたファイルにほかのファイルが含まれる場合、このオプションで追加で含まれたファイルへのパスを指定します。複数の -I オプションを使用できます。すべてのインクルード ファイルを 1 つのディレクトリに含めておくと、ライブラリが分配しやすくなります。
-add-ip-repo path リストされたリポジトリで見つかったすべての IP をライブラリに追加します。複数のパスを指定するには、複数の -add-ip-repo オプションを使用できます。

ザイリンクスでは、すべての必要な IP を 1 つのディレクトリに含めて、-add-ip-repo を 1 回使用することをお勧めしています。

-primary-clk clk_interface=min_clk_period プライマリ クロック インターフェイスおよびその最小クロック周期 (ps) を指定します。
-derived-clk clk_interface=multiplier:divisor 位相を揃えた派生クロック インターフェイス、およびその乗数および除数 (整数単位) を指定します。サポートされるのは 2 つの位相で揃えられたクロックのみです。
-target-family device_family IP でサポートされるターゲット デバイス ファミリ (例: zynq (デフォルト)、zynquplus)。
-target-cpu cpu_type ターゲット CPU の指定:
  • cortex-a9 (デフォルト)
  • cortex-a53
  • cortex-r5
  • microblaze
-target-os name ターゲット OS の指定:
  • linux (デフォルト)
  • standalone (ベアメタル)
-query-target type IP のサポート デバイス ファミリ、CPU タイプ、OS タイプ [family, cpu, os] のいずれかをクエリします。
-query-interface type IP のクエリ インターフェイスおよびパラメーター。複数のクエリ タイプ [all, aximm, axilite, axis, clock, control, param, misc] をサポートします。
注記: これには、IP がそのクエリに必要な情報すべてをパッケージにしている必要があります。
-o output.json ユーザー指定の JSON ファイルでクエリ結果を保存します。
-verbose STDOUT に詳細出力を表示。
-version STDOUTsdx_pack バージョン情報を表示。
-h, -help, --help sdx_pack オプションの使用方法と説明を表示します。

次にコード例を示します。

sdx_pack -header arraycopy.hpp -lib libarraycopy.a \
-func arraycopy -map A=A:in -map B=B:out \
-map M=s_axi_lite:in:16 -func-end \
-ip ../ip/component.xml -control AXI=s_axi_lite:0 \
-target-family zynquplus -target-cpu cortex-a53 -target-os standalone \
-verbose

説明:

  • arraycopy.hpp は、arraycopy 関数の関数プロトコルを定義するヘッダー ファイルを指定します。
  • IP の component.xml では、SDx 用にパッケージされた Vivado IP が生成されます。
  • -control では、IP 制御プロトコルを指定します。
  • –map では、ソフトウェア関数から Vivado IP のポートへの引数のマップを指定します。上記の例では、このオプションを 3 回使用して、AB および M 関数引数を IP ポートにマップしています。
  • –target-os オプションでは、ターゲット オペレーティング システムを指定します。

sdx_pack ユーティリティは C 呼び出し可能な IP ライブラリを生成して、-lib オプションの名前 (この場合 libarraycopy.a) と同じになるようにします。

C 呼び出し可能な IP ライブラリの使用

C 呼び出し可能なライブラリを生成したら、作成してライブラリを使用するために新しい SDx アプリケーション プロジェクトを作成します。、ライブラリ ビルドの Release ディレクトリから生成したライブラリ (libarraycopy.a) を使用して、前のセクションでビルドした C 呼び出し可能なライブラリの axis_arraycopy の例を続行します。アプリケーション プロジェクトをビルドすると、C 呼び出し可能な IP ライブラリにリンクされた実行ファイル (ELF) が生成されます。

  1. SDx アプリケーション プロジェクトを作成して、実行ファイルを出力します。[File] > [New] > [SDx Application Project] をクリックします。
    注記: device_familycpu_type、および os_type を含むタプルは C 呼び出し可能な IP ライブラリのものと同じである必要があります。
    表 6. SDx アプリケーション プロジェクト
    ダイアログ ボックス 選択またはフィールド名 動作
    Project Type Application [Next] をクリックします。
    Create a New SDx Project Project name: app_arraycopy
      Use default location オン
        [Next] をクリックします。
    Platform Name zcu102
        [Next] をクリックします。
    System Configuration System configuration: A53_Linux
      Runtime: C/C++
      Domain: a53_linux
    (プリセット) CPU: cortex-a53
    (プリセット) OS: linux
      Linux Root File System: オフ
        [Next] をクリックします。
    Templates Empty Application [OK] をクリックします。
  2. ライブラリとアプリケーションの両方に共通する関数宣言ヘッダー ファイル (.hpp) をインポートします。[Project Explorer] ビューで app_arraycopy を右クリックして [Import Sources] を選択します。
    表 7. インポートするソースの選択
    ダイアログ ボックス 選択またはフィールド名 動作
    File system From directory: axis_arraycopy/src directory in <SDx_Install_Dir>/samples/rtl を参照します。
        [OK] をクリックします。
      Files: arraycopy.hpp オン
      Into folder: app_arraycopy/src
        [OK] をクリックします。
  3. [Importing Sources] ダイアログ ボックスを開き直して、<SDx_Install_Dir>/samples/rtl ディレクトリから main アプリケーション コード例を取得します。[Project Explorer] ビューで app_arraycopy を右クリックして [Import Sources] を選択します。
    表 8. インポートするソースの選択
    ダイアログ ボックス 選択またはフィールド名 動作
    File system From directory: <SDx_Install_Dir>/samples/rtlaxis_arraycopy/app ディレクトリを参照します。
        [OK] をクリックします。
      Files: main.cpp オン
      Into folder: app_arraycopy/src
        [OK] をクリックします。
    app_arraycopy アプリケーションのソース ファイルがインポートされたので、[C/C++ Build Settings] をアップデートして、アプリケーションをビルドする際に sds++ リンカーで arraycopy.a C 呼び出し可能な IP が使用されるようにします。
  4. C/C++ ビルド設定をアップデートするには、[Project Explorer] ビューで app_arraycopy を右クリックして [C/C++ Build Settings] を選択します。
    表 9. C/C++ ビルド設定
    ダイアログ ボックス 選択またはフィールド名 動作
    Settings > Tool Settings SDS++ Linker [Libraries] を選択します。
        [Libraries] (-l) ウィンドウで [Add] シンボル (+ アイコン) をクリックします。
      Libraries(-l) arraycopy
        [OK] をクリックします。
        [Libraries search path (-L)] ウィンドウで [Add] シンボル (+ アイコン) をクリックします。
        [Workspace] をクリックします。
      Folder: arraycopy/Release を選択します。
        [OK] をクリックします。
    (プリセット) Directory: ${workspace_loc:/arraycopy/Release}
        [OK] をクリックします。
        [Apply and Close] をクリックします。

アプリケーションを作成するには、[Assistant] ウィンドウを使用して app_arraycopy アプリケーションをビルドします。

  1. [Assistant] ビューで [app_arraycopy [SDSoC]] の下の [Debug[Hardware]] を右クリックし、[Build] をクリックします。[Console] ビューには、sds++ システム コンパイラ呼び出しを含むビルドの進捗状況が表示されます。
  2. アプリケーションがターゲット実行ファイル (app_arraycopy.elf) を問題なくビルドしたら、[Assistant] ビューに [Data Motion Network Report][Compilation Log]、および [SD Card Image] メニューが表示されます。[SD Card Image] メニューからは生成されたファイルのディレクトリ (sd_card) の内容にアクセスでき、[Project Explorer] ビュー、ファイル ブラウザー、またはコマンド シェル ウィンドウを使用して表示できます。
  3. ビルドが終了したら、生成された sd_card ディレクトリの内容を FAT32 フォーマットの SD カードに書き込み、ZCU102 ボードで app_arraycopy.elf アプリケーションを実行できます。sd_card ディレクトリには、ブート セットアップ命令用の README.txt、ブート可能な BOOT.BIN ファイル、および Linux をブートするの使用する image.ub ファイルが含まれます。

SDx IDE は、C 呼び出し可能なライブラリおよびアプリケーション コードを使用して sds++ システム コンパイラを含むアプリケーションをビルドします。オブジェクト ファイルを生成するために main アプリケーションがコンパイルされ、C 呼び出し可能なライブラリ (arraycopy) とリンクされます。

次の例は、発行されたコマンドを示しています。

main.cpp のコンパイル:

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-sys-config a53_linux -sds-proc a53_linux -sds-pf zcu102

main.oarraycopy ライブラリにリンクして、実行可能なアプリケーション app_arraycopy.elf を生成します。

sds++ -L<path_to_arraycopy/Release> --remote_ip_cache ../ip_cache \
 -o app_arraycopy.elf ./src/main.o -larraycopy -dmclkid 1 \
 -sds-sys-config a53_linux -sds-proc a53_linux -sds-pf zcu102