FreeRouting自动布线实战:从DSN导出到SES回导的完整教程
PCB自动布线这件事我前后折腾过不少工具。商业方案里Altium Designer、Cadence Allegro、PADS这些各有各的强项但授权成本摆在那里个人玩家和小团队很难长期负担。开源阵营里能打的选手不多KiCad自带的布线器这几年进步明显但真正让我愿意单独写一篇完整教程的是FreeRouting——一个用Java写的、基于Specctra DSN格式的自动布线引擎。它不绑定任何EDA软件只要你的设计能导出DSN文件它就能接手布线跑完再导回原来的工具里。这个特性让它在开源硬件圈子里一直有稳定的使用群体。这篇内容面向的是刚接触FreeRouting、或者之前尝试过但被环境配置和文件格式卡住的人。我会从它到底解决什么问题讲起把安装、DSN导出、参数配置、布线执行、结果回导这条完整链路拆开讲清楚中间穿插我自己踩过的坑和参数调优的经验。读完你应该能独立完成一块中等复杂度双层板的自动布线并且知道哪些情况下不该指望自动布线、该手动介入。1. FreeRouting到底解决的是谁的痛点1.1 自动布线工具的真实定位很多人对自动布线有个误解觉得它是一键搞定所有走线的魔法按钮。实际用过就知道自动布线器最擅长的是处理规则明确、约束清晰、密度适中的连线任务比如大量分散的阻容网络、总线扇出、电源和地的初步铺线。它不擅长的是高速差分对、阻抗敏感走线、需要精确等长的时序总线以及那些需要靠经验判断往哪边走更顺的模糊场景。FreeRouting的定位很明确它是一个基于几何和规则驱动的布线引擎输入是Specctra DSN文件输出是Specctra SESSession文件。DSN里包含了板框、层叠、元件封装、网络连接关系、设计规则SES里则是它算出来的走线路径。整个过程不依赖图形界面做交互式编辑你给它什么约束它就在约束空间里找解。这意味着两件事。第一你的设计规则写得越清楚它布出来的结果越可用。第二它不会替你做这个网络应该走内层还是外层这种策略性决策这些得你在导出DSN之前就想好。1.2 和KiCad自带布线器的关系KiCad从5.x开始内置了交互式布线器6.x之后又集成了自己的自动布线能力。那为什么还要用FreeRouting我自己的体会是KiCad自带的自动布线在简单板上够用但一旦网络数量上去、层数增加它的收敛速度和结果质量就不太稳定。FreeRouting的算法经过多年迭代在处理中等规模双层板时完成率和走线整洁度往往更好。另一个原因是FreeRouting可以脱离KiCad使用。如果你用的是Eagle、立创EDA、甚至某些老版本的Protel只要能导出DSN就能接FreeRouting。这种解耦设计让它在工具链里像个通用布线后端。1.3 适合和不适合的场景适合的场景我列一下双层板网络数在100到500之间元件以0805/0603封装为主数字电路为主没有严格的阻抗控制要求电源网络已经手动铺了粗线或铜皮剩下信号线交给自动布线原型验证阶段先跑通功能后续再优化走线不适合的场景同样要说清楚四层以上、有完整地平面和电源平面的板子自动布线容易破坏平面完整性高速信号USB、HDMI、DDR等需要手动控制参考平面和回流路径射频和模拟小信号走线长度和寄生参数敏感高密度BGA扇出需要盘中孔和特殊过孔工艺提示自动布线不是替代手动布线而是把重复性高的连线工作批量化。策略性走线永远需要人来判断。2. 环境搭建Java运行时和FreeRouting的安装2.1 Java版本的选择逻辑FreeRouting是Java应用所以第一步是装JRE或JDK。这里有个坑不同版本的FreeRouting对Java版本要求不一样。老版本1.4.x系列在Java 8上跑得最稳新版本1.8.x之后开始要求Java 11甚至17。我的建议是直接装Java 17 LTS然后下载最新的FreeRouting发行版。Java 17的长期支持周期长兼容性好而且新版本FreeRouting对它的适配最完整。如果你系统里已经有其他Java版本注意配置好JAVA_HOME避免版本冲突。验证Java是否就绪java -version输出里应该能看到类似openjdk version 17.0.x的字样。如果提示找不到命令说明PATH没配好需要手动把Java的bin目录加进去。2.2 获取FreeRouting的几种途径FreeRouting的官方发布在GitHub上提供两种形式可执行JAR包和带启动脚本的压缩包。我推荐下载带启动脚本的压缩包因为脚本里已经帮你配好了内存参数和模块路径省得自己写命令行。下载后解压到一个路径里不含中文和空格的目录。这一点很重要Java对非ASCII路径的处理在某些版本上会出问题我见过因为路径里有中文导致启动直接报错的案例。解压后的目录结构大致是这样freerouting/ ├── freerouting-executable.jar ├── freerouting.sh ├── freerouting.bat └── ...Linux和macOS用.shWindows用.bat。2.3 启动参数里的内存配置默认启动脚本给的内存可能偏小跑大板子会卡甚至OOM。打开启动脚本找到类似-Xmx的参数把它调大。我的经验值是板子规模建议堆内存网络数 2001G网络数 200-5002G网络数 5004G修改方式是在启动脚本的Java命令里加上或修改-Xmx2g这样的参数。注意不要超过你机器的物理内存否则系统会开始换页反而更慢。2.4 首次启动的界面认识FreeRouting的界面很朴素甚至有点上个时代的感觉。主窗口分几个区域菜单栏、工具栏、左侧的层和网络列表、中间的画布、底部的状态栏。第一次打开是空的需要导入DSN文件才会显示内容。工具栏上最常用的几个按钮打开文件、保存SES、开始自动布线、停止布线、缩放适应。记住这几个就够了其他功能在初学阶段用不上。注意FreeRouting的界面不会自动保存你的操作。布线跑到一半想调整参数最好先停止、保存当前SES再重新导入DSN改规则。直接关窗口会丢失进度。3. 从EDA工具导出Specctra DSN文件3.1 DSN格式为什么是关键Specctra DSN是Cadence提出的一种布线交换格式后来成了事实上的行业标准。它用文本描述整个设计板框坐标、每一层的用途、每个元件的封装和位置、每个网络的连接关系、设计规则。FreeRouting读的就是这个文件。DSN的好处是工具无关。不管你是从KiCad、Eagle还是立创EDA导出只要格式正确FreeRouting都能处理。坏处是不同EDA工具导出的DSN质量参差不齐有些会漏掉规则有些封装定义不完整导致FreeRouting读进去之后布线结果很奇怪。3.2 KiCad导出DSN的完整步骤以KiCad 7为例流程是这样的打开PCB编辑器确认板框已经画好元件已经布局完成菜单栏选择文件-导出-Specctra DSN在弹出的对话框里选择保存路径文件名建议用英文点击保存KiCad会生成一个.dsn文件导出前有几件事必须确认设计规则已经设置好。KiCad的板设置-设计规则里的线宽、间距、过孔尺寸会写进DSN。如果这里没设FreeRouting会用默认值布出来的线可能太细或间距不够。网络类已经分配。电源网络、差分对、普通信号最好在KiCad里分好类导出后FreeRouting能识别这些分类。元件封装完整。如果有封装缺少焊盘定义DSN里对应元件就是空的FreeRouting会跳过它。3.3 立创EDA和其他工具的导出差异立创EDA专业版支持导出DSN路径在文件-导出-Specctra DSN。但它的导出有个特点默认只导出当前可见的层。如果你隐藏了某些层导出的DSN会缺层定义。导出前把所有层都打开。Eagle的DSN导出需要通过ULP脚本稍微麻烦一点。老版本Protel和Altium可以通过File-Export-Specctra Design导出但Altium的DSN有时会把内层平面也写进去导致FreeRouting误判层用途需要在导入后手动检查。3.4 导出后先做一次自检拿到DSN文件后别急着丢给FreeRouting。先用文本编辑器打开快速扫几眼搜索(structure看层定义是否完整搜索(placement看元件数量和位置是否对得上搜索(network看网络数量和连接关系是否正常如果发现层定义缺失或者网络明显不对回到EDA工具重新导出别在FreeRouting里硬改。提示DSN是纯文本出问题时可以直接看内容定位。我遇到过导出后网络名变成乱码的情况就是EDA工具编码设置的问题改回UTF-8重新导出就好了。4. FreeRouting的布线参数怎么调4.1 导入DSN后的第一件事检查层和规则导入DSN后FreeRouting左侧会列出所有层和网络。先点开层列表确认每一层的类型信号层、电源层和方向水平、垂直是否正确。双层板通常是顶层水平、底层垂直这样过孔最少。然后看规则。FreeRouting的规则菜单里可以设置全局线宽、间距、过孔尺寸。这些值应该和你在EDA工具里设的一致。如果DSD里已经带了规则这里会显示出来你只需要确认如果没带就得手动补。4.2 自动布线器的核心参数FreeRouting的自动布线有几个关键参数理解它们才能调出好结果布线通道宽度Trace Clearance这是走线之间、走线和焊盘之间的最小距离。设太小会导致短路风险设太大会让布线器找不到路径。一般取EDA工具里设计规则的最小间距值。过孔类型和尺寸FreeRouting支持通孔和盲埋孔。双层板只用通孔。过孔外径和内径要匹配你的工艺能力常见的是外径0.6mm、内径0.3mm。布线层顺序可以指定优先用哪层。比如让信号优先走顶层底层留给地。这个设置影响布线的整洁度。优化迭代次数FreeRouting会反复尝试优化走线次数越多结果越好但时间越长。原型阶段设个中等值就行比如10到20次。4.3 参数配置的实操建议我一般这样配参数双层数字板建议值说明最小线宽0.25mm普通信号最小间距0.2mm匹配多数PCB厂工艺过孔外径0.6mm常规工艺过孔内径0.3mm常规工艺优化次数15平衡质量和时间布线层顶层优先底层留地这些值不是绝对的要根据你的板子密度和工艺能力调整。密度高的板子线宽和间距都要往下压但别低于PCB厂的最小能力。4.4 规则冲突时的处理顺序有时候DSN里带的规则和FreeRouting的默认规则冲突比如DSN说最小间距0.15mmFreeRouting默认0.2mm。这时候FreeRouting会取更严格的值也就是0.2mm。如果你确实需要0.15mm得在FreeRouting里手动改。还有一种情况是某些网络需要特殊规则比如电源网络要更粗的线。FreeRouting支持按网络类设置规则在网络列表里选中对应网络右键设置线宽。这个功能很实用能把电源和信号分开处理。注意改规则之后一定要重新跑一次布线不要指望改完规则旧结果会自动更新。FreeRouting不会增量更新每次都是从头算。5. 执行自动布线并解读结果5.1 启动布线的正确姿势参数配好后点工具栏的自动布线按钮或者菜单里的Autoroute。FreeRouting会开始计算画布上会实时显示走线过程。状态栏会显示完成百分比和已布通的网络数。这个过程可能从几十秒到几十分钟不等取决于板子复杂度和优化次数。期间界面可能会卡顿这是正常的Java在做大量几何计算。别频繁点界面容易触发重绘导致更卡。如果跑到一半发现结果明显不对比如大量网络布不通可以点停止调整参数重来。不要让它一直跑到结束浪费时间。5.2 怎么看布线结果好不好布线完成后从几个维度评估完成率状态栏会显示还有多少网络没布通。理想情况是100%但实际中80%以上就算不错剩下的手动补。走线整洁度看有没有大量绕远路的线、有没有不必要的过孔。FreeRouting有时会为了布通某个网络而绕大圈这种线手动优化一下更好。层间平衡顶层和底层的走线量应该大致均衡。如果一层特别密一层特别空说明层顺序设置需要调整。和板框的关系走线不能超出板框也不能压到安装孔和禁布区。FreeRouting一般会遵守但边界情况要人工检查。5.3 常见布线失败的原因现象可能原因处理方式大量网络布不通间距设太大或板子太密减小间距或增加层数走线绕远优化次数不够增加优化迭代过孔过多层顺序不合理调整优先层电源线太细网络类规则没设单独给电源网络设线宽布线超出板框板框定义不完整检查DSN里的板框坐标5.4 手动补线的时机自动布线跑完后剩下的未布通网络通常分两类一类是确实被其他线挡住了需要挪线腾空间另一类是本身连接关系复杂自动算法处理不好。这两类都建议手动补。手动补线在FreeRouting里也能做但它的交互编辑能力很弱不如导回EDA工具里补。我的习惯是自动布线跑完导出SES导回KiCad然后在KiCad里手动补剩下的线和优化关键走线。提示不要追求100%自动布通。80%自动加20%手动往往比强行100%自动的结果更好因为手动部分能针对性地优化。6. 导出SES并回导到EDA工具6.1 SES文件是什么SES是Specctra Session文件记录的是布线结果每一段走线的起点、终点、所在层、线宽每一个过孔的位置和尺寸。它和DSN配合使用DSN描述要连什么SES描述怎么连的。FreeRouting布线完成后通过文件-导出-Specctra Session生成SES文件。这个文件同样是纯文本可以用编辑器查看。6.2 回导到KiCad的步骤回到KiCad的PCB编辑器菜单栏选择文件-导入-Specctra Session选择刚才导出的SES文件KiCad会把走线合并到当前设计里导入前建议先备份当前PCB文件因为导入是覆盖式的如果SES有问题原来的走线可能被破坏。导入后检查几件事走线是否都在正确的位置、过孔是否正常、有没有网络连接错误。KiCad的DRC设计规则检查跑一遍看有没有违规。6.3 回导到其他工具的注意事项立创EDA导入SES的路径在文件-导入-Specctra Session。Eagle需要用ULP脚本导入。Altium的导入在File-Import-Specctra Session。不同工具对SES的解析有差异常见问题是过孔尺寸被重置、线宽被改成默认值。导入后一定要检查这些参数必要时手动修正。6.4 导入后的收尾工作SES导入后板子基本成型但还有几件事要做铺铜自动布线不管铺铜需要手动在顶层和底层铺地铜并连接到地网络DRC检查跑一遍完整的设计规则检查修掉所有违规丝印调整自动布线可能压到丝印需要挪动位号泪滴和加固对焊盘连接处加泪滴提高可靠性这些做完一块板子的布线才算真正完成。7. 我踩过的坑和参数调优心得7.1 路径和编码的坑前面提过路径不能有中文这里再强调一次。我最早在Windows上把FreeRouting解压到D:\工具\freerouting启动直接报ClassNotFoundException换成纯英文路径就好了。Java的类加载器对非ASCII路径的处理确实有问题。编码问题也遇到过。有次从立创EDA导出的DSN网络名里的中文注释变成乱码FreeRouting读进去后网络识别错误。解决办法是在EDA工具里把导出编码设成UTF-8或者干脆把网络名里的中文去掉。7.2 内存不足导致的中断跑一块400多网络的板子时默认1G内存跑到70%就卡死了日志里报OutOfMemoryError。把-Xmx调到3G后顺利跑完。这个坑的教训是板子规模上去之前先把内存给够别等跑到一半才发现。7.3 规则设置过严导致布不通有次我把最小间距设成0.25mm结果一块密度稍高的板子大量网络布不通。降到0.2mm后完成率从60%跳到95%。这说明规则要匹配板子的实际密度不能一味求保守。当然降规则之前要确认PCB厂能做得到。7.4 优化次数和时间的权衡优化次数设太高时间成倍增长但质量提升有限。我实测下来15次是个甜点值再往上加走线整洁度的改善就不明显了。原型阶段甚至可以设5到10次先看能不能布通再决定要不要精细优化。7.5 层顺序对结果的影响双层板默认是顶层水平、底层垂直。有次我改成顶层优先结果顶层走线特别密底层很空过孔数量反而增加了。后来改回默认的水平和垂直交替过孔数明显下降。这个参数要根据板子的实际布局来调没有万能值。7.6 自动布线后的手动优化重点自动布线的结果我一般重点优化这几处电源和地自动布的电源线往往偏细手动加粗或改成铺铜晶振和时钟线这些线要短、要远离干扰源自动布线不管这些差分对如果板上有必须手动走自动布线处理不好等长和间距连接器附近走线要整齐方便后续焊接和维修这些优化做完板子的电气性能和可制造性都会好很多。8. 什么情况下该放弃自动布线自动布线不是万能的有些板子从一开始就不该指望它。我的判断标准是层数超过两层四层板有完整地平面自动布线会打乱平面得不偿失。四层以上基本全手动。有高速信号USB、以太网、DDR这些需要控制阻抗和等长自动布线做不到。模拟和射频小信号对走线长度和寄生电容敏感必须手动控制。高密度BGA扇出需要盘中孔和特殊工艺自动布线处理不了。板子特别小空间紧张时每一根线的走向都需要仔细规划自动布线容易布死。遇到这些情况FreeRouting可以帮你处理一些边角的低速信号但核心走线还是得手动。把它当成一个辅助工具而不是替代方案心态就对了。9. 把FreeRouting放进日常工作流我现在的工作流是这样的布局在KiCad里完成设计规则设好导出DSNFreeRouting跑自动布线导出SES回导KiCad手动补线和优化最后铺铜和DRC。整个过程里FreeRouting承担的是把大量低速信号连起来这个重复劳动省下来的时间用在关键走线的优化上。这套流程跑顺之后一块中等复杂度的双层板从布局完成到布线结束能比纯手动快不少。当然前提是布局本身合理如果布局阶段就一团糟自动布线只会把问题放大。最后分享一个小技巧跑自动布线之前先把电源和地的粗线手动布好或者用铜皮连上。这样FreeRouting只需要处理信号线完成率会高很多结果也更整洁。这个习惯我坚持了很久效果一直很稳。