オフセットと動作モード - 2023.2 日本語

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

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 日本語
重要: Vitis カーネル フローでは、デフォルトの動作モードは offset=slave であり、変更すべきではありません。Vivado IP フローでもデフォルトは offset=slave ですが、これは変更できます。

AXI4 マスター インターフェイスには、特定のアドレスに対して読み出し/書き込みを実行するのに使用可能な読み出し/書き込みアドレス チャネルがあります。デフォルトでは、m_axi インターフェイスはすべての読み出しおよび書き込み操作をアドレス 0x00000000 から開始します。たとえば、次のコードの場合、50 個のアドレス値を表すアドレス 0x000000000x000000C7 (32 ビット ワード 50 個で 200 バイトを提供) からデータを読み出してから、同じアドレスにデータを再び書き込みます。

#include <stdio.h>
#include <string.h>
 
void example(int *a){
   
#pragma HLS INTERFACE mode=m_axi port=a depth=50
   
  int i;
  int buff[50];
   
  //The use of memcpy is discouraged because multiple calls of memcpy cannot be
  //pipelined and will be scheduled sequentially. Use a dedicated for loop instead
  //memcpy(buff,(const int*)a,50*sizeof(int));
  //Burst read input
  for(i=0; i<50; i++){
    buff[i] = a[i];
  }
   
  // Compute value
  for(i=0; i < 50; i++){
    buff[i] = buff[i] + 100;
  }
   
  //Burst write output
  for(i=0; i<50; i++){
    a[i] = buff[i];
  }
}

HLS コンパイラでは、インスタンスのベース アドレスを Vivado IP でスタティックに設定するか、ソフトウェア アプリケーションやほかの IP で実行中に動的に設定できます。

m_axi インターフェイスは、トランザクションを開始するマスターおよびデータを受信して肯定応答 (ACK) を送信するスレーブ インターフェイスの両方として使用できます。INTERFACE プラグマの offset オプションで指定されたモードによって、HLS IP では複数の方法を使用してベース アドレスを設定できます。

ヒント: syn.interface.m_axi_offset コンフィギュレーション コマンドを使用すると、オフセットをグローバルに設定できます。INTERFACE プラグマの offset オプションを使用すると、特定の m_axi インターフェイスに対してこのグローバル設定を変更できます。
  • マスター モード: 異なる offset オプションを使用するマスター インターフェイスとして動作する場合、m_axi インターフェイスの開始アドレスはハードコード化するか、実行時に設定できます。
    • offset=off: m_axi インターフェイスのベース アドレスを 0x00000000 に設定し、Vivado IP インテグレーターで変更できないようにします。この方法の欠点の 1 つは、実行中にベース アドレスを変更できないことです。ベース アドレスの設定については、IP インテグレーターでの AXI4 Master インターフェイスのカスタマイズ を参照してください。
      次は、関数の INTERFACE プラグマ設定の offset=off を示しています。
      void example(int *a){
      #pragma HLS INTERFACE m_axi depth=50 port=a offset=off
      ...
      }
    • offset=direct: Vitis HLS で IP にアドレスを設定するポートが生成されます。次の図に示すように、a ポートが追加されます。これにより、実行時にアドレスをアップデートできるので、異なる場所に対して読み出しおよび書き込みを実行する m_axi インターフェイスが得られます。たとえば、ADC から RAM にデータを読み出す HLS モジュール、そのデータを処理する HLS モジュールなどです。モジュール上のアドレスを変更できるので、1 つの HLS モジュールが初期データセットを処理している間に、別のモジュールで異なるアドレスにデータを読み出すことができます。
      void example(int *a){
      #pragma HLS INTERFACE m_axi depth=50 port=a offset=direct
      ...
      }
    図 1. offset=direct
  • スレーブ モード: インターフェイスのスレーブ モードは、offset=slave で設定します。このモードでは、IP は s_axilite インターフェイスを介してホスト アプリケーションまたはマイクロコントローラーで制御されます。これが Vitis カーネル フローと Vivado IP フローの両方でデフォルトです。動作のフローは次のとおりです。
    1. ホスト/CPU が、s_axilite アダプターにマップされたブロック レベル制御プロトコルを使用して IP またはカーネルを開始します。
    2. ホストが s_axilite アダプターを介して m_axi インターフェイスのアドレス オフセットを送信します。
    3. m_axi アダプターは、s_axilite アダプターから開始アドレスを読み出し、キューに格納します。
    4. HLS デザインがグローバル メモリからデータを読み出し始めます。

次の図に示すように、HLS デザインには、ベース アドレス用の s_axilite アダプターとグローバル メモリへの読み出しおよび書き込み転送を実行する m_axi があります。

図 2. スレーブ モードの AXI アダプター

オフセット規則

offset オプションの規則は、次のとおりです。

  • 完全指定されたオフセット: ユーザーが明示的にオフセット値を設定すると、ツールで指定した設定が使用されます。デザインの異なる m_axi インターフェイスに対して異なるオフセット値を指定でき、ツールでそれらのオフセットが使用されます。
    #pragma HLS INTERFACE s_axilite port=return
    #pragma HLS INTERFACE mode=m_axi bundle=BUS_A port=out offset=direct
    #pragma HLS INTERFACE mode=m_axi bundle=BUS_B port=in1 offset=slave
    #pragma HLS INTERFACE mode=m_axi bundle=BUS_C port=in2 offset=off
  • オフセットの指定なし: INTERFACE プラグマでオフセットが指定されていない場合は、ツールで syn.interface.m_axi_offset の設定が使用されます。
    注記: グローバル syn.interface.m_axi_offset 設定が指定されており、デザインに s_axilite インタフェースがある場合は、グローバル設定は無視され、offset=slave と見なされます。
    void top(int *a) {
    #pragma HLS interface mode=m_axi port=a
    #pragma HLS interface mode=s_axilite port=a
    }