If your design requires a streaming interface, lets first start with defining and using a streaming data structure like hls::stream in Vitis HLS. This simple object encapsulates the requirements of streaming and its streaming interface is by default implemented in the RTL as a FIFO interface (ap_fifo) but can be optionally, implemented as a handshake interface (ap_hs) or an AXI4-Stream interface (axis). Refer to Vitis-HLS-Introductory-Examples/Interface/Streaming on Github for different examples of streaming interfaces.
If a AXI4-Stream interface (axis) is specified via the interface pragma mode option, the interface implementation will mimic the style of an AXIS interface by defining the TDATA, TVALID and TREADY signals.
If a more formal AXIS implementation is desired, then Vitis HLS requires the usage of a special data type (hls::axis defined in ap_axi_sdata.h) to encapsulate the requirements of the AXI4-Stream protocol and implement the special RTL signals needed for this interface.
The AXI4-Stream interface is implemented as a struct type in Vitis HLS and has the following signature (defined in ap_axi_sdata.h):
template <typename T, size_t WUser, size_t WId, size_t WDest> struct axis { .. };
Where:
-
T
- The data type to be streamed. Tip: This can support any data type, including
ap_fixed
. -
WUser
- Width of the TUSER signal
-
WId
- Width of the TID signal
-
WDest
- Width of the TDest signal
When the stream data type (T
) are simple
integer types, there are two predefined types of AXI4-Stream implementations available:
- A signed implementation of the AXI4-Stream class (or more simply
ap_axis<Wdata, WUser, WId, WDest>
)hls::axis<ap_int<WData>, WUser, WId, WDest>
- An unsigned implementation of the AXI4-Stream class (or more simply
ap_axiu<WData, WUser, WId, WDest>
)hls::axis<ap_uint<WData>, WUser, WId, WDest>
The value specified for the WUser
,
WId
, and WDest
template parameters controls the usage of side-channel signals in the AXI4-Stream interface.
When the hls::axis
class is used, the
generated RTL will typically contain the actual data signal TDATA
, and the following additional signals: TVALID
, TREADY
, TKEEP
, TSTRB
, TLAST
, TUSER
, TID
, and TDEST
.
TVALID
, TREADY
, and TLAST
are necessary control
signals for the AXI4-Stream protocol. TKEEP
, TSTRB
, TUSER
, TID
, and TDEST
signals are optional special signals that can be
used to pass around additional bookkeeping data.
WUser
, WId
, and WDest
are set to 0, the generated RTL will not include the optional
TUSER
, TID
, and
TDEST
signals in the interface.