☰
Cadence Sub-Drawing完全指南:跨项目复制PCB模块的核心技巧与避坑手册
2026/10/6 6:51:34 网站建设 项目流程

Sub-Drawing这个功能,老工程师一般叫它“跨项目复制神器”,Cadence玩到一定阶段基本绕不开它。我最早接触是被项目逼的:母板上有块成熟电源模块,新出了一个子板项目,要求把整块电源部分连走线带铺铜原样搬过去。手工重画至少三天,用Sub-Drawing不到十分钟就搞定了,从那以后它就成了我PCB设计流程里的固定环节。

这篇文章把Sub-Drawing的定位、底层机制、实操场景和常见坑完整梳理一遍,适合正在学Cadence Layout的硬件工程师,也适合已经用过但经常被“层叠映射”“铜皮优先级”“网络丢失”折磨的同行。内容不绕弯子,直接讲能落地的操作。

1. Sub-Drawing的真实定位:它不是一个“进阶命令”,而是跨项目复制的第一选择

1.1 为什么说它是Cadence里最灵活的复制工具

很多人第一次接触Allegro时,下意识会找Ctrl+C和Ctrl+V,结果发现编辑器里根本没有跨文件的剪贴板。Allegro自带的Edit Copy只能在当前设计内部复制元素,跨PCB文件那就只能抓瞎。Design Reuse确实能做模块复用,但它有固定流程:要先创建reuse、处理符号映射、保持网络一致,部署起来比较重。

Sub-Drawing绕开了这些限制。它的本质是把你在当前板卡上选中的任意对象集,打包成一个后缀为.clp的文件,然后在另一块板卡上通过Import重新放进去。这个.clp文件本质上是文本格式,记录的是对象的几何形状、坐标、所在层、网络名和属性,你可以直接用记事本打开看里面的内容,遇到导入异常时还能手动改坐标和网络名——这一点在调试时非常有用。

在Allegro里执行Sub-Drawing的方式很简单:新版菜单路径是File -> Export -> Sub-Drawing,旧版(16.x)是File -> Export Sub-Drawing;对应导入路径是File -> Import -> Sub-Drawing。命令本身只有两步,但真正决定成败的是导出前对象勾选、坐标设定和目标板环境准备。后面第三章我会把每个场景的完整操作铺开讲。

它比Design Reuse灵活的地方在于,你能精确控制这次要搬什么。只有走线的等长组,可以只选Clines和Vias;要连元件一起搬,就把Symbols勾上;要连铜皮和禁布区,就把Shapes和Figures一起选中。这种“按对象类型自由组合”的能力,让Sub-Drawing成了我在多板卡项目中复用布局布线、复制板框、搬运禁布区、迁移丝印标注时最顺手的工具。

1.2 哪些场景适合用,哪些场景建议绕开

先列几个我几乎每周都会用的场景:

  • 模块复用:电源模块、MCU最小系统、接口防护电路这类成熟模块,从旧板搬到新板。
  • DDR或高速等长走线组迁移:拉好的DDR走线组、差分对、蛇形线,整体搬到新板后只需微调。
  • 铜皮与禁布区复制:把验证过的铺铜区域、Route Keepin、Shape Keepout、Package Keepin搬到新板,省去重新画区域的时间。
  • 板框和安装孔搬运:做拼板或者从参考板提取外形时,直接导出Outline和机械孔。
  • 丝印和装配信息复制:把散热器区域标注、极性标识、版本丝印一并搬走,避免二次绘制。

但也要说清楚,有两类情况我不建议用Sub-Drawing硬来。第一类是约束规则本身,比如线宽线距、等长Match Group、差分对规则,Sub-Drawing不会把Constraint Manager里的完整规则集搬过去。它只搬运对象,规则要靠目标板的约束管理器重建,或者提前导入一个统一的规则文件。第二类是与原理图强绑定的网络结构,如果目标板网表还没做好,导入的走线会变成Dummy Net,后续要花大量时间重新分配网络,不如先同步网表再做搬运。

2. 用之前必须搞明白的三个底层机制

2.1 你导出的其实是“对象集”,不是“图层”

第一次用Sub-Drawing的人最容易犯的错误,是把导出理解成“整层复制”。实际上Export Sub-Drawing弹出框里的Find面板,控制的是你这次要抓取哪几类对象,而不是图层。

我把最常用的对象类型整理成了表,照着勾就清楚:

