syn.directive.cache - 2023.2 简体中文

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

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

描述

在 FPGA 中,对 DDR 存储器的非突发访问代价不菲,可能影响设计的整体性能。因此,设计一种方案来缩短访问必要信息所需的时间就显得尤为重要。有一种有效的解决方案是重写代码或使用手动突发,但如果无效,那么另一种解决方案是使用高速缓存存储器。

高速缓存在 M_AXI 适配器中提供了一个临时存储区域,因此设计可以更快检索数据。高速缓存机制的效果是以命中/未命中率来度量的,该指标以计算机程序中所谓访问局部性 (locality of reference) 的属性为基础,即某个程序在短时间内重复访问同一组存储器位置的趋势。它表明在访问特定的存储器块时,很可能不久之后就会再次访问该存储器块以及位于附近的存储器。例如,在存储器中执行连续指令时,下一组要访问的指令很可能就在附近的连续数据块内。

提示: 您可使用 syn.interface.m_axi_cache_impl 命令控制高速缓存实现资源。

语法

syn.directive.cache=<location> port=<name> lines=<value> depth=<value>

其中:

<location>
指定函数,可在该函数所在位置找到指定端口。这是顶层函数。
port=<name>
指定高速缓存要添加到的端口。这是必需实参。
lines=<value>
表示缓存行的数量。行数可指定为 1,表示单个高速缓存行;也可指定为大于 1 的值(指定为 2 的幂值),表示多个高速缓存行。这是可选值,如不指定则默认为 1。
depth=<value>
以字数为单位,指定每行的大小。深度必须指定为 2 的幂,表示每个行的指针数据类型的大小(以字数为单位)。
这是可选值,如不指定则默认为最大突发长度。最大突发长度默认值为 16,但可通过 syn.interface.m_axi_max_read_burst_length 命令来全局指定(如 接口配置 中所述),或者通过 syn.directive.interface 命令来为特定接口指定该值。

限制

CACHE 指令或编译指示存在如下限制:

  • 仅限只读端口才支持 CACHE
  • CACHE 是作为单端口单向高速缓存来实现的。
  • 对于连接到同一捆绑的多个端口,则不支持 CACHE

示例

以下示例显示的设计中,重叠访问将导致突发失败。使用 CACHE 编译指示或指令将改善设计性能。

extern "C" {
  void dut(
    const double *in,  // Read-Only Vector 1
    double *out,       // Output Result
    int size                 // Size in integer
  )
#pragma HLS INTERFACE m_axi port=in  bundle=aximm depth = 1026
#pragma HLS INTERFACE m_axi port=out bundle=aximm depth = 1024
#pragma HLS cache port=in lines=8 depth=128    
for(int i = 0; i < size; i++)
    {
      out[i] = in[i] + in[i + 1];
    }
}