描述
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 | 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 |
提示: FIFO 含 0 时延表示:
- 在 FIFO 输出上的读取数据可用的同一周期内,读取输入处于活动状态。
- 在 FIFO 输入接受写入数据的同一个周期内,写入输入处于活动状态。
以先写后读时延为例,写入数据完成后经过若干周期之后方可从 FIFO 读取该数据,此周期数只能通过以下方式来全局配置:config_storage fifo -read_after_write_latency
N
重要: 上表中未列出的存储器类型与实现的任意组合均不受
set_directive_bind_storage 支持。示例
该编译指示指定 coeffs 变量使用来自库的 BRAM 核上实现的单端口 RAM。
#pragma HLS bind_storage variable=coeffs type=RAM_1P impl=bram
提示: 在 RAM_1P 中定义 RTL 中创建的用于访问
coeffs 值的端口。