O algoritmo Modified Booth (Booth Radix-4) reduz o número de produtos parciais pela metade comparado à multiplicação simples, examinando pares de bits do multiplicador (com sobreposição) para determinar se deve adicionar, subtrair ou deslocar o multiplicando. Abaixo está um módulo Verilog limpo e sintetizável para multiplicador 4x4, facilmente parametrizável para operandos mais largos.
module booth_multiplier_4x4 ( input logic [3:0] multiplicand, input logic [3:0] multiplier, output logic [7:0] product ); // Produtos parciais (Radix-4 gera N/2 = 2 produtos parciais para multiplicador 4-bit) logic signed [7:0] pp [0:1]; logic [2:0] booth_sel [0:1]; // {multiplier[2i+1], multiplier[2i], multiplier[2i-1]} // Codificação Booth (Combinacional) always_comb begin // Grupo 0: bits multiplier[1:0] + 0 implícito (multiplier[-1]=0) booth_sel[0] = {multiplier[1], multiplier[0], 1'b0}; // Grupo 1: bits multiplier[3:2] + multiplier[1] booth_sel[1] = {multiplier[3], multiplier[2], multiplier[1]}; for (int i = 0; i < 2; i++) begin unique case (booth_sel[i]) 3'b000, 3'b111: pp[i] = 8'sd0; // 0 * M 3'b001, 3'b010: pp[i] = {{4{multiplicand[3]}}, multiplicand}; // +1 * M 3'b011: pp[i] = {{3{multiplicand[3]}}, multiplicand, 1'b0}; // +2 * M (shift left 1) 3'b100: pp[i] = -({{3{multiplicand[3]}}, multiplicand, 1'b0}); // -2 * M 3'b101, 3'b110: pp[i] = -({{4{multiplicand[3]}}, multiplicand}); // -1 * M default: pp[i] = 8'sd0; endcase // Desloca produto parcial conforme posição do grupo (2 bits por grupo) pp[i] = pp[i] << (2*i); end end // Somador Final (Combinacional) assign product = pp[0] + pp[1]; endmodule module tb; logic [3:0] a, b; logic [7:0] p; booth_multiplier_4x4 uut (.multiplicand(a), .multiplier(b), .product(p)); initial begin a = 4'd5; b = 4'd3; #10; // 15 a = -4'sd5; b = 4'd3; #10; // -15 (complemento de dois) a = -4'sd6; b = -4'sd7; #10; // 42 $finish; end endmodule Para RTL de produção, envolva a codificação e geração de produtos parciais num loop `generate` parametrizado por `WIDTH`. Use árvore de somador carry-save (CSA) (Wallace ou Dadda) seguida por somador final rápido (CLA/Kogge-Stone) para multiplicadores largos de alto desempenho, em vez de soma ripple simples como mostrado aqui para clareza.
Tecnologia Eletrônica © [www.351231.com]