Find面板选项包含对象典型用途
Symbols元件、过孔符号、机械孔带封装和位号一起迁移元件
Clines完整走线(含网络信息)复制走线组、差分对
Cline Segs走线中的独立线段按更细粒度挑选局部走线
Vias过孔随走线或单独复制过孔阵列
Shapes铜皮、动态铜皮、静态铜皮复制铺铜区域
Figures图形对象(矩形、圆弧、多边形)复制板框、禁布区、装配图标注
Text文本和丝印字符搬运丝印标识、版本号
Other其他杂项对象特殊场合使用

实际操作里,选中区域的走线、元件、铜皮往往混在一起。在Find面板把Symbols、Clines、Vias、Shapes、Figures、Text全部勾上,看起来是“整块区域复制”,其实Cadence是把这些不同类型的对象分别序列化进.clp文件。导入时再按对象类型逐一还原。

这解释了为什么经常出现“走线过去了、丝印没过去”的情况:因为导出时Text根本没勾。为了避免这种问题,我的习惯是导出前先把Find面板全部勾选,如果确实只想搬某类对象,再手动去掉不用的类型。

2.2 坐标方式决定导入位置是否听话

导入.clp文件时,Options面板会要求你确定坐标参考方式,主要就两个选项:Absolute origin(绝对坐标)和Relative offset(相对偏移)。

Absolute origin是让导入对象按照源板坐标系下的绝对坐标重新落到目标板上。如果两块板卡原点一致,或者你打算让模块落在和源板完全相同的位置上,选这个最省事。比如源板上电源模块中心在(1000, 2000),目标板也希望放在同一坐标,直接输0:0作为原点,模块就会出现在原坐标位置。

Relative offset则适合目标板位置和源板不一致的情况。它可以让你指定一个偏移量,或者使用“pick point”方式,在导入时用鼠标点击一个插入点。如果源板导出时勾选了“Relative”模式,导入对话框会让你指定源板参考点和目标板参考点,两者对齐后,整个模块就会以可预测的姿态放在你点击的位置。

常见坑是:选了Absolute origin,但两块板的原点设置不一样(比如一块板原点在左下角,另一块在板框中心),导入后模块跑到十万八千里外,还要再整体拖回来。我现在的习惯是导入前先看一眼两块板的Setup -> Change Drawing Origin,把原点统一到同一位置再操作。如果实在对不上,用Relative模式手动点放更靠谱。

2.3 层叠映射是绝大多数兼容问题的根源

Sub-Drawing搬运的不是“Top层”“GND层”这种概念,它记录的是几何对象所在层的层名,导入时按层名映射到目标板的Cross-section。所以源板和目标板的层叠越接近,导入越顺;层叠差异越大,越容易出幺蛾子。

最常见的场景是:源板是四层板(Top / GND / Power / Bottom),目标板是六层板(Top / GND1 / Signal1 / Signal2 / Power / Bottom)。导入时Allegro确实会弹出层叠映射对话框,让你手动把源板层名映射到目标板层名。比如源板的Internal1(GND)可以映射到目标板的GND1,源板的Internal2(Power)映射到Power。这个环节不能跳过,因为一旦映射错了,走线会跑到完全错误的信号层,DRC瞬间爆红一片。

如果两块板层叠名称完全相同,Allegro会按同名自动映射,几乎无需干预。我的建议是,在准备Sub-Drawing导入之前,先在目标板上把Cross-section和你规划中要承接的网络层配置好,再导入对象。层叠不一致的时候,宁可先只导入Top和Bottom两层内容,内层走线后面手动调整,也不要硬着头皮一次性搬,否则排查错误的时间比重新走线还长。

3. 六个高频实操场景,从走线到整板这么复制

3.1 场景一:把DDR等长走线组原样搬进新板

DDR走线组是所有复用场景里最讲究的,因为等长关系、阻抗连续性和拓扑都是反复调过的,重新走一遍成本很高。

操作步骤:

  1. 打开源板,执行File -> Export -> Sub-Drawing。
  2. 在Find面板勾选Clines、Cline Segs、Vias,如果DDR区域底部有完整铺铜支撑,再把Shapes也勾上。Symbols这次不用勾,因为新板元件已经放置好了。
  3. 用“Selection by Rectangle”或“Selection by Polygon”把DDR整个区域框选进去。注意框选时要把走线的端头包含完整,否则导入后发现走线段落残缺,还要一根根补。
  4. 保存.clp文件,文件名尽量带日期和版本,比如DDR_ROUTE_20240520_V01.clp。
  5. 打开目标板,File -> Import -> Sub-Drawing,选择刚才的文件。
  6. 坐标方式建议用Absolute origin,并确保目标板原点与源板一致,或者你已经把DDR器件放在了相同坐标区域。
  7. 导入后先不要急着存盘,用Display -> Ratsnest -> All刷新飞线,检查走线是否带上了正确网络。

