The stable
pragma can be used to mark input or output variables of a dataflow
region. Its effect is to remove their corresponding task-level synchronizations,
assuming that the user guarantees this removal is indeed correct.
void dataflow_region(int A[...], ...
#pragma HLS stable variable=A
#pragma HLS dataflow
proc1(...);
proc2(A, ...);
Without the stable
pragma, and assuming that A
is read
by proc2
, then proc2
would be part of the initial
synchronization for the dataflow region where it is located. This means that
proc1
would not restart until proc2
is also ready
to start again, which would prevent dataflow iterations to be overlapped and induce a
possible loss of performance. The stable
pragma indicates that this
synchronization is not necessary to preserve correctness.
With the stable
pragma, the compiler assumes that:
- If
A
is read byproc2
, then the memory locations that are read are still accessible and will not be overwritten by any other process or calling context, while thedataflow_region
is being executed. - If
A
is written byproc2
, then the memory locations written will not be read, before their definition, by any other process or calling context, whiledataflow_region
is being executed.
A typical scenario is when the caller updates or reads these variables only when the dataflow region has not started yet or has completed execution.
In summary, the Dataflow optimization is a powerful optimization that can significantly improve the throughput of your design. As there is reliance on the HLS tool to do the inference of the available parallelism in your design, it requires the designer's help to ensure that the code is written in such a way that the inference is straightforward for the HLS tool. Finally, there will be situations where the designer might see the need to deploy both the Dataflow model and the Task-Channel model in the same design. The next section describes this hybrid combination model that can lead to some interesting designs.