MIPS乘除法运算主要包含四条指令,分别是:mult、mult、div、divu。结果保存在两个体系外寄存器中hi、lo。对于乘法而言,hi寄存器保存高位,lo保存低位;对于除法,hi保存余数,lo保存商。首先,需要注意一点:MIPS Family的乘除法运算都不是集成在ALU内,而是单独built一个乘除法单元(MDU)。之前实现的乘除法运算,需要32个周期左右的延时,因为采用了资源复用的设计,主要算法就是基本的原码一位乘和原码一位除,补码一位乘的校正法我也实现过,Booth算法我没有实现。然而,这些实现都是每个周期只进行一次基本运算,从而叠加30+次,取得最终结果的思路。现假设,这是在流水线中,我们不难想象这样的大幅度延迟会造成大量的转发、冲突等。因为,很多时候我乘法或除法计算后,紧接下来的指令十有八九就是mflo/mfhi/ Integer Operation。所以,先让我们看一看MIPS 24K处理器如何处理乘除法流水线的延时。
首先,可以看到对于MULT/MULTU+MFHI/MFLO,延时为0cycle,如何实现呢,旁路对吧?而对于MUL+Integer Operation,延时0cycle;对于除法,我觉得MIPS 24K设计的很巧妙,通过比较除数的位数,来决定延时,这一做法我们可以学习。延时均很多,当然,我也可以使用一个计数器来算这些延时,同时与MDUctrl做逻辑,来发送MDUdone信号进行握手。但是,我个人觉