Vitis Unified IDE および v++
コマンドでは、Vivado IP または Vitis カーネルを制御する制御レジスタ マップと、s_axilite
インターフェイスにグループ化されたポートが自動的に生成されます。生成された RTL ファイルに追加されるこのレジスタ マップは、次の 2 つのセクションに分けることができます。
- ブロック レベル制御信号
-
s_axilite
インターフェイスにマップされる関数引数
Vitis カーネル フローでは、デフォルトのブロック プロトコルは ap_ctrl_chain
で、s_axilite
インターフェイスに割り当てられます。このデフォルト設定は変更しないでください。
ただし、Vivado IP フローでは、デフォルトのブロック制御プロトコルは ap_ctrl_hs
で、Vivado IP フローのインターフェイス に示すように、それ独自のインターフェイスに割り当てられます。IP で s_axilite
インターフェイスを使用している場合は、次の例のように INTERFACE プラグマを使用して、ブロック制御プロトコルをそのインターフェイスに割り当てることもできます。
#pragma HLS INTERFACE mode=s_axilite port=return
次のように INTERFACE プラグマまたは指示子を使用しても、ブロック制御プロトコルを変更できます。
#pragma HLS INTERFACE mode=ap_ctrl_chain port=return
s_axilite
インターフェイスの制御レジスタ マップでは、Vitis HLS により、ブロック レベル プロトコル、割り込み、メールボックス、および割り込み制御用にアドレス 0x00
~ 0x18
を予約されます。0x18 は、次のようにカウントされた自動再起動およびメールボックスがイネーブルになっている場合のみです。
アドレス | 説明 |
---|---|
0x00 | 制御信号 |
0x04 | グローバル割り込みイネーブル レジスタ |
0x08 | IP 割り込みイネーブル レジスタ (読み出し/書き込み) |
0x0c | IP 割り込みステータス レジスタ (読み出し/TOW) |
0x10 | 自動再起動カウンター (書き込みで、カウントされた自動再開がある場合にのみ存在) |
0x14 | 入力メールボックスの書き込み (読み出し/書き込みで、入力メールボックスがイネーブルの場合にのみ存在) |
0x18 | 出力メールボックスの読み出し (読み出し/書き込みで、出力メールボックスがイネーブルの場合にのみ存在) |
制御信号 (0x00) には、ap_start
、ap_done
、ap_ready
、および ap_idle
が含まれ、ap_ctrl_chain
ブロック プロトコルの場合は、ap_continue
も含まれます。これらは、s_axilite
アダプターを介してアクセスされるブロック レベル インターフェイスです。
ブロック演算を開始するには、制御レジスタの ap_start
ビットを 1 に設定する必要があります。次に HLS エンジンがレジスタから AXI4-Lite スレーブ インターフェイスにまとめられた入力を読み出します。
ブロックの演算が終了すると、ハードウェアの出力ポートにより ap_done
、ap_idle
、および ap_ready
が設定され、s_axilite
インターフェイスにまとめられた出力ポートの結果が適切なレジスタから読み出されます。
関数引数に対しては、s_axilite
インターフェイスに割り当てられている各引数またはポートのアドレスが自動的に割り当てられます。各ポートには、0x10
から開始するオフセットが割り当てられます。これより下位のアドレスは、制御信号用に予約されています。ポートに割り当てられるサイズ (アドレス範囲) は、引数のデータ型および使用されるポート プロトコルにより決定されます。
AXI4-Lite インターフェイスにまとめられた変数は関数引数であり、C コードではデフォルト値がないので、s_axilite
インターフェイスのどの引数レジスタにもデフォルト値を割り当てることはできません。レジスタは config_rtl
コマンドを使用するとリセットを付けてインプリメントできますが、それ以外のデフォルト値を割り当てることはできません。
ap_ctrl_chain
ブロック プロトコルに対して Vitis HLS で生成される制御レジスタ マップは、次のとおりです。
...
//------------------------Address Info-------------------
// 0x00 : Control signals
// bit 0 - ap_start (Read/Write/COH)
// bit 1 - ap_done (Read)
// bit 2 - ap_idle (Read)
// bit 3 - ap_ready (Read/COR)
// bit 4 - ap_continue (Read/Write/SC)
// bit 7 - auto_restart (Read/Write)
// bit 9 - interrupt (Read)
// others - reserved
// 0x04 : Global Interrupt Enable Register
// bit 0 - Global Interrupt Enable (Read/Write)
// others - reserved
// 0x08 : IP Interrupt Enable Register (Read/Write)
// bit 0 - enable ap_done interrupt (Read/Write)
// bit 1 - enable ap_ready interrupt (Read/Write)
// others - reserved
// 0x0c : IP Interrupt Status Register (Read/TOW)
// bit 0 - ap_done (Read/TOW)
// bit 1 - ap_ready (Read/TOW)
// others - reserved
// 0x10 : Data signal of a
// bit 7~0 - a[7:0] (Read/Write)
// others - reserved
// 0x14 : reserved
// 0x18 : Data signal of b
// bit 7~0 - b[7:0] (Read/Write)
// others - reserved
// 0x1c : reserved
// 0x20 : Data signal of c_i
// bit 7~0 - c_i[7:0] (Read/Write)
// others - reserved
// 0x24 : reserved
// 0x28 : Data signal of c_o
// bit 7~0 - c_o[7:0] (Read)
// others - reserved
// 0x2c : reserved
// (SC = Self Clear, COR = Clear on Read, TOW = Toggle on Write, COH = Clear on Handshake)
...