muldiv模块首先将infobus中输入的信息分别解析出来,这其中包括的信息有:当前操作是乘除操作的哪一种以及当前操作与上一操作是否存在back to back情况(back to back后续会讲)。
随后,将该次计算中所需要用到的信号进行预处理,包括操作数符号位的确定,符号位扩展以及操作码的确定。
2.muldiv模块所使用的状态机
本小节着重讲一下back2back情况。所谓back2back,就是上一条指令的两个操作数与下一条指令的操作数完全一致,并且操作不同但当前指令的结果已经得到了的情况。比如,上一条指令是divu操作,操作数为32和5,则商为6,同时不恢复余数法还会顺带计算得到余数为2.因此,若下一条指令为remu,且操作数同样为32和5,则可以直接单周期返回余数2的结果。
而在muldiv源代码中451行注释所说的//Only the MUL will be treated as back2back
并不是指只有乘法会有back2back,而是指乘法部分只有mul指令可以发生back2back,而mulh,mulhsu,mulhu因为操作数肯定不同或者过程值不同,不能发生back2back情况。
Back2back情况和specialcase情况(如除以0、乘以0、溢出等情况)都是能够单周期写回的情况,其他则是正常的情况,进行正常运算。
6.最后的一些问题