首先,抱歉我的英语不好。问题是我的计算机体系结构课程中的一个问题,我在网上找到答案,但仍然无法找到详细信息。
以下是五阶段(获取,解码,执行,内存,写入)单管道微体系结构无转发机制的指令阶段。 所有操作都是一个周期,除了LW和SW是1 + 2,而Branch是1 + 1.
Loop: C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 C12 C13 C14 ...
LW R3, 0(R0) F D E M - - W
LW R1, 0(R3) F D - - - E M - - W
ADDI R1, R1, #1 F - - - D - - - E M W
SUB R4, R3, R2 F - - - D E M W
SW R1, 0(R3) F D W M ...
BNZ R4, Loop F D E ...
...
我有以下几个问题。
为什么第二条指令可以在C2中启动D?由于我已经倾斜,D阶段包括“寄存器读取”,但前一条指令写回R3直到C7。
与前一个相似,是什么原因导致第3个月的D在C7开始,E从C11开始?
为什么4 inst必须从C7开始而不是C4?
这个问题起源于“计算机体系结构:定量方法5e”一书,例3.11。
答案 0 :(得分:1)
看起来你的管道在执行与内存相关的操作(LW)时会冻结整个系统,除了我无法想到ADDI无法在C4中执行其解码的正当理由。我并不是说它对加载操作有效,以冻结整个执行,但这似乎只是"只有"合乎逻辑的解释。
指令2可以在C3中执行其解码,但必须等到指令1将其数据写回R1
。这就是为什么第二条指令的执行被推迟到C7
。
答案 1 :(得分:1)
为什么第二条指令可以在C2中启动D? D包括reg-read,但前一条指令在C7之前不会写回R3。
Ans - 这是因为MIPS简单pipleline中的DECODER阶段有两个部分/子阶段。
DEC = DECODE + RR(注册读取)
指令可以被解码,即操作码可以被读取和解码但是,由于在这种情况下的依赖性,RR将停止直到第一个加载指令执行(从存储器中取出R3)并且在C7中简单转发下一个加载可以去执行。
在两个子站中破坏DECODE阶段以避免结构性危险。 如果您阅读图表"计算机架构:定量方法"再次,您将看到一条虚线和实线,有意绘制以显示整体工作由两部分决定(DECODE OPCODE + REG READ)。
另外两个问题我同意@Peter Cordes
希望这会有所帮助。 Jaymin答案 2 :(得分:0)
Classic RISC pipeline wiki article非常好。如果你没有,请查看。
- 为什么第二条指令可以在C2中启动D? D包括reg-read,但前一条指令在C7之前不会写回R3。
醇>
我不确定,我没有花太多时间在经典RISC管道上。基于我们对此和ADDI的看法,看起来寄存器读取发生在E阶段。
这完美地解释了E停止直到前一次加载的回写。如果你确定reg-read应该在你正在研究的管道的D阶段发生,那么这个解决方案与你的管道不匹配;对于在Execute之前不读取寄存器的不同管道是正确的。
第3个月的D从C7开始,E从C11开始?
管道的D阶段被前一条指令占用,直到C7,此时它可以解码。
R1直到周期11才准备好,此时the data can be forwarded来自前一条指令的存储器级,因此ADDI的Execute可以与前一条指令中的Writeback并行发生。这称为“旁路”。
旁路可以让ALU操作以1个周期的延迟运行,因此您可以在下一条指令中使用ADD的输出而不会停顿。
- 为什么4 inst必须从C7开始而不是C4?
醇>
因为前一条指令在获取阶段停止,并且它是一个有序管道;没有无序执行。