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

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

Document ID
UG1393
Release Date
2022-03-29
Version
2021.2 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 プロジェクト タイプに対応する新しい 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 を接続してエクスポートすることもできます。プラットフォームが AXI メモリ マップド カーネルで動作しない場合、これらのインターフェイスは必要ありません。

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 ポートをサポートしません。
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 インターフェイスのリンクの詳細 は、計算ユニット間のストリーミング接続の指定 を参照してください。

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

図 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>]

割り込みの追加

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 と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 を使用します。
図 4. [Export Platform] ウィザード

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

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

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>

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