双路径,五级、三级,前导0预测,桶形移位器
双路径
经过上面分析,双路径算法就应运而生了,M.J. Flynn 等人, 提出了双路径算法(Michael.J.Flynn,1990):
它的基本思想是根据两操作数的指数差异大小来划分数据通路。这是因为,当指数差异较小时,两指数进行减法操作时.其结果将可能产生大量的前导零,这在规格化的时候将产生大量的左移操作,而移位的位数是个变量:当指数差异较大时,又将在对齐指数时产生大量的移位。浮点加法器的双数据通道划分方法在浮点加法器的结构设计中被广泛采用。
通过对 CLOSE 路径和 FAR 路径这 2 条路径分析,发现双路径算法相对于传统的加法算法的改进主要在于,在每条路径中,只有一次全长的移位。
FAR路径中,要么进行加法运算,要么进行指数差异较大的减法运算,所以
最终的尾数在规格化时候,不需要移位或者只需要进行一位左移
尾数运算结果始终为正.不需要转换成原码的转换操作。
A跟B的指数相差非常大,则相当于对1个无穷大数进行不痛不痒的加减操作,这样的话,可以将较大的数(即A)当成结果直接输出。
CLOSE路径中,由于A跟B指数差d<=1.所以
对齐操作的移位,最多为1位
d的计算只由最后两位相减
舍入可以避免。
五级
- Exp-d: 求指数之差同时交换 2 个操作数 A,B,总是让大操作数用 A 表示,小操作数用 B 表示。
- Rshift: B 右移向 A 对齐,移动的位数由 Exp-d 中计算出来的指数之差 d决定。
- Man-Add: 尾数有效位相加减(减法也是通过加法实现)。
- Round: 舍入操作。
- LZA: 前导 0 判断,主要应用在指数相差不大的减法操作中。
- Convert: 减法可能出现负数,这样需要进行负数转原码表示的转换。
- Lshift: 根据前导零的结果,判断第一个 1 出现的位置,从而进行左移,使尾数符合标准 IEEE754 表示的标准。
三级
为了进一步优化, Flynn 等人继续做出改进,提出了合并舍入的方法,在有效位加法器的设计上进行改进,针对 IEEE 四种舍入方式的计算要求,用结合了 CLA 跟CSA2 种加法器优点的混和加法器 ComAdd 完成所有舍入可能结果的计算, 这种改进将原来五周期的传统浮点加法算法缩短为三周期完成。
- Exp-d: 求指数之差同时交换 2 个操作数 A,B,总是让大操作数用 A 表示,小操作数用 B 表示。
- Rshift: B 右移向 A 对齐,移动的位数由 Exp-d 中计算出来的指数之差 d决定。
- ComAdd: 复合加法器,可以将舍入合并在尾数有效位加法器中。
- LZA: 前导 0 判断,主要应用在指数相差不大的减法操作中。
- Convert: 减法可能出现负数,这样需要进行负数转原码表示的转换。
- Lshift: 根据前导零的结果,判断第一个 1 出现的位置,从而进行左移,使尾数符合标准 IEEE754 表示的标准。
运算部件
错位并行指数比较、尾数移位
sd
尾数有效位加法器
减法
sfa
前导 0 预测
前导 0 预测仅在CLOSE路径进行。
加法运算:不需要前导 0 预测
减法运算:
始终采取大数减小数 A - B
如果是采用大操作数减去小操作数的话,Q(采用公式预测的结果)跟 C(实际算出来的结果),Q 跟 C 要么相同,要么差了一位(多计算一个前导零),而这个差一位的情况可以在后面进行微调,如果不微调,则会在左移过程中将首个 1 移走。
这个前导零预测电路有个局限性,只有当是大操作数减去小操作数时候才有用,而如果是小操作数减去大操作数,就会出现预测错误。而我们知道,前导零预测电路主要应用在 CLOSE 路径中,尽管我们之前会根据指数大小来判断操作数大小,但是如果指数相同的情况下,我们并没有采用再对具体尾数比较来判断大小,因为这样会加深电路结构的复杂化,且降低速度,而是任由 2 操作数哪个减去哪个,所以这里,并行的思想再次得到体现,我们分别用两个前导零预测(?)电路,一个预测(A-B)的前导零计数,一个预测(B-A)的前导零计数,然后由最终结果来选择准确的需要移位的数目的。
桶形移位器
桶形移位器(Barrel Shifter)是微处理器定点/浮点运算器中的典型运算部件。桶形移位器的基本构成使多路复用器,设计如果使采用标准单元综合的话,它所占用的面积较大,如果设计对时序,面积有很高要求的话,则不适合。所以我们可以采用自己设计的桶形移位器(Rafati, R.Fakhraie, S.M Smith, K.C.,2006),可以避免标准单元综合的桶形移位器在时序,面积上面的缺点,当在需要多次重复使用以及要求速度的设计中,能得到广泛的使用,因此在High-performance跟Low power的微CPU的设计中,通常都采用全定制设计的桶形移位器来实现移位功能。