pragma HLS bind_storage - 2023.2 简体中文

Vitis 高层次综合用户指南 (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 简体中文

描述

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 编译指示分配到的变量。指定编译指示时,此变量是必需的。
提示: 如果变量是顶层函数实参,则使用 INTERFACE 编译指示或指令的 -storage_type 选项和 -storage_impl 选项。
type=<type>
定义要绑定到指定变量的存储器的类型。
受支持的类型包括:fiforam_1pram_1wnrram_2pram_s2pram_t2prom_1prom_2prom_np
表 1. 存储类型
类型 描述
FIFO FIFO。Vitis HLS 可判定如何在 RTL 中将其实现,除非指定 -impl 选项。
RAM_1P 单端口 RAM。Vitis HLS 可判定如何在 RTL 中将其实现,除非指定 -impl 选项。
RAM_1WNR 含 1 个写入端口和 N 个读取端口的 RAM,内部使用 N 个 bank。
RAM_2P 双端口 RAM,允许在某一端口上执行读操作并在另一个端口上执行读写操作。
RAM_S2P 双端口 RAM,允许在某一端口上执行读取操作,并在另一个端口上执行写入操作。
RAM_T2P 真正的双端口 RAM,支持在 2 个端口上执行读写操作。
ROM_1P 单端口 ROM。Vitis HLS 可判定如何在 RTL 中将其实现,除非指定 -impl 选项。
ROM_2P 双端口 ROM。
ROM_NP 多端口 ROM。
提示: 如果您为 PIPO 指定了单端口 RAM,那么绑定程序通常会分配一个合并的 PIPO,只有一个 bank,读取和写入分别访问 bank 的不同部分。HLS 编译器报告的参考消息会显示“Implementing PIPO using a single memory for all blocks.”,即,“为所有块使用同一个存储器来实现 PIPO”。对于小型 PIPO 来说,这种方法通常比较经济,因为所有 bank 可以共享单个 RAM 块。但是,如果您为 PIPO 指定了双端口 RAM 以获取更高带宽,而调度器在生产者或使用者中使用了这两个端口,那么绑定程序通常会分配一个拆分 PIPO,即生产者使用 1 个端口,使用者使用不同 bank 的 2 个端口。在此情况下,HLS 编译器报告的参考消息为“Implementing PIPO using a separate memory for each block.”,即,“为每个块使用一个独立存储器来实现 PIPO”。
impl=<value>
定义指定存储器类型的实现。受支持的实现包括:brambram_ecclutramuramuram_eccsrlmemoryauto,如下所述。
表 2. 受支持的实现
名称 描述
MEMORY 通用存储器,允许 Vivado 工具选择实现。
URAM UltraRAM 资源
URAM_ECC 含 ECC 的 UltraRAM
SRL 移位寄存器逻辑资源
LUTRAM 分布式 RAM 资源
BRAM 块 RAM 资源
BRAM_ECC 含 ECC 的块 RAM
AUTO Vitis HLS 会自动判定变量的实现。
表 3. FIFO/RAM/ROM 支持的实现
类型 命令/编译指示 作用域 受支持的实现
FIFO bind_storage 1 局部 AUTO、BRAM、LUTRAM、URAM、MEMORY 和 SRL
FIFO config_storage global AUTO、BRAM、LUTRAM、URAM、MEMORY 和 SRL
RAM* | ROM* bind_storage 局部 AUTO BRAM、BRAM_ECC、LUTRAM、URAM 和, URAM_ECC
RAM* | ROM* config_storage 2 global 不适用
RAM_1P set_directive_interface s_axilite -storage_impl 局部

AUTO、BRAM 和 URAM

  config_interface -m_axi_buffer_impl global

AUTO、BRAM、LUTRAM 和 URAM

  1. 如不指定任何实现,该指令会使用 AUTOSRL 行为作为默认实现。但您无法指定该值。
  2. config_storage 仅支持 FIFO 类型。
latency=<int>
定义用于绑定类型的默认时延。如下表所示,有效的时延值因指定的 typeimpl 而异。默认值为 -1,即交由 Vitis HLS 选择时延。
表 4. 受支持的存储器类型、实现和时延组合
类型 实现 最小时延 最大时延
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 值的端口。