假设我有这样的乘数代码,
module multiply(
output [63:0] result,
input [31:0] a,
input [31:0] b
);
assign result = a * b;
endmodule
这会产生很多门。
应该使用什么更好的方法来实现组合乘法器?
硬件乘数很大,你只需要忍受它!
乘法器将随着其输入位宽变大而变大。因此,如果您不需要其中一个操作数上的完整 32 位,那么将此大小减小到最小值将减小最终硬件的大小。
如果你乘以一个固定的数字,我认为编译器也可以进行一些优化来限制硬件的大小。或者您可以对固定数字使用不同的编码方案,例如CSD,这将减少乘法器中加法器的数量,进一步减少其面积。
如果您需要大量乘法器并拥有快速时钟,也许您可以将单个硬件乘法器重用于许多计算。这意味着编写一些控制/流水线逻辑来安排乘法,并且您可能需要一些内存,但它可以节省您的整体区域。在这种情况下,您将设计一个 mini-DSP 数据路径。
如果您可以放弃组合要求,则可以使用加法器和累加器进行乘法运算,如果速度不是一个大问题并且您能够在多个时钟上处理操作数。一些低功耗/低成本/小面积处理器在其ISA中没有专用的乘法指令,或者前端指令解码器将乘法asm指令变为加法运算变成加法微码操作。
如果您要使用此方法,则必须为数据握手创建额外的信号,因为在输入稳定后的 1 个周期内输出不再有效。
由verilog 生成的乘数可能不是最优的。在 evvective 乘法器和加法器领域有很多研究。这里是 add/mul 的相当普遍和好的生成器之一: http ://www.aoki.ecei.tohoku.ac.jp/arith/mg/algorithm.html
此页面描述了许多 add/mul 低级实现