Implémentation d'un encodeur Booth modifié en Verilog
Implémentation Verilog de l'algorithme de Booth modifié
L'algorithme de Booth modifié (Booth radix-4) divise par deux le nombre de produits partiels par rapport à une multiplication simple, en examinant des paires de bits du multiplicateur (avec chevauchement) pour déterminer s'il faut ajouter, soustraire ou décaler le multiplicande. Voici un module Verilog propre et synthétisable pour un multiplicateur 4×4, aisément paramétrable pour des opérandes plus larges.
Module Verilog complet
module booth_multiplier_4x4 ( input logic [3:0] multiplicand, input logic [3:0] multiplier, output logic [7:0] product ); // Produits partiels (Radix-4 génère N/2 = 2 produits partiels pour un multiplicateur 4 bits) logic signed [7:0] pp [0:1]; logic [2:0] booth_sel [0:1]; // {multiplier[2i+1], multiplier[2i], multiplier[2i-1]} // Encodage de Booth (combinatoire) always_comb begin // Groupe 0 : bits multiplier[1:0] + 0 implicite (multiplier[-1]=0) booth_sel[0] = {multiplier[1], multiplier[0], 1'b0}; // Groupe 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 (décalage gauche 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 // Décalage du produit partiel selon la position du groupe (2 bits par groupe) pp[i] = pp[i] << (2*i); end end // Additionneur final (combinatoire) assign product = pp[0] + pp[1]; endmodule Points clés de conception
- Arithmétique signée : La déclaration
logic signedet l'extension de signe ({{4{multiplicand[3]}}, ...}) gèrent correctement la multiplication en complément à deux pour des opérandes positifs et négatifs. - Encodage Radix-4 : Les groupes
booth_sel se chevauchent d'un bit (LSB du groupe précédent). Lemultiplier[-1] = 0implicite gère le premier groupe. - Décodage des actions : L'instruction
caseimplémente la table de vérité standard de Booth Radix-4 : 0, ±1×M, ±2×M. L'opération ±2×M est un simple décalage gauche de 1. - Décalage des produits partiels : Chaque produit partiel est décalé gauche de
2*ibits pour s'aligner sur son poids. - Paramétrage : Pour un multiplicateur N bits (N pair), générer
N/2produits partiels via une bouclegenerate.
Extraits de testbench
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 (complément à deux) a = -4'sd6; b = -4'sd7; #10; // 42 $finish; end endmodule Extension à des largeurs supérieures
Pour du RTL de production, envelopper l'encodage et la génération des produits partiels dans une boucle generate paramétrée par WIDTH. Utiliser un arbre d'additionneurs à retenue reportée (CSA) type Wallace ou Dadda suivi d'un additionneur final rapide (CLA/Kogge-Stone) pour les multiplicateurs larges haute performance, plutôt qu'une simple somme par propagation comme ici pour la clarté.
