1. 为什么 Sub-drawing 是 PCB 设计师的“复制粘贴”神器
做 PCB 设计这行十几年,我见过太多工程师在重复劳动上耗费大量时间。尤其是当你要在多个项目之间复用同一段走线、同一个过孔阵列、同一组差分对的时候,如果还在用鼠标一笔一笔重新画,那效率真的低到令人发指。Cadence Allegro 17.4 里的Sub-drawing功能,就是专门解决这个痛点的。说白了,它就是一个“带网络属性的复制粘贴”工具——你可以把一块板子上的走线、过孔、铜皮、甚至器件布局,原封不动地搬到另一块板子上,而且网络连接关系不会丢。
这个功能特别适合以下几类人:一是经常做系列化产品的硬件工程师,比如一个主板平台衍生出三四个不同配置的型号,核心走线完全一致;二是做模块化设计的团队,比如电源模块、DDR 模块、射频模块需要跨项目复用;三是需要把旧板子的成熟走线迁移到新板子上的场景。只要你用过一次 Sub-drawing,基本就回不去了,因为手动重画的出错概率和耗时完全不在一个量级。
我个人的经验是,一块中等复杂度的板子,如果涉及 30% 以上的走线复用,用 Sub-drawing 至少能省下 60% 的走线时间,而且网络连接的正确率是 100%——前提是你操作规范。下面我就把这个功能的完整用法、参数细节、踩坑经验全部拆开讲清楚。
2. Sub-drawing 的核心机制与适用边界
2.1 它到底复制了什么
Sub-drawing 的本质是把设计对象导出成一个独立的剪辑文件(.clp),这个文件里包含了你在 Allegro 里选中的所有元素及其属性。你可以选择导出走线(clines)、过孔(vias)、铜皮(shapes)、引脚(pins)、器件(symbols)、文本(text)等等。导出之后,在目标板子上再导入这个 .clp 文件,Allegro 会自动把这些元素按原来的坐标和网络关系放置到目标设计里。
这里有一个关键点:Sub-drawing 不是简单的图形复制,它携带网络信息。也就是说,如果你导出了一段属于 VCC_3V3 网络的走线,导入到目标板子后,只要目标板子上也有 VCC_3V3 这个网络,走线就会自动挂到这个网络上。如果目标板子上没有同名网络,Allegro 会报错或者创建一个新的网络名,具体行为取决于你的导入设置。
2.2 和 Copy/Paste 的本质区别
很多人会问:Allegro 里已经有 Copy 和 Paste 了,为什么还要用 Sub-drawing?这个问题我当年也问过。区别在于:
- Copy/Paste 是板内操作,只能在同一个设计文件里复制元素,跨项目就不行了。
- Sub-drawing 是跨设计操作,它通过 .clp 文件中转,可以在完全不同的两个 .brd 文件之间传递元素。
- Copy/Paste 对网络的处理比较粗糙,有时候粘贴过去网络会丢或者变成乱码;Sub-drawing 对网络映射的处理更严谨,导入时会做网络匹配检查。
所以如果你的需求只是同一块板子内挪一段走线,用 Copy 就够了;但如果是跨项目复用,Sub-drawing 是唯一靠谱的选择。
2.3 什么场景不适合用
Sub-drawing 也不是万能的。以下几种情况我建议你慎重:
- 目标板子的层叠结构完全不同。比如源板子是 6 层板,目标板子是 4 层板,走线所在的层对不上,导入后走线会跑到错误的层或者直接丢失。
- 目标板子的网络名和源板子不一致。比如源板子叫 DDR_DQ0,目标板子叫 DDR0_DQ0,这种命名差异会导致网络匹配失败。
- 目标板子的栅格设置和源板子差异巨大。虽然 Sub-drawing 会保留坐标,但如果目标板子的设计规则(Constraint Manager)和源板子不同,导入的走线可能违反 DRC。
提示:在跨项目复用之前,先确认两块板子的层叠结构、网络命名规范、设计规则是否兼容。这三项对不上,后面全是坑。
3. 手把手实操:从导出到导入的完整流程
3.1 导出 Sub-drawing 的详细步骤
假设你现在打开的是源板子(已经走好线的那块),操作路径如下:
- 在 Allegro 菜单栏找到File → Export → Sub-drawing。
- 弹出的对话框里,首先在Sub-drawing File栏指定导出文件的路径和名称,比如
D:\reuse\ddr_bus.clp。 - 在Find面板里选择你要导出的元素类型。这里我通常只勾选Clines、Vias、Shapes和Pins,其他如 Text、Symbols 看情况。
- 在Options面板里,注意Retain net names这个选项要勾上,这样导出的 .clp 文件里会保留网络名信息。
- 点击Export按钮,然后用鼠标框选你要复用的走线区域。框选完成后,Allegro 会生成 .clp 文件。
这里有一个细节很多人会忽略:框选的时候要确保选中的走线是完整的。如果你只选了一段走线的中间部分,导出后这段走线在目标板子上就是断头的,网络连接会出问题。我的做法是先用 Temp Group 或者直接框选整个模块区域,确保走线的起点和终点都在选择范围内。
另外,过孔的选择也要注意。如果你导出了走线但没导出对应的过孔,导入后走线换层的地方就会断开。所以框选时一定要把过孔一起选上。
3.2 导入 Sub-drawing 的详细步骤
打开目标板子(你要把走线放进去的那块),操作路径:
- 菜单栏File → Import → Sub-drawing。
- 在对话框里选择刚才生成的 .clp 文件。
- Options面板里有一个关键选项:Net name matching。这里有三个子选项:
- Match by name:按网络名精确匹配,推荐用这个。
- Match by position:按坐标位置匹配,适合网络名不同但物理位置对应的场景。
- Ignore net names:忽略网络名,直接按图形放置,这个慎用,容易出问题。
- 还有一个Action选项,通常选Add,表示把导入的元素添加到当前设计中。
- 点击Import,然后用鼠标在目标板子上点击一个参考点,Allegro 会把 .clp 文件里的元素按相对坐标放置到这个参考点附近。
导入完成后,一定要用 Display → Status 检查一下 DRC,看看有没有走线违反设计规则。我遇到过好几次导入后走线间距不够的情况,都是因为两块板子的 Constraint Manager 设置不同。
3.3 坐标对齐的技巧
Sub-drawing 导入时最头疼的问题就是坐标对齐。因为 .clp 文件里记录的是绝对坐标,而你导入时点击的参考点决定了这些元素在新板子上的位置。如果参考点选得不准,走线就会偏。
我的做法是:在源板子和目标板子上都找一个共同的参考点,比如某个器件的 Pin 1 或者某个定位孔的中心。导出时记住这个参考点的坐标,导入时精确点击同一个位置。如果两块板子的坐标系原点不同,你还需要在导入前用Setup → Change Drawing Origin调整原点位置,让两块板子的坐标系一致。
注意:如果你导入后发现走线整体偏移了一个固定距离,大概率是坐标系原点不一致导致的。这时候不要手动去挪走线,而是撤销导入,调整原点后重新导入。
4. 网络匹配与设计规则同步的深层逻辑
4.1 网络名匹配的三种模式怎么选
前面提到了 Net name matching 的三个选项,这里展开说一下实际使用中的选择逻辑。
Match by name是最常用的模式。它的逻辑是:源板子上的网络名和目标板子上的网络名完全一致时,走线才会挂到对应网络上。比如源板子有 DDR_DQ0 到 DDR_DQ31 这 32 个网络,目标板子也有同名的 32 个网络,导入后走线会自动分配到正确的网络上。这种模式适合系列化产品,因为系列化产品的网络命名通常是统一的。
Match by position适合网络名不同但物理位置对应的场景。比如源板子的网络叫 DDR0_DQ0,目标板子叫 DDR_DQ0,名字不一样但物理位置是一样的。这种模式下,Allegro 会根据走线的坐标位置去匹配目标板子上最近的网络。但这个模式有个风险:如果目标板子上那个位置没有网络,或者有多个网络重叠,匹配就会出错。
Ignore net names我基本不用。它相当于把走线当成纯图形放进去,网络属性完全丢失。导入后你需要手动给每段走线重新指定网络,工作量比自己画还大。
4.2 设计规则(Constraint Manager)的同步问题
这是 Sub-drawing 使用中最容易被忽视的坑。Sub-drawing 只复制走线的几何形状和网络属性,不复制设计规则。也就是说,如果源板子上这段走线的线宽是 5mil,间距规则是 4mil,但目标板子的默认线宽规则是 6mil,间距规则是 5mil,那么导入后这段走线会立刻触发 DRC 报错。
解决办法有两个:
- 方法一:在导入前,先把目标板子的 Constraint Manager 里相关网络的规则改成和源板子一致。这个适合规则差异不大的情况。
- 方法二:导入后,用Edit → Change命令批量修改走线的线宽,然后用Display → Status更新 DRC。这个适合规则差异较大但走线数量不多的情况。
我个人的习惯是方法一,因为批量改线宽容易漏掉某些段,而且改完之后过孔尺寸可能也需要调整,牵一发而动全身。
4.3 层叠结构不一致时的处理
如果源板子和目标板子的层叠结构不同,比如源板子是 Top-GND-Sig1-Sig2-PWR-Bottom 的 6 层板,目标板子是 Top-GND-Sig-PWR 的 4 层板,那么源板子上走在 Sig2 层的走线导入到目标板子后,会因为目标板子没有 Sig2 层而丢失。
这种情况下,你有两个选择:
- 在导入前修改目标板子的层叠结构,临时增加缺失的层,导入完成后再把走线换层到目标板子实际存在的层上。
- 在导出前就把走线换到目标板子也有的层上,比如把 Sig2 层的走线先换到 Sig1 层,再导出。
第二种方法更稳妥,因为不会破坏目标板子的层叠设置。但换层后要注意参考平面的变化,可能会影响信号完整性。
5. 常见问题排查与避坑经验实录
5.1 导入后走线不见了
这是最常见的问题。原因通常有三个:
- 层对不上:源板子走线所在的层在目标板子上不存在。排查方法是打开 .clp 文件(它是文本格式),看看里面记录的层名,然后对比目标板子的层叠设置。
- 网络匹配失败:如果选了 Match by name 但目标板子上没有同名网络,走线可能被放到一个临时网络里或者直接丢弃。排查方法是导入时注意看 Allegro 的提示信息,它会告诉你哪些网络匹配成功了,哪些失败了。
- 颜色设置问题:有时候走线其实导入成功了,但因为你当前的颜色方案里那个层是关闭的,所以看不到。按一下Display → Color/Visibility,把所有层都打开看看。
5.2 走线断头或过孔丢失
前面提过,导出时如果没选全走线和过孔,导入后就会出现断头。排查方法是导入后用Tools → Reports → Dangling Lines报告,看看有没有悬空的走线端点。如果有,说明导出时漏选了。
还有一种情况是过孔尺寸不匹配。源板子用的过孔是 8/16mil,目标板子的过孔库里有 10/20mil 但没有 8/16mil,导入时 Allegro 会找不到对应的过孔焊盘,导致过孔丢失。解决办法是在目标板子的 Padstack 库里提前添加源板子用到的过孔定义。
5.3 DRC 报错暴增
导入后 DRC 报错暴增,通常是因为设计规则不一致。除了前面说的线宽和间距规则,还有一个容易被忽视的是Same Net Spacing规则。源板子可能允许同网络走线间距为 0,但目标板子的规则要求最小 3mil,导入后就会报错。
排查方法是打开 Constraint Manager,逐个检查 Spacing 规则里的 Line to Line、Line to Via、Via to Via 等参数,确保和源板子一致。
5.4 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| 走线完全不见 | 层不存在或网络匹配失败 | 查看 .clp 文件层名,检查导入日志 | 调整层叠或改用 Match by position |
| 走线断头 | 导出时漏选走线或过孔 | Tools → Reports → Dangling Lines | 重新导出,确保框选完整 |
| 过孔丢失 | Padstack 库缺少对应定义 | 检查目标板子 Padstack 库 | 提前添加过孔定义 |
| DRC 暴增 | 设计规则不一致 | 对比两块板子的 Constraint Manager | 同步规则或批量修改 |
| 走线整体偏移 | 坐标系原点不一致 | 对比两块板子的 Drawing Origin | 调整原点后重新导入 |
| 网络挂错 | 网络名匹配模式选错 | 检查导入时的 Net name matching 设置 | 改用 Match by name 或手动修正 |
5.5 我踩过的最大的坑
有一次我做一个车载项目,需要把一块老板子的 CAN 总线走线复用到新板子上。老板子的网络名叫 CAN_H 和 CAN_L,新板子的网络名叫 CAN0_H 和 CAN0_L。我当时图省事,用了 Match by position 模式,结果导入后走线挂到了相邻的另一个差分对上,因为那个位置刚好有一组 USB 差分线。后来检查 DRC 才发现问题,差点流片。
从那以后,我养成了一个习惯:导入前先把目标板子的网络名改成和源板子一致,导入完成后再改回来。虽然多了一步操作,但能避免网络挂错的风险。或者更稳妥的做法是,在导出前就把源板子的网络名改成目标板子的命名规范,这样用 Match by name 模式就能精确匹配。
6. 高阶技巧:让复用效率再翻一倍
6.1 批量导出多个模块
如果你有多个模块需要复用,比如 DDR 模块、电源模块、以太网模块,可以一次性导出多个 .clp 文件。我的做法是给每个模块单独导出一个 .clp 文件,命名规则是项目名_模块名_日期.clp,比如ProjectA_DDR_20240115.clp。这样在目标板子上可以按模块逐个导入,方便控制进度和排查问题。
6.2 用 Script 自动化导入流程
Allegro 支持 Script 录制和回放。如果你需要频繁导入多个 .clp 文件,可以录一个 Script,把导入的步骤(选择文件、设置选项、点击参考点)全部录下来,下次直接回放就行。具体操作是Tools → Macro → Record,然后正常执行一次导入操作,停止录制后保存成 .scr 文件。下次用Tools → Macro → Play回放即可。
但要注意,Script 里记录的参考点坐标是固定的,如果目标板子的坐标系变了,回放时参考点会偏。所以 Script 适合坐标系固定的场景,比如同一个项目内的多次导入。
6.3 跨版本兼容性
Allegro 17.4 导出的 .clp 文件,在 17.2 或 16.6 里导入可能会报错,因为不同版本的 .clp 文件格式有差异。如果你需要在不同版本的 Allegro 之间复用走线,建议统一用同一个版本操作,或者把 .clp 文件里的内容手动转换。我试过用 17.4 导出、17.2 导入,结果走线属性丢失了一大半,后来还是老老实实用 17.4 重新做了一遍。
6.4 复用铜皮和器件布局
Sub-drawing 不仅能复用走线,还能复用铜皮(Shapes)和器件布局(Symbols)。比如你有一个电源模块的铜皮铺铜方式很成熟,想复用到新板子上,就可以把铜皮和相关的过孔一起导出。但要注意,铜皮的网络属性也要匹配,否则导入后铜皮会变成孤岛。
器件布局的复用更复杂一些,因为涉及到器件的位号和封装。如果目标板子上的器件位号和源板子不同,导入后会出现位号冲突。我的做法是只复用走线和过孔,器件布局手动调整,这样虽然慢一点,但不会出乱子。
7. 我的个人经验总结
Sub-drawing 这个功能,用好了是神器,用不好就是灾难。核心就三点:层叠要对齐、网络要匹配、规则要同步。这三项做好了,跨项目复用走线就是几分钟的事;这三项有一项没做好,后面排查问题的时间可能比你重新画一遍还长。
我现在做新项目的时候,如果涉及到走线复用,流程是这样的:先确认两块板子的层叠结构和网络命名规范是否一致,不一致就先统一;然后在源板子上按模块导出 .clp 文件,导出时确保走线和过孔都选全;接着在目标板子上逐个导入,导入时用 Match by name 模式,导入后立刻跑 DRC;最后检查一遍关键网络(比如差分对、时钟线)的走线是否完整,有没有断头或者挂错网络。
还有一个小技巧:导出前先把源板子的设计规则导出成 .dc 文件,导入后在目标板子上导入这个规则文件,这样能最大程度保证两块板子的规则一致,减少 DRC 报错。这个操作在 Constraint Manager 的 File → Export → Constraints 里。
最后说一句,Sub-drawing 虽然方便,但不要滥用。有些走线看起来一样,实际上因为参考平面、阻抗要求、时序约束的不同,直接复用可能会引入信号完整性问题。复用之前,最好让 SI 工程师评估一下,确认这段走线在新板子的环境下也能正常工作。毕竟,效率再高,也不如一次做对。