描述
在 FPGA 中,对 DDR 存储器的非突发访问代价不菲,可能影响设计的整体性能。因此,设计一种方案来缩短访问必要信息所需的时间就显得尤为重要。有一种有效的解决方案是重写代码或使用手动突发,但如果无效,那么另一种解决方案是使用高速缓存存储器。
高速缓存在 M_AXI 适配器中提供了一个临时存储区域,因此设计可以更快检索数据。高速缓存机制的效果是以命中/未命中率来度量的,该指标以计算机程序中所谓访问局部性 (locality of reference) 的属性为基础,即某个程序在短时间内重复访问同一组存储器位置的趋势。它表明在访问特定的存储器块时,很可能不久之后就会再次访问该存储器块以及位于附近的存储器。例如,在存储器中执行连续指令时,下一组要访问的指令很可能就在附近的连续数据块内。
提示: 您可使用
config_interface -m_axi_cache_impl
命令控制高速缓存实现资源。语法
set_directive_cache <location> port=<name> lines=<value> depth=<value>
其中:
-
<location>
- 指定函数,可在该函数所在位置找到指定端口。这是顶层函数。
-
port=<name>
- 指定高速缓存要添加到的端口。
-
lines=<value>
- 表示缓存行的数量。行数可指定为 1,表示单个高速缓存行;也可指定为大于 1 的值(指定为 2 的幂值),表示多个高速缓存行
-
depth=<value>
- 以字数为单位,指定每行的大小。深度必须指定为 2 的幂,表示每个行的指针数据类型的大小(以字数为单位)。
限制
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];
}
}