M_AXI バンドル - 2023.2 日本語

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

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 日本語

Vitis Unified IDE および v++ コマンドでは、互換性のあるオプションを使用する関数引数が 1 つの m_axi インターフェイス アダプターにまとめられます。ポートを 1 つのインターフェイスにグループ化すると、AXI ロジックを削減することにより FPGA リソースを節約できますが、すべてのメモリ転送が 1 つのインターフェイスを通過する必要があるので、カーネルのパフォーマンスが制限される可能性があります。m_axi インターフェイスには独立した読み出しチャネルと書き込みチャネルがあるので、1 つの場所に対してであれば、1 つのインターフェイスで読み出しと書き込みを同時に実行できます。複数のバンドルを使用すると、複数のメモリ バンクに接続するために複数のインターフェイスが作成されるので、カーネルの帯域幅とスループットを増加できます。

次の例では、インターフェイス オプションの bundle=BUS_A を使用してすべてのポインター引数が 1 つの m_axi アダプターにグループ化され、m_axi オフセット、スカラー引数 size、および関数 return に対して s_axilite が 1 つ追加されます。

extern "C" {
void vadd(const unsigned int *in1, // Read-Only Vector 1
          const unsigned int *in2, // Read-Only Vector 2
          unsigned int *out,     // Output Result
          int size                 // Size in integer
          ) {
 
#pragma HLS INTERFACE mode=m_axi bundle=BUS_A port=out
#pragma HLS INTERFACE mode=m_axi bundle=BUS_A port=in1
#pragma HLS INTERFACE mode=m_axi bundle=BUS_A port=in2
#pragma HLS INTERFACE mode=s_axilite port=in1
#pragma HLS INTERFACE mode=s_axilite port=in2
#pragma HLS INTERFACE mode=s_axilite port=out
#pragma HLS INTERFACE mode=s_axilite port=size
#pragma HLS INTERFACE mode=s_axilite port=return
図 1. MAXI および S_AXILITE

また、次のコードに示すように、関数引数を個別のインターフェイス アダプターにまとめることもできます。ここでは引数 in2bundle=BUS_B により別のインターフェイス アダプターにグループ化されます。これにより、ポート in2 に新しい m_axi インターフェイス アダプターが作成されます。

extern "C" {
void vadd(const unsigned int *in1, // Read-Only Vector 1
          const unsigned int *in2, // Read-Only Vector 2
          unsigned int *out,     // Output Result
          int size                 // Size in integer
          ) {
 
#pragma HLS INTERFACE mode=m_axi bundle=BUS_A port=out
#pragma HLS INTERFACE mode=m_axi bundle=BUS_A port=in1
#pragma HLS INTERFACE mode=m_axi bundle=BUS_B port=in2
#pragma HLS INTERFACE mode=s_axilite port=in1
#pragma HLS INTERFACE mode=s_axilite port=in2
#pragma HLS INTERFACE mode=s_axilite port=out
#pragma HLS INTERFACE mode=s_axilite port=size
#pragma HLS INTERFACE mode=s_axilite port=return
図 2. 2 つの MAXI バンドル

バンドルの規則

グローバル コンフィギュレーション コマンド syn.interface.m_axi_auto_max_ports=false を使用すると、インターフェイス バンドルの数を必要最小限に制限できます。これにより、互換性のあるポートが 1 つの m_axi インターフェイスにグループ化できます。このコマンドはデフォルトではディスエーブル (false) になっていますが、イネーブルにすると、各ポートに個別の m_axi アダプターを作成して帯域幅を最大限にできます。

m_axi_auto_max_ports をディスエーブルにすると、バンドルは次のように処理されます。

  1. デフォルト バンドル名: バンドル名が指定されていないすべてのインターフェイス ポートは、デフォルトの bundle=<default> という名前で 1 つの m_axi インターフェイス ポートにまとめられ、RTL ポートの名前は m_axi_<default> になります。プラグマを次のように設定したとします。
    #pragma HLS INTERFACE mode=m_axi port=a depth=50 
    #pragma HLS INTERFACE mode=m_axi port=a depth=50
    #pragma HLS INTERFACE mode=m_axi port=a depth=50 
    

    これにより、次のメッセージが表示されます。

    INFO: [RTGEN 206-500] Setting interface mode on port 'example/gmem' to 'm_axi'.
    INFO: [RTGEN 206-500] Setting interface mode on port 'example/gmem' to 'm_axi'.
    INFO: [RTGEN 206-500] Setting interface mode on port 'example/gmem' to 'm_axi'.
    
  2. ユーザー指定バンドル名: 同じユーザー指定名 bundle=<string> が指定されたすべてのインターフェイス ポートが 1 つの m_axi インターフェイス ポートにグループ化され、RTL ポートの名前は m_axi_<string> になります。bundle が指定されていないポートは、先ほど説明したようにデフォルト バンドルにグループ化されます。プラグマを次のように設定したとします。
    #pragma HLS INTERFACE mode=m_axi port=a depth=50 bundle=BUS_A
    #pragma HLS INTERFACE mode=m_axi port=b depth=50
    #pragma HLS INTERFACE mode=m_axi port=c depth=50
    

    これにより、次のメッセージが表示されます。

    INFO: [RTGEN 206-500] Setting interface mode on port 'example/BUS_A' to 'm_axi'.
    INFO: [RTGEN 206-500] Setting interface mode on port 'example/gmem' to 'm_axi'.
    INFO: [RTGEN 206-500] Setting interface mode on port 'example/gmem' to 'm_axi'.
    
    重要: 互換性のないインターフェイスをまとめると、メッセージが表示され、バンドル設定は無視されます。