The INTERFACE pragma or directive lets you explicitly define which type of RAM or
ROM is used with the storage_type=<value>
option. This defines which ports are created (single-port or dual-port). If no
storage_type
is specified the tool uses:
- A single-port RAM by default.
- A dual-port RAM if it reduces the initiation interval or reduces latency.
The ARRAY_PARTITION and ARRAY_RESHAPE pragmas can re-configure arrays on the interface. Arrays can be partitioned into multiple smaller arrays, each implemented with its own interface. This includes the ability to completely partition the array into a set of scalars. On the function interface, this results in a unique port for every element in the array. This provides maximum parallel access, but creates many more ports and might introduce routing issues during hardware implementation.
By default, the array arguments in the function shown in the following code example are synthesized into a single-port RAM interface.
#include "array_RAM.h"
void array_RAM (dout_t d_o[4], din_t d_i[4], didx_t idx[4]) {
int i;
For_Loop: for (i=0;i<4;i++) {
d_o[i] = d_i[idx[i]];
}
}
A single-port RAM interface is used because the for-loop
ensures that only one element can be read and written in each
clock cycle. There is no advantage in using a dual-port RAM interface. If the
for-loop is unrolled, Vitis HLS uses a dual-port
RAM. Doing so allows multiple elements to be read at the same time and improves the
initiation interval. The type of RAM interface can be explicitly set by applying the
INTERFACE pragma or directive, and setting the storage_type
.
Issues related to arrays on the interface are typically related to throughput.
For example, if the arrays in the example above are partitioned into individual
elements, and the for-loop
is unrolled, all four
elements in each array are accessed simultaneously.
You can also use the INTERFACE pragma or directive to specify the latency of the
RAM, using the latency=<value>
option. This
lets the tool model external SRAMs with a latency greater than 1 at the
interface.