流水线处理器中的缓存实现
Cache Implementation in Pipelined Processor
我最近开始使用 verilog 进行编码。我已经完成了我的第一个项目,使用 5 级流水线对 MIPS 32 处理器进行了原型设计。现在我的下一个任务是在指令集内存上实现单级缓存层次结构。
我已经成功地实现了一个 2-way set associative cache。
之前我已经将指令集内存声明为寄存器数组,所以每当我需要访问 IF 阶段的下一条指令时,数据(指令)会立即分配给寄存器以进行进一步解码(因为 blocking/non_blocking 赋值是从任何内存位置瞬时)。
但是现在因为我在它上面添加了一个单级缓存,缓存 FSM 需要更多的周期才能工作(比如数据搜索,以及缓存未命中时的替换策略)。最大限度。当缓存未命中时,延迟约为 5 个周期。
由于我的流水线阶段仅在一个周期内进入下一阶段,因此每当出现缓存未命中时,缓存都无法在流水线阶段移动到下一阶段之前传送指令。所以期望的输出总是错误的。
为了解决这个问题,与处理器流水线时钟相比,我将缓存时钟增加了 5 倍。这确实起作用了,因为缓存时钟快得多,它不需要担心处理器时钟。
但是这个解决方法合法吗??我的意思是我还没有听说过处理器系统中有多个时钟。现实世界中的处理器如何克服这个问题。
是的,还有另一种在管道中使用停顿周期的方法,直到数据很容易在缓存中可用(命中)。但只是想知道通过增加时钟使内存系统更快是合理的吗??
P.S。我是计算机体系结构和 verilog 的新手。我不太了解VLSI。这是我的第一个问题,因为无论出现什么问题,我都能在网页上轻松找到它,但我找不到关于这个问题的详细信息,所以我来了。
我也问过我的教授,她回答我在这个主题上做更多的研究,我的同事/前辈的 bcs none 在流水线处理器上做了很多工作。
But is this workaround legit??
不,不是 :P 您不仅增加了高速缓存时钟,而且显然还增加了内存时钟。而且,如果您可以 运行 将缓存速度提高 5 倍,并且仍然进行时序限制,这意味着如果您的目标是最大性能,则应该将整个 CPU 速度提高 5 倍。
A classic 5-stage RISC pipeline assumes and is designed around single-cycle 高速缓存延迟 命中 (以及同步数据和指令高速缓存访问),但 在高速缓存未命中时停止。 (数据load/store地址计算发生在EX中,缓存访问发生在MEM中,这就是存在该阶段的原因)
停顿在逻辑上等同于插入 NOP,因此您可以在缓存未命中时执行此操作。程序计数器不需要增加,否则它应该是一个相当局部的变化。
如果您有硬件性能计数器,您可能想要区分真正的指令和伪造的延迟 NOP,这样您就可以计算真正执行的指令。
您需要为其他停止等待其输入准备就绪的阶段实施管道互锁,例如cache-miss 加载后跟使用结果的 add
。
MIPS 我有 load-delay 个槽(你不能在下面的指令中使用加载的结果,因为 MEM 阶段在 EX 之后)。因此,ISA 规则隐藏了缓存命中的 1 个周期延迟,而不需要 HW 检测依赖关系并为其停止。
但是仍然需要检测缓存未命中。无论是否存在依赖关系,它都可能使整个管道停滞不前。 (同样,就像在保留传入指令的同时为管道的其余部分插入 NOP。除了这不是第一阶段,所以它必须向前一阶段发出信号,表明它正在停止。)
更高版本的 MIPS 删除了加载延迟槽,以避免在编译器无法填充槽时使用 NOP 使代码膨胀。简单的 HW 然后必须检测依赖关系并在需要时停止,但更智能的硬件可能无论如何都会跟踪负载,因此它们可以做到命中未命中等等。在指令实际尝试读取尚未准备好的加载结果之前,不会停止流水线。
MIPS = "Microprocessor without Interlocked Pipeline Stages"(即没有 data-hazard 检测)。但它仍然不得不因缓存未命中而停止。
首字母缩略词的另一种扩展(它仍然适合 MIPS II,其中加载延迟槽被删除,需要 HW 互锁来检测数据危险)将是 "Minimally Interlocked Pipeline Stages" 但显然我在脑海中弥补了这一点,感谢@PaulClayton抓住那个。
我最近开始使用 verilog 进行编码。我已经完成了我的第一个项目,使用 5 级流水线对 MIPS 32 处理器进行了原型设计。现在我的下一个任务是在指令集内存上实现单级缓存层次结构。
我已经成功地实现了一个 2-way set associative cache。 之前我已经将指令集内存声明为寄存器数组,所以每当我需要访问 IF 阶段的下一条指令时,数据(指令)会立即分配给寄存器以进行进一步解码(因为 blocking/non_blocking 赋值是从任何内存位置瞬时)。
但是现在因为我在它上面添加了一个单级缓存,缓存 FSM 需要更多的周期才能工作(比如数据搜索,以及缓存未命中时的替换策略)。最大限度。当缓存未命中时,延迟约为 5 个周期。
由于我的流水线阶段仅在一个周期内进入下一阶段,因此每当出现缓存未命中时,缓存都无法在流水线阶段移动到下一阶段之前传送指令。所以期望的输出总是错误的。
为了解决这个问题,与处理器流水线时钟相比,我将缓存时钟增加了 5 倍。这确实起作用了,因为缓存时钟快得多,它不需要担心处理器时钟。
但是这个解决方法合法吗??我的意思是我还没有听说过处理器系统中有多个时钟。现实世界中的处理器如何克服这个问题。
是的,还有另一种在管道中使用停顿周期的方法,直到数据很容易在缓存中可用(命中)。但只是想知道通过增加时钟使内存系统更快是合理的吗??
P.S。我是计算机体系结构和 verilog 的新手。我不太了解VLSI。这是我的第一个问题,因为无论出现什么问题,我都能在网页上轻松找到它,但我找不到关于这个问题的详细信息,所以我来了。
我也问过我的教授,她回答我在这个主题上做更多的研究,我的同事/前辈的 bcs none 在流水线处理器上做了很多工作。
But is this workaround legit??
不,不是 :P 您不仅增加了高速缓存时钟,而且显然还增加了内存时钟。而且,如果您可以 运行 将缓存速度提高 5 倍,并且仍然进行时序限制,这意味着如果您的目标是最大性能,则应该将整个 CPU 速度提高 5 倍。
A classic 5-stage RISC pipeline assumes and is designed around single-cycle 高速缓存延迟 命中 (以及同步数据和指令高速缓存访问),但 在高速缓存未命中时停止。 (数据load/store地址计算发生在EX中,缓存访问发生在MEM中,这就是存在该阶段的原因)
停顿在逻辑上等同于插入 NOP,因此您可以在缓存未命中时执行此操作。程序计数器不需要增加,否则它应该是一个相当局部的变化。
如果您有硬件性能计数器,您可能想要区分真正的指令和伪造的延迟 NOP,这样您就可以计算真正执行的指令。
您需要为其他停止等待其输入准备就绪的阶段实施管道互锁,例如cache-miss 加载后跟使用结果的 add
。
MIPS 我有 load-delay 个槽(你不能在下面的指令中使用加载的结果,因为 MEM 阶段在 EX 之后)。因此,ISA 规则隐藏了缓存命中的 1 个周期延迟,而不需要 HW 检测依赖关系并为其停止。
但是仍然需要检测缓存未命中。无论是否存在依赖关系,它都可能使整个管道停滞不前。 (同样,就像在保留传入指令的同时为管道的其余部分插入 NOP。除了这不是第一阶段,所以它必须向前一阶段发出信号,表明它正在停止。)
更高版本的 MIPS 删除了加载延迟槽,以避免在编译器无法填充槽时使用 NOP 使代码膨胀。简单的 HW 然后必须检测依赖关系并在需要时停止,但更智能的硬件可能无论如何都会跟踪负载,因此它们可以做到命中未命中等等。在指令实际尝试读取尚未准备好的加载结果之前,不会停止流水线。
MIPS = "Microprocessor without Interlocked Pipeline Stages"(即没有 data-hazard 检测)。但它仍然不得不因缓存未命中而停止。
首字母缩略词的另一种扩展(它仍然适合 MIPS II,其中加载延迟槽被删除,需要 HW 互锁来检测数据危险)将是 "Minimally Interlocked Pipeline Stages" 但显然我在脑海中弥补了这一点,感谢@PaulClayton抓住那个。