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
: 该段部分积为 0one
: 乘以 1two
: 乘以 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
→ 0001/010
→ +1011
→ +2100
→ -2101/110
→ -1111
→ 0
🔧 第 18 行:中间变量
logic [WIDTH:0] temp_prod;
比 multiplicand
多一位,用于暂存部分积并支持符号扩展。
🔁 第 19 行:组合逻辑块开始
always_comb begin
即将进入组合逻辑块,根据 zero/one/two/neg
控制信号计算实际部分积。
是否继续分析 always_comb
块中生成 temp_prod
和最终输出 partial_prod
、sign
的逻辑?
我们继续分析 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_prod
是 WIDTH+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 格式(去除 logic
、always_comb
、模块调用结构)?