Vitis HLS allows array arguments to be implemented as FIFO ports in the RTL. If a FIFO ports is to be used, be sure that the accesses to and from the array are sequential. Vitis HLS conservatively tries to determine whether the accesses are sequential.
Accesses Sequential? | Vitis HLS Action |
---|---|
Yes | Implements the FIFO port. |
No |
|
Indeterminate |
|
The following code example shows a case in which Vitis HLS cannot determine whether the accesses are
sequential. In this example, both d_i
and d_o
are specified to be implemented with a FIFO
interface during synthesis.
#include "array_FIFO.h"
void array_FIFO (dout_t d_o[4], din_t d_i[4], didx_t idx[4]) {
int i;
#pragma HLS INTERFACE mode=ap_fifo port=d_i
#pragma HLS INTERFACE mode=ap_fifo port=d_o
// Breaks FIFO interface d_o[3] = d_i[2];
For_Loop: for (i=0;i<4;i++) {
d_o[i] = d_i[idx[i]];
}
}
In this case, the behavior of variable idx
determines whether or not a FIFO interface can be successfully
created.
- If
idx
is incremented sequentially, a FIFO interface can be created. - If random values are used for
idx
, a FIFO interface fails when implemented in RTL.
Because this interface might not work, Vitis HLS issues a message during synthesis and creates a FIFO interface.
@W [XFORM-124] Array 'd_i': may have improper streaming access(es).
€œ//Breaks FIFO
interface
comment in the example above, leaving the remaining portion
of the line uncommented, d_o[3] = d_i[2];
, Vitis HLS can determine that the accesses to the
arrays are not sequential, and it halts with an error message if a FIFO interface is
specified.The following general rules apply to arrays that are implemented with a FIFO interface:
- The array must be written and read in only one loop or function. This can be transformed into a point-to-point connection that matches the characteristics of FIFO links.
- The array reads must be in the same order as the array write. Because random access is not supported for FIFO channels, the array must be used in the program following first in, first out semantics.
- The index used to read and write from the FIFO must be analyzable at compile time. Array addressing based on runtime computations cannot be analyzed for FIFO semantics and prevent the tool from converting an array into a FIFO.
Code changes are generally not required to implement or optimize arrays in the top-level interface. The only time arrays on the interface may need coding changes is when the array is part of a struct.