ハードウェア インターフェイスの追加 - 2023.2 日本語

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

Document ID
UG1393
Release Date
2023-12-13
Version
2023.2 日本語

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

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

General Requirements

重要: 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 インターフェイスに変換する必要があります。

Project Type

Vivado プロジェクト タイプに対応する新しい XSA プラットフォームを作成するには、RTL Project を選択して Project is an extensible Vitis platform チェック ボックスをオンにします。

図 1. Project Type
ヒント: これらの設定は New Project ウィザードに表示されます。

新規プロジェクトを作成する際は、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 をクリックして設定します。

図 2. [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) と AXI スレーブ ポート (S_AXI) を含む 1 つのメモリ インターフェイス持つ AXI 制御インターフェイスを少なくとも 1 つ宣言する必要があります。PS ブロックから直接エクスポートすることも、インターコネクト IP を接続してエクスポートすることもできます。プラットフォームが AXI4 カーネルをサポートしない場合、これらのインターフェイスは必要ありません。

セキュリティ上の理由から、DFX プラットフォームの場合、カーネルを制御するために DFX デカップラー IP が必要です。DFX デカップラーでリコンフィギュレーション中にチャネルをオフにすると、スタティック領域からの予期しないリ要求によって AXI インターフェイスが無効な状態にならないようにしたり、RP リコンフィギュレーションによって発生するランダム トグルのためにスタティック領域で予期しない影響を受けないようにできます。XRT は、リコンフィギュレーション プロセス前に DFX デカップラーをオンにし、リコンフィギュレーション完了後にオフにします。

Vitis 領域の DFX プラットフォームでは、プラットフォーム用のメモリ インターフェイスをエクスポートするために、NoC スタブが必要です。V++ リンカーでは、PL カーネル メモリ インタフェースを NoC スタブに接続して、メモリにアクセスできます。

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

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

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

memport
AXI 制御インターフェイスは M_AXI_GP として定義できます。メモリ インターフェイスは、ほかのタイプ (S_AXI_HP、S_AXI_ACP、S_AXI_HPC、または MIG) を使用します。
sptag
(オプション) 最初の文字がアルファベットで始まる必要のあるユーザー定義の ID。ID の大文字/小文字は区別されます。システム ポート タグ (sptag) は、S_AXI_HP、S_AXI_ACP などのプラットフォーム ポート接続のクラスを示すシンボル識別子です。複数のブロック デザイン プラットフォーム ポートが同じ sptag を共有できます。sptags の使用方法の詳細は、カーネル ポートのメモリへのマップ を参照してください。
ヒント: sptag プロパティは、M_AXI_GP ポートをサポートしません。
メモリ
(オプション) 関連する 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 はアドレス範囲名です。

AXI インターフェイス ストリームの追加

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 インターフェイスのリンクの詳細は、ストリーミング接続の指定 を参照してください。

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

DFX プラットフォームであれば、スタティック領域とダイナミック領域にはそれぞれクロックとリセット信号を含めることができます。デバイス ツリー ジェネレーター (DTG) が正しいデバイス ツリーを生成してこのクロック トポロジを記述できるようにするには、スタティック領域に Clock Wizard が必要です。

図 3. [Platform Setup] - ウィンドウでのクロック設定

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

上の図からは、プラットフォームのクロックの詳細がわかります。プラットフォームには少なくとも 1 つのイネーブル クロックが必要で、デフォルトとして 1 つのクロックを指定する必要があります。

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

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

割り込みの追加

ヒント: DFX プラットフォームには、DFX デカップラー IP が必要です。これは、スタティック領域の割り込みコントローラーと、ダイナミック領域の割り込み信号をエクスポートするための Concat IP を接続するために使用されます。割り込みコントローラーは、Control, Interfaces, and Processing System (CIPS) IRQ へ出力します。

Vitis コンパイラは、v++ リンク段階中にカーネル interrupt 信号をプラットフォームの IRQ に自動的に接続します。ただし、これには、次に示すように、PFM.IRQ プロパティを使用してプラットフォーム上の割り込みを定義する必要があります。

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]

AMD Versal™ CIPS IP コアの割り込みは、IP カスタマイズ ダイアログ ボックスで PS PMC コンフィギュレーション コマンドを選択し、Interrupts をクリックすると設定できます。ここでは、プラットフォームで使用する CIPS IP の割り込みをオンにできます。この後、リンク時に v++ で、プラットフォーム上の割り込みをオンにして接続する必要があります。ブロック デザインの [Platform Setup] タブで、Interrupt をクリックし、表示されている CIPS IP の割り込みをオンにします。詳細は、 『Versal アダプティブ SoC ハードウェア、IP、およびプラットフォーム開発設計手法ガイド』 (UG1387) の「プラットフォーム ベース デザイン フローでのハードウェア プラットフォームの作成」を参照してください。

