【Code with SOLO】用 SOLO MTC 开发一款 FPGA 可视化模块拖拽拼装工具,让硬件设计告别繁琐连线
一、摘要
我是一名 FPGA 开发工程师,日常工作中需要大量编写 Verilog 模块实例化和端口连线代码——这类工作繁琐但设计价值低。我使用 TRAE SOLO MTC 从零开发了一款 FPGA 模块拖拽拼装工具,通过可视化拖拽操作自动生成规范的 Verilog 代码,将原本 2-3 小时的连线编写工作缩短到 10-15 分钟,并内置 80+ 常用模块库,支持嵌套层级设计。
值得一提的是,SOLO MTC 参与了这款软件产品从构思到交付的完整生命周期——从早期的架构设计与技术选型,到核心功能开发、性能优化、Bug 修复,再到打包发布、使用说明书与推广文案的编写,乃至开发过程中技术经验的技能化沉淀,每一个环节都有 SOLO MTC 的深度参与。甚至这篇参赛帖子本身,也是由 SOLO MTC 协助撰写的——某种意义上,我提交了我自己。
二、背景
在 FPGA/数字电路开发中,一个包含 15-20 个模块的中等规模系统,仅模块实例化和端口连线代码就需要编写 200+ 行 Verilog。这些代码结构高度重复、容易出错,但对系统功能设计本身贡献甚微。尤其是对于技术积累丰富的企业或团队,拥有大量可复用的 IP 模块,但每次搭建系统时仍需手动编写大量"胶水代码"。
我希望开发一款可视化工具,让开发者通过拖拽模块、点击端口的方式完成系统搭建,自动生成规范的 Verilog 代码,从而将精力集中在核心功能设计上。
三、实践过程
3.1 任务拆解
我将整个项目拆解为以下核心模块,逐步交给 SOLO MTC 实现:
- 数据模型层:定义 FPGAModule、Port、Connection、Project 等数据结构
- Verilog 解析器:基于 PLY 解析 .v 文件,提取模块端口信息
- 图形化画布:基于 Qt Graphics View 实现拖拽、连线、缩放
- 代码生成器:基于 Jinja2 模板自动生成 Verilog 代码
- 项目管理:设计文件的保存、加载、嵌套层级管理
- 性能优化:网格绘制重构、视口优化、批量加载、索引加速等
3.2 SOLO MTC 在开发中的关键作用
(1)软件架构设计阶段
在项目启动的架构设计阶段,我仅向 SOLO 描述了需求:“基于 PySide6 开发一个 FPGA 模块可视化拖拽拼装工具”。SOLO 立即为我提供了完整的架构方案:
- 技术栈选型:为什么选择 PySide6 而非 PyQt5、为什么选择 QGraphicsView 而非 QWidget 直接绘制
- 三层架构设计:QGraphicsView(视图)/ QGraphicsScene(场景)/ QGraphicsItem(图形项)的分层职责
- 数据模型设计:使用 Python dataclass 定义 FPGAModule、Port、Connection 等核心数据结构
- 信号槽机制:模块间通信方案、回调函数设计模式
- 项目目录结构:core/、models/、ui/、parser/ 等目录的划分依据
(2)核心功能开发
Verilog 解析器开发:我提供了 Verilog 模块的语法样本,SOLO 基于 PLY(Python Lex-Yacc)生成了完整的词法分析器和语法分析器,能够自动解析模块名、端口方向、位宽、参数等信息。后续遇到解析边界情况(如多行参数声明),通过补充样本让 SOLO 迭代修复。
图形化画布实现:画布是整个项目最复杂的部分。SOLO 实现了:
- 模块图形项(ModuleItem)的绘制、端口布局、拖拽交互
- 贝塞尔曲线连线(WireItem)和箭头绘制
- 端口点击拖拽创建连线
- 画布缩放、平移、自适应扩展
- Ctrl+拖拽复制模块
性能优化:当模块数量增多后出现卡顿,我让 SOLO 进行了系统性的性能分析和优化:
- 将网格从 1200+ 个独立 QGraphicsLineItem 改为 drawBackground() 直接绘制
- 视口更新模式从 FullViewportUpdate 改为 SmartViewportUpdate
- 批量加载时阻塞信号、统一更新
- 连线按 module_id 建立索引字典,查找从 O(N) 降为 O(K)
- 为 ModuleItem 和 WireItem 启用 DeviceCoordinateCache 消除拖拽残影
- 模块库从同步加载改为 QThread 异步加载
Bug 修复与功能迭代:开发过程中遇到的各种问题,SOLO 都能快速定位并修复:
- 常量连接保存后重新打开不显示 → 加载逻辑缺少对 CONSTANT_MODULE_ID 的特殊处理
- 保存后关闭仍提示未保存 → _dirty 标志未重置
- 放大后拖拽残影 → 启用图形缓存模式
- 启动时解析 80 个 Verilog 文件阻塞界面 → 改为后台线程异步加载
(3)软件发布与打包
SOLO 协助完成了软件的打包发布工作:
- PyInstaller 配置:创建 .spec 文件,配置隐藏导入、资源文件收集、图标设置
- 打包问题解决:诊断并修复 Python 环境与 PySide6 安装路径不一致导致的 DLL 缺失问题
- 独立可执行程序:生成无需 Python 环境即可运行的 exe 文件,总大小约 114MB
(4)配套文档编写
SOLO 帮助编写了完整的软件配套文档:
- 使用说明书:8 章完整文档,涵盖软件概述、系统要求、安装启动、界面介绍、基本操作、高级功能、快捷键、常见问题
- 推广文案:突出产品核心价值(告别繁琐连线、提升模块复用效率、可视化设计思路清晰),包含效率对比数据表
- 技术技能文档:将开发过程中的关键技术提炼为 4 个技能文档——Verilog 解析与代码生成、图形化设计画布、撤销/重做系统、嵌套层级设计
(5)作品提交帖子
本帖子本身也是由 SOLO 协助完成的——我提供了项目背景和开发过程的关键信息,SOLO 按照 SOLO 挑战赛的作品提交指南格式,生成了结构完整的参赛帖子,包括摘要、背景、实践过程、成果展示、效果总结等章节。
四、成果展示
应用功能
- 可视化拖拽设计:从模块库拖拽模块到画布,点击端口创建连线
- 智能连线:自动生成连线名称,位宽匹配检查
- 常量连接:右键端口直接设置常量值(如 8’d255)
- 代码自动生成:一键生成完整的 Verilog 模块实例化和连线代码
- 嵌套层级设计:将设计封装为自定义模块,支持多层级系统搭建
- 模块库管理:内置 80+ 常用模块,支持导入自定义 .v 文件
- 撤销/重做:完整的操作历史记录
- 独立可执行程序:PyInstaller 打包,无需 Python 环境
技术栈
| 层级 | 技术 |
|---|---|
| UI 框架 | PySide6 (Qt for Python) |
| 图形视图 | QGraphicsView / QGraphicsScene / QGraphicsItem |
| Verilog 解析 | PLY (Python Lex-Yacc) |
| 代码生成 | Jinja2 模板引擎 |
| 数据模型 | Python dataclass + JSON 序列化 |
| 打包发布 | PyInstaller |
项目结构
fpga_module_builder/
├── main.py # 入口文件
├── core/ # 核心逻辑
│ ├── module_manager.py # 模块管理
│ ├── undo_manager.py # 撤销/重做
│ └── validator.py # 设计验证
├── models/ # 数据模型
│ ├── fpga_module.py # 模块模型
│ ├── port.py # 端口模型
│ ├── connection.py # 连接模型
│ └── project.py # 项目模型
├── parser/ # Verilog 解析器
├── generator/ # 代码生成器
├── ui/ # 界面组件(13个文件)
│ ├── main_window.py # 主窗口
│ ├── canvas_scene.py # 设计画布
│ ├── module_item.py # 模块图形项
│ ├── wire_item.py # 连线图形项
│ └── port_item.py # 端口图形项
└── resources/ # 资源文件
└── default_module_lib/ # 默认模块库(80+ .v 文件)
配套文档
使用说明书
推广PPT
SKILLS总结
五、效果与总结
提效数据
| 指标 | 传统手写 | 使用本工具 |
|---|---|---|
| 搭建时间(15模块系统) | 2-3 小时 | 10-15 分钟 |
| 连线代码量 | 200+ 行 | 自动生成 |
| 出错风险 | 较高 | 极低(自动位宽检查) |
SOLO MTC 在开发中的价值
- 大幅降低开发门槛:作为硬件工程师,我对 Python/Qt 的图形编程经验有限,SOLO 帮我完成了从架构设计到代码实现的全流程,让我能专注于 FPGA 领域的业务逻辑。
- 全流程深度参与:SOLO 不仅参与了软件本体的开发,还覆盖了架构设计、性能优化、打包发布、文档编写、技能提炼等软件产品的完整生命周期,甚至包括本参赛帖子的撰写。
- 快速迭代:遇到 bug 或需要新功能时,描述问题即可获得修复方案,平均每个问题从提出到解决不超过 3 轮对话。
- 性能优化专业到位:SOLO 主动进行了系统性的性能分析,提出了 24 个优化点并逐一实现,包括网格绘制重构、索引优化、异步加载等,这些都是我作为非专业 Python 开发者难以想到的。
- 知识沉淀:SOLO 帮助将开发过程中的关键技术提炼为可复用的技能文档,形成技术资产。
可复用经验
- 将复杂项目拆分为独立模块,每个模块交给 SOLO 单独实现,降低单次任务的复杂度
- 遇到性能问题时,先让 SOLO 做系统性分析,再针对性优化
- 打包发布等非核心开发工作也可以交给 SOLO 处理,节省大量时间




