Vivado IP フローのインターフェイス - 2023.2 日本語

Vitis 高位合成ユーザー ガイド (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 日本語
Vivado IP フローは、さまざまなアプリケーションで FPGA デザインをサポートする必要があるため、さまざまな I/O プロトコルとハンドシェイクをサポートします。このフローでは、複数の IP がシステムに統合された従来のシステム デザイン フローがサポートされます。IP は Vitis HLS を使用して生成できます。この IP フローでは、システムを実行する 2 つの制御モードがあります。
  • [Software Control]: システムは、エンベデッド Arm プロセッサまたは外部 x86 プロセッサ上で実行されるソフトウェア アプリケーションを介して制御され、ドライバーを使用してハードウェア デザインの要素にアクセスし、ハードウェアでレジスタの読み出しと書き込みをして、システム内の IP の実行を制御します。
  • [Self Synchronous]: このモードでは、IP がカーネルの起動と停止に使用される信号を公開します。これらの信号は、IP の実行を処理するシステム デザインのほかの IP または要素によって駆動されます。

Vivado IP フローでは、メモリ、ストリーム、およびレジスタ インターフェイス パラダイムがサポートされます。各パラダイムでは、次の表に示すように、外部との通信用に異なるインターフェイス プロトコルがサポートされます。Vitis カーネル フローでは、AXI4 インターフェイス アダプターのみがサポートされますが、このフローではさまざまなインターフェイス タイプがサポートされます。

表 1. インターフェイスの種類
パラダイム 説明 インターフェイスの種類
メモリ データは、DDR、HBM、PLRAM/BRAM/URAM などのメモリを介してカーネルからアクセスされます。 ap_memorybramAXI4 メモリ マップド (m_axi)
ストリーム データは、ビデオ プロセッサやほかのカーネルなどの別のストリーミング ソースからカーネルにストリーミングされるほか、カーネルからストリーミングすることもできます。 ap_fifoAXI4-Stream (axis)
Register データは、レジスタの読み書きによって実行されるレジスタ インタフェースを介して、カーネルからアクセスされます。 ap_noneap_hsap_ackap_ovldap_vld、および AXI4-Lite アダプター (s_axilite)。

デフォルトのインターフェイスは、次の表に示すように、最上位関数の C 引数タイプとデフォルトのパラダイムによって定義されます。

表 2. デフォルト インターフェイス
C 引数タイプ サポートされるパラダイム デフォルトのパラダイム デフォルトのインターフェイス プロトコル
入力 出力 入出力
スカラー変数 (値渡し) Register Register ap_none N/A N/A
配列 メモリ、ストリーム メモリ ap_memory ap_memory ap_memory
ポインター メモリ、ストリーム、レジスタ Register ap_none ap_vld ap_ovld
参考資料 Register Register ap_none ap_vld ap_vld
hls::stream ストリーム ストリーム ap_fifo ap_fifo N/A

Vivado IP フローのデフォルトの実行モードは順次実行であり、HLS IP は次のタスクを開始する前に 1 つのタスクを完了しておく必要があります。これは、ap_ctrl_hs ブロック制御プロトコルで指定されます。この制御プロトコルは、ブロック レベルの制御プロトコル の方法に従うと変更できます。

次のコードの vadd 関数は、Vivado IP フローのインターフェイス合成の例を示しています。

#define VDATA_SIZE 16

typedef struct v_datatype { unsigned int data[VDATA_SIZE]; } v_dt;

extern "C" {
void vadd(const v_dt* in1, // Read-Only Vector 1
          const v_dt* in2, // Read-Only Vector 2
          v_dt* out_r, // Output Result for Addition
          const unsigned int size // Size in integer 
) {

   unsigned int vSize = ((size - 1) / VDATA_SIZE) + 1;

   // Auto-pipeline is going to apply pipeline to this loop
   vadd1:
   for (int i = 0; i < vSize; i++) {
      vadd2:
      for (int k = 0; k < VDATA_SIZE; k++) {
         out_r[i].data[k] = in1[i].data[k] + in2[i].data[k];
      }
   }
}
}

vadd 関数には、次が含まれます。

  • in1in2 の 2 つのポインター入力
  • 結果が書き込まれるポインター out_r
  • スカラー値 size

Vivado IP フローで使用されるデフォルトのインターフェイス合成設定では、次の図に示すように、デザインはポートおよびインターフェイスを含む RTL ブロックに合成されます。

図 1. デフォルト インターフェイスの合成後の RTL ポート

デフォルトの Vivado IP フローでは、データおよび制御の両方のフローを処理するため、RTL デザインに 3 つのタイプのインターフェイス ポートが作成されます。

  • クロック ポートとリセット ポート: ap_clkap_rst がカーネルに追加されます。
  • [Block-level control protocol]: ap_ctrl インターフェイスは s_axilite インターフェイスとしてインプリメントされます。
  • ポート レベルのインターフェイス プロトコル: 最上位関数の各引数および関数の戻り値 (関数が値を返す場合) に対して作成されます。前述の表のように、ほとんどの引数は ap_none のポート プロトコルを使用するため、制御信号はありません。前述の vadd の例では、in1in2、および size などのポートがありましたが、out_r_o 出力ポートは ap_vld プロトコルを使用するので、out_r_o_ap_vld 信号に関連付けられています。

Vivado IP フロー内の AP_Memory

ap_memory は前述の表に記載されているメモリ パラダイムのデフォルトのインターフェイスです。Vivado IP フローでは、BRAM や URAM などのメモリ リソースとの通信に使用されます。ap_memory プロトコルは、アドレスおよびデータ フェーズでも使用されます。プロトコルは最初にリソースの読み出し/書き込みを要求し、リソースが使用可能かどうかの承認応答を受信するまで待機します。次に、読み出し/書き込みのデータ転送フェーズを開始します。

ap_memory では、1 つのビート データを 1 つのアドレスに転送しかできず、バースト アクセスが可能な m_axi とは異なるということに注意することが重要です。これにより、ap_memory はほかのプロトコルと比較して軽量なプロトコルになります。

  • [Memory Resources]: デフォルトでは、Vitis HLS はシングル ポートの RAM リソースと通信するプロトコルがインプリメントします。INTERFACE プラグマまたは指示子の一部として storage_type を指定することで、プロトコルのインプリメンテーションを制御できます。storage_type では、どのタイプの RAM を使用するか、どの RAM ポート (シングル ポートとデュアル ポートのいずれか) を作成するかを明示的に指定できます。storage_type を指定しない場合、Vitis HLS は次を使用します。
    • シングル ポート RAM (デフォルト)。
    • 開始間隔またはレイテンシが削減される場合はデュアル ポート RAM。

Vivado IP フローの M_AXI インターフェイス

AXI4 メモリ マップド (m_axi) インターフェイスを使用すると、IP がグローバル メモリ (DDR、HBM、PLRAM) でデータを読み出しおよび書き込みできます。メモリ マップド インターフェイスは、複数の IP 間でデータを共有する便利な方法です。m_axi インターフェイスの主な利点は、次のとおりです。
  • インターフェイスには、独立した読み出しチャネルおよび書き込みチャネルがあります。
  • バースト ベースのアクセスをサポートします。
  • 未処理のトランザクションのキューを提供します。
バースト アクセスの理解
AXI4 メモリ マップド インターフェイスは、1 つのアドレス位相だけを含む最大 4K バイトの高スループット バーストをサポートします。バースト モード転送では、Vitis HLS で 1 つのベース アドレスを使用してデータが読み出しまたは書き込みされ、その後に複数のシーケンシャル データ サンプルが続くので、より高いデータ スループットを達成できます。バースト モードは、C の memcpy 関数を使用している場合、または for ループをパイプライン処理している場合に使用できます。詳細は、AXI4 バースト動作の制御 または AXI バースト転送 を参照してください。
ポートの自動拡張とポート幅の調整
ポート幅の自動変更 で説明するように、Vitis HLS には、バースト アクセスに必要な前提条件が揃っている場合に、データ転送を容易にし、ポート幅を自動的に広げてバースト アクセスを改善する機能があります。Vivado IP フローでは、次のコンフィギュレーション設定により、デフォルトでポート幅の自動サイズ変更がディスエーブルになります。この機能をイネーブルにするには、次のコンフィギュレーション オプションを変更する必要があります (1 つのコマンドがビットとして指定され、もう 1 つのコマンドがバイトとして指定されていることに注意してください)。
syn.interface.m_axi_max_widen_bitwidth=0
syn.interface.m_axi_alignment_byte_size=0
Vivado IP モードのアライメントの指定

m_axi ポートのアライメントにより、ポートが指定されたアライメントに従ってメモリを読み出しおよび書き込みできます。ベスト ケースではパフォーマンスに影響し、ワースト ケースでは機能に影響する可能性があるため、正しいアライメントを選択することが重要です。

アライメントされたメモリ アクセスとは、ポインター (またはデータの開始アドレス) がアライメントと呼ばれるタイプ別の値の倍数であることを意味します。アライメントは、(パフォーマンス上の理由などにより) タイプをメモリに格納する必要があるか、または格納するべきである、自然なアドレスの倍数です。たとえば、標準の 32 ビット アーキテクチャでは、32 ビットのワードがメモリにそれぞれ 4 バイトずつ格納されます。データは 1 ワードまたは 4 バイトの境界にアライメントされます。

システム内でアライメントに一貫している必要があります。アライメントは、IP が AXI4 マスター モードで動作しているときに決定され、4 バイト アライメントの 32 ビット アーキテクチャと同じように指定する必要があります。IP がスレーブ モードで動作している場合、アライメントはマスターのアライメントと一致している必要があります。

オフセットの規則

m_axi オフセットのデフォルトは offset=direct および syn.interface.default_slave_interface=s_axilite です。ただし、Vivado IP フローでは、オフセットと動作モード で説明する方法で変更できます。

バンドル インターフェイス: パフォーマンスとリソース使用率

デフォルトでは、M_AXI バンドル に説明するように、Vitis HLS が互換性のあるオプションを持つ関数引数を 1 つの m_axi インターフェイス アダプターにグループ化します。ポートを 1 つのインターフェイスにバンドルすると、AXI4 ロジックを排除してデバイス リソースを節約できるので、密集したデザインで作業する場合に必要になることがあります。

ただし、すべてのメモリ転送が 1 つのポートを通ることになるので、1 つのインターフェイス バンドルにより IP のパフォーマンスが制限されてしまうことがあります。m_axi インターフェイスには独立した読み出しチャネルと書き込みチャネルがあるので、1 つの場所に対してであれば、1 つのインターフェイスで読み出しと書き込みを同時に実行できます。複数のバンドルを使用すると、複数のインターフェイスを作成してメモリ バンクに接続することで、パフォーマンスを向上させることができます。

Vivado IP フローの S_AXILITE

Vivado IP フローでは、デフォルトの実行制御は、デフォルトの ap_ctrl_hs 制御プロトコルを使用し、s_axilite インターフェイスを介したレジスタの読み出しと書き込みによって管理されます。IP は、S_AXILITE 制御レジスタ マップ で説明するように、s_axilite インターフェイスの制御レジスタを読み出しおよび書き込みすることによって、ソフトウェアで制御されます。

s_axilite インターフェイスには次の機能があります。

制御プロトコル
ブロック レベルの制御プロトコル で指定されるブロック制御プロトコル。
スカラー引数
S_AXILITE 制御レジスタ マップ で説明するように、最上位関数のスカラー引数は、その値用のレジスタを作成する s_axilite インターフェイスにマップできます。ソフトウェアは、このレジスタ空間への読み出し/書き込みを実行できます。
オフセットの規則
Vivado IP フローでは、最上位関数内の関連する C 引数のデータ型に基づいて、ポートに割り当てられるアドレスのサイズまたは範囲が定義されます。ただし、S_AXILITE オフセット オプション で説明するように、オフセット サイズを手動で定義することもできます。
バンドルの規則
Vivado IP フローでは、s_axilite インターフェイスを使用して複数のバンドルを指定できます。これにより、定義したバンドルごとに個別のインターフェイス アダプターが作成されます。ただし、S_AXILITE バンドルの規則 で説明するように、複数のバンドルの使用に関連する規則がいくつかあります。

Vivado IP フローの AP_FIFO

Vivado IP フローでは、ap_fifo インターフェイス プロトコルがメモリ リソース FIFO との通信用インターフェイスのストリーミング パラダイムのデフォルト インターフェイスであり、IP 内のさまざまな関数間の通信チャネルとしても使用できます。このプロトコルは、データがシーケンシャルにアクセスされる場合にのみ使用する必要があり、AMDでは FIFO をインプリメントする hls::stream<data type> を使用することを強くお勧めしています。

ヒント: <data type>T_data_type と同じにすることはできず、インターフェイスでのみ使用する必要があります。

Vivado IP フローの AXIS インターフェイス

AXI4-Stream プロトコル (axis) はストリーミング インターフェイスの代替で、ストリーミング データ用の単一方向チャネルをシーケンシャルに定義します。m_axi プロトコルとは異なり、AXI4-Stream インターフェイスは無制限にデータをバーストできるので、パフォーマンスがかなり向上します。メモリの読み出し/書き込みにアドレスを必要とする AXI4 メモリ マップド インターフェイスとは異なり、axis インターフェイスは単にアドレスを必要とせずにデータを別の axis インターフェイスに渡すだけなので、使用するデバイス リソースが少なくなります。AXI4-Stream インターフェイス で説明するように、これらの機能を組み合わせることで、ストリーミング インターフェイスが軽量でパフォーマンスに優れたインターフェイスになります。