4. PCB 设计导入:从 Allegro / Altium / ODB++ 到 SIwave

做信号仿真这么多年,PCB 导入这一步看着简单,实际踩过的坑可不少。图纸过不来、叠层丢了、网络名乱掉……每次遇到这种问题,我都得折腾半天。所以今天这篇,咱们就把三种主流导入路径掰开揉碎讲清楚。

PCB 导入 SIwave 核心流程 Allegro .brd Altium .pcbdoc ODB++ / IPC-2581 Ansys EDB 转换引擎 自动叠层映射 · 网络校验 · 铜皮修复 SIwave 全波仿真模型 导出前必须检查叠层对齐、网络完整、铜皮无毛刺 数据源 → 中间格式 → SIwave 模型

4.1 从 Allegro 导入 .brd 文件

Allegro 是目前高速设计圈用得最多的工具,SIwave 对它的支持也最成熟。我个人习惯直接拖 .brd 文件到 SIwave 窗口,或者走 File → Import → Allegro/APD。它会弹出一个 Assistant 窗口,帮你一步步走完。

小经验:Allegro 版本很关键。我建议用 17.2~17.4 保存的 .brd 文件。太旧或太新的版本可能会触发「Unsupported database version」错误。遇到这种情况,你可以用 allegro 打开再 save as 一下,通常就能解决。

导入过程中,SIwave 会自动调用 EDB 转换引擎。它会帮我们做三件事:

  • 叠层映射:自动识别板厂的 stackup 信息,生成 SIwave 的 layer stack 表。
  • 网络提取:把所有的 net 和 component 信息读进来,保持与原理图一致。
  • 铜皮修复:自动填补小缝隙、锐角碎片——这些东西做直流压降分析时会出问题。

我记得有一次,客户给的 .brd 文件有几十块碎片状的铜皮,DC IR drop 仿真跑完,结果惨不忍睹。后来我仔细看了 log,发现有 warning 说「unresolved copper fragment」。从那以后,我每次导入都会先扫一遍 Message Window。

4.2 从 Altium Designer 导入 .pcbdoc

Altium 的用户也不少。这里要注意:SIwave 并不直接读 .pcbdoc 文件,你需要先导成 ODB++ 格式,或者用 Altium 的 Export → ANSYS EDB。

具体操作路径是这样的:

  1. 在 Altium 中打开你的 PCB 项目。
  2. File → Export → ODB++,选择导出目录。
  3. 在 SIwave 中 File → Import → ODB++,选中刚才的 .tgz 或文件夹。

为什么要走 ODB++?说白了,ODB++ 是业界通用的制造数据格式,几乎所有 EDA 工具都认。你想想看,如果直接转 proprietary 格式,很多第三方工具根本读不了。ODB++ 虽然多了一步,但兼容性是最好的。

避坑提醒:Altium 导出 ODB++ 的时候,一定要勾选「Embedded layers」和「Convert filled polygons to contours」。否则你的 power/gnd plane 会被当成一堆散碎的 line 导入,仿真根本跑不了。我曾经因为漏了这个选项,花了一个下午排查,最后发现是这里的问题。

4.3 从 ODB++ 和 IPC-2581 导入

ODB++ 和 IPC-2581 其实是两种不同的中间格式,但处理方式很相似。SIwave 对 ODB++ 的支持更好一些,IPC-2581 偶尔会遇到材质参数丢失的情况。

特性 ODB++ IPC-2581
SIwave 支持版本 全版本支持 2019 及以上版本
叠层信息 自动完整读取 需手动补 dielectric Dk/DF
铜皮细节 保留 polygon 和 fill 部分工具会展开成 line
推荐使用场景 Allegro / Altium / Mentor Cadence / Zuken 等

我个人更倾向用 ODB++,除非客户指定要 IPC-2581。有一次我用 IPC-2581 导入一个 28 层的背板,所有 dielectric 厚度全变成 1 mil,简直是灾难。后来我用 ODB++ 重新导一遍,叠层完全正确。所以,如果你手上有两个选项,优先走 ODB++。

4.4 导入后的必做检查清单

图纸进来了,不代表万事大吉。我一般会花 5 分钟做一次「健康检查」。你可以把这个清单贴在显示器旁边:

  • 叠层检查:SIwave 的 Stackup 编辑器里,每一层顺序、厚度、Dk、Df 是不是和板厂文件一样?特别要注意 copper roughness 模型有没有自动匹配。
  • 网络完整性:走 Circuits → Net Manager,看看是否有 unexpected net,或者某个重要的 net 消失了。我遇到过 power net 因为命名不规范被当成普通信号线。
  • 过孔检查:有无 floating via、stub 过长。SIwave 的 Via Overview 表格一眼就能看出问题。
  • 铜皮连续性:用 SIwave 自带的「Merge Copper」工具跑一遍,特别是电源平面,很容易有微小的分割缝隙。

核心原则:导入后的数据质量,直接决定你后续的仿真准确度。我从不把「能跑出结果」当作标准。每次导入完毕,我都会手动比对至少 3~5 条关键信号的回流参考层——只有这一步确认了,我才敢开始设置激励源。

4.5 常见报错与解决思路

做了这么多项目,有些报错我闭着眼睛都能猜出原因。下面列几个最常遇到的:

报错信息 原因 解决方式
Unsupported database version Allegro 版本不匹配 在 Allegro 中 Save As 到 17.4
Missing layer mapping 叠层文件损坏或未嵌入 重新导出 ODB++ 并勾选全部 layer
Copper entity error 铜皮碎片或自交叉 polygon 运行 SIwave 的 Copper Check Utility
Net count mismatch 规则区域被忽略导出 检查 Altium 导出选项中的 keep-in which region

嗯,最后一句提醒:永远保留原始设计文件的副本。 导入再方便,也架不住源文件被误改。我习惯把 .brd / .tgz 和导入后的 .siw 文件放在同一个文件夹,版本号加上时间戳。出了事,随时能回头。你想想看,要是真弄到一半发现数据不对,重新导入也比重新画板子快太多了。