Description
By default, array variables are implemented as RAM:
- Top-level function array parameters are implemented as a RAM interface port.
- General arrays are implemented as RAMs for read-write access.
- Arrays involved in sub-functions, or loop-based DATAFLOW optimizations are implemented as a RAM ping-pong buffer channel.
If the data stored in the array is consumed or produced in a sequential manner, a
more efficient communication mechanism is to use streaming data, where FIFOs are
used instead of RAMs. When an argument of the top-level function is specified as
INTERFACE type ap_fifo
, the array is automatically
implemented as streaming. See Defining Interfaces for
more information.
volatile
qualifier as described
in Type Qualifiers.Syntax
set_directive_stream [OPTIONS] <location> <variable>
-
<location>
is the location (in the formatfunction[/label]
) which contains the array variable. -
<variable>
is the array variable to be implemented as a FIFO.
Options
-
-depth <integer>
-
Note: Relevant only for array streaming in dataflow channels.By default, the depth of the FIFO implemented in the RTL is the same size as the array specified in the C code. This options allows you to modify the size of the FIFO.
When the array is implemented in a DATAFLOW region, it is common to the use the
-depth
option to reduce the size of the FIFO. For example, in aDATAFLOW
region where all loops and functions are processing data at a rate of II = 1, there is no need for a large FIFO because data is produced and consumed in each clock cycle. In this case, the-depth
option may be used to reduce the FIFO size to 2 to substantially reduce the area of the RTL design.This same functionality is provided for all arrays in a DATAFLOW region using the
config_dataflow
command with the-depth
option. The-depth
option used withset_directive_stream
overrides the default specified usingconfig_dataflow
. - -type <arg>
- Specify a mechanism to select between FIFO, PIPO,
synchronized shared (
shared
), and un-synchronized shared (unsync
). The supported types include:-
fifo
: A FIFO buffer with the specifieddepth
. -
pipo
: A regular Ping-Pong buffer, withdepth
but without a duplication of the array data. Consistency can be ensured by setting thedepth
small enough, which acts as the distance of synchronization between the producer and consumer. -
shared
: Specifies that an array local variable or argument in a given scope is viewed as a single shared memory, distributing the available ports to the processes that access it.Tip: The default depth for shared is 1. -
unsync
: Does not have any synchronization except for individual memory reads and writes. Consistency (read-write and write-write order) must be ensured by the design itself.
-
Examples
Specifies array A[10]
in function
func
to be streaming and implemented as a
FIFO.
set_directive_stream func A -type fifo
Array B in named loop loop_1
of
function func
is set to streaming with a FIFO depth
of 12. In this case, place the pragma inside loop_1
.
set_directive_stream -depth 12 -type fifo func/loop_1 B
Array C has streaming implemented as a PIPO.
set_directive_stream -type pipo func C