今天讲一个很简单的IC设计算法优化案例,希望大家能够从中找到芯片设计优化的一些方法。案例取自本人工作开发的一点小经历,省去背景和细节,单独拎出一个局部讲一下。
题目是这样的:有一个4bit宽的整数,要求实现其乘以0.675之后的下取整。
怎么用verilog实现呢?
看到这个题,你当然不能直接写: assign output = input *0.675;
因为被乘数是个小数。如果被乘数是整数的话,这么写“*”倒也可以,只不过最后会用乘法器来实现,浪费面积而已。
最简单的办法就是用查找表:
0 * 0.675,得到0, 下取整得到0;
1 * 0.675,得到0.675,下取整得到0;
2* 0.675,得到1.35, 下取整得到1;
3* 0.675,得到2.025, 下取整得到2;
............
15*0.675,得到10.125,下取整得到10;
高级一点的办法是把0.675转换成分数。
0.675=27/40;
先乘以27,再除以40;
乘以27很简单,可以拆成乘以(16+8+2+1),采用左移累加来实现。但是分母是40,没法通过右移来实现除法。除非分母是32或者64。
下面就是我的优化步骤:
(1)对于分数乘法,我们希望分母是2的指数,分子无