本帖最后由 yaya126 于 2017-9-12 15:20 编辑
Reduce Logic size
Divider optimization(N/M):乘法器通常1拍内完成,但除法器少有能1拍完成的。乘法我们可以直接在代码里面写“*”号,综合工具通常能给我们满意的结果,但除法器,极少数情况下我们直接写“/”,大部分情况我们需要单独inst 除法module.
标准除法器(N和M 都是变量):
基本的设计思路是移位减,如果每个cycle计算被除数1bit, N/M, 我们需要N拍,如果每个cycle 2bit则需要(N+1)/2 拍,这样的除法器面积都不大,但计算latency长。同时EDA公司也提供的design-ware除法器,速度更快,面积也更大。当然还有一种查LUT表的除法器,但我没用过,不好评价
特殊除法器:
1)除数是2的幂次,如2, 4, 8,很多人会想到直接移位,对于被除数是正数来说移位绝对正确,但如果被除数是负数,除法结果收敛到0,移位结果收敛到-1, 如 -5/64=0, -5 == 5B'1-1011, 右移后,变成5b'1-1111,= -1,两者结果不同。 判断高位是都全为1,如A[m,0]>>n, 需要确认A[m,n]的情况 |A[n-1:0] !=1'b0? A[m,n] + 1'b1 : A[m,n]; 2)除数是常数,最好为 (2的幂次+/-1), 如5,,7,可以考虑泰勒展开,用2的幂次和来近似。 如下 用最近的2的幂去近似的除,将余数和商迭代知道其和小于除数。 Div/(2^X - K) step1 Div/2^X = M0 ... R0 if K*M0 + R0 >=2^X - K, to step 2, else M= M0,R=R0+K*M0 step 2 (K*M0+R0)/2 … 如下 100/7 =14 ...2 step 1 100/8 = 12 .. 4 if (12+4)>= 7, to step 2 step 2 (12+4)/8 = 2 ...0 if (2 +0 )<7 . result = 12 +2 ...2. 3)除数是常数,是不是可以用近似的乘法来代替,比如先计算X= 1024/M, 再用 X*N/1024来还原成N/M. 当然这个除法会有精度损失需要考虑。 网上还有相关文档针对特殊除法器的优化,这个需要具体应用具体分析。
正因为除法器在面积和latency上的差异非常大,特别是长latency的除法器,很容易成为计算逻辑中的瓶颈,别的逻辑都在等着它的结果才能开始后面的计算。因此在选择不同除法器时,需要考虑整个data-path的开销,减少1个cycle的除法计算,是不是能缩短整个path 1 拍,可以节约多少寄存器。 当data-path不关心除法latency的时候,直接选1bit移位减的除法器area和power最优,如果能结果逻辑复用效果更佳。 |