MIPS流水线时序图

Jak*_*ake 3 pipeline mips computer-architecture

我想确认以下时序图是否适用于MIPS 5阶段管道(*=停顿):

               |  1 |  2 |  3 |  4 |  5 |  6 |  7 |  8 |  9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
LW R1, 0(R4)   | IF | ID | EX |  M |  W |    |    |    |    |    |    |    |    |    |    |    |
LW R2, 400(R4) |    | IF | ID | EX |  M |  W |    |    |    |    |    |    |    |    |    |    |
ADD1 R3,R1,R2  |    |    | IF | ID |  * |  * | EX |  M |  W |    |    |    |    |    |    |    |
SW R3, 0(R4)   |    |    |    | IF |  * |  * | ID |  * |  * | EX |  M |  W |    |    |    |    |
SUB R4,R4,#4   |    |    |    |    |    |    | IF |  * |  * | ID | EX |  M |  W |    |    |    |
BNEZ R4, L1    |    |    |    |    |    |    |    |    |    | IF | ID |  * |  * | EX |  M |  W |
Run Code Online (Sandbox Code Playgroud)

评论:

1)ADDI:ID停止2个周期,因此之前的WB可以完成

2)SW:2个档位因为ID无法开始,2个档位因前一个WB完成ID

3)SUB:IF直到第7周期才开始,由于前一条指令,ID必须等到第10周期

4)BNEZ:IF无法启动直到#10周期,2个ID停止,因此之前的WB可以完成

Pau*_*ton 6

如果指令结果仅通过寄存器文件传递(无转发/旁路),并且只在EX之前读取寄存器,那么您的图表看起来是正确的.(您可能会考虑IF之前的空阶段,因为SUB和BNEZ是停顿周期,因为通常下一条指令的IF将紧跟在前一条指令的IF阶段之后.另一方面,这可能会被视为图表的混乱.)

然而,通常通过将结果产生指令的EX阶段(或M阶段结束)的结果直接转发到开头,通常优化5阶段流水线以避免大部分上述停顿.依赖指令的EX阶段.(对于存储指令,M或W阶段可能只需要存储在存储器中的值,因此设计人员可能会考虑为这种情况添加转发.使用这个简单的管道,这只对一对指令有用提供存储器移动,因为负载是延迟大于1的唯一指令.对于两个宽的超标量,这样可以允许类似"ADD R3,R2,R1; SW R3,0(R4);"的开始执行同一个循环.)

利用这种优化的流水线,ADD只有一个停顿周期(在ID之后),通过将结果从"LW R2,400(R4)"的M级结束转发到ADD的EX的开始.

               |  1 |  2 |  3 |  4 |  5 |  6 |  7 |  8 |  9 | 10 | 11 |
LW R1, 0(R4)   | IF | ID | EX |  M |  W |    |    |    |    |    |    |
LW R2, 400(R4) |    | IF | ID | EX |  M |  W |    |    |    |    |    |
ADD1 R3,R1,R2  |    |    | IF | ID |  * | EX |  M |  W |    |    |    |
SW R3, 0(R4)   |    |    |    | IF |  * | ID | EX |  M |  W |    |    |
SUB R4,R4,#4   |    |    |    |    |  * | IF | ID | EX |  M |  W |    |
BNEZ R4, L1    |    |    |    |    |    |    | IF | ID | EX |  M |  W |

这种优化增加了设计的复杂性,但避免不必要的停顿可以显着提高性能.