管道图,如果以前的EX使用相同的寄存器,可以启动ID吗?

时间:2015-01-06 18:45:32

标签: architecture mips pipeline computer-architecture

我最近开始使用计算机体系结构。我对我想要解决的图表感到困惑。基于依赖性并努力避免危险,我设计了下表。但是我不确定2个阶段是否可以同时从同一个寄存器读取。这里有表格和带有突出显示混淆区域的mips。enter image description here

编辑:替代添加

删除一个档位是否正确,因为已经处理了r0的值?

enter image description here

1 个答案:

答案 0 :(得分:2)

"使用"过于笼统,您需要在读取和写入寄存器之间进行拆分。 如果您询问"同时阅读" - 绝对,这是流水线操作的重点。只要寄存器值没有改变,一遍又一遍地读取它就没有问题。 实际上,ID和EX阶段没有使用相同的资源,因此没有冲突 - EX阶段读取的值来自ID阶段在上一个周期中写入的锁存器。

您认为是单个全局值的寄存器实际上沿管道有多个副本,每个副本对应于程序中某个点的值。如果你采用最后2条指令,例如,两者都读取$ r0,那么ID阶段将在循环7中将其读出OR的寄存器文件,将其写入锁存器,然后在第8周期再次读取它以获得XOR OR处于EX阶段,同时从前一个周期获取锁存值。

现在真正的问题出现在您遇到数据危险时,例如第一条指令导致的数据危险。由于任何给定阶段的寄存器值必须反映它根据程序顺序所具有的真值,如果你在第2周期尝试执行Sub指令的EX阶段,你会遇到问题,因为$ r0值是读取上一个循环而不表示Add的结果。实际上,只有在Add完成第4周的回写之后,该值才会在寄存器文件中准备就绪。这称为RAW(写入后读取)冲突,必须修复或程序将产生伪造结果。解决这个问题的一种方法是在检测到这种危险时添加一个失速(如图所示的星号) - 当读取$ r0的指令最终继续时,他们将更新的值(后添加)已经写入锁存器。另一个(更有用的)解决方案是添加特殊逻辑,以便在新值准备好所有需要它的管道阶段后绕过它。在这种情况下,这可能仍然需要停止,因为指令是背对背的,因此在下一条指令需要之前你甚至没有时间执行操作。

最后一点 - 请记住,处理器,即使是像流水线mips这样简单的处理器,也是骗你的。它们会让你相信你正在运行你编写的程序,而实际上它们在没有告诉你的情况下在内部完成各种各样的事情(稍微更高级的例子就是无序执行)。在这种情况下,它们会让您认为指令是连续执行的,而实际上它们是在前一个指令完成(甚至执行)之前推测性地启动每个指令。这当然在大部分时间都有效,并使处理器在指令吞吐量(或IPC)方面表现更好,但在某些情况下(如此类数据危害,控制危险等等),这可能会完全破坏您的程序,因此他们必须通过添加摊位或冲洗管道来隐藏这一点。