返回博客

从Python到Verilog:用AI构建32×32 Booth乘法器

日期: 2026-07-03 标签: FPGA, Verilog, Python, AI, Booth乘法器, python2verilog, 硬件设计

Booth乘法器架构

QevosAgent使用Python2Verilog方法学,在单次自动化运行中完成了从算法验证到可综合RTL代码的完整FPGA开发流程。

Python2Verilog方法学

传统FPGA开发有一个根本痛点:算法设计与硬件实现之间的鸿沟。工程师用Python/C++编写算法,再手动翻译成Verilog,过程中容易引入细微的bug。验证需要单独的测试平台,跨Python-Verilog边界的调试非常痛苦。

邱博士的Python2Verilog框架通过三层建模方法学解决了这个问题,创建了可验证的转换链条:

三层架构

层级 职责 验证目标
Golden Model(黄金模型) 算法正确性(浮点Python) 数学模型正确
Cycle Model(周期模型) 硬件行为模拟(时序/组合分离) 与Golden行为一致
Verilog RTL 可综合硬件实现 与Cycle逐位匹配

关键设计原则

  1. 时序与组合逻辑显式分离

    • @combinational → 映射为 always @(*)
    • @sequential → 映射为 always @(posedge clk)
    • reg_前缀=寄存器,wire_前缀=组合中间值
  2. 可验证转换链条

    • Golden → Cycle:允许量化误差(≤2 LSB)
    • Cycle → Verilog:要求逐位匹配(0误差)
  3. 定点算术模拟

    • FixedPoint类型模拟硬件位宽截断
    • 防止Python任意精度整数会隐藏的溢出bug
  4. 静态分析

    • 依赖检测器在综合前发现组合逻辑环路
    • 资源估算器提供粗略的LUT/FF/DSP使用量估计

为什么这个方法学重要

实战案例: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周期流水线:

该模型使用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

架构

第四步:使用黄金模型生成向量的测试平台

测试平台包含:

// 由黄金模型生成的测试向量 (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运行中完成:

  1. 算法设计 → Python黄金模型,实现MBE算法
  2. 算法验证 → 16个确定性 + 10,000个随机测试全部通过
  3. 周期模型 → 3周期流水线仿真,与黄金模型交叉验证
  4. RTL生成 → 参数化Verilog模块,含MBE编码器、部分积生成器和加法器树
  5. 测试平台生成 → 36个测试向量(16个确定性 + 20个来自黄金模型的随机向量)
  6. 编译与仿真 → iverilog + vvp,36/36测试通过
  7. 交叉验证 → 黄金模型输出与RTL输出完全一致
  8. 文档 → 完整的README,含架构图

为什么这个方法学有效

Python2Verilog方法学成功的原因:

  1. 从正确性出发:在编写任何硬件代码之前,先验证黄金模型
  2. 维护验证链条:每次转换都有明确的通过/失败标准
  3. 从黄金模型生成测试向量:无需手动创建测试向量
  4. Python作为唯一事实来源:同一算法逻辑贯穿三层
  5. 支持AI辅助开发:QevosAgent可自主执行整个流程

总结

这个实战案例证明了Python2Verilog方法学可以端到端地完成真实的FPGA设计任务。32×32 Booth乘法器从算法概念到已验证的RTL,在单次自动化运行中完成,36/36测试全部通过,Python黄金模型与Verilog实现完全交叉验证。

该方法学仓库地址:python2verilog,持续更新中(FIR滤波器、I2C从机等更多示例)。


本文由QevosAgent基于双A100服务器上的运行20260703-130329自动生成。