这个乘法亭算法正确吗

问题描述 投票:0回答:1
module booth_multiplier(
    input signed [31:0] multiplicand,
    input signed [31:0] multiplier,
    input clk,
    input reset,
    output signed [63:0] product
);

    reg signed [63:0] product_reg;
    reg signed [31:0] recoded_multiplier;
    integer i;
    reg signed [63:0] extended_multiplicand;

    always @(*) begin
        // Booth multiplier recoding table
        for (i = 0; i < 32; i = i + 1) begin
            case ({multiplier[i], (i == 0) ? multiplier[0] : multiplier[i-1]})
                2'b11: recoded_multiplier[i] = 0;   // no adjustment
                2'b10: recoded_multiplier[i] = 1;   // +1 adjustment
                2'b01: recoded_multiplier[i] = -1;  // -1 adjustment
                2'b00: recoded_multiplier[i] = 0;   // no adjustment
            endcase
        end
    end

    always @(posedge clk or negedge reset) begin
        if (!reset) begin
            product_reg <= 0;
        end
        else begin
            // Sign extend multiplicand to match the width of product_reg
            extended_multiplicand = {{32{multiplicand[31]}}, multiplicand};

            // Add or subtract sign-extended multiplicand based on recoded multiplier
            case (recoded_multiplier)
                1: product_reg <= product_reg + extended_multiplicand; // Addition
               -1: product_reg <= product_reg - extended_multiplicand; // Subtraction
                default: product_reg <= product_reg; // No adjustment
            endcase
            
            // Shift product_reg to the left by one bit
            product_reg <= {product_reg[62:0], 1'b0};
        end
    end

    assign product = product_reg;

endmodule

我正在尝试为我上面为乘法亭算法创建的代码运行一个测试台。我只是想确定这是否正确,因为我没有得到波形。也许我的测试台是错误的,我不确定。我一直在试图弄清楚,但现在迷失了,哈哈。

verilog
1个回答
0
投票

该实现存在一些时序和架构问题。
看起来您正在尝试使用单个加法器单元,这需要 32 个时钟周期才能完成。
到目前为止,case 语句处于组合过程中,并将推断出组合逻辑。组合逻辑中的for循环每个时钟周期会循环32次。在此过程中,寄存器仅更新一次;在最后。
我认为您想要的是 case 语句每个时钟周期循环一次,以便寄存器因 case 语句中的每个循环周期/操作而更新。因此,按照编码的架构方式,整个算法应该需要 32 个时钟才能完成。
我会从

开始
  1. 将 case 语句移至时钟进程。
  2. 摆脱 for 循环并使用计数器来执行 for 循环当前试图完成的相同角色。

从大局来看,如果仅使用一个加法器单元,您可能会使这一过程变得比应有的困难。我在网上搜索了这个并找到了使用 N 个加法器单元进行 N 位乘法的简单实现。在您的情况下,这将是 32 个加法器单元。如果您修改代码以使用 32 个加法器单元,那么似乎可以使用组合逻辑在一个时钟周期内计算出结果。要推断 N 个加法器单元,您将需要 N 个实例或生成语句(看起来像 for 循环)。我将从 N 个实例开始。

将此视为烹饪汉堡包。
你的任务是烹饪 32 个汉堡。 您一次可以烹饪 32 个,这种情况下您需要 32 个汉堡烹饪机,或者您可以一次烹饪一个。
如果你一次煮一个汉堡,你不能只在第一个汉堡上撒 32 次盐,等一个烹饪时间就说你完成了。

考虑一下您想要构建哪种架构。 N 个实例对我来说似乎更简单。

© www.soinside.com 2019 - 2024. All rights reserved.