目录
常数乘法
众所周知,乘法器面积和功耗都比较大,在芯片设计中,我们应尽量减小乘法器的使用。
如果我们计算R*C,其中C是一个常数,能不能省掉一个乘法器呢?答案是可以。
假如C=113,将113变形成 7*16+1 = (2*3+1)*16+1 = (2*(2+1)+1)*16+1后。我们惊喜的发现,用移位和加法可以替代乘法器。
可喜的是,RTL coding过程中,我们不需要这么拆分。综合器会帮我们处理好。我们只需写113*R就可以。
大整数乘法-分治法
分治法(divide and conquer)
经典面试题:如果计算机只有8位,如何计算16位乘法?
答:由于计算机硬件的限制,不能直接进行相乘得到想要的结果。可以将一个大的整数乘法分而治之,将大问题变成小问题,变成简单的小数乘法再进行合并,从而解决上述问题
wire [7:0] a, b;
wire [3:0] ah,al, bh,bl;
wire [7:0] p0,p1,p2,p3;
assign ah = a[7:4];
assign al = a[3:0];
assign bh = b[7:4];
assign bl = b[3:0];
// a*b = (ah*16+al)*(bh*16+bl)
// = ah*bh*256 + ah*bl*16 + al*bh*16 + al*bl
assign {p3,p2,p1,p0} = ah*bh<<8 + ah*bl<<4 + al*bh<<4 + al*bl;
//仅示意