这里有个经验:DDR等长组里的蛇形绕线,会被完整保留,因为几何形状是按坐标存进.clp的。但Match Group的长度约束不会跟着过来,目标板仍然需要在Constraint Manager里手动设定等长目标值。走线是现成的,剩下的就是把规则补齐,这比从零画快太多。

3.2 场景二:整个电源模块一键迁移(元件、走线、铜皮、位号)

电源模块复用是Sub-Drawing最常见的用途,因为它同时涉及元件、走线、铜皮和位号四类对象,操作步骤最完整。

步骤如下:

  1. 在源板上打开Export Sub-Drawing,Find面板把Symbols、Clines、Cline Segs、Vias、Shapes、Figures、Text全部勾选。
  2. 框选整个电源模块。这里我说“框选”,实际更推荐用“Select by Polygon”沿着模块边界选,不然容易把无关的走线也带进来。
  3. 导出选项里注意勾选“Include sublayer outlines”或类似的子类保留选项,这样对象原本的子类信息不会丢失。
  4. 打开目标板,先检查Setup -> User Preferences -> Design Paths里的psmpath、padpath是否包含源板的封装和焊盘库目录。如果目标机没配这些路径,导入时大概率会报“Symbol not found”,或者元件显示成空封装。
  5. 执行Import选中.clp,建议用Absolute origin对齐到板上预留位置。
  6. 导入后,如果源板和目标板原理图网络名一致,Allegro会自动把导入对象挂到同名网络上;不一致的会变成Dummy Net,需要在后续修复。
  7. 对所有导入元件执行Logic -> Auto Rename RefDes,框选导入区域,让系统自动重新编号,避免与目标板已有位号冲突。

这里特别提醒:电源模块里的铜皮优先级,在跨板导入后经常出现错乱。源板上可能让GND铜皮避让5V铜皮,导入后发现两块铜皮互相避让成犬牙状。针对这个问题的完整修复方法我在第四章单独写,先记得导入后要检查一遍Shape之间的避让关系。

3.3 场景三:单独搬运铜皮和禁布区

很多工程师不知道Sub-Drawing能单独复制禁布区,结果每次都在新板上手工重新画Route Keepin和Shape Keepout,费时还容易漏。

铜皮搬运的要点:

  • Export时在Find面板只勾Shapes,其他全部取消。
  • 框选目标铜皮后导出。
  • 导入后如果目标板存在同名网络,铜皮会自动挂上网络;如果网络名不存在,铜皮会变成无网络状态,这时选中铜皮,右键Assign Net,手动指定网络即可。
  • 动态铜皮导入后可能需要刷新边界。用Shape -> Select Shape or Void/Cavity选中铜皮后,右键选择Update Boundary,让它在新的组件布局下重新计算避让区域。

禁布区搬运更简单,Route Keepin、Route Keepout、Shape Keepout、Package Keepin这类区域本质上以Area形式存在,在Find面板里属于Figures或Other,把对应选项勾上就能导出导入。区域对象的子类(Route Keepout/All等)在导入后能正确保留,前提是目标板Cross-section也存在相同子类。

我有一个实际教训:导入Shape Keepout后,一定要先执行一遍Shape -> Shape Check,确认和已经铺好的铜皮没有发生意外的交叉。因为禁布区从源板搬过来后,它的坐标不会自动适应目标板已有的铺铜,哪里是禁布区就是哪里,该报的DRC一个都不会少。

3.4 场景四:板框、安装孔与拼板排版

做拼板或者从参考板提取外形时,Sub-Drawing能直接把整块板的外形和安装孔搬过来,不用重新量尺寸画板框。

具体操作:

  1. 源板上打开Export Sub-Drawing,Find面板勾选Figures和Symbols,如果板框里有Line类型,把Lines相关的选项也一并勾上。
  2. 框选整个板框区域,导出为OUTLINE.clp。
  3. 目标板上导入时,坐标方式推荐Absolute origin并输入0:0,让板框落到目标板原点。
  4. 导入后的板框会自动落到Design Outline或Board Geometry/Outline层,取决于源板上的层设置。

拼板场景我通常这样用:新建一个拼板文件,把单板Sub-Drawing导入多次,按阵列排列,然后在合适位置添加工艺边和Mark点。这种操作比手工复制板框加安装孔效率高很多,而且不会漏掉任何一个定位孔。

需要留意的是,安装孔如果是带网络的固定孔(比如连接到GND的安装孔),导入后网络也会跟随,拼板时如果多个单板共享同一个网络结构,要小心是否会影响单独板卡的连通性。我一般在拼板文件里把这类固定孔网络清掉,只保留机械属性。

