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
また、次のコードに示すように、関数引数を個別のインターフェイス アダプターにまとめることもできます。ここでは引数 in2
が bundle=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
バンドルの規則
グローバル コンフィギュレーション コマンド syn.interface.m_axi_auto_max_ports=false
を使用すると、インターフェイス バンドルの数を必要最小限に制限できます。これにより、互換性のあるポートが 1 つの m_axi
インターフェイスにグループ化できます。このコマンドはデフォルトではディスエーブル (false) になっていますが、イネーブルにすると、各ポートに個別の m_axi
アダプターを作成して帯域幅を最大限にできます。
m_axi_auto_max_ports
をディスエーブルにすると、バンドルは次のように処理されます。
-
デフォルト バンドル名: バンドル名が指定されていないすべてのインターフェイス ポートは、デフォルトの
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'.
- ユーザー指定バンドル名: 同じユーザー指定名
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'.
重要: 互換性のないインターフェイスをまとめると、メッセージが表示され、バンドル設定は無視されます。