Description
All operations are performed sequentially in a C/C++ description. In
the absence of any directives that limit resources (such as set_directive_allocation
), Vitis HLS seeks to minimize latency and improve concurrency. Data dependencies can limit
this. For example, functions or loops that access arrays must finish all read/write
accesses to the arrays before they complete. This prevents the next function or loop
that consumes the data from starting operation.
However, it is possible for the operations in a function or loop to
start operation before the previous function or loop completes all its operations.
syn.directive.dataflow
specifies that dataflow optimization be
performed on the functions or loops, improving the concurrency of the RTL
implementation. When syn.directive.dataflow
is specified, the HLS
tool analyzes the dataflow between sequential functions or loops and creates
channels (based on ping-pong RAMs or FIFOs) that allow consumer functions or loops
to start operation before the producer functions or loops have completed. This
allows functions or loops to operate in parallel, which decreases latency and
improves the throughput of the RTL.
syn.dataflow.xxx
command specifies the default memory
channel and FIFO depth used by syn.directive.dataflow
as explained
in Dataflow Configuration.If no initiation interval (number of cycles between the start of one
function or loop and the next) is specified, Vitis HLS attempts to minimize the initiation interval and start
operation as soon as data is available. For the DATAFLOW optimization to work, the
data must flow through the design from one task to the next. The following coding
styles prevent the HLS tool from performing the DATAFLOW
optimization.
- Single-producer-consumer violations
- Feedback between tasks
- Conditional execution of tasks
- Loops with multiple exit conditions
Finally, the DATAFLOW optimization has no hierarchical implementation. If a sub-function or loop contains additional tasks that might benefit from the DATAFLOW optimization, you must apply the optimization to the loop and the sub-function, or inline the sub-function.
Syntax
syn.directive.dataflow=<location> disable_start_propagation
-
<location>
is the location (in the formatfunction[/label]
) at which dataflow optimization is to be performed. -
disable_start_propagation
disables the creation of a start FIFO used to propagate a start token to an internal process. Such FIFOs can sometimes be a bottleneck for performance.
Examples
Specifies DATAFLOW optimization within function foo
.
syn.directive.dataflow=foo