3.5 场景五:搬丝印标注与装配信息

丝印标注(比如极性标识、版本号、散热区域警示)在每块板上几乎一样,用Sub-Drawing搬运可以保持完全一致,不用重画。

操作时,Export Sub-Drawing的Find面板只勾Text(如果版本里Text是独立选项)和Figures(丝印图形通常属于Figures),框选源板上的丝印区域导出。导入目标板后,文字会落到对应Silkscreen子类。

这里我常用的一个细节是:丝印文本的字体、高度、线宽会跟随.clp一起保留,所以你不需要在新板重新设置Text style。跨板复制后文本外观和源板完全一致,对追求丝印美观统一的团队特别友好。

如果只是复制单个或几个文字标注,不需要框选整板,直接点选后导出即可。Sub-Drawing的优势就是对象粒度可选,大到一个板框,小到一行丝印,都能搬运。

3.6 场景六:跨版本导入前的“投保”操作

这个场景不算Sub-Drawing的经典用法,但遇到跨版本项目时很救命。比如一个外包团队用Cadence 17.4画好了板卡,你本地还是16.6,直接用新版导出的.clp导入,偶尔会因为版本关键字不同而出问题。

我的习惯是:拿到高版本.clp文件后,先不要直接导入主设计文件,而是在一个临时空白板卡上做测试导入。如果它提示“Sub-Drawing version mismatch”或者某些新特性不支持,就请对方把源板用低版本Save As另存一份,再重新导出.clp。版本相近(16.6和17.2之间)通常都还好,跨大版本时就要格外谨慎。

另一个“投保”手段是:导入前先对目标板运行一次Tools -> Database Check,确保数据库干净。Sub-Drawing本身不会把数据库错误带过来,但目标板如果已经有DB问题,导入大文件时容易触发报错,先查一遍能省很多麻烦。

4. 常见问题排查:这些都是我踩过的坑

4.1 先看高频问题速查表

下面这张表是我这些年处理Sub-Drawing问题整理出来的高频速查,基本可以覆盖日常入库、网络、层叠、对象缺失八成以上的故障。

现象可能原因解决方法
导入后走线全部不在目标层层叠映射没设置或映射错误导入时手动调整Sub-Drawing Layer Mapping
铜皮之间避让关系错乱Shape Z-order优先级丢失用Setup -> Shapes -> Assign Priority重新排列
元件变成空封装或报Symbol not found目标机psmpath、padpath未包含封装库补全Design Paths里的库路径
位号变U?或与已有元件冲突导入后位号未重排用Logic -> Auto Rename RefDes批量重排
走线变成Dummy Net目标板没有同名的网络导入前同步网表,或用Net Logic重新分配
飞线不显示Ratsnest显示层被关闭Display -> Ratsnest -> All
板框/禁布区无法编辑图形对象落到被锁定的子类或Locked元素在Find面板选中后右键Unfix,或检查Layer Lock
导入时提示数据库错误目标板DB有存量错误Tools -> Database Check修复后再导入
.clp文件跨版本不识别版本关键字不兼容请输出方另存低版本再重新导出

4.2 铜皮优先级错乱怎么恢复

铜皮优先级(Shape Z-order)是Sub-Drawing跨项目复制时最容易被忽略的坑,也是围观群友提问最多的问题之一。

先说原理。动态铜皮之间发生重叠时,Allegro会按照每个Shape的优先级决定谁避让谁。源板上你可能设置了5V铜皮优先级高、GND铜皮优先级低,所以GND铜皮会自动给5V铜皮让出空隙。Sub-Drawing导出时,Shape的几何和网络都带了过来,但目标板原本的Shape优先级列表里没有这些新成员,导入后新铜皮默认排在列表尾部,避让关系就和源板完全不同了。

修复方法分两步。第一步,执行Setup -> Shapes -> Assign Priority,弹窗里会列出当前板上所有动态铜皮及其优先级排序。第二步,把导入的铜皮拖动到合适位置。需要避让其他铜皮的,放到低优先级区域;需要保持完整形状的,放到高优先级区域。优先级越高,在避让关系中越占主动。调整完保存后,铜皮的避让关系会实时刷新。

还要区分另一种情况:源板用的是静态铜皮。静态铜皮没有Z-order概念,重叠时按照创建顺序来决定谁在谁前面,且不会自动避让。Sub-Drawing导入静态铜皮后,它和已有铜皮的重叠关系是固定的,如果出现不自然的空洞或者覆盖关系,只能通过Shape -> Operations里的Merge或Cut Out手工处理。所以我的建议很直接:跨项目复制涉及多层铜皮重叠时,尽量在源板先把铜皮转成动态铜皮再导出,这样至少保留优先级调整的机会。

