首页 > 解决方案 > 流水线处理器中的缓存实现

问题描述

我最近开始用verilog编码。我已经完成了我的第一个项目,使用 5 级流水线对 MIPS 32 处理器进行原型设计。现在我的下一个任务是在指令集内存上实现单级缓存层次结构。

我已经成功地实现了一个 2-way set associative cache。以前我已将指令集内存声明为寄存器数组,因此每当我需要访问 IF 阶段的下一条指令时,数据(指令)会立即分配给寄存器以进行进一步解码(因为阻塞/非阻塞分配是从任何内存位置)。

但是现在由于我在其上添加了单级缓存,因此缓存 FSM 需要更多的周期才能工作(例如数据搜索和缓存未命中的替换策略)。最大限度。当缓存未命中时,延迟大约为 5 个周期。

由于我的流水线阶段仅在一个周期内进入下一个阶段,因此每当缓存未命中时,缓存无法在流水线阶段移动到下一个阶段之前传递指令。所以想要的输出总是错误的。

为了解决这个问题,与处理器流水线时钟相比,我将缓存的时钟增加了 5 倍。这确实有效,因为高速缓存时钟要快得多,所以不必担心处理器时钟。

但是这种解决方法合法吗?我的意思是我还没有听说过处理器系统中有多个时钟。现实世界中的处理器如何克服这个问题。

是的,还有另一种方法可以在流水线中使用停顿周期,直到数据在缓存中可用(命中)。但是只是想知道通过增加时钟来使内存系统更快是合理的吗?

PS我是计算机体系结构和verilog的新手。我不太了解VLSI。这是我有史以来的第一个问题,因为无论遇到什么问题,我都可以在网页上轻松找到它,但是我找不到有关此问题的更多详细信息,所以我在这里。

我还问了我的教授,她回答我在这个主题上做更多的研究,因为我的同事/前辈都没有在流水线处理器上做过很多工作。

标签: mipscpu-architecturecpu-cache

解决方案


但是这种解决方法合法吗?

不,不是:P 您不仅增加了缓存时钟,而且显然还增加了内存时钟。而且,如果您可以将缓存运行速度提高 5 倍,并且仍然限制时序,这意味着如果您的目标是获得最大性能,您应该将整个 CPU 的时钟速度提高 5 倍。

经典的5 级 RISC流水线假设并围绕缓存命中(以及同时数据和指令缓存访问)的单周期延迟进行设计,但在缓存未命中时会停止。(数据加载/存储地址计算发生在 EX 中,缓存访问发生在 MEM 中,这就是该阶段存在的原因)

停顿在逻辑上等同于插入 NOP,因此您可以在缓存未命中时执行此操作。程序计数器不需要增加,否则它应该是一个相当局部的变化。

如果您有硬件性能计数器,您可能想要区分真实指令和假停止 NOP,以便计算实际执行的指令。


您需要为等待其输入准备就绪的其他阶段实现流水线互锁,例如缓存未命中加载,然后是add使用结果的加载。

MIPS 我有加载延迟槽(你不能在下面的指令中使用加载的结果,因为 MEM 阶段在 EX 之后)。因此,ISA 规则隐藏了缓存命中的 1 个周期延迟,而无需硬件检测依赖关系并停止它。

但是仍然必须检测缓存未命中。无论是否存在依赖关系,它都可能使整个管道停滞不前。(再次,就像在保持传入指令的同时为管道的其余部分插入 NOP。除了这不是第一阶段,因此它必须向前一阶段发出信号它正在停止。)

更高版本的 MIPS 删除了加载延迟槽,以避免在编译器无法填充槽时使用 NOP 使代码膨胀。简单的硬件然后必须检测依赖关系并在需要时停止,但更智能的硬件可能无论如何都会跟踪负载,因此它们可以在未命中时命中等等。在指令实际尝试读取尚未准备好的加载结果之前,不会停止流水线。

MIPS =“没有互锁流水线阶段的微处理器”(即没有数据危害检测)。但它仍然不得不因缓存未命中而停止。
首字母缩略词的另一种扩展(仍然适合 MIPS II,其中加载延迟槽被移除,需要硬件联锁来检测数据危险)将是“最小互锁管道阶段”,但显然我在脑海中做了这个,谢谢@PaulClayton为了抓住它。


推荐阅读