重要:
Vitis カーネル フローでは、デフォルトの動作モードは offset=slave であり、変更すべきではありません。Vivado IP フローでもデフォルトは offset=slave ですが、これは変更できます。
AXI4 マスター インターフェイスには、特定のアドレスに対して読み出し/書き込みを実行するのに使用可能な読み出し/書き込みアドレス チャネルがあります。デフォルトでは、m_axi
インターフェイスはすべての読み出しおよび書き込み操作をアドレス 0x00000000
から開始します。たとえば、次のコードの場合、50 個のアドレス値を表すアドレス 0x00000000
~ 0x000000C7
(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 フローの両方でデフォルトです。動作のフローは次のとおりです。- ホスト/CPU が、
s_axilite
アダプターにマップされたブロック レベル制御プロトコルを使用して IP またはカーネルを開始します。 - ホストが
s_axilite
アダプターを介してm_axi
インターフェイスのアドレス オフセットを送信します。 -
m_axi
アダプターは、s_axilite
アダプターから開始アドレスを読み出し、キューに格納します。 - HLS デザインがグローバル メモリからデータを読み出し始めます。
- ホスト/CPU が、
次の図に示すように、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 }