S_AXILITE の例 では、INTERFACE プラグマの bundle=BUS_A
オプションが指定されたすべての関数引数が 1 つの s_axilite
インターフェイス アダプターにグループ化されます。bundle
オプションを使用すると、複数のポートを 1 つのインターフェイスにまとめることができます。
Vitis カーネル フローでは通常、ツールにより
s_axi_control
という名前が付けられた 1 つのインターフェイス バンドルのみを使用する必要があります。そのため、このフローでは bundle
オプションは指定しないでください。指定すると、合成中にエラーが発生します。Vivado IP フローでは、s_axilite
インターフェイスを使用して複数のバンドルを指定できます。これにより、定義したバンドルごとに個別のインターフェイス アダプターが作成されます。次に、この例を示します。void example(char *a, char *b, char *c)
{
#pragma HLS INTERFACE mode=s_axilite port=a bundle=BUS_A
#pragma HLS INTERFACE mode=s_axilite port=b bundle=BUS_A
#pragma HLS INTERFACE mode=s_axilite port=c bundle=OUT
#pragma HLS INTERFACE mode=s_axilite port=return bundle=BUS_A
#pragma HLS INTERFACE mode=ap_vld port=b
*c += *a + *b;
}
合成が完了すると、Synthesis Summary レポートには生成された s_axilite
アダプターの数に関するフィードバックが表示されます。レポートの SW-to-HW Mapping セクションには、制御レジスタのオフセットと各ポートのアドレス範囲を示す HW 情報が含まれます。
ただし、s_axilite
インターフェイスでのバンドルの使用に関するいくつかの規則があります。
- デフォルト バンドル名: バンドル名が指定されていないすべてのインターフェイス ポートは、 1 つの AXI4-Lite インターフェイス ポートにまとめられてツールのデフォルト バンドル名が使用され、RTL ポートの名前は
s_axi_<default>
(通常s_axi_control
) になります。この例では、すべてのポートがデフォルト バンドルにマップされます。void top(char *a, char *b, char *c) { #pragma HLS INTERFACE mode=s_axilite port=a #pragma HLS INTERFACE mode=s_axilite port=b #pragma HLS INTERFACE mode=s_axilite port=c *c += *a + *b; }
- ユーザー指定バンドル名: 同じ
bundle
名が指定されたすべてのインターフェイス ポートが 1 つの AXI4-Lite インターフェイス ポートにまとめられ、RTL ポートの名前がs_axi_<string>
になります。次の例では、s_axi_BUS_A
、s_axi_BUS_B
、およびs_axi_OUT
という名前のインターフェイスが生成されます。void example(char *a, char *b, char *c) { #pragma HLS INTERFACE mode=s_axilite port=a bundle=BUS_A #pragma HLS INTERFACE mode=s_axilite port=b bundle=BUS_B #pragma HLS INTERFACE mode=s_axilite port=c bundle=OUT #pragma HLS INTERFACE mode=s_axilite port=return bundle=OUT #pragma HLS INTERFACE mode=ap_vld port=b *c += *a + *b; }
- 部分的に指定されたバンドル名: 一部の引数に
bundle
名を指定し、残りの引数に名前を指定しない場合、引数は次のようにまとめられます。- INTERFACE プラグマでバンドル名が指定されたすべてのポートがグループ化されます。
- バンドル名が指定されていないポートがデフォルト名のバンドルにグループ化されます。デフォルト名は、標準ツール デフォルト名か、またはユーザーがツールのデフォルト名を指定している場合は代替のデフォルト名になります。
次の例では、ユーザーがツールのデフォルト名である
bundle=control
を指定しています。この場合、ポート c はユーザーが指定したs_axi_control
に割り当てられ、残りのポートは代替のデフォルト名であるs_axi_control_r
にまとめられます。void top(char *a, char *b, char *c) { #pragma HLS INTERFACE mode=s_axilite port=a #pragma HLS INTERFACE mode=s_axilite port=b #pragma HLS INTERFACE mode=s_axilite port=c bundle=control }