描述
BIND_STORAGE 编译指示用于将代码中的变量(阵列或函数实参)分配给 RTL 中的特定存储器类型 (type
)。如果不指定此编译指示,那么 Vitis HLS 工具会判定要分配的存储器类型。HLS 工具在硬件中使用指定的实现 (impl
) 来实现该存储器。
例如,您可使用此编译指示来指定要用于实现阵列的存储器类型。例如,这样您即可控制阵列是作为单端口 RAM 还是作为双端口 RAM 来实现。
重要: 此功能特性对于顶层函数接口上的阵列尤为重要,因为与阵列关联的存储器类型可用于判定 RTL 中所需的端口数量和类型,如 接口上的阵列 中所述。但对于分配给顶层函数实参的变量,您必须使用 INTERFACE 编译指示或指令的
-storage_type
选项和 -storage_impl
选项来分配存储器类型和实现。您还可以指定实现的时延。对于接口上的块 RAM,latency
选项允许您对接口上的片外非标准 SRAM 进行建模,例如,用于支持时延为 2 或 3 的 SRAM。对于内部运算,latency
选项允许使用多个流水打拍阶段来实现存储器。这些附加的流水线阶段可帮助解决 RTL 综合期间的时序问题。
重要: 要使用
latency
选项,运算必须具有 1 个可用的多阶段实现。HLS 工具可以为所有块 RAM 提供多阶段实现。语法
将 C/C++ 源代码中的编译指示置于定义变量的函数体内。
#pragma HLS bind_storage variable=<variable> type=<type>\
[ impl=<value> latency=<int> ]
其中:
-
variable=<variable>
- 定义要将 BIND_STORAGE 编译指示分配到的变量。指定编译指示时,此变量是必需的。
-
type=<type>
- 定义要绑定到指定变量的存储器的类型。
-
impl=<value>
- 定义指定存储器类型的实现。受支持的实现包括:
bram
、bram_ecc
、lutram
、uram
、uram_ecc
、srl
、memory
和auto
,如下所述。 -
latency=<int>
- 定义用于绑定类型的默认时延。如下表所示,有效的时延值因指定的
type
和impl
而异。默认值为 -1,即交由 Vitis HLS 选择时延。
类型 | 实现 | 最小时延 | 最大时延 |
---|---|---|---|
FIFO | BRAM | 1 | 4 |
FIFO | LUTRAM | 1 | 4 |
FIFO | MEMORY | 1 | 4 |
FIFO | SRL | 1 | 4 |
FIFO | URAM | 1 | 4 |
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
支持。示例
该编译指示指定 coeffs
变量使用来自库的 BRAM 核上实现的单端口 RAM。
#pragma HLS bind_storage variable=coeffs type=RAM_1P impl=bram
提示: 在 RAM_1P 中定义 RTL 中创建的用于访问
coeffs
值的端口。