电脑组织设计ch4说:
R型跟随负载不能前进,需要失速。
但为什么呢?
比如说
lw |F|D|E|M|W
add | |F|D|E|M|W
我们可以简单地将数据从mem_read_data转发到alu_src。
我猜那是因为关键路径太长,流水线会变得毫无意义吧?
所以前向源只能是来自流水线阶段的数据?
然后,又出现了一个新的问题,在ID阶段分支之前的R型怎么办?
add |F|D|E|M|W
beq | |F|D|E|M|W
如果转发源只能来自流水线寄存器,这个不能转发,需要像lw那样停止吗?
1条答案
按热度按时间ix0qys7i1#
这里只是猜测,但 memory 是写回之前的最后一个阶段。Memory 发生在 execute 之后,因此,如果刚好在加载之后的指令尝试使用加载的结果,它必须暂停一个周期,即使使用转发,因为内存操作的执行时间比ALU操作晚一个周期。
然而,在这种情况下,转发逻辑就没有任何意义了。下一个周期,结果已经在写回阶段,所以它可以在同一个周期中用于其他指令。转发不会消除任何气泡;在某种意义上,回写阶段为您执行转发。