在 MIPS 中组织流水线

Organizing pipeline in MIPS

我不确定以下属性如何影响 5 级 MIPS 设计(IF、ID、EX、MEM、WB)的流水线执行。我只是需要清理一下。

1个内存端口是否意味着当我们read/write到mem时我们不能获取或写入(即lw上的MEM阶段,sw你不能进入IF或另一个MEM)? 如果没有转发,这是否意味着一条指令直到它所依赖的前一条指令的 WB 阶段之后或 WB 阶段才会进入 ID 阶段? 不知道分支摊位是什么意思

一个常见的假设是您可以在一个周期的前半部分写入,而在一个周期的后半部分读取.

假设 I1 是您的第一条指令,I2 是您的第二条指令,而 I2 正在使用 I1 正在修改的寄存器。

  • 只有1个内存端口。 这意味着您不能在管道的两个不同阶段同时 读取或写入 内存。 例如,如果 I1 处于 MEM 阶段,则另一条指令 cannot 处于 IF阶段同时进行,因为两者都需要访问内存。

  • 无数据转发。数据转发反映了EX阶段结束时I1,你转发数据到I2ID周期。 因此,无转发 意味着管道必须等待 I1WB 阶段完成到 ID I2 阶段。有了这个假设,就可以和上一条指令的WB阶段同时进入ID阶段,因为WB 会在前半个周期写入内存,ID会在后半个周期从内存读取。

  • 分支停止直到 EX 阶段结束。这是一个常见的假设,不使用 分支预测技术.它只是说明分支后的指令必须等到 EX 阶段结束 才能开始 ID 阶段。回想下一条要执行的指令的地址仅在分支指令的 EX 阶段是已知的。

注释:IF 和 MEM 访问不同的内存部分。一个是数据存储器(.data),另一个是指令存储器(.code.text)。它是这样设计的,因此在 IF 和 MEM 期间访问内存不会导致结构性停顿。 .data 使用的区域是堆栈使用的区域,堆栈传统上位于 .data 扇区的 "end" 处。这就是为什么如果在将数据保存到堆栈之前不从堆栈指针地址中减去 运行 覆盖程序代码的风险。由于 MIPS 允许您手动指定堆栈地址,有些人选择将堆栈放在 "before" 末尾,以避免出现问题,如果他们知道他们将拥有 space 而不会覆盖 MEM 中的变量。例如,将堆栈放在 0x300 而不是 WinMIPS64 中的 0x400。我不确定这是否是好的做法。但是我听说有人这样做。