ハードウェア インターフェイスの追加 - 2021.1 Japanese

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

Document ID
UG1393
Release Date
2022-03-29
Version
2021.1 Japanese

次の表は、使用可能な Vitis 入力とアクセラレーション エンベデッド プラットフォームの最小要件を示しています。

表 1. Vitis で使用可能なインターフェイス
入力 Vitis の使用可能なタイプ AXI MM カーネルの最小要件
制御インターフェイス PS または AXI Interconnect IP や SmartConnect IP からの AXI マスター インターフェイス カーネル制御用の AXI4-Lite マスター 1 つ
メモリ インターフェイス AXI スレーブ インターフェイス データ交換用のメモリ インターフェイス 1 つ
ストリーミング インターフェイス AXI4-Stream インターフェイス 必要なし
クロック 複数のクロック信号 クロック 1 つ
割り込み 複数の割り込み信号 割り込み 1 つ

一般的な要件

重要: Vivado プロジェクトのすべての要素のソースファイルは、XSA としてエクスポートする前にプロジェクトに対してローカルである必要があります。そうでない場合は Vitis ツールでプラットフォームを使用するときにエラーになります。
  • プラットフォーム デザインで使用される IP で標準の Vivado IP カタログに含まれていないものは、Vivado Design Suite プロジェクトのローカルに配置されている必要があります。プロジェクト外部の IP リポジトリ パスへの参照は、エクステンシブル XSA を作成する場合はサポートされません。
  • Vitis コンパイラでカーネルへのリンクに使用されるプラットフォーム インターフェイスは、AXI4AXI4-LiteAXI4-Stream、割り込み、クロック、またはインターフェイスのリセット タイプにする必要があります。
  • Vitis コンパイラでカーネルへのリンクに使用される AXI インターフェイスを持つプラットフォーム IP には、クロック ピンも関連付けて v++ をイネーブルにし、必要に応じてクロック乗せ換えロジックを正しく推論して挿入する必要があります。
  • プラットフォーム上またはカーネル上のカスタム バス タイプおよびハードウェアインタフェースは v++ リンカーの --connectivity.sp および --connectivity.sc 指示子ではされません。カスタム バス タイプを指定したデータ バスを Vitis コンパイラでカーネルに接続する必要がある場合は、AXI4AXI4-Lite、または AXI4-Stream インターフェイスに変換する必要があります。

プロジェクト タイプ

Vivado プロジェクト タイプを extensible Vitis platform に設定する必要があります。

新規プロジェクトを作成する際は、Project is an extensible Vitis platform を選択します。

既存の Vivado プロジェクトエクステンシブル Vitis プラットフォーム プロジェクトに変更するには、Project Manager > Settings in the Flow Navigator をクリックし、Project is an extensible Vitis platform をオンします。

set_property platform.extensible true [current_project]

プラットフォーム インターフェイスの追加

ブロック デザインのコンポーネントに PFM プロパティが含まれる場合、v++ リンカーで認識され、アクセラレーション カーネルで使用できるようになります。

Vivado IDE では、プロジェクトがエクステンシブル プラットフォーム プロジェクトとして作成される場合、Platform Setup ウィンドウで PFM インターフェイス プロパティを設定できます。Window menu > Platform Setup をクリックして設定します。これらは、[Tcl Console] ウィンドウから手動で定義できるほか、Tcl スクリプトでも定義できます。

プラットフォーム インターフェイスの Tcl API は、次の 4 つです。

  • AXI メモリ マップド インターフェイス:
    set_property PFM.AXI_PORT { <port_name> {parameters} <port2> {parameters} ...} [get_bd_cells <cell_name>]
  • AXI4-Stream インターフェイス:
    set_property PFM.AXIS_PORT { <port_name> {parameters} <port2> {parameters} ...} [get_bd_cells <cell_name>]
  • クロックおよびリセット:
    set_property PFM.CLOCK { <port_name> {parameters} <port2> {parameters} ...} [get_bd_cells <cell_name>]
  • 割り込み:
    set_property PFM.IRQ {pin_name {id id_number range irq_count}} [get_bd_cells <cell_name>]

PFM プロパティの要件は、次のとおりです。

  • PFM インターフェイス プロパティの値は、Tcl ディクショナリ (名前/"値" のペア) として指定する必要があります。
    重要: 値は二重クォーテーションで囲む必要があります。名前と値の大文字と小文字は区別されます。
  • bd_cell には複数の PFM インターフェイス定義を指定できます。ただし、PFM インターフェイスの各タイプごとに、すべてのポートを 1 つの set_property Tcl コマンドで設定する必要があります。
  • 各 PFM インターフェイス プロパティで、ポート オブジェクトに指定した名前が外部ポートまたは bd_cell のインターフェイスの名前と同じである必要があります。各外部ポートまたはインターフェイス オブジェクトに含めることができるのは、1 つの PFM インターフェイス定義だけです。
  • PFM インターフェイスのタイプごとに異なるパラメーターを設定できます。
  • PFM プロパティに NULL ("") 文字列を設定すると、前に定義した PFM インターフェイスが削除されます。

AXI インターフェイスの追加

AXI メモリ マップド カーネルをサポートするには、プラットフォームが AXI メモリ マップド マスター ポート (M_AXI_GP) と AXI スレーブ ポートを含む 1 つのメモリ インターフェイス持つ AXI 制御インターフェイスを少なくとも 1 つ宣言する必要があります。PS ブロックから直接エクスポートすることも、インターコネクト IP を接続してエクスポートすることもできます。プラットフォームが AXI メモリ マップド カーネルで動作しない場合、これらのインターフェイスは必要ありません。

Tcl コマンドの構文は、次のとおりです。

set_property PFM.AXI_PORT { <port_name> {parameters} <port2> {parameters} ...} [get_bd_cells <cell_name>]

AXI 制御インターフェイスと AXI メモリ インターフェイスは同じ PFM.AXI プロパティを共有します。それぞれ memport タイプは異なります。

  • AXI 制御インターフェイスは M_AXI_GP として定義できます。メモリ インターフェイスは、ほかのタイプ (S_AXI_HP、S_AXI_ACP、S_AXI_HPC、または MIG) を使用します。
  • M_AXI_GP ポートの sptags プロパティはサポートされません。
  • sptag ID: (オプション) 最初の文字がアルファベットで始まる必要のあるユーザー定義の ID。ID の大文字/小文字は区別されます。システム ポート タグ (sptag) は、S_AXI_HP、S_AXI_ACP、または M_AXI_GP などのプラットフォーム ポート接続のクラスを示すシンボル識別子です。複数のブロック デザイン プラットフォーム ポートが同じ sptag を共有できます。
  • memory: (オプション) 関連する MIG IP インスタンスと address_segment を指定します。memory タグは、IP インテグレーターの [Address Editor] ウィンドウの [Cell Name] と [Base Name] 列を組み合わせた独自の名前になります。このタグは、複数のブロック デザイン プラットフォーム ポートが同じ memory タグを共有可能な Memory Subsystem HIP への接続に関連付けられます。

AXI インターコネクトのマスター ポートおよびスレーブ ポートのエクスポートには、次の要件があります。

  • プラットフォームで使用されるインターコネクト上のすべてのポートは、宣言されたプラットフォーム インターフェイスの前にインデックス順で宣言する必要があります。
  • ポートのインデックス番号をスキップすることはできません。
  • S_AXI_ACP ポートのマスター ID の最大数は 8 なので、接続された AXI インターコネクト上で宣言する使用可能なポートは {S00_AXI, S01_AXI, ..., S07_AXI} のいずれかである必要があります。プラットフォーム内で使用されるポートは宣言しないでください。できるだけ多くのポートを宣言すると、sds++ でカスケードされた axi_interconnects を回避できます。
  • S_AXI_HP または MIG ポートのマスター ID の最大数は 16 なので、接続された AXI インターコネクト上で宣言する使用可能なポートは {S00_AXI, S01_AXI, ..., S15_AXI} のいずれかである必要があります。プラットフォーム内で使用されるポートは宣言しないでください。できるだけ多くのポートを宣言すると、v++ で生成されたユーザー システムでカスケードされた axi_interconnects を回避できます。
  • M_AXI_GP ポートに接続されるインターコネクト上で宣言されるマスター ポートの最大数は 64 なので、接続された AXI インターコネクト上で宣言する使用可能なポートは {M00_AXI, M01_AXI, ..., M63_AXI} のいずれかである必要があります。プラットフォーム内で使用されるポートは宣言しないでください。できるだけ多くのポートを宣言すると、v++ で生成されたユーザー システムでカスケードされた axi_interconnects を回避できます。

