做硬件这几年,我最大的一个体会是:PCB设计里最浪费时间的动作,不是布复杂的线,而是重复画已经画过的电路。产品迭代时,老项目里的电源模块、MCU最小系统、接口保护电路,新板子上几乎是原样要用。早期我都是开两个Cadence Allegro,盯着屏幕手工重画,一块电源板要重画大半天,而且抄板最容易抄错。后来把Sub-Drawing这个功能用熟之后,才算真正把这块时间省下来。这篇文章不打算写成帮助文档式的逐项罗列,我按自己在实际项目里用这个功能的经验来写,包含正常流程、跨项目复制时最容易踩的坑,以及对应的排查思路。
1. Sub-Drawing是什么:跨项目模块复用的核心场景
1.1 先解决“为什么不直接复制”
很多人会问:Allegro里不是可以直接Ctrl+C、Ctrl+V吗?其实Allegro默认的复制粘贴更多是在同一个设计文件内部操作,跨项目想把整个模块的走线、铜皮、过孔、器件、禁布区一起带走,靠剪贴板是做不到的,尤其是两个工程文件彼此独立时。Sub-Drawing的本质,是把当前PCB里选中的对象,连同它们的坐标关系、网络属性、叠层信息,打包写进一个.clp文件。这个文件天然就成了两个项目之间传递版图片段的载体。
这里多说一句:Symbol、Package、Netlist这些概念,是跨项目复用时最容易搞混的。Sub-Drawing不会重新生成原理图,它带过去的是“这些对象连在一起”的结果,也就是一个几何和连接关系的快照。到了新项目里,如果原理图里恰好有对应的网络名,导入的那段走线会直接挂到同名网络上;如果新项目里没有这些网络,Allegro会按导入的内容自动创建网络。这个特性用好了非常顺手,用坏了也会引发网络重复、位号冲突的问题,后面会专门说。
1.2 能带走的对象清单
我实际用过的版本包括16.6、17.4,Sub-Drawing能带着这些内容走:
- 走线(Clines、Cline Segs)、过孔(Vias)、铜皮(Shape)
- 器件封装(Symbols),包括位号文本、Value文本、器件本体、丝印
- 板框(Outline)、装配孔、螺丝孔
- 走线、铜皮上的网络属性
- 禁布区域(Route Keepout、Package Keepout、Via Keepout)
- 尺寸标注(Dimension)
- 部分区域约束规则
列个表方便查阅:
| 对象 | 是否支持 | 备注 |
|---|---|---|
| 走线/线段 | 支持 | 网络属性随线一起带走 |
| 过孔 | 支持 | 跟随网络,不会丢失连接关系 |
| 铜皮/Shape | 支持 | 铜皮的边界、网络属性、部分参数会保留 |
| 器件Symbol | 支持 | 位号、Value、封装坐标、旋转角度一起导出 |
| 板框Outline | 支持 | 注意新板已有板框时,直接导入会叠在一起 |
| 各类Keepout | 支持 | 很多人会漏选,其实完全可以带过去 |
| 尺寸标注 | 支持 | 依赖对应格式和单位设置 |
| 区域约束 | 部分 | 有些Constraints无法100%迁移,需要重新设定 |
这个表是根据我多年使用经验确认的,不同版本可能会有细微差异,但大方向不会变。
1.3 不适合用Sub-Drawing的场景
有几种情况我劝你别用:
- 两个项目原理图网络完全对不上,导入后需要手动处理的网络太多,不如重画。
- 新项目的原理图还没准备好,Sub-Drawing只是版图级操作,不会改动原理图。如果网络对不上,导入的器件会被当成孤立器件,铺天盖地的DRC会让人崩溃。
- 两个设计的叠层完全不一样,比如一个四层一个两层。Sub-Drawing虽然会把对象放进去,但铜皮和走线所在层的物理意义会有差异,导入后要逐一检查,反而更慢。
2. 导出Sub-Drawing:框选、保存、生成.clp文件的完整流程
2.1 导出操作步骤
在Allegro 16.6、17.2、17.4这几个常用版本里,菜单路径基本一致:
- 打开源项目PCB文件。
- 执行 File -> Export -> Sub-Drawing。
- 弹出Export Sub-Drawing对话框,先别急着点导出,先确认要导出的内容。
- 在绘图区框选需要复用的模块范围。如果只想导出某一类对象,在Find面板里勾选对象类型。
- 确认选择后,回到对话框,输入导出文件名,比如 power_module_a,后缀会自动是.clp。
- 点击Export,完成。
这个操作听上去简单,但有几个细节会影响导出文件好不好用。
2.2 导出时容易被忽略的三个细节
细节一:参考点怎么设。
Export对话框里有一个选择参考点的选项。这个点决定导入新板时,点击位置对应源设计的哪个坐标。我的习惯是选择模块内部的某个关键焊盘或器件中心,比如电源模块输入电容的中心。这样导入时,只要把鼠标点到新板上想放的位置,模块就能按这个参考点对位,非常直观。如果不设,默认会用坐标原点(0,0),导入时你就要靠猜来定位模块,非常难受。
细节二:只导出需要的层。
Sub-Drawing默认会带上所有层,但有些层的对象你其实不想带,比如一些临时的标注、说明文字。导出前可以在导出对话框里通过层选择,把不用的层关掉。这个操作不复杂,但能减少导入后清理的工作量。
细节三:检查是否漏选了器件。
框选的时候,很多人的习惯是仅仅框了走线和铜皮,器件没选中。Allegro的Sub-Drawing不会自动帮你把元件补上。所以框选前,一定要在Find面板里明确勾选Symbols、Clines、Shapes、Vias等类型。如果漏选了,导出成功但你得到的是一个残缺模块。我见过不少同事把铜皮和走线都带过去了,回头发现器件没跟着走,又得重新导一次。
2.3 快速选对对象的实用技巧
框选特别大的模块时,建议不要把整个板框框进去,而是用“按符号名选择”。具体做法是:在Find面板里选中Symbols,再按位号或封装类型过滤,例如只选U1、U2、L1这一串器件,然后按住Ctrl把走线、铜皮补选进来,这样可以避免把不想复制的螺丝孔、工艺边也一起选进去。
另外一个比较实用的习惯:在导出之前,先在纸上或文本文件里列一下要导出的网络名、位号清单,导完对照检查。很多导出“成功”但内容不对的问题,实际上是在选择对象那一步就埋下了,对照清单能很快发现问题。
3. 导入Sub-Drawing:跨项目粘贴背后的机制
3.1 导入操作步骤
导入流程比导出多一个步骤——确定安放位置:
- 打开目标项目PCB文件。
- 执行 File -> Import -> Sub-Drawing。
- 选择之前导出的.clp文件。
- 在绘图区点击一次,模块会以参考点为基准放在这个点击位置。
- 放置后,切忌马上继续操作,先跑一遍DRC,重点看有没有位号重复、网络短路、间距违规。
这里有个关键概念:导入不是把内容“贴”到光标处就完了,Allegro会把.clp里的对象,按照导出时记录的坐标关系,整体平移到你点击的位置。也就是说,你点了一个点,整个模块都跟着落在那个点上。
3.2 导入后网络和位号的处理逻辑
这是我最想展开讲的部分。Sub-Drawing导入时,网络的处理遵循一套规则,理解它,能减少大量返工:
- 如果.clp中的网络名在目标设计中已存在,Allegro会尝试把这些对象并入同名网络,不新建网络。
- 如果目标设计中不存在该网络,Allegro会直接创建这个网络。
- 对于器件位号,默认情况下Allegro会保留原RefDes。如果目标设计里已经有了同一位号,就会出现冲突。
实际项目中最典型的情况是:源项目电源模块的5V网络叫5V_PWR,目标项目里电源网络也叫5V_PWR,但目标项目的这个网络下方还连着别的器件。导入后,整个模块的网络会自动并入5V_PWR,这时候如果不仔细核对连通关系,很容易出现“设计上看着没画、实际上已经通过同名网络拉通了”的隐患。也就是说,同名网络合并是便利,也是风险。我的避坑习惯是:导入前先看源项目和目标项目的网络名差异,把目标项目改成一致的,或者在导入后用网络对比工具检查一遍,看哪些网络被新增了、哪些被合并了。
3.3 叠层差异导致的层映射
跨项目复制时,如果两个项目的叠层顺序不同,比如源项目把电源层放在第3层,目标项目把同样的层放在第2层,Sub-Drawing导入时会按“层名”对应,而不是按层号。这一点很多人会踩坑。Allegro的Sub-Drawing以层名作为映射依据,源项目里叫PWR的层,导入后会落到目标项目的PWR层。如果目标项目没有PWR层,则会重新创建一个。这个逻辑本身是合理的,但设计者必须提前确认层名的一致性。
实际操作中,我给的建议是:在导入之前,把目标项目所有层名截图或导出层清单,和源项目对比,凡是在Sub-Drawing里包含的层,名称必须一致。不一致就先在其中一个项目里改层名,再做导入。这样能避免导入后铜皮、走线全落到莫名其妙的层上。
3.4 导入后常规收尾动作
导入完成后,有几个动作不能省:
- 执行 Display -> Status,看是否有未连接引脚、DRC错误。
- 检查导入模块的封装是否和目标库匹配,尤其是库路径不一致时,器件可能显示为绿色。
- 如果新板已有板框,检查板框是否被意外覆盖,必要时删除导入的多余板框。
- 最后跑一次Gerber预览,肉眼确认铜皮和丝印没有异常。
4. 跨项目复制最容易翻车的几个地方(含排查思路)
4.1 位号冲突:导出时没雷,导入时炸
位号冲突是出现频率最高的问题。原因很好理解:不同项目的位号命名习惯常常一样,比如U1、C1、R1。当目标板已有的元件和导入模块的位号重名时,Allegro会保留两个对象都叫U1,结果就是DRC报错、器件绑定混乱,严重时出Gerber都会出问题。
我的处理链路是:
- 导入前先给目标板现有器件做一次自动重命名,执行 Logic -> Auto Rename RefDes,把目标板上全部位号改成带“T_”或“B_”前缀的名字。
- 然后再导入.clp文件。
- 导入完成后,用 Tools -> Reports 查看是否有重复的RefDes,逐个修正。
这个过程治标也治本。很多人直接在导入后手动改冲突位号,一旦冲突数量多,容易漏,后面板子做回来才发现丝印重号,非常被动。
4.2 网络名冲突导致非预期的连通
前面说过,同名网络会自动合并。这不完全是坏事,但有时候会造成严重短路。举一个我真实遇到的例子:A项目的GND叫GND,B项目的GND也叫GND。听起来都是地,应该合并。但A模块里有一根电容短接到GND_SIGNAL,B项目里这个网络不存在,于是Allegro创建了GND_SIGNAL。本来这也没问题,问题在于B项目的原理图后续有一天也添加了一个GND_SIGNAL网络,于是原本在版图上隔离的那段铜皮就和全板网络连通了。这种隐蔽的连接问题在Sub-Drawing里最容易出现。
所以我每次导入后都会做一次网络对比:Tools -> Reports -> Netlist,核对新增网络是否都是自己预期的。同时,导入后的第一件事永远是全板DRC,不要急着布线。
4.3 铜皮优先级错乱
很多人卡在铜皮优先级上。铜皮优先级(Shape Priority)在Sub-Drawing里也会被带过来,但一旦源项目和目标项目的铜皮状态不一致,就会出乱子。比如源项目里5V的铜皮优先级高于GND铜皮,导入目标项目后,如果目标项目的铜皮优先级排序和源项目不同,这层顺序就可能翻转,结果就是本该被5V覆盖的区域,变成了GND优先,铜皮互相吞噬,出现短路区域或者形状边界错乱。
排查方法:
- 导入后执行 Display -> Status,查看Shape填充状态。
- 用 Shape -> Global Dynamic Shape Parameters,检查铜皮优先级顺序。
- 如果发现异常,不要手动一个区域一个区域去改,直接执行 Shape -> Modify Shape Priority,重新统一排序。
这个问题的根因在于Sub-Drawing导入时,铜皮优先级不是按“源项目的排序”整体迁移,而是按每个铜皮的属性去和目标项目现有铜皮做整合。目标项目已经有铜皮的时候,特别是动态铜皮,整合过程容易把优先级弄乱。所以稳妥做法是:导入前,把目标项目里与导入区域重叠的铜皮先删除;导入后重新铺一遍,而不是试图去修优先级。
4.4 Keepout禁布区域被吞掉
禁止铺铜区域、禁布区域是跨项目复制时我重点检查的地方。Keepout区域(Route Keepout、Package Keepout、Via Keepout)是可以被Sub-Drawing带走的,但前提是你在导出框选时选中了这些类型。很多人框选时只勾了Symbols、Clines、Shapes,把Keepout给漏了。
如果漏了Keepout,最直接的后果是:源项目里明明有一块禁布区,到新板子导入后,那个位置没有任何限制,后续自动布线或手动布线都可能把线走进去,铺铜也会铺进去,等到板厂反馈“短路”才知道问题。
所以导出时务必在Find面板里勾选:Clines、Cline Segs、Vias、Shapes、Symbols、Route Keepout、Package Keepout等。如果你不确定,可以全选,导出后再在导入端删掉不需要的。
4.5 封装路径不一致导致器件变绿或丢失
最后这个坑,不是Sub-Drawing本身的问题,但跨项目复制时几乎必踩。源项目用到的某些封装,目标项目的封装库路径里没有,导入后器件会变成绿色或者直接不显示。原因是Allegro在打开设计时按库路径查找封装,找不到就用一个占位符代替。
处理办法:
- 把源项目的库路径补到目标项目的User Preferences里,通过 Setup -> User Preferences -> Paths -> Library,把源项目的主目录加进去。
- 更稳妥的做法:直接把源项目里用到的封装文件复制到目标项目的库目录,并用 Tools -> Update Symbols 更新一次。
- 如果是团队协作,建议统一库管理,避免每次跨项目复制都“搬库”。
5. 一个完整案例:把电源模块从项目A搬进项目B
5.1 案例背景
我做一块控制板的时候,项目A里已经调通过一个12V转5V的电源模块,包含U3、L1、C12-C18、R5-R8、若干过孔和一块PWR铜皮,整体区域在板子右上角。新项目B要复用这个模块,B板尺寸不同,叠层一样,网络命名习惯接近,只是位号和网络前缀不同。
5.2 操作全过程
第一步,打开项目A,执行 File -> Export -> Sub-Drawing。Find面板里把所有需要的类型勾上,框选模块时特意包含了右侧的Keepout区域。参考点选在U3的第1脚焊盘中心。
第二步,导出文件命名为 power_12v_to_5v_a.clp。
第三步,打开项目B,先做两件事:把所有已有位号重命名为B_前缀;导出B的层名清单,和A对比确认叠层一致。
第四步,执行 File -> Import -> Sub-Drawing,选择.clp文件,然后在B板的左下方空白区点击放置。
第五步,放置后做检查:跑一遍DRC,发现C12位号没冲突,R5位号没冲突,但R8所在的网络FB_1在B项目里是新网络,被自动创建。我核对原理图,发现B原理图里这个网络叫FB,于是把B板里导入的FB_1网络改回FB,再跑两遍DRC确认电气连通性OK。
第六步,检查铜皮优先级。B板之前已有的3.3V铜皮优先级高于GND,而导入的5V铜皮优先级也高于GND,两者互不重叠,但Allegro的优先级排序表里它们顺序相邻,我特意用 Shape -> Modify Shape Priority 看了一眼,确认没有异常。
第七步,检查Keepout。我在 Display -> Status 里看到导入模块的禁布区域状态正常,板框没被覆盖。
整个过程,从开始导到验证完成,大概半小时。放在以前手工重画,一个完整的电源模块带铜皮和禁布区,至少要半天。
5.3 复盘
那次案例最大的教训是:如果不做位号重命名,B板已经有R8,导入后R8会重复,而且重名的R8很可能被Allegro自动映射到错误的库封装。因为这个,我在案例操作里特意把“导入前重命名现有器件”写成了步骤。不要高估自己的检查能力,好的规则才是省时间的关键。
6. 把Sub-Drawing用成“模块库”的一些效率经验
6.1 将常用模块沉淀为.clp库
我在公司里做了一套模块库文件夹,专门存放经过验证的常用电路子板:USB接口模块、电源模块、传感器接口模块。每次新项目需要这些功能时,直接把.clp文件导入,再根据新项目的位号体系做一次重命名。这样既避免了重新画图,又保证了和旧项目的一致性。模块文件本身也可以给团队共享,新工程师上手速度会快很多。
这套做法需要注意版本管理。我在文件名里会带上日期和适用版本,比如 usb_interface_16p6_202501.clp。因为不同版本的Cadence导出属性可能有差异,带上版本号和日期,后面排查问题会方便很多。
6.2 巧用Sub-Drawing做镜像复制
除了跨项目复制整个模块,Sub-Drawing还有一个偏门用法:在同一个设计里,如果一段走线和铜皮需要原封不动做镜像复制,也可以用Sub-Drawing导出,再导入后通过 Edit -> Mirror 来镜像。这个方法在对称布局中很实用。比如一块双路电源板,左右两边结构完全对称,我只需要画好一边,导出再镜像导入,省一半时间。
6.3 关于版本兼容性
16.6导出的.clp,在17.4里能不能导入?我试过,多数情况下可以,但会丢失部分新版才有的属性,比如新版动态铜皮参数和约束规则可能不会被完整保留。反过来,17.4导出的.clp,16.6往往打不开。所以跨版本复用前,最好把源设计的层、约束规则导出成文件检查一次。现在很多项目在公司内部会统一版本,这个问题反而不大,但如果你需要和外部协作,这一点一定要提前确认。
6.4 一个我自己的验证闭环
Sub-Drawing导入完成后,我会习惯性做一个“导出-导入-验证”的闭环。验证动作是:先把导入模块的所有网络和源项目模块的网络名做一次对比;再跑一次完整DRC;最后看一眼Gerber预览,确认铜皮和封装没有异样。三步都过了,我才敢继续画下面的板子。
最后再分享一个小技巧:在Export对话框里,参考点如果设成一个容易记忆的格点坐标,比如模块中心,导入后可以使用格点对齐功能,把模块精确地放到新板的网格上。配合Align、Fix功能,整个模块的复用可以做到既快又准。希望这篇内容对同样在Cadence里画板的朋友有帮助,少走点弯路。