| 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 | | |这是否有效,或者在内存访问发生后,我是否需要插入另一个停顿?
如果我使用转发,时间会是什么样子的?我该怎么做?
发布于 2016-07-11 09:51:05
对于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 | | |这是因为只有初始ADD写入R1。并且,在指令的目的寄存器和后续指令的源寄存器之间不再有重叠。
通过转发,ADD (即R1)的输出将在T3的EX阶段之后可用(即它可用于T4开始处的任何后续指令)
因此,由于转发,即使是最难压缩的指令( SUB)也会在T4中具有可用于其EX阶段的值。
因此,对于转发,时间与初始图相同(即转发修复了危险)。
https://stackoverflow.com/questions/38294721
复制相似问题