次に、AXI インターコネクト IP で AXI マスターポートを定義する例を示します。

set parVal []
for {set i 2} {$i < 64} {incr i} {
lappend parVal M[format %02d $i]_AXI \
{memport "M_AXI_GP"}
}
set_property PFM.AXI_PORT $parVal [get_bd_cells /axi_interconnect_0]

次に、SmartConnect IP で MIG を使用して AXI メモリ ポートを定義する例を示します。

set parVal []
for {set i 1} {$i < 16} {incr i} {
lappend parVal S[format %02d $i]_AXI 
{memport "MIG" sptag "Bank0"}
}
set_property PFM.AXI_PORT $parVal [get_bd_cells /smartconnect_0]

次は、制御インターフェイスとメモリ インターフェイスの PFM.AXI_PORT 設定の例です。

set_property PFM.AXI_PORT {
M_AXI_HPM1_FPD {memport "M_AXI_GP"} 
S_AXI_HPC0_FPD {memport "S_AXI_HPC" sptag "HPC0" memory "zynq_ultra_ps_e_0 HPC0_DDR_LOW"}  
S_AXI_HPC1_FPD {memport "S_AXI_HPC" sptag "HPC1" memory "zynq_ultra_ps_e_0 HPC1_DDR_LOW"}  
S_AXI_HP0_FPD {memport "S_AXI_HP" sptag "HP0" memory "zynq_ultra_ps_e_0 HP0_DDR_LOW"}  
S_AXI_HP1_FPD {memport "S_AXI_HP" sptag "HP1" memory "zynq_ultra_ps_e_0 HP1_DDR_LOW"}  
S_AXI_HP2_FPD {memport "S_AXI_HP" sptag "HP2" memory "zynq_ultra_ps_e_0 HP2_DDR_LOW"}
} [get_bd_cells /ps_e]
注記:
  • zynq_ultra_ps_e_0Zynq UltraScale+ MPSoC モジュールのインターフェイス名です。
  • HPC0_DDR_LOW はアドレス範囲名です。

AXI4-Stream インターフェイスの追加

AXI4-Stream ストリーム カーネルをサポートするには、プラットフォームが該当するマスターまたはスレーブ AXI4-Stream インターフェイスを宣言する必要があります。

AXI4-Stream カーネル インターフェイスは PFM.AXIS_PORT sptag インターフェイス プロパティとそれに合った v++ リンカーへの connectivity.sc コマンド引数を使用して指定します。

Tcl コマンドの構文は、次のとおりです。

set_property PFM.AXIS_PORT { <port_name> {parameters} <port2> {parameters} ...} [get_bd_cells <cell_name>]

引数の説明

Port_name
AXI4-Stream ポート名。
パラメーター
type value: ストリーミング インターフェイス ポート タイプ。type の有効な値は、次のとおりです。
  • M_AXIS: 汎用 AXI マスター ポート
  • S_AXIS: 高パフォーマンスの AXI スレーブ ポート

set_property PFM.AXIS_PORT {AXIS_P0 {type "S_AXIS"}} [get_bd_cells /zynq_ultra_ps_e_0]
注記: カーネルとプラットフォーム間の AXI4-Stream インタフェースをリンクする方法については v++ リンカー設定ファイルの構文を参照していください (--connectivity.sc)。

クロックおよびリセットの追加

クロック ソースはプラットフォームと一緒にエクスポートできますが、各クロックに対してプラットフォームの Processor System Reset IP ブロックを使用して、同期リセット信号もエクスポートする必要があります。PFM.CLOCK プロパティは、BD セル、外部ポート、または外部インターフェイスに設定できます。

次は、PFM.CLOCK プロパティを設定する Tcl コマンドです。

set_property PFM.CLOCK { <port_name> {parameters} \
<port2> {parameters} ...} [get_bd_cells <cell_name>]

割り込みの追加

Vitis では、v++ リンク段階中にカーネル出力の IRQ 信号をプラットフォームの IRQ に自動的に接続できます。次は、その Tcl コマンド構文です。

