描述
Vitis HLS 在代码中使用特定存储器资源(或类型)来分配阵列。该工具会自动判定要使用的资源。或者,您也可以定义 syn.storage 来笼统指定存储器类型,如 存储配置 所述。
syn.directive.bind_storage 命令用于将代码中的特定变量(阵列或函数实参)分配到 RTL 中的特定存储器类型 (type)。例如,您可使用 syn.directive.bind_storage 命令指定用于阵列变量的存储器的类型以及要使用的实现。您可控制此阵列是作为单端口 RAM 还是双端口 RAM 来实现。
重要: 该功能特性对于顶层函数接口上的阵列非常重要。与阵列关联的存储器类型用于判定 RTL 中所需端口的数量和类型。请参阅
Vitis 高层次综合用户指南(UG1399) 的“接口上的阵列”章节。对于分配给顶层函数实参的变量,您必须使用
syn.directive.interface 的 storage_type 选项和 storage_impl 选项来分配存储器类型和实现。您也可使用 syn.directive.bind_storage 的 latency 选项来指定实现的时延。对于接口上的块 RAM,latency 选项允许您对接口上的片外非标准 SRAM 进行建模。例如,针对时延为 2 或 3 的 SRAM 的建模支持。对于内部运算,latency 选项允许使用多个流水打拍阶段来实现运算。这些附加的流水线阶段可帮助解决 RTL 综合期间的时序问题。
重要: 要使用
latency 选项,存储器必须具有 1 个可用的多阶段实现。HLS 工具可以为所有块 RAM 提供多阶段实现。语法
syn.directive.bind_storage=[OPTIONS] <location> <variable>
-
<location>是包含变量的位置(格式为function[/label])。 -
<variable>是要分配的变量。提示: 如果变量是顶层函数实参,则使用syn.directive.interface的storage_type选项和storage_impl选项。
选项
-
type=<value> - 定义要绑定到指定变量的存储器的类型。
-
impl=<value> - 定义指定存储器类型的实现。受支持的实现包括:
bram、bram_ecc、lutram、uram、uram_ecc、srl、memory和auto,如下所述。 -
latency=<int> - 定义用于将存储类型绑定到实现的默认时延。有效的时延值因指定的
type和impl而异。默认值为 -1,即交由 Vitis HLS 选择时延。
| 类型 | 实现 | 最小时延 | 最大时延 |
|---|---|---|---|
| FIFO | BRAM | 1 | 5 |
| FIFO | LUTRAM | 1 | 5 |
| FIFO | MEMORY | 1 | 5 |
| FIFO | SRL | 1 | 5 |
| FIFO | URAM | 1 | 5 |
| RAM_1P | AUTO | 1 | 5 |
| RAM_1P | BRAM | 1 | 5 |
| RAM_1P | LUTRAM | 1 | 5 |
| RAM_1P | URAM | 1 | 5 |
| RAM_1WNR | AUTO | 1 | 5 |
| RAM_1WNR | BRAM | 1 | 5 |
| RAM_1WNR | LUTRAM | 1 | 5 |
| RAM_1WNR | URAM | 1 | 5 |
| RAM_2P | AUTO | 1 | 5 |
| RAM_2P | BRAM | 1 | 5 |
| RAM_2P | LUTRAM | 1 | 5 |
| RAM_2P | URAM | 1 | 5 |
| RAM_S2P | BRAM | 1 | 5 |
| RAM_S2P | BRAM_ECC | 1 | 5 |
| RAM_S2P | LUTRAM | 1 | 5 |
| RAM_S2P | URAM | 1 | 5 |
| RAM_S2P | URAM_ECC | 1 | 5 |
| RAM_T2P | BRAM | 1 | 5 |
| RAM_T2P | URAM | 1 | 5 |
| ROM_1P | AUTO | 1 | 5 |
| ROM_1P | BRAM | 1 | 5 |
| ROM_1P | LUTRAM | 1 | 5 |
| ROM_2P | AUTO | 1 | 5 |
| ROM_2P | BRAM | 1 | 5 |
| ROM_2P | LUTRAM | 1 | 5 |
| ROM_NP | BRAM | 1 | 5 |
| ROM_NP | LUTRAM | 1 | 5 |
注释: 除 ROM 外的所有其他类型都支持 BRAM_ECC 和 URAM_ECC。
注释: FIFO 的最小和最大时延为 0。应从 bind_storage 编译指示部分复制有关 config_storage -read_after_write_latency 的提示。
重要:
syn.directive.bind_storage 仅支持上表中的存储器类型与实现的组合。示例
在以下示例中,coeffs[128] 变量是 func1 函数的实参。该指令指定 coeffs 使用来自库的 BRAM 核上实现的单端口 RAM。
syn.directive.bind_storage=func1 coeffs type=RAM_1P impl=bram
提示: 在 RAM_1P 核中定义 RTL 中创建的用于访问
coeffs 值的端口。