gen_product

我们开始逐行分析 gen_product.sv 文件的前 20 行。该模块用于根据 Booth 编码结果生成一个部分积(partial product),这是 Booth 乘法器流水线中的关键步骤之一。


📝 第 1 行:模块说明

// Generate partial product according to radix-4 booth encoding result

📘 模块功能:根据 radix-4 Booth 编码结果生成部分积(partial product)。


🔧 第 2–3 行:模块定义与参数声明

module gen_product #(
    parameter int unsigned WIDTH = 16
)(
参数 含义
WIDTH 被乘数 multiplicand 的位宽

🔌 第 4–8 行:端口定义

    input logic [WIDTH-1:0] multiplicand,
    input logic [2:0] code,
    output logic [WIDTH:0] partial_prod,
    output sign
);
信号 方向 说明
multiplicand 输入 被乘数
code 输入 3 位 Booth 编码(例如来自 Booth 编码器)
partial_prod 输出 输出部分积,注意是 WIDTH+1
sign 输出 当前部分积的符号(是否是负)

⚙️ 第 9 行:内部信号声明

logic neg, zero, one, two;

这些是对 code 解码后可能产生的 4 个控制信号:

  • neg: 是否需要取反
  • zero: 该段部分积为 0
  • one: 乘以 1
  • two: 乘以 2

这些信号由下方的 booth_encoder 模块输出。


🧩 第 10–16 行:调用 booth_encoder 模块

booth_encoder u_booth_encoder(
    .code(code),
    .neg(neg),
    .zero(zero),
    .one(one),
    .two(two)
);

该模块将 code(3 位)翻译成上述控制信号。radix-4 Booth 编码通常有以下含义:

  • 000 → 0
  • 001/010 → +1
  • 011 → +2
  • 100 → -2
  • 101/110 → -1
  • 111 → 0

🔧 第 18 行:中间变量

logic [WIDTH:0] temp_prod;

multiplicand 多一位,用于暂存部分积并支持符号扩展。


🔁 第 19 行:组合逻辑块开始

always_comb begin

即将进入组合逻辑块,根据 zero/one/two/neg 控制信号计算实际部分积。


是否继续分析 always_comb 块中生成 temp_prod 和最终输出 partial_prodsign 的逻辑?

我们继续分析 gen_product.sv 中的 always_comb 组合逻辑块部分,主要完成部分积计算及符号处理。


🔁 行 21–29:组合逻辑块生成 temp_prod

if(one) begin
    temp_prod = multiplicand;
end
else if(two) begin
    temp_prod = multiplicand << 1;
end
else begin
    temp_prod = '0;
end

🧠 逻辑解释:

  • 如果是乘以 1:直接输出 multiplicand
  • 如果是乘以 2:左移 1 位,相当于乘以 2(Booth 中的 ±2 项)
  • 否则(例如编码为 000 或 111,对应 ±0):输出 0

🔧 注意:temp_prodWIDTH+1 位,multiplicand 会隐式零扩展。


🔗 行 30–31:最终输出信号赋值

assign partial_prod = neg ? (~temp_prod) : temp_prod;
assign sign = neg;
信号 说明
partial_prod neg=1,对 temp_prod 取位反(未加一,补码加法需外部处理)
sign 输出部分积的符号位,供后续补码加法使用

📌 注意:这里 仅进行了按位取反,未加一,符合 Booth 算法的设计模式,补码需要在 CSA 或后续处理中统一加上。


🔚 行 32:模块结束

endmodule

✅ 小结:gen_product.sv 模块功能

输入 控制逻辑 输出
code (3位) Booth 编码 控制 0/±1/±2
multiplicand 被乘数 根据 code 生成部分积
neg 信号控制 是否取反 仅按位取反,不补码加一

这是 Booth 乘法器流水线中用于生成 单个部分积 的关键模块。


是否将其转换为 Verilog-2001 格式(去除 logicalways_comb、模块调用结构)?

posted @ 2025-05-04 16:39  江左子固  阅读(30)  评论(0)    收藏  举报