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可以完成
如果指令结果仅通过寄存器文件传递(无转发/旁路),并且只在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 |
这种优化增加了设计的复杂性,但避免不必要的停顿可以显着提高性能.