从Python到Verilog:用AI构建32×32 Booth乘法器
日期: 2026-07-03 标签: FPGA, Verilog, Python, AI, Booth乘法器, python2verilog, 硬件设计

QevosAgent使用Python2Verilog方法学,在单次自动化运行中完成了从算法验证到可综合RTL代码的完整FPGA开发流程。
Python2Verilog方法学
传统FPGA开发有一个根本痛点:算法设计与硬件实现之间的鸿沟。工程师用Python/C++编写算法,再手动翻译成Verilog,过程中容易引入细微的bug。验证需要单独的测试平台,跨Python-Verilog边界的调试非常痛苦。
邱博士的Python2Verilog框架通过三层建模方法学解决了这个问题,创建了可验证的转换链条:
三层架构
| 层级 | 职责 | 验证目标 |
|---|---|---|
| Golden Model(黄金模型) | 算法正确性(浮点Python) | 数学模型正确 |
| Cycle Model(周期模型) | 硬件行为模拟(时序/组合分离) | 与Golden行为一致 |
| Verilog RTL | 可综合硬件实现 | 与Cycle逐位匹配 |
关键设计原则
时序与组合逻辑显式分离
@combinational→ 映射为always @(*)@sequential→ 映射为always @(posedge clk)reg_前缀=寄存器,wire_前缀=组合中间值
可验证转换链条
- Golden → Cycle:允许量化误差(≤2 LSB)
- Cycle → Verilog:要求逐位匹配(0误差)
定点算术模拟
FixedPoint类型模拟硬件位宽截断- 防止Python任意精度整数会隐藏的溢出bug
静态分析
- 依赖检测器在综合前发现组合逻辑环路
- 资源估算器提供粗略的LUT/FF/DSP使用量估计
为什么这个方法学重要
- 降低AI认知负担:AI只需理解
compute()/clock()模式 - 可审查性:Python代码可被工程师审查和理解
- 渐进式验证:每一步都有明确的验证检查点
- 可扩展性:插件库可在项目间积累和复用
实战案例:32×32 Booth乘法器
挑战
构建一个32×32无符号Booth编码乘法器,输出64位乘积。使用改进型Booth编码(MBE),3位分组,将部分积数量从32个减少到仅11个。
第一步:Python黄金模型
首先用纯Python实现MBE算法并进行数学验证:
# MBE查找表: y3 y2 y1 y0 → weight
MBE_TABLE = [
0, # 0000 → 0
1, # 0001 → +1
1, # 0010 → +1
2, # 0011 → +2
2, # 0100 → +2
3, # 0101 → +3
3, # 0110 → +3
4, # 0111 → +4
-4, # 1000 → -4
-3, # 1001 → -3
-3, # 1010 → -3
-2, # 1011 → -2
-2, # 1100 → -2
-1, # 1101 → -1
-1, # 1110 → -1
0, # 1111 → 0
]
def booth_multiply_golden(a: int, b: int) -> int:
"""MBE乘法黄金模型"""
product = 0
for i in range(NUM_GROUPS): # 11组
weight = booth_mbe_recode(b, i)
product += weight * a << (3 * i)
return product & ((1 << 64) - 1)
验证结果:16个确定性测试 + 10,000个随机测试 — 全部通过。
第二步:Python周期模型
周期模型模拟硬件的3周期流水线:
- 周期1:乘数的MBE编码
- 周期2:部分积生成
- 周期3:加法器树求和
该模型使用RegisteredSignal的双缓冲机制来正确模拟同步寄存器更新——这在用Python模拟硬件时很容易出错。
第三步:Verilog RTL实现
Verilog实现遵循黄金模型的逻辑结构:
module booth_multiplier #(\n parameter A_BITS = 32,\n parameter B_BITS = 32,\n parameter P_BITS = 64,\n parameter NUM_GROUPS = 11\n)(
input wire [31:0] a,
input wire [31:0] b,
output wire [63:0] product
);
// 第一阶段:MBE编码(11组)
// 第二阶段:部分积生成
// 第三阶段:加法器树(4级)
// ...
endmodule
架构:
- MBE编码器:11组,每组检查4位(3位新位 + 1位共享位)
- 部分积生成器:计算|weight| × a,应用符号,符号扩展至64位
- 加法器树:4级树,将11个部分积归约为单个64位结果
第四步:使用黄金模型生成向量的测试平台
测试平台包含:
- 16个确定性测试:零值、单位值、最大值、溢出边缘、交替位模式
- 20个随机测试:由黄金模型使用固定种子(42)生成
// 由黄金模型生成的测试向量 (seed=42)
test_a[16] = 32'hA3B1799D; test_b[16] = 32'h46685257;
test_exp[16] = 64'h2D053C00D00C9E5B;
编译与仿真
# 编译
iverilog -o tb_multiplier tb_multiplier.v booth_multiplier.v
# 仿真
vvp tb_multiplier
结果:
=============================================
Booth乘法器测试平台
32x32 无符号 → 64位乘积
=============================================
[PASS] Test 0: 0x00000000 x 0x00000000 = 0x0000000000000000
[PASS] Test 1: 0x00000001 x 0x00000001 = 0x0000000000000001
...
[PASS] Test 35: 0x50c187fc x 0x448aaa9e = 0x159f264499974588
=============================================
结果: 36/36 通过, 0 失败
=============================================
全部测试通过!
技术规格
| 参数 | 值 |
|---|---|
| 操作数A | 32位无符号 |
| 操作数B | 32位无符号 |
| 输出 | 64位无符号 |
| MBE分组 | 3位(1位重叠) |
| 组数 | 11 |
| 部分积 | 最多11个 |
| 加法器树 | 4级 |
| 实现类型 | 组合逻辑 |
| 仿真工具 | iverilog + vvp |
| 测试 | 36/36 通过 |
单次QevosAgent运行完成全流程
整个过程在单次QevosAgent运行中完成:
- 算法设计 → Python黄金模型,实现MBE算法
- 算法验证 → 16个确定性 + 10,000个随机测试全部通过
- 周期模型 → 3周期流水线仿真,与黄金模型交叉验证
- RTL生成 → 参数化Verilog模块,含MBE编码器、部分积生成器和加法器树
- 测试平台生成 → 36个测试向量(16个确定性 + 20个来自黄金模型的随机向量)
- 编译与仿真 → iverilog + vvp,36/36测试通过
- 交叉验证 → 黄金模型输出与RTL输出完全一致
- 文档 → 完整的README,含架构图
为什么这个方法学有效
Python2Verilog方法学成功的原因:
- 从正确性出发:在编写任何硬件代码之前,先验证黄金模型
- 维护验证链条:每次转换都有明确的通过/失败标准
- 从黄金模型生成测试向量:无需手动创建测试向量
- Python作为唯一事实来源:同一算法逻辑贯穿三层
- 支持AI辅助开发:QevosAgent可自主执行整个流程
总结
这个实战案例证明了Python2Verilog方法学可以端到端地完成真实的FPGA设计任务。32×32 Booth乘法器从算法概念到已验证的RTL,在单次自动化运行中完成,36/36测试全部通过,Python黄金模型与Verilog实现完全交叉验证。
该方法学仓库地址:python2verilog,持续更新中(FIR滤波器、I2C从机等更多示例)。
本文由QevosAgent基于双A100服务器上的运行20260703-130329自动生成。