Streams are modeled as an infinite queue in software (and in the test bench during RTL co-simulation). There is no need to specify any depth to simulate streams in C++. Streams can be used inside functions and on the interface to functions. Internal streams may be passed as function parameters.
Streams can be used only in C++ based designs. Each
hls::stream<>
object must be written by a single process and read by a single
process.
If an hls::stream
is used
on the top-level interface in the Vivado IP flow it is implemented in the
RTL as a FIFO interface (ap_fifo
) by default, but can be optionally implemented
as an AXI4-Stream interface
(axis
). In the
Vitis kernel
flow it is by default implemented as an AXI4-Stream interface (axis
).
If an hls::stream
is
used inside the design function and synthesized into hardware,
it is implemented as a FIFO with a default depth of 2. In some
cases, such as when interpolation is used, the depth of the FIFO
might have to be increased to ensure the FIFO can hold all the
elements produced by the hardware. Failure to ensure the FIFO is
large enough to hold all the data samples generated by the
hardware can result in a stall in the design (seen in C/RTL
co-simulation and in the hardware implementation). The depth of
the FIFO can be adjusted using the STREAM directive with the
depth
option. An
example of this is provided in the example design
hls_stream.
hls::stream
variables are correctly sized when used in the default
non-DATAFLOW regions.If an hls::stream
is
used to transfer data between tasks (sub-functions or loops),
you should immediately consider implementing the tasks in a
DATAFLOW region where data streams from one task to the next.
The default (non-DATAFLOW) behavior is to complete each task
before starting the next task, in which case the FIFOs used to
implement the hls::stream
variables must be sized to ensure they are large enough to hold
all the data samples generated by the producer task. Failure to
increase the size of the hls::stream
variables results in the error
below:
ERROR: [XFORM 203-733] An internal stream xxxx.xxxx.V.user.V' with default size is
used in a non-dataflow region, which may result in deadlock. Please consider to
resize the stream using the directive 'set_directive_stream' or the 'HLS stream'
pragma.
This error informs you that in a non-DATAFLOW region, the default FIFOs depth of 2 may not be large enough to hold all the data samples written to the FIFO by the producer task, and deadlock may occur.