
Sub-Drawing这个功能老工程师一般叫它“跨项目复制神器”Cadence玩到一定阶段基本绕不开它。我最早接触是被项目逼的母板上有块成熟电源模块新出了一个子板项目要求把整块电源部分连走线带铺铜原样搬过去。手工重画至少三天用Sub-Drawing不到十分钟就搞定了从那以后它就成了我PCB设计流程里的固定环节。这篇文章把Sub-Drawing的定位、底层机制、实操场景和常见坑完整梳理一遍适合正在学Cadence Layout的硬件工程师也适合已经用过但经常被“层叠映射”“铜皮优先级”“网络丢失”折磨的同行。内容不绕弯子直接讲能落地的操作。1. Sub-Drawing的真实定位它不是一个“进阶命令”而是跨项目复制的第一选择1.1 为什么说它是Cadence里最灵活的复制工具很多人第一次接触Allegro时下意识会找CtrlC和CtrlV结果发现编辑器里根本没有跨文件的剪贴板。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确实会弹出层叠映射对话框让你手动把源板层名映射到目标板层名。比如源板的Internal1GND可以映射到目标板的GND1源板的Internal2Power映射到Power。这个环节不能跳过因为一旦映射错了走线会跑到完全错误的信号层DRC瞬间爆红一片。如果两块板层叠名称完全相同Allegro会按同名自动映射几乎无需干预。我的建议是在准备Sub-Drawing导入之前先在目标板上把Cross-section和你规划中要承接的网络层配置好再导入对象。层叠不一致的时候宁可先只导入Top和Bottom两层内容内层走线后面手动调整也不要硬着头皮一次性搬否则排查错误的时间比重新走线还长。3. 六个高频实操场景从走线到整板这么复制3.1 场景一把DDR等长走线组原样搬进新板DDR走线组是所有复用场景里最讲究的因为等长关系、阻抗连续性和拓扑都是反复调过的重新走一遍成本很高。操作步骤打开源板执行File - Export - Sub-Drawing。在Find面板勾选Clines、Cline Segs、Vias如果DDR区域底部有完整铺铜支撑再把Shapes也勾上。Symbols这次不用勾因为新板元件已经放置好了。用“Selection by Rectangle”或“Selection by Polygon”把DDR整个区域框选进去。注意框选时要把走线的端头包含完整否则导入后发现走线段落残缺还要一根根补。保存.clp文件文件名尽量带日期和版本比如DDR_ROUTE_20240520_V01.clp。打开目标板File - Import - Sub-Drawing选择刚才的文件。坐标方式建议用Absolute origin并确保目标板原点与源板一致或者你已经把DDR器件放在了相同坐标区域。导入后先不要急着存盘用Display - Ratsnest - All刷新飞线检查走线是否带上了正确网络。这里有个经验DDR等长组里的蛇形绕线会被完整保留因为几何形状是按坐标存进.clp的。但Match Group的长度约束不会跟着过来目标板仍然需要在Constraint Manager里手动设定等长目标值。走线是现成的剩下的就是把规则补齐这比从零画快太多。3.2 场景二整个电源模块一键迁移元件、走线、铜皮、位号电源模块复用是Sub-Drawing最常见的用途因为它同时涉及元件、走线、铜皮和位号四类对象操作步骤最完整。步骤如下在源板上打开Export Sub-DrawingFind面板把Symbols、Clines、Cline Segs、Vias、Shapes、Figures、Text全部勾选。框选整个电源模块。这里我说“框选”实际更推荐用“Select by Polygon”沿着模块边界选不然容易把无关的走线也带进来。导出选项里注意勾选“Include sublayer outlines”或类似的子类保留选项这样对象原本的子类信息不会丢失。打开目标板先检查Setup - User Preferences - Design Paths里的psmpath、padpath是否包含源板的封装和焊盘库目录。如果目标机没配这些路径导入时大概率会报“Symbol not found”或者元件显示成空封装。执行Import选中.clp建议用Absolute origin对齐到板上预留位置。导入后如果源板和目标板原理图网络名一致Allegro会自动把导入对象挂到同名网络上不一致的会变成Dummy Net需要在后续修复。对所有导入元件执行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能直接把整块板的外形和安装孔搬过来不用重新量尺寸画板框。具体操作源板上打开Export Sub-DrawingFind面板勾选Figures和Symbols如果板框里有Line类型把Lines相关的选项也一并勾上。框选整个板框区域导出为OUTLINE.clp。目标板上导入时坐标方式推荐Absolute origin并输入0:0让板框落到目标板原点。导入后的板框会自动落到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处理思路有三种如果只是少数几条走线选中走线后打开Edit - Properties在Net属性里直接改成正确网络。如果是整批网络不对使用Logic - Net Logic在Options面板里选择目标网络然后框选所有需要重新分配的走线和铜皮。如果源板和目标板的原理图本来网络就不一致那就别挣扎了先把目标板网表同步好再重新导入。飞线不显示这种“看似小问题”的状况很多时候只是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真正省下来的不光是重新画板的时间还有验证成熟方案是否被正确复用的心力。