MIPS-为什么要在管道中插入五个气泡?

MIPS-为什么要在管道中插入五个气泡?,mips,pipeline,cpu-architecture,Mips,Pipeline,Cpu Architecture,书中的例子: 显示执行此代码的转发路径: add $3, $4, $6 sub $5, $3, $2 lw $7, 100($5) add $8, $7, $2 书中的管道图: I1: IF ID EX MEM WB I2: IF ID EX MEM WB I3: IF ID EX MEM WB NOP NOP NOP NOP NOP I4 IF ID EX MEM WB 为什么要在此处插入5个气泡,而不是类

书中的例子: 显示执行此代码的转发路径:

add $3, $4, $6
sub $5, $3, $2
lw $7, 100($5)
add $8, $7, $2
书中的管道图:

I1: IF ID EX MEM WB
I2:    IF ID EX  MEM WB
I3:       IF ID  EX  MEM WB
             NOP NOP NOP NOP NOP
I4               IF  ID  EX  MEM WB
为什么要在此处插入5个气泡,而不是类似于:

I1: IF ID EX MEM WB
I2:    IF ID EX  MEM WB
I3:       IF ID  EX  MEM WB
I4           IF  ID  ID  EX  MEM WB

它不是五个气泡,它是在第三条指令之后插入的气泡,并进展到所有管道阶段,因此在每个管道阶段都会看到一个气泡


插入气泡的原因是第四条指令需要第三条指令的输出($7)。这仅在第三条指令的“mem”阶段后可用,指令4的“ex”阶段需要7美元。为了在第3条和第4条指令之间插入气泡,指令3的内存级的输出可用于指令4的“ex”级的输入。

为什么不在指令4的IF级之后插入气泡?两者在计时上的效果相同,只是符号不同。我也会使用和你一样的符号,但我不会做两次ID,我只会在那里插入nop。所以从技术上来说,两者都是一样的?我真的很困惑,因为我看到过一些例子,它们使用NOP、
-
,或者只是重复ID阶段来表示暂停。是的。从架构的角度来看,我们要说的是,我们不能在这个周期中完成这个管道阶段。谢谢!最后一个问题,你知道我能读到的关于寄存器不允许读写在同一周期中的任何流水线示例吗?