syn.directive.bind_storage - syn.directive.bind_storage - 2023.1 简体中文 - UG1553

Vitis Unified IDE 和通用命令行参考手册 (UG1553)

Document ID
UG1553
Release Date
2023-07-17
Version
2023.1 简体中文

描述

Vitis HLS 在代码中使用特定存储器资源(或类型)来分配阵列。该工具会自动判定要使用的资源。或者,您也可以定义 syn.storage 来笼统指定存储器类型,如 存储配置 中所述。

syn.directive.bind_storage 命令用于将代码中的特定变量(阵列或函数实参)分配到 RTL 中的特定存储器类型 (type)。例如,您可使用 syn.directive.bind_storage 命令指定用于阵列变量的存储器的类型以及要使用的实现。并且,此命令还允许您控制此阵列是作为单端口 RAM 还是双端口 RAM 来实现。

重要: 此功能特性对于顶层函数接口上的阵列尤为重要,因为与阵列关联的存储器类型可用于判定 RTL 中所需的端口数量和类型,如接口上的阵列中所述。但对于分配给顶层函数实参的变量,您必须使用 syn.directive.interfacestorage_type 选项和 storage_impl 选项来分配存储器类型和实现。

您也可使用 syn.directive.bind_storagelatency 选项来指定实现的时延。对于接口上的块 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.interfacestorage_type 选项和 storage_impl 选项。

选项

type=<value>
定义要绑定到指定变量的存储器的类型。
受支持的类型包括: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。
impl=<value>
定义指定存储器类型的实现。受支持的实现包括:brambram_ecclutramuramuram_eccsrlmemoryauto,如下所述。
表 2. 受支持的实现
名称 描述
MEMORY 通用 FIFO 存储器,允许 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 全局 AUTO、BRAM、LUTRAM、URAM、MEMORY 和 SRL
RAM* | ROM* bind_storage 局部 AUTO BRAM、BRAM_ECC、LUTRAM、URAM 和, URAM_ECC
RAM* | ROM* config_storage 2 全局 不适用
RAM_1P set_directive_interface s_axilite -storage_impl 局部

AUTO、BRAM 和 URAM

  config_interface -m_axi_buffer_impl 全局

AUTO、BRAM、LUTRAM 和 URAM

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

另请参阅