lab 3实验报告
20302010043 苏佳迪
一、流水线的改动
为了支持多周期乘除法器,流水线做出以下调整:
1、支持乘多周期除法器
为了支持乘除法器的多周期运算,给 alu 和 execute 添加时钟与握手信号;当 execute_data_ok 为低
电平时,说明 execute 在该周期未计算完成,此时需要阻塞 execute 以及之前的流水段, memory 与
writeback 流水段继续流动并插入气泡,直到某个周期中 execute_data_ok 信号为高电平,恢复流
动。
存在一种情况: execute 计算乘除法,此时需要用到 memory 转发的数据,但 memory 为访存指令存在
延迟,即 multiplier 和 divider 拿到的操作数据有可能是不对的,需要在拿到正确的数据后进行重新
计算,解决方案为在满足上述条件时(具体到信号为 hazardOut.clear == 1 ),将 multiplier 与
divider 的 reset 信号拉高,直到某一周期 memory 得到正确的结果 state_nxt 设置为 DOING ,下一
周期开始计算。
2、转发器问题
execute 阻塞, memory 与 writeback 继续流动,此时会导致转发器数据覆盖,即memory会把
writeback转发的数据覆盖掉(lab2时已经改进转发器解决无效数据转发的问题),若此时 execute 阻
塞阶段需要用到writeback转发的数据就会导致执行错误。若通过 memory 阻塞的方式防止覆盖,在特定
条件下会导致 ireq 和 dreq 循环访存一直阻塞,无法正常执行。
解决方案:添加两个备份转发器,当 execute 阻塞而 memory 不阻塞时,阻塞两个备份转发器,五个转
发器进行转发;如下图:
通过两个备份转发器,在一般情况下, forward4 与 forward5 转发器与 forward2 和 forward3 转发器
的数据同步,在特殊条件下阻塞:
评论0