サイド チャネルを持たない AXI4-Stream のインスタンス (たとえば hls::stream<ap_axiu<32, 0, 0, 0>>
) は、インターフェイス上で次のような RTL 信号になります。
-
TVALID
-
TREADY
-
TDATA[ ]
-
TLAST[ ]
-
TKEEP[ ]
-
TSTRB[ ]
これらの信号の一部 (TLAST
、TKEEP
および TSTRB
) は、デザイン上不要なことがあります。また、モデラーが TUSER
を使ってデータを移動するため、TDATA
が必要ないユース ケースもあります。これらの追加のユース ケースをサポートするために、hls::axis<T>
定義では次のオプションがサポートされます。
template <typename T,
std::size_t WUser = 0,
std::size_t WId = 0,
std::size_t WDest = 0,
uint8_t EnableSignals = (AXIS_ENABLE_KEEP |
AXIS_ENABLE_LAST |
AXIS_ENABLE_STRB),
bool StrictEnablement = false>
struct axis {
// members
T data;
ap_uint<bytesof<T>> strb;
ap_uint<bytesof<T>> keep;
ap_uint<WUser> user;
ap_uint<WId> id;
ap_uint<WDest> dest;
ap_uint<1> last;
// get_* methods
…
// set_* methods
…
};
EnableSignals
と StrictEnablement
フィールドでは、特別なマクロを使用して、3 つの信号 (TKEEP
、TLAST
, TSTRB
) のどれをデザインに表示するかを指定できます。次は、すべてのマクロのリストを示しています。
// Enablement for axis signals
#define AXIS_ENABLE_DATA 0b00000001
#define AXIS_ENABLE_DEST 0b00000010
#define AXIS_ENABLE_ID 0b00000100
#define AXIS_ENABLE_KEEP 0b00001000
#define AXIS_ENABLE_LAST 0b00010000
#define AXIS_ENABLE_STRB 0b00100000
#define AXIS_ENABLE_USER 0b01000000
// Disablement mask for DATA axis signals
#define AXIS_DISABLE_DATA (0b11111111 ^ AXIS_ENABLE_DATA) & \
(0b11111111 ^ AXIS_ENABLE_KEEP) & \
(0b11111111 ^ AXIS_ENABLE_STRB)
// Enablement/disablement of all axis signals
#define AXIS_ENABLE_ALL 0b01111111
#define AXIS_DISABLE_ALL 0b00000000
ヒント: これらのマクロは、仕様が不完全なケースを特定するためのエラー チェックも可能にします。
特定のサイド チャンネル信号を有効または無効にできるだけでなく、マクロのセットが拡張されて、信号の all
または none
を指定できるようになります。これによって、特別な hls::axis_data<>
と hls::axis_user<>
ヘルパー クラスが定義され、正確な信号仕様を選びやすくなりました。これらの特別なヘルパー クラスの定義は、次のとおりです。
// Struct: axis_data (alternative to axis)
// DATA signal always enabled
// All other signals are optional, disabled by default
template <typename TData,
uint8_t EnableSignals = AXIS_ENABLE_DATA,
std::size_t WUser = 0,
std::size_t WId = 0,
std::size_t WDest = 0,
bool StrictEnablement = true>
using axis_data = axis<TData, WUser, WId, WDest,
(EnableSignals | AXIS_ENABLE_DATA),
StrictEnablement>;
// Struct: axis_user (alternative to axis)
// USER signal always enabled
// DATA signal always disabled
// All other signals are optional, disabled by default
template <std::size_t WUser,
uint8_t EnableSignals = AXIS_ENABLE_USER,
std::size_t WId = 0,
std::size_t WDest = 0,
bool StrictEnablement = true>
using axis_user = axis<void, WUser, WId, WDest,
(EnableSignals & AXIS_DISABLE_DATA),
StrictEnablement>;
次のユース ケースは、AXI4-Stream インターフェイスに関連する信号をカスタマイズするさまざまなオプションを示しています。
// Allow user to control existence of TKEEP, TSTRB and TLAST by template parameter `EnableSideChannels`
// Enable only TKEEP
using data_t = hls::axis<int, 0, 0, 0, AXIS_ENABLE_KEEP>; Or using data_t = hls::axis_data<int, AXIS_ENABLE_KEEP>
// Enable two channels TKEEP and TLAST
using data_t = hls::axis_data<int, AXIS_ENABLE_KEEP|AXIS_ENABLE_LAST>;
// Disable all side-channels
using data_t = hls::axis_data<int, AXIS_DISABLE_ALL>;
// Enable all side-channels
using data_t = hls::axis_data<int, AXIS_ENABLE_ALL, 4, 2, 3>;
// Error case: All signals enabled but zero size specified for WUser/WId/WDest
using data_t = hls::axis_data<int, AXIS_ENABLE_ALL>;
// Allow user to control existence of TDATA by specifying template parameter `T` with `void` type
// and only use TUSER channel
using data_t = hls::axis<void, 5, 0, 0, AXIS_DISABLE_ALL>; Or using data_t = hls::axis_user<5>
// Use default enabling of TDATA, TKEEP, TSTRB and TLAST
using data_t = hls::axis<int>;