FPGA中如何设计一个小cache(一)-FPGA常见问题论坛-FPGA CPLD-ChipDebug

FPGA中如何设计一个小cache(一)

说明:严格意义来讲,本文说的cache并不是真正意义上的cache,只是一个类似的功能模块,借用了cache这个名字。
FPGA设计中常见的一个场景就是逻辑需要查存放在外部DDR中的表项,如果查外部DDR中的表项是性能瓶颈点怎么办呢?相信每个项目都有自己不同的解决方法,这里介绍一个比较通用的方法,那就是增加一个片内缓存——cache来提升表项的读性能。让查表尽量在片内完成,从而提升效率。
这里我们先假定一种比较通用的场景,就是逻辑查DDR表项后,每次都需要回写。一个常见的查表如下图所示:

图片[1]-FPGA中如何设计一个小cache(一)-FPGA常见问题论坛-FPGA CPLD-ChipDebug

主要分成3步,第一个是读取表项;第二步是处理表项的内容;第三步是写回表项。完成后开始下一次的查表。这种查表方式最大的问题就是慢,两次查表必须串行,即必须等上一次查表处理完成后才能开始下一次查表,这种效率显然是很低的。要提升查表的性能,这里就可以用本文前面提及的cache方案了。如下图所示:

图片[2]-FPGA中如何设计一个小cache(一)-FPGA常见问题论坛-FPGA CPLD-ChipDebug

在查表逻辑和DDR表项之间插入一个cache模块,那么整个查表过程就变成如下几个步骤:
1、逻辑逻辑查询cache,如果命中,查表结束,同时将更新的表项内容写入cache;
2、如果查表不命中,则从DDR中读取表项,同时将更新的表项内容写入cache;
3、在更新的表项写入cache时,如果cache还有空间,则直接回写cache中;
4、在更新的表项写入cache时,如果cache满了,需要将cache中最不常用的一条表项写回DDR中,或者将cache中的内容全部写回DDR中,同时将更新的的表项再写入cache;
在上述的cache方案中,如果每次查表都能命中,那查表的就相当于读FPGA内部的表项,性能可以达到线速。考虑一种极限情况,就是每次都不命中,根据上面的分析,每次都需要从DDR中读取表项,更新后再写入cache中,相比没有cache的场景,性能是不变的。
那如何提高cache的命中率呢?或者说如何利用cache来减少对DDR表项的访问呢?这个就和具体的使用场景相关了,举个例子,在某种场景下,需要对每条流的报文数进行统计,采用深度为16的cache,当cache满了以后,如果没有新的条目输入,那么可以一直使用cache命中,如果有新的条目输入,可以讲cache中的内容全部写入DDR中,这时写入的地址必定不一样,相比没有cache时的串行操作,可以实现背靠背的读改写,提升了读写DDR的效率。
那cache究竟如何设计呢?期待后续……

请登录后发表评论

    没有回复内容