4.3 位号丢失、冲突与自动化重排

导入元件后位号变U?,或者导入元件位号和目标板已有元件位号一模一样——这两类问题我见得太多了。

先说为什么位号会变U?。这通常是导入选项里勾选了“Map duplicate symbol names to new name”之类映射后的结果,也可能是.clp文件中的symbol属性在传递时丢失了RefDes字段。遇到这种情况,不用慌,选中丢失位号的元件,在右侧的Edit Properties面板里手动改RefDes,或者直接执行Logic -> Auto Rename RefDes,在Rename对话框中设置好起始编号(比如从U300开始),框选导入区域,系统会自动把所有丢失或冲突位号重新分配。

位号冲突更常见。源板电源模块用的位号是U12、U13、U14,目标板对应位置已经有U12了。导入时Allegro会警告,有的版本会强制放进去,导致两个不相关元件共用位号,后边BOM表直接乱套。处理办法就是导入后统一Rename,不要想着手动改三五个就完了,批量重排是最稳的。

我自己习惯在导入前先看一眼目标板已有元件的位号占用区间,然后在Auto Rename对话框里设置一个躲开该区间的起始值,比如目标板已经用到U100,那电源模块就从U200开始排。这样重排后位号分区清晰,后续定位元件也方便。

4.4 网络对不上、飞线不显示的完整处理思路

导入.clp后,走线、铜皮全都“躺”在板子上,但飞线就是不出来,或者走线颜色发灰,打开Properties一看全是Dummy Net。这个问题的根源基本是:目标板当前的网表里没有.clp中记录的网络名。

我踩过一次很大的坑:项目经理催得急,我没等网表同步就开始搬模块,结果一大批走线全部变成Dummy Net,后续一条条重新指网络,花了大半天。从那以后,我给自己定了个规矩——跨项目Sub-Drawing导入前,先把源板和目标板的网络列表核对一遍,哪怕只是用Export -> Netlist导出对比,也比事后返工强。

如果真的已经导入了Dummy Net,处理思路有三种:

  1. 如果只是少数几条走线,选中走线后打开Edit -> Properties,在Net属性里直接改成正确网络。
  2. 如果是整批网络不对,使用Logic -> Net Logic,在Options面板里选择目标网络,然后框选所有需要重新分配的走线和铜皮。
  3. 如果源板和目标板的原理图本来网络就不一致,那就别挣扎了,先把目标板网表同步好再重新导入。

飞线不显示这种“看似小问题”的状况,很多时候只是Color/Visibility里把Ratsnest层关闭了,执行Display -> Ratsnest -> All就能恢复。如果执行后还是看不到,再检查网络是否为Dummy Net,以及元件封装引脚有没有正确对应到网络结构。

4.5 库路径错一半,导入必然出幺蛾子

最后一个高频问题,也是最容易被新手忽略的:Sub-Drawing导入元件时,Cadence会按照psmpath和padpath去搜索封装和焊盘。目标机如果从来没有打开过源板的封装库,导入时往往报“Symbol not found”,或者更隐蔽——元件进去了一个空轮廓,看起来是封装,其实没有焊盘。

我把库路径管理作为Sub-Drawing操作的前置检查项。在目标板上执行Setup -> User Preferences -> Design Paths,把psmpath和padpath里加入源板使用的封装库目录。如果团队有统一库服务器,直接在env文件里配置好全局路径,一劳永逸。

焊盘版本不一致也会造成类似问题。比如源板用的是Flash焊盘、Thermal Relief连接,目标机库里的焊盘却是不带散热孔的旧版本,导入后过孔连接关系会异常。遇到这类情况,优先检查.pad文件和源板版本是否一致,而不是盲目改Shape参数。

做完这一步,Sub-Drawing导入由“看运气”变成了“可预期”。之后再处理铜皮优先级、位号重排这些细节,基本就不会手忙脚乱了。


最后分享一个我一直保留的操作习惯:每次Sub-Drawing跨板导入后,我不会立刻关掉源板,而是把两块板用窗口并排摆好,开启Color/Visibility对比模块区域的颜色和元素分布。这不只是为了确认对象有没有完整导入,更重要的是观察铜皮优先级、禁布区位置、走线层次这些“隐性信息”是否和源板一致。很多时候报错的不是.clp文件本身,而是导入后没有及时验证环境差异。用多了你会发现,Sub-Drawing真正省下来的不光是重新画板的时间,还有验证成熟方案是否被正确复用的心力。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询