我最近开始用verilog编码。我已经完成了我的第一个项目,即使用5级流水线制作MIPS 32处理器的原型。现在,我的下一个任务是在指令集存储器上实现单级缓存层次结构。
我已经成功实现了2路集关联缓存。 以前我已将指令集存储器声明为寄存器数组,因此,每当我需要在IF阶段访问下一条指令时,都会立即将数据(指令)分配给寄存器以进行进一步解码(因为阻塞/非阻塞分配是从任何内存位置)。
但是,由于现在我在其之上添加了一个单级缓存,因此缓存FSM需要更多的周期才能工作(例如数据搜索以及在缓存未命中的情况下的替换策略)。最高发生高速缓存未命中时,延迟大约为5个周期。
由于我的流水线级仅在一个周期内进入下一阶段,因此,每当发生高速缓存未命中时,高速缓存均无法在流水线级移至下一阶段之前传递指令。因此,期望的输出总是错误的。
为解决这个问题,与处理器流水线时钟相比,我将缓存的时钟增加了5倍。这样就可以完成工作,因为高速缓存时钟要快得多,所以不必担心处理器时钟。
但是这种解决方法合法吗?我的意思是我没有听说过处理器系统中的多个时钟。现实世界中的处理器如何克服这个问题。
是的,还有另一种在流水线中使用停顿周期,直到在缓存(命中)中随时提供数据之前的方法。但是,只是想知道通过增加时钟来使内存系统更快速是合理的吗?
P.S。我是计算机体系结构和Verilog的新手。我对VLSI知之甚少。这是我有史以来的第一个问题,因为无论遇到什么问题,我都可以在网页上随时获得它,但是我找不到有关此问题的详细信息,所以我在这里。
我还问了我的教授,她回答我要对该主题进行更多的研究,因为我/她的同事/大四没有一个在流水线处理器上做过很多工作。
答案 0 :(得分:6)
但是这种解决方法合法吗?
不,不是:P您不仅增加了缓存时钟,而且显然增加了内存时钟。而且,如果您可以将缓存运行速度提高5倍,并且仍然会限制时序,则意味着要实现最高性能,就应该使整个CPU的时钟速度提高5倍。
一个classic 5-stage RISC管道assumes and is designed around的缓存命中(以及同时的数据和指令缓存访问)的单周期延迟,但是对缓存未命中 >。 (数据加载/存储地址计算在EX中进行,而MEM中进行缓存访问,这就是该阶段存在的原因)
从逻辑上讲,停顿等同于插入NOP,因此您可以在缓存未命中时执行此操作。程序计数器不必增加,否则应该是相当本地的更改。
如果您具有硬件性能计数器,则可能要区分真实指令与伪造的NOP,以便可以对执行的真实指令进行计数。
您需要为其他停滞的阶段实现管道互锁,以等待其输入准备就绪,例如缓存未命中加载,然后是使用结果的add
。
MIPS我有加载延迟插槽(您不能在以下指令中使用加载结果,因为MEM阶段位于EX之后)。这样,ISA规则就可以隐藏高速缓存命中的1个周期的延迟,而无需HW检测依赖关系并为此暂停。
但是仍然必须检测到缓存 miss 。无论是否存在依赖关系,都可能使整个管道停滞不前。 (同样,就像在坚持传入指令的同时为流水线的其余部分插入NOP一样。除了这不是第一阶段,因此它必须向上一个阶段发出信号,表明它正在停止。)
较新版本的MIPS删除了加载延迟插槽,以避免在编译器无法填充插槽时,NOP导致代码膨胀。然后,简单的硬件必须检测依赖关系并在需要时停止运行,但是更智能的硬件可能仍会跟踪负载,因此它们可以在未命中的情况下进行命中等等。在指令实际尝试读取尚未准备好的加载结果之前,不要停止管道。
MIPS = "Microprocessor without Interlocked Pipeline Stages"(即未检测到数据危害)。但是它仍然不得不因缓存未命中而停滞。
首字母缩略词的另一种扩展(仍适用于MIPS II,其中已删除了负载延迟插槽,需要硬件联锁来检测数据危害)将是“最小联锁的管线阶段”,但显然我对此深表歉意,谢谢@PaulClayton赶上了。