| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
ADD R1,R2,R3 | IF | ID | EX | MA | WB | | | | | | |
SUB R4,R1,R3 | | IF | ID | EX | MA | WB | | | | | |
AND R6,R1,R7 | | | IF | ID | EX | MA | WB | | | | |
OR R8,R1,R9 | | | | IF | ID | EX | MA | WB | | | |
XOR R10,R1,R11 | | | | | IF | ID | EX | MA | WB | | |
所以我理解,查看所有后续指令取决于写入的R1值。所以要解决这个问题,我需要插入档位。
AFTER (Using Stalls)
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
ADD R1,R2,R3 | IF | ID | EX | MA | WB | | | | | | |
SUB R4,R1,R3 | | IF | ID | * | * | EX | MA | WB | | | |
AND R6,R1,R7 | | | IF | ID | EX | MA | WB | | | | |
OR R8,R1,R9 | | | | IF | ID | EX | MA | WB | | | |
XOR R10,R1,R11 | | | | | IF | ID | EX | MA | WB | | |
这是否有效或者我是否需要在发生内存访问后插入另一个档位?
如果我使用转发,时间会是什么样的?我该怎么做?
答案 0 :(得分:0)
对于摊位,时间看起来像:
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
ADD R1,R2,R3 | IF | ID | EX | MA | WB | | | | | | |
SUB R4,R1,R3 | | IF | ID | * | * | EX | MA | WB | | | |
AND R6,R1,R7 | | | IF | ID | * | EX | MA | WB | | | |
OR R8,R1,R9 | | | | IF | ID | EX | MA | WB | | | |
XOR R10,R1,R11 | | | | | IF | ID | EX | MA | WB | | |
这是因为只有初始ADD
写入R1
。并且,指令的目标寄存器和后面指令的源寄存器之间不再存在重叠。
通过转发,ADD
的输出(R1
)将在EX
T3
的{{1}}阶段之后 可用于T4
)
因此,即使是最难按的指令(SUB
),由于转发,EX
的{{1}}阶段的值也可用。
因此,通过转发,时间与初始图表相同(即转发可以解决危险)。