set_directive_bind_storage - 2023.2 简体中文

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

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

描述

set_directive_bind_storage 命令可用于将代码中的变量(阵列或函数实参)分配给 RTL 中的特定存储器类型 (type)。如果不指定此命令,那么 Vitis HLS 工具会判定要分配的存储器类型。HLS 工具在硬件中使用指定的实现 (impl) 来实现该存储器。例如,您可使用 set_directive_bind_storage 命令指定用于阵列变量的存储器的类型以及要使用的实现。并且,此命令还允许您控制此阵列是作为单端口 RAM 还是双端口 RAM 来实现。

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

您可使用 -latency 选项来指定实现的时延。对于接口上的块 RAM,-latency 选项允许您对接口上的片外非标准 SRAM 进行建模,例如,用于支持时延为 2 或 3 的 SRAM。对于内部运算,-latency 选项允许使用多个流水打拍阶段来实现运算。这些附加的流水线阶段可帮助解决 RTL 综合期间的时序问题。

重要: 要使用 -latency 选项,运算必须具有 1 个可用的多阶段实现。HLS 工具可以为所有块 RAM 提供多阶段实现。

为实现最佳结果,AMD 建议使用 -std=c99(针对 C)和 -fno-builtin(针对 C 和 C++)。要指定 -std=c99 等 C 语言编译选项,请使用 Tcl 命令 add_files 搭配 -cflags 选项。或者,选中Project Settings(工程设置)对话框中的Edit CFLAGs(编辑 CFLAG)按钮,如 创建 HLS 组件 中所述。

语法

set_directive_bind_storage [OPTIONS] <location> <variable>
  • <location> 是包含变量的位置(格式为 function[/label])。
  • <variable> 是要分配的变量。
    提示: 如果变量是顶层函数实参,则使用 INTERFACE 编译指示或指令的 -storage_type 选项和 -storage_impl 选项。

选项

-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 通用 FIFO 存储器,允许 Vivado 工具选择实现。
URAM UltraRAM 资源
URAM_ECC 含 ECC 的 UltraRAM
SRL 移位寄存器逻辑资源
LUTRAM 分布式 RAM 资源
BRAM 块 RAM 资源
BRAM_ECC 含 ECC 的块 RAM
AUTO Vitis HLS 会自动判定变量的实现。
提示: 将针对相同地址的读取和写入操作映射到相同存储器端口时,URAM 不支持 read-first(先读取)输出 write_mode(不同于 BRAM)。BRAM 支持以下写入模式:write thruread firstno change。URAM 仅支持 no change。如果 Vitis HLS 在 URAM 端口上无法将存储器操作调度为在同一个周期内执行,那么将发出以下警告消息:
Usage of URAM can potentially cause worse II as Vitis HLS does not exploit 
read-first mode for URAMs. Consider using BRAMs instead.
表 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[128] 变量是 func1 函数的实参。该指令指定 coeffs 使用来自库的 BRAM 核上实现的单端口 RAM。

set_directive_bind_storage -impl bram "func1" coeffs RAM_1P
提示: 在 RAM_1P 核中定义 RTL 中创建的用于访问 coeffs 值的端口。