【经验总结】【乘法替换方法】
1 背景
客户将原器件(xilinx,altera,lattice,elitestek)平台代码移植到京微齐力器件平台时,代码中可能存在大量的乘法语句。原器件厂商的EDA工具可以将乘法映射到DSP的资源,且能够正确的统计资源的使用情况。由于FUXI目前不支持映射因此需要手动替换。
2 场景
场景1:变量 * 常量
场景2:变量 * 变量
3 替换方案
场景1: 变量位移和加法器/减法器替。
优点:可以减少DSP资源的使用,通过拼接和加法实现,理论上仅仅消耗加法器。
3.1 变量 * 常量 = 变量位移 + 常量
举例:
原代码语句:gray_GF_22 = gray22 * 1796;
分析:以上语句可以分解为:gray_GF_22 = gray22 * (1024 + 512 + 256 + 4);
替换代码语句: gray_GF_22 = {gray22, 10'd0} + {gray22, 9'd0} + {gray22, 8'd0} + {gray22, 2'd0};
3.2 变量 * 常量 = 变量位移 - 常量
举例:
原代码语句:Table_filiter = TableCur + TableBref * 7;
分析:以上语句可以分解为:Table_filiter = TableCur +TableBref *(8 - 1);
替换代码语句:Table_filiter = TableCur + {TableBref , 3'd0} - TableBref;
场景2: 例化DSP IP核
3.3 小于等于10 * 10 例化一个 10 *10的DSP;
3.4 小于等于18*9例化一个18*9的DSP;
3.5 小于等于18*18例化一个18*18的DSP;
4 FUXI工具DSP IP核支持基本模型
4.1 DSP IP核的4种10*10模型
4.1.1 DSP IP核支持单个 X*Y = Z模型,也支持同时8组 X*Y = Z模型,如图1:
图1
4.1.2 DSP IP核支持单个X0*Y0 + X1*Y1 = Z01模型,也支持同时4组X0*Y0 + X1*Y1 = Z01的模型,如图2:
图2
4.1.3 DSP IP核支持单个X0*Y0 + X1*Y1 + X2*Y2 + X3*Y3 = Z0123模型,也支持同时2组X0*Y0 + X1*Y1 + X2*Y2 + X3*Y3 = Z0123模型,如图3:
图3
4.1.4 DSP IP核支持X0*Y0 + X1*Y1 + X2*Y2 + X3*Y3 + X4*Y4 + X5*Y5 + X6*Y6 + X7*Y7 = Z模型,如图4:
图4
4.2 DSP IP核的3种18*9模型
4.2.1 DSP IP核支持单个 X*Y = Z模型,也支持同时4组 X*Y = Z模型,如图5:
图5
4.2.2 DSP IP核支持单个X0*Y0 + X1*Y1 = Z01模型,也支持同时2组X0*Y0 + X1*Y1 = Z01的模型,如图6:
图6
4.2.3 DSP IP核支持1组X0*Y0 + X1*Y1 + X2*Y2 + X3*Y3 = Z模型,如下图7:
图7
4.3 DSP IP核的2种18*18模型
4.3.1 DSP IP核支持单个 X*Y = Z模型,也支持同时2组 X*Y = Z模型,如图8:
图8
4.3.2 DSP IP核支持1组X0*Y0 + X1*Y1 = Z模型,如下图9:
图9
5 大位宽乘法方法
针对大于18*18的位宽乘法可以做如下拆解:
举例:36*18 = (高18*18) << 18 + (低18*18)
例化 4.3.1 18*18同时2组 X*Y = Z模型,然后高位结果移位 + 低位结果。