Description
The BIND_STORAGE pragma assigns a variable (array, or function argument)
in the code to a specific memory type (type
) in the RTL.
If the pragma is not specified, the Vitis HLS tool
determines the memory type to assign. The HLS tool implements the memory using specified
implementations (impl
) in the hardware.
For example, you can use the pragma to specify which memory type to use to implement an array. This lets you control whether the array is implemented as a single or a dual-port RAM for example.
-storage_type
and -storage_impl
options of the INTERFACE pragma or directive.You can also specify the latency of the implementation. For block RAMs on
the interface, the latency
option lets you model off-chip,
non-standard SRAMs at the interface, for example supporting an SRAM with a latency of 2 or
3. For internal operations, the latency
option allows the
memory to be implemented using more pipelined stages. These additional pipeline stages can
help resolve timing issues during RTL synthesis.
latency
option, the operation must have an available
multi-stage implementation. The HLS tool provides a multi-stage implementation for all block
RAMs.Syntax
Place the pragma in the C/C++ source within the body of the function where the variable is defined.
#pragma HLS bind_storage variable=<variable> type=<type>\
[ impl=<value> latency=<int> ]
Where:
-
variable=<variable>
- Defines the variable to assign the BIND_STORAGE pragma to. This is required when specifying the pragma.
-
type=<type>
- Defines the type of memory to bind to the specified variable.
-
impl=<value>
- Defines the implementation for the specified memory type. Supported
implementations include:
bram
,bram_ecc
,lutram
,uram
,uram_ecc
,srl
,memory
, andauto
as described below. -
latency=<int>
- Defines the default latency for the binding of the type. As shown in
the following table, the valid latency varies according to the specified
type
andimpl
. The default is -1, that lets Vitis HLS choose the latency.
Type | Implementation | Min Latency | Max Latency |
---|---|---|---|
FIFO | BRAM | 0 | 0 |
FIFO | LUTRAM | 0 | 0 |
FIFO | MEMORY | 0 | 0 |
FIFO | SRL | 0 | 0 |
FIFO | URAM | 0 | 0 |
RAM_1P | AUTO | 1 | 3 |
RAM_1P | BRAM | 1 | 3 |
RAM_1P | LUTRAM | 1 | 3 |
RAM_1P | URAM | 1 | 3 |
RAM_1WNR | AUTO | 1 | 3 |
RAM_1WNR | BRAM | 1 | 3 |
RAM_1WNR | LUTRAM | 1 | 3 |
RAM_1WNR | URAM | 1 | 3 |
RAM_2P | AUTO | 1 | 3 |
RAM_2P | BRAM | 1 | 3 |
RAM_2P | LUTRAM | 1 | 3 |
RAM_2P | URAM | 1 | 3 |
RAM_S2P | BRAM | 1 | 3 |
RAM_S2P | BRAM_ECC | 1 | 3 |
RAM_S2P | LUTRAM | 1 | 3 |
RAM_S2P | URAM | 1 | 3 |
RAM_S2P | URAM_ECC | 1 | 3 |
RAM_T2P | BRAM | 1 | 3 |
RAM_T2P | URAM | 1 | 3 |
ROM_1P | AUTO | 1 | 3 |
ROM_1P | BRAM | 1 | 3 |
ROM_1P | LUTRAM | 1 | 3 |
ROM_2P | AUTO | 1 | 3 |
ROM_2P | BRAM | 1 | 3 |
ROM_2P | LUTRAM | 1 | 3 |
ROM_NP | BRAM | 1 | 3 |
ROM_NP | LUTRAM | 1 | 3 |
set_directive_bind_storage
.Example
The pragma specifies that the variable coeffs
uses a single port RAM implemented on a BRAM core from the library.
#pragma HLS bind_storage variable=coeffs type=RAM_1P impl=bram
coeffs
are defined in the
RAM_1P.