夜雨聆风学习资料网

ARTICLE · 1042253

AI PCB 设计的实验

AI PCB 设计的实验

最近网络上 ChatGPT-6 设计 PCB 的视频引发了我对 AI 设计 PCB 的好奇,于是开始尝试用 Claude Code 做 PCB 设计。结果给自己挖了一个大坑,填都填不完的坑。引发了一次漫长的实验。

一、PCB 设计的三步

构建原理图:根据功能需求确定电路结构,选择合适的器件,并用原理图表达各模块之间的连接关系。
放置元器件:将元器件安排在电路板的合理位置,兼顾功能分区、信号流向、散热和后续布线的便利性。
布线:按照电气连接关系完成走线,同时满足线宽、间距、回流路径、过孔和电磁兼容等设计要求。

二、原理图:LLM 能起作用的地方

设计意图到原理图

使用大语言模型生成 Python 代码,再由 Python 生成 KiCad 的 Sch 文件。设计规范和参考图纸非常重要。

根据设计要求撰写硬件设计文档。大语言模型(LLM)可以承担元器件选型,通读器件 datasheet,并生成 Python 原理图生成代码(schematicGen)。该工具调用 KiCad 的库,产出 KiCad 原理图。

这一阶段是语言模型能真正发挥作用的场合。实测下来,LLM 生成的原理图连线方式还没有达到人类工程师设计的原理图的水平,它给出的只是几何上的连接,没有体现电子学和硬件设计的表达习惯,人读起来别扭,排查错误也费劲。

参考图纸

改善的方法是构建大量的原理图文档库,用 RAG 技术检索类似的原理图。大语言模型能够理解参考原理图的架构,把它的结构归纳出来,再照着迁移到新的设计上。

绘制原理图的规则

除了参考图之外,还有设计习惯。设计惯例大致有六个类别。

1.
全局骨架:信号左→右,电源在上、地在最下,功能块按信号链排序,复杂部分收进层次 sheet。元器件之间不能重叠,连线不能穿过元器件。
2.
电源与地:电源用旗标,去耦/滤波电容竖立并贴靠被去耦的电源脚。地线在器件的底部引出。电源在器件的顶部引出。
3.
局部子电路惯用法:晶体、RC、上拉/下拉、分压、LED、运放等各自的规范摆法。
4.
连线习惯:只走水平/垂直线,T 型连接必打 junction,跨区域连接改用网络标签,多位信号走总线。
5.
符号与标注:只用标准符号,多单元器件拆成独立单元,值/编号位置一致。
6.
一致性:同类同画,整页乃至整个工程保持一致。
7.
避免长距离连线:垂直线超过图纸高度的三分之一,或水平线超过图纸宽度的三分之一时,就改用标签。地线、电源线和信号线都一样。

三、布局布线:为什么换用强化学习

PCB 布局布线是连续空间里的几何问题:元件坐标、旋转角、走线路径、间距、重叠、过孔位置,都是实数域上的空间关系。LLM 的输入输出是离散的 token 序列,它没有持久的空间世界模型,二维三维的邻接、包含、避让关系只能用语言描述,没法原生计算。它可以指出两个元件靠得太近,却并不真的知道它们到底有多近,那需要精确的几何运算,而不是语言的模式补全。

另一个问题是 PCB 有硬约束,比如 DRC 规定的间距、短路和可制造性,违反即无效。LLM 是概率式生成最可能的下一个 token,天然无法保证输出落在合法解空间里;这类问题要的是精确、可验证的求解,而不是一个概率上看着差不多的答案。

更根本的区别在于,LLM 是一次性的、没有环境反馈的自回归生成器,而布局布线是序贯决策:每放一个元件、每走一段线,板子状态就变了,下一个决策依赖当前状态,也就是马尔可夫决策过程(MDP)。走线尤其典型,它是约束寻路问题(maze routing),属于 NP-hard,需要大量搜索、试错、回溯和约束传播。LLM 没有内部搜索,没有回溯,也没有试一下不行再改的机制,更处理不了长程信用分配:前面一个看似合理的走线决策,可能到很后面才暴露出无法布通。

语言任务里好坏往往是模糊的人类偏好,很难定义;但 PCB 里目标函数是可度量、可自动计算的,比如总线长、过孔数、层数、DRC 违规数、串扰/阻抗偏差、热分布。这意味着环境可以自动给出稠密或终局的奖励,RL 能真正做优化而非模仿。而且 RL 通过探索与奖励,有机会超越训练数据里见过的布局,而 LLM 的模仿式学习只能逼近示范的上限,没法在一个可量化目标上持续爬坡。

几何与搜索这一层,交给 RL 或传统优化器;而 LLM 的价值在它擅长的符号/知识层:读懂数据手册里的布局指南、生成约束与设计规则、选叠层、写脚本、当高层 Agent 去调度布线器,以及用自然语言解释和复核设计意图。

RL 更适合 PCB 的放置与布线,理由有三。

其一,它是多步决策,反馈延迟。放第一个元件时我不知道好坏,要等全部放完、甚至布完线,才知道最终线长与可布线性。中间每一步都没有正确答案可标注,我只知道终局好不好。监督学习要的是每步标签,而这里根本没有;RL 是为延迟、稀疏、终局奖励设计的。

其二,目标不可微、多目标、带硬约束。线长、DRC、拥挤、散热、EMC 大多是非连续、离散、组合性的,无法对其求导。过没过 DRC 这种东西,梯度无法穿过。RL 把奖励当黑盒,只要能评估就能优化,不管它可不可微。这一点在 EDA 里特别明显:真值就是那个跑一次要几十秒的布线器加 DRC,我没有解析模型,只有评估器。

其三,解空间组合爆炸。哪个元件、放哪个格、什么朝向,组合数极其庞大。传统方法每块板都要重新搜索一遍;RL 学的是策略而非某一个解,训一次,之后对新板子秒出布局。这是 RL 相对传统算法最大的价值:把重复搜索摊销成一次学习。

PCB 放置和布线的过程更接近下围棋,落下一子,可能影响许多步之后的成败。

四、初步试验

元器件放置

用 RL 比用大语言模型更有效。

可以通过仿真算法训练 RL 模型。具体的做法是收集人类工程师的 PCB 设计,再生成 FreeRouting 的操作,虽然可能不了解人类设计的前后顺序,但可以训练 RL 该怎么摆放元件。

模块化设计

一开始我和 ChatGPT 讨论,能不能借用软件工程里的模块化思想来做 PCB 设计,得到的回答极为肯定,认为这个思路很好。但实测下来,模块化设计并没有多少改善,布通率反而下降了;模块内部的布通率可能提高了,模块与模块之间的布线却变差了。

不奏效的原因都在边界上。模块化的收益来自模块内部的同质和可复用,代价却全堆在跨模块的地方:板边、过孔通道是共享资源,地平面的回流路径本身就是全局的,模块内部优化得再好也管不到这些;单个模块在设计时并不知道将来要怎么和其他模块拼接,IO 放在哪里也说不清。独立最优不等于全局最优。

还有一个问题是,功能上的分法不等于几何上的分法。电源和 MCU 在功能上可以分得很开,在几何上却常常必须贴在一起,去耦电容就得挨着 MCU 的引脚放。这种拆分给的是约束上的模块化,不是布局上的模块化。

布线

同样地,大语言模型也不适合 PCB 布线,要改用 RL。人类的布线只是一个结果,而 RL 要学的是过程,是怎么一步一步地应对。

训练 PCB 布线 RL 的方法,是让它跟着 FreeRouting 的实际布线来学。这个过程耗时比较长,通常以天计。

优化布线 RL 的方法,是把布线质量较好的项目里的环境、动作、奖励数据都记录下来,再做训练。这一条我还没有尝试过。

AI 实现 PCB 设计还有许多改善的可能性。它和人类一样,也需要完善的资料和丰富的参考资料,再加上经验的积累。如何利用原有的知识库进行仿真训练,是最有希望的研究方向。

相关学习资料