set_property PFM.IRQ {pin_name {id id_number}} bd_cell
set_property PFM.IRQ {port_name {id id_number range irq_count}} [get_bd_cell <cell_name>]

引数の説明

Port_name
bd_cell の IRQ ポート名。
id_number
0 ~ 127 の整数。範囲が指定されている場合は、IRQ 番号または開始番号を指定します。
irq_count
バスのサイズを指定する際にパラメーター伝搬の対象となるインタフェースのラベル付けに使用されます (例: 割り込みコントローラー (intr) インタフェース)。

この例では、32 の IRQ 入力を axi_intc_0 intr ポートに対してイネーブルにする方法を示しています。

set_property PFM.IRQ {intr {id 0 range 32}} [get_bd_cells /axi_intc_0]

この例は、VCK190 ベース プラットフォームでカスケード割り込みコントローラーを使用して 63 個の IRQ をイネーブルにする方法を示しています。

set_property PFM.IRQ {intr {id 0 range 32}}  [get_bd_cells /axi_intc_cascaded_1]
set_property PFM.IRQ {In0 {id 32} In1 {id 33} In2 {id 34} In3 {id 35} In4 {id 36} In5 {id 37} In6 {id 38} In7 {id 39} In8 {id 40} \
                               In9 {id 41} In10 {id 42} In11 {id 43} In12 {id 44} In13 {id 45} In14 {id 46} In15 {id 47} In16 {id 48} In17 {id 49} In18 {id 50} \
                               In19 {id 51} In20 {id 52} In21 {id 53} In22 {id 54} In23 {id 55} In24 {id 56} In25 {id 57} In26 {id 58} In27 {id 59} In28 {id 60} \
                               In29 {id 61} In30 {id 62}} [get_bd_cells /xlconcat_0]

エクステンシブル プラットフォームのエクスポート

ハードウェア プラットフォームは、XSA ファイル形式でカプセル化されます。XSA には、ソフトウェア開発用の固定 XSA とアクセラレーション プロジェクト用のエクステンシブル XSA の 2 つのフォーマットがあります。アクセラレーション フロー用に Vitis エンベデッド プラットフォームを作成する場合は、エクステンシブル XSA を使用する必要があります。

Vivadoプロジェクト タイプが extensible Vitis platform に設定されている場合は、File > Export or Window > Platform Setup > Export Platform ボタンでプラットフォームのエクスポート メニューを使用できます。

Export Hardware Platform ウィンドウでプラットフォーム タイプを選択します。プラットフォームには、4 つのタイプがあります。エクスポートされたプラットフォームがハードウェア ボードで実行されるバイナリを生成するためだけに使用される場合は、[Hardware] を選択します。このプラットフォームを使用してハードウェア エミュレーションを実行する場合は、[Hardware Emulation] または [Hardware and Hardware Emulation] を選択します。これらの 2 つのオプションの違いは、現在のデザインの一部のモジュールがエミュレーションでサポートされていない場合、エミュレーション固有のデザインを作成し、[Hardware Emulation] としてエクスポートしてから、[Combine XSAs] オプションを使用してハードウェア XSA とハードウェア エミュレーション XSA を 1 つの XSA に結合し、両方のジョブを実行できるようにする必要がある点です。

シンプルなデザインの場合:

  1. Hardware and Hardware Emulation を選択して Next をクリックします。
  2. Pre-synthesis for Platform State オンにします。ポスト インプリメンテーションが必要なのは、DFX プラットフォームを作成する場合だけです。Next をクリックします。
  3. Platform Properties と入力します。Next をクリックします。
  4. XSA ファイル名を入力し、エクスポートするターゲット ディレクトリを指定します。Next をクリックします。
  5. サマリを確認して、Finish をクリックします。

これは、次のコマンドを使用すると、コマンド ラインでも実行できます。

set_property pfm_name {vendor:board:name:version} [get_files <bd_file>]
write_hw_platform -hw -force <XSA file>

ハードウェア XSA とハードウェア エミュレーション XSA を作成してまとめるオプションは、次のとおりです。

write_hw_platform -hw <hw_platform> 
write_hw_platform -hw_emu <hw_emu_platform>
combine_hw_platform -hw <hw_platform> -hw_emu <hw_emu_platform> -o <combined_platform>