図 4. [Platform Setup] - [Interrupt]
この結果、割り込みをオンにする Tcl コマンドは次のようになります。
set_property PFM.IRQ {pl_ps_irq9 {is_range "false"} pl_ps_irq10 {is_range "false"}} [get_bd_cells /versal_cips]
ヒント: Concat ブロックを使用すると、複数の割り込みを CIPS IP に接続できます。

DFX 専用のプラットフォーム設定

アドレス アパーチャの設定
V++ によるリンキングの後、CIPS や SmartConnect がダイナミック領域のカーネルにアクセスできるように、ダイナミック領域のアドレス範囲を設定する必要があります。
カーネルがアクセス可能な DDR 範囲をエクスポートするには、アパーチャを DDR インターフェイスに設定する必要があります。
Tcl コンソールに次のコマンドを入力して、アパーチャ設定をロックします。
set_property HDL_ATTRIBUTE.LOCKED TRUE [get_bd_intf_pins /VitisRegion/PL_CTRL_S_AXI] set_property HDL_ATTRIBUTE.LOCKED TRUE [get_bd_intf_pins /VitisRegion/DDR_0] set_property HDL_ATTRIBUTE.LOCKED TRUE [get_bd_intf_pins /VitisRegion/DDR_1] set_property HDL_ATTRIBUTE.LOCKED TRUE [get_bd_intf_pins /VitisRegion/DDR_2] set_property HDL_ATTRIBUTE.LOCKED TRUE [get_bd_intf_pins /VitisRegion/DDR_3]
DFX 用ブロック デザイン コンテナー (BDC) を設定します。
DFX の [Vitis Region BDC] プロパティを更新してこのコンテナーの境界を凍結し、このコンテナーの Dynamic Function eXchange をイネーブルにします。
Dynamic Function eXchange ウィザードを設定してコンフィギュレーションを追加します。
DFX プラットフォームのプロパティの設定

# Specify that this platform supports 
DFX set_property platform.uses_pr true [current_project] 
# Specify the dynamic region instance path for hardware run 
set_property platform.dr_inst_path {design_1_i/VitisRegion} [current_project] 
# Specify the dynamic region instance path for emulation 
set_property platform.emu.dr_bd_inst_path {design_1_wrapper_sim_wrapper/design_1_wrapper_i/design_1_i/VitisRegion} [current_project]

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

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

Vivado プロジェクト タイプが extensible Vitis platform に設定される場合は、File > Export > Export Platform メニュー コマンドから Export Platform ウィザードを使用できます。

重要: ブロック デザインには HDL ラッパーが必要であり、プラットフォーム XSA をエクスポートするための出力ターゲットが生成されている必要があります。Sources ウィンドウ内の右クリック メニューから Create HDL Wrapper を使用してラッパーを作成し、Vivado IDE の Flow Navigator から Generate Block Design を使用します。
図 5. [Export Platform] ウィザード

[Export Platform] ウィザードには、エクステンシブル プラットフォーム XSA のエクスポートに役立つ 5 つのページが含まれます。

[Platform Type]
XSA をサポートするハードウェア エミュレーションおよびハードウェア ターゲットとして指定します。
[Platform State]
XSA をプラットフォーム インプリメンテーションまたは合成のみを含むように指定します。
[Platform Properties]
プラットフォーム プロパティを定義し、システムの構築時に Vitis コンパイラが使用する Tcl スクリプトおよび XDC 制約を指定できます。
[Output File]
出力ファイル名とディレクトリを指定します。
概要
エクスポート中に使用されるさまざまな設定をレポートします。

Export Hardware Platform ウィザードで、プラットフォーム タイプを選択します。プラットフォームには、ハードウェアのみで実行するプラットフォーム、ハードウェアエミュレーション専用のプラットフォーム、またはハードウェア エミュレーションとハードウェアで実行できるプラットフォームの 3 種類があります。これらの 3 つのオプションの違いは、一部のモジュールがエミュレーションでサポートされていない場合、エミュレーション固有のデザインに別作成し、[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>
コマンドは、DFX プラットフォームのみの XSA ファイルをエクスポートするのに使用できます。

#emulation XSA
set_property platform.platform_state "pre_synth" [current_project] 
write_hw_platform -hw_emu -force -file vck190_custom_dfx_hw_emu.xsa
#hardware and RP XSA
set_property platform.platform_state "impl" [current_project]
write_hw_platform -force -fixed -static -file vck190_custom_dfx_static.xsa
write_hw_platform -force -rp design_1_i/VitisRegion vck190_custom_dfx_rp.xsa

ハードウェア 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>