
简介面向使用 Cadence Allegro 进行原理图与 PCB 设计的工程师这份速查文档聚焦实际操作中的高频报错与设置难点覆盖网表导入、约束管理、库文件与封装符号替换、第三方设计文件互转以及显示和保存异常等场景适合具备一定电路板设计基础的从业者也便于初学软件流程的技术人员对照排查。压缩包仅含 1 个 docx 文件约 4.24MB内容按功能模块与故障现象组织可直接检索具体操作已有 1023 人学习。正文以案例和步骤展开涉及焊接掩膜、网络隐藏、焊盘大小、BOM 生成、线宽与间距规则、区域规则、分段等长、差分对设置、泪滴与边框倒角等细节并给出问题成因与修正方法。对 Altium Designer 与 Cadence 的 PCB 文件互转、库路径与坐标原点定位也有说明可帮助读者在复杂布局、方案改进和日常排错时减少误操作返工提升布线与约束管理效率尤其对高精度布线和元件库管理较有帮助。1. 网表导入后一片空焊盘先别重装先看库路径和原点Allegro PCB 设计里网表导入和约束管理是最容易让人怀疑人生的两件事File-import-logic 点下去要么弹一堆找不到封装的报错要么器件全叠在坐标原点约束管理器里线宽、间距、差分规则明明设了DRC 却像没看见。某开发者在一个模拟项目X里就遇到过导入后花半天重装软件最后发现只是库路径顺序写反。这类故障不神秘但触发点分散在原理图导出、库路径、原点、规则优先级几个环节。下面按我踩过的坑从报错现场一路拆到根因和可复现的解决步骤适合正在被网表、约束、等长和出图卡住的 PCB 设计人员照着排查。2. 导入网表失败File-import-logic 报错的三条排查线导入网表这件事新手容易把它当成一个“点一下就完事”的动作实际它同时依赖三样东西原理图导出的网表文件、PCB 端能访问到的封装库、以及正确的放置基准。任何一样对不上表现都可能是“报错”“导入 0 个器件”或者“导入成功但全是飞线”。我一般先不碰软件安装也不急着重装而是把故障分成三条线库找不到、文件没生成、导入后没放置。这三条线分清楚后面每一步才有意义。2.1 报错“找不到器件/封装”库路径与 psmpath/padpath 的顺序最常见的报错是导入时提示找不到 symbol、找不到 padstack或者 device file 不存在。Allegro 查找封装不是全盘搜索而是按psmpath、padpath、devpath这些路径变量给出的顺序逐个目录找。路径顺序一乱它可能先命中一个同名的旧封装然后停下来后面正确的库根本没机会被读到。另一个高频原因是只设了psmpath忘了padpath封装符号能打开焊盘却找不到报错看起来像“封装坏了”实际是焊盘路径没配。先做一次静态检查确认网表文件、封装文件、焊盘文件是不是同一套库# 检查网表、封装、焊盘是否在同一套库路径下 NETLIST_DIR/path/to/netlist LIB_DIR/path/to/lib ls -l $NETLIST_DIR/pstxnet.dat $NETLIST_DIR/pstxprt.dat $NETLIST_DIR/pstchip.dat find $LIB_DIR -maxdepth 2 -type d -print # 确认封装目录里同时有 .dra/.psm 和配套焊盘 .pad find $LIB_DIR -name *.psm -o -name *.pad | head -20这段命令只做一件事把“文件到底在不在”这件事先钉死。pstxnet.dat是连接关系pstxprt.dat是器件表pstchip.dat是器件引脚模型三个文件缺一个导入逻辑就可能只完成一半。find用来确认.psm和.pad是否在同一个库根目录下如果.psm有、.pad没有问题就不在网表而在焊盘库没同步。路径配置我一般直接看 Allegro 的env文件按“越靠前优先级越高”的顺序写# 在 Allegro 的 env 文件里按顺序追加越靠前优先级越高 set psmpath /path/to/lib/symbols /path/to/lib/alternate set padpath /path/to/lib/pads set devpath /path/to/lib/devicespsmpath指向封装符号所在目录padpath指向焊盘文件目录devpath指向 device 文件目录。这里最容易翻车的是路径里带中文、空格或者网络盘符Allegro 在某些环境下解析会出问题表现就是“明明文件存在但就是说找不到”。我一般把库放在纯英文、无空格的本地路径路径层级也不要太深。还有一点.表示当前工作目录如果当前目录里正好有一份旧封装它可能比库路径更早被命中所以排查时先把当前目录下的同名文件挪走再试。报错对照可以按下面这张表先过一遍不要一上来就改库文件报错关键词先查什么常见根因Could not find symbolpsmpath是否包含.psm所在目录路径顺序错、当前目录有同名旧封装Padstack not foundpadpath是否包含.pad所在目录只配了psmpath漏了padpathDevice file not founddevpath和pstchip.dat器件模型没导出或路径没配No footprint found原理图器件封装名是否为空封装名空、拼写不一致2.2 网表文件本身没生成从原理图导出到 .dat/.txt 的检查点第二类故障更隐蔽File-import-logic 能打开但选不到网表文件或者导入后器件数为 0。这个时候不要怀疑 PCB 端先回原理图端看网表到底有没有生成。常见情况是原理图有未保存修改、输出目录选错、导出格式选成第三方格式或者工程里某个器件封装名为空。封装名为空时原理图端可能不报错但网表里那一条器件记录是不完整的PCB 端导入时就会跳过或者报错。我一般先看三个.dat文件的时间戳是不是接近再看器件行有没有明显字段缺失# 三个文件时间戳应接近器件数可从 pstxprt.dat 粗略统计 stat -c %y %n pstxnet.dat pstxprt.dat pstchip.dat grep -c ^ pstxprt.dat # 查空封装名器件行里封装字段为空会直接导致导入失败 awk NF 6 {print NR: $0} pstxprt.dat | headstat的作用是确认三个文件是不是同一次导出产生的如果pstxnet.dat是昨天的pstxprt.dat是今天的说明导出过程可能中断过。grep -c只是粗略看行数不能当成精确器件数因为网表里还有表头和注释。awk NF 6是按常见字段数做示意不同网表格式字段数不一样看到空行或者字段明显偏少的行就回原理图检查对应器件的封装名和 Part Number。这里有一个很容易被忽略的点原理图端导出网表时输出格式要选 Allegro 对应的格式不要选成通用文本或者第三方格式后再硬改后缀。格式不对时PCB 端可能能读进去一部分但网络名、器件属性会丢后面约束管理和等长会跟着出问题。重新导出时我一般会清空旧输出目录避免新旧文件混在一起导入时选错文件。3.3 差分对与 XNET设了差分却没等长先查模型关联差分对和 XNET 是约束管理里最容易“看起来设了、实际没关联”的部分。现象是差分对在 PCB 上能看出来是两根线但等长组里没有它们或者 XNET 里电阻两端各算各的绕线长度永远对不上。根因通常不是差分规则本身而是网络模型没建差分对没有在 Electrical 里创建XNET 没有把电阻两端关联起来约束管理器就不知道这两段线属于同一个拓扑。我一般先建 XNET再建差分对。XNET 的作用是把电阻、电容这类串联器件两端的网络合成一个扩展网络等长和差分才有完整的路径。建完之后用一段 SKILL 把网络名和 XNET 属性列出来确认属性不是空的; 列出网络名和 XNET 属性确认电阻两端是否已关联 let((design) design axlDBGetDesign() foreach(net design-nets printf(%s xnet%L\n net-name axlDBGetProperty(net XNET)) ) )net-name是网络名axlDBGetProperty(net XNET)取 XNET 属性。输出里如果大量网络显示xnetnil说明 XNET 根本没建或者没赋上如果只有电阻一端有值、另一端没有说明关联只做了一半。参数上要注意XNET 属性值应该是 XNET 名称不是随便一个字符串差分对名称也要和约束管理器里的 Match Group 对得上。这个脚本只读不会改设计但跑之前还是建议保存当前 brd避免误操作。差分对本身在 Physical 里的 Differential Pair 创建创建时选对正负网络别选成两个不相干的网络。设完差分对后回 Electrical 看等长组如果等长组里仍然没有差分对优先查 XNET 和 Pin Pair而不是反复改差分规则值。常见误用是在 PCB 上直接改网络名来“凑”差分这样约束管理器里的规则和实际网络对不上DRC 会时好时坏。4. 等长绕线翻车分段等长、相对误差、绝对误差和 F9 参考线等长绕线是另一个容易让人产生“玄学”错觉的环节明明规则设了 50 mil绕完一测差 80 mil明明同一组网络有的过、有的不过。等长不是把线拉长就行它依赖分组、目标线、误差类型和长度统计口径。我踩过的坑里最常见的是 XNET 没关联、Match Group 没选全 Pin Pair、相对误差和绝对误差混用以及绕线中途改单位。4.1 分段等长先分组XNET 与电阻两端关联分段等长的第一步不是绕线是分组。比如一个模拟项目X里一组信号经过串联电阻电阻两端各是一段网络如果只把其中一段放进 Match Group绕线时只统计一段长度另一段再长也不会报。正确做法是先把电阻两端关联成 XNET再在 Electrical Net Routing Relative Propagation Delay 里建 Match Group把每一段的 Pin Pair 都选进去。分组是否完整可以从等长报告里粗查# 从等长报告里按网络分组检查每段长度是否都进了同一个 Match Group awk /^Net/{net$2} /Length/{print net, $0} length.rpt | sortawk先匹配Net行记下网络名再匹配Length行输出网络和长度。这个写法依赖报告格式不同版本字段位置可能不同但思路是一样的看同一个 Match Group 里的网络是不是都出现了。如果某一段网络完全没出现在报告里不是长度算错而是它根本没进组。参数上length.rpt换成实际导出的报告文件名导出时把 Pin Pair 和长度列都勾上。Match Group 里还要注意目标线。相对误差是相对于组内目标线算的目标线没设或者设错整组都会跟着偏。我一般选走线最长、最难绕的那根做 Target其他线向它靠。目标线不是固定不变的布局调整后要重新确认否则会出现“规则没改结果全变”的情况。4.2 相对误差 / 绝对误差怎么选目标线显示长度与 F9相对误差和绝对误差的区别简单说相对误差看的是组内各线相对于目标线的差值绝对误差看的是相对于一个固定长度的差值。大多数分段等长场景用相对误差因为目标线长度会随布局变化绝对误差更适合有明确长度上限的总线或者时钟。混用的后果是有的线按目标线算、有的线按绝对值算DRC 结果自然对不上。F9 在这里的作用是调出参考线长度显示。绕线时按 F9 看当前线和目标线的差距比在约束管理器里反复刷新直观。但 F9 显示的是当前参考对象如果参考对象选错看到的差值就是错的。我一般先确认目标线再按 F9绕一段复核一段不等到最后一次性看。单位换算是另一个隐蔽点。约束值用 mil 设的中途把显示单位改成 mm规则值可能被四舍五入绕线时看起来只差一点点实际已经超了。先算清楚再改# 约束值在 mil 和 mm 之间换算避免改单位后公差被四舍五入 python3 - PY mil 50 mm mil * 0.0254 print(f{mil} mil {mm:.4f} mm) print(f1 mm {1/0.0254:.4f} mil) PY0.0254是 mil 到 mm 的换算系数50换成实际公差。改单位前先把原值记下来改完回约束管理器确认数值没变。布线过程中我一般不改单位确实要看 mm 就用测量工具临时看不动全局设置。4.3 绕线时改单位、换层、加泪滴导致长度跳变长度跳变不一定是绕线绕错了很多时候是统计口径变了。改单位会让约束值换算换层会增加过孔过孔长度有没有算进等长要看规则加泪滴会改变实际铜长但有些长度统计不把泪滴算进去删除或重新铺铜可能让 Shape 变化参考线跟着变。表现就是同一根线什么都没动长度突然多出几十 mil。换层前后我一般数一下过孔数量确认长度跳变是不是过孔引起的; 统计当前设计里的过孔数量绕线换层前后对比避免长度跳变没发现 let((design count) design axlDBGetDesign() count 0 foreach(via design-vias count count 1 ) printf(via count %d\n count) )design-vias遍历当前设计里的过孔count累加。换层前跑一次换层后再跑一次数量对得上说明长度变化至少有一部分来自过孔。过孔长度要按叠层厚度算不是固定值所以规则里要确认是否启用了过孔长度补偿。这个脚本同样只读跑之前保存 brd。泪滴我一般放到绕线完成后再加加完再跑一次 DRC 和等长报告。如果先加泪滴再绕线后面调整走线时泪滴可能被删或重算长度统计会反复跳。单位、过孔、泪滴这三件事能固定就固定别在绕线中途反复改不然很容易把自己绕进“越调越不对”的循环。5. 制造文件避坑BOM 少件、泪滴消失和空 Shape 的 5 个坑出图阶段的翻车成本最高因为前面布局布线都做完了BOM 少一个器件、泪滴消失、机械层没出最后都要返工。下面这 5 个坑是我在模拟项目X和几个小批量板子上反复见过的每条按“现象、原因、解决”写能直接照着核对。5.1 坑一BOM 少件/多件先别怪软件现象是 BOM 里少几个位号或者多出一批不该贴的器件。原因通常不是软件漏读而是器件属性不全Part Number 为空、DNP 没有标记、Variant 没选、BOM 字段映射错。尤其是从旧工程复制过来的器件属性可能还是上一版的位号改了Part Number 没改BOM 就会把两个器件合成一个。我一般用脚本把 BOM 和网表位号对一遍先看少件还是多件# 对比 BOM CSV 与网表 pstxprt.dat 的位号集合快速找出少件/多件 import csv, re bom_refs set() with open(bom.csv, newline, encodingutf-8) as f: for row in csv.DictReader(f): ref (row.get(RefDes) or ).strip() if ref: bom_refs.update(re.split(r[,;\s], ref)) net_refs set() with open(pstxprt.dat, encodingutf-8, errorsignore) as f: for line in f: # 具体字段随网表格式变化这里按常见位号列做示意 m re.search(r\b([A-Z]{1,3}\d)\b, line) if m: net_refs.add(m.group(1)) print(BOM 有、网表没有, sorted(bom_refs - net_refs)) print(网表有、BOM 没有, sorted(net_refs - bom_refs))csv.DictReader按表头读 BOMRefDes换成实际列名re.split处理一个单元格里多个位号的情况网表侧用正则只是示意实际格式不同要调。输出两组差集分别对应“BOM 多出来”和“BOM 漏掉”。DNP 器件要单独标记不能靠位号差集判断否则会把故意不贴的器件当成漏件。5.2 坑二泪滴加了又消失焊盘改了不更新现象是加完泪滴重新铺铜或者更新符号后泪滴没了焊盘库改了大小PCB 上还是旧焊盘。泪滴是 gloss 对象重新执行 gloss 或者删除走线时可能被覆盖焊盘改的是库文件PCB 里缓存的是旧 padstack不执行更新就不会变。解决顺序是先备份再更新符号最后加泪滴。# 更新符号和焊盘前先备份当前 brd 和库文件避免改坏回不去 cp project.brd project.brd.bak_$(date %Y%m%d_%H%M) find lib -name *.pad -o -name *.psm | cpio -pdm backup_libcp备份当前 brdcpio保留目录结构备份库文件。参数替换project.brd和lib。更新符号时在Place Update Symbols里勾选 Padstack 和 Package symbol不要只勾一个。泪滴放到最后加加完不要再跑会重算走线的 gloss。这个坑的血泪经验是改库之前不备份更新完发现旧焊盘回不去只能重导网表。5.3 坑三机械层/冷板层加了出图却没有现象是 Subclass 里明明加了冷板层Gerber 里却没有。原因通常是层加到了错误的父类或者 Artwork 输出没勾选。冷板层一般放在MANUFACTURING或BOARD GEOMETRY下具体子类名按加工要求定如果只加了一个孤立 subclassArtwork 里不勾出图自然没有。# 检查 Artwork 控制文件里是否包含冷板层/机械层 grep -Ei COLD|MECH|MANUFACTURING art_param.txtart_param.txt是 Artwork 参数文件grep看层名有没有进控制文件。如果没有回Manufacture Artwork对话框勾选对应层再重新生成。不同版本文件名可能不同按实际输出目录找。注意机械层不要和阻焊、助焊层混在一起出图前把每层的用途写在层名里后面核对会快很多。5.4 坑四导入边框单位毫米删除铜皮只剩空 Shape现象是导入 DXF 边框后单位不对shape 要么是空的要么大得离谱删除铜皮后只剩一个空 shape。原因是导入时单位没选 mm或者先 compose 再删铜皮把边框也一起删了。正确顺序是导入时选毫米确认边框闭合再 compose 成 shape最后处理内部铜皮。; 列出 shape 的边界和面积判断是否导入了空 shape 或单位错误 let((design) design axlDBGetDesign() foreach(shape design-shapes printf(shape%s area%L\n shape-name shape-area) ) )shape-area是面积面积为 0 或者异常大先查导入单位和边框是否闭合。参数上DXF 导入对话框里的单位要选 mm不要选 mil 后再换算。空 shape 不一定是没导进来可能是边框线段没闭合compose 失败后留下一个空对象。这个坑我一般用“先看面积再看闭合”的顺序排查比反复重新导入省时间。5.5 坑五第三方 PCB 互转网络和规则丢失现象是从第三方 PCB 转过来后网络名变了约束规则全是默认值。转换器通常只转几何和部分网络约束、差分、区域规则不一定带过来。导入后先别急着布线先对网络数和器件数# 导入第三方 PCB 后分别统计原网表和转换后网表的网络数量先看丢没丢 grep -c ^NET original_netlist.txt grep -c ^NET converted_netlist.txt # 对比网络名排序后 diff只显示差异 diff (grep ^NET original_netlist.txt | awk {print $2} | sort -u) \ (grep ^NET converted_netlist.txt | awk {print $2} | sort -u) | head -40grep -c统计 NET 行数量diff对比网络名。不同格式 NET 行不一样按实际调整字段。转换后规则必须重建不能假设带过来差分对、XNET、区域规则要重新挂。这个坑的后悔药是转换前先导出原工程的网表和规则报告转换后逐项对别等 DRC 报一大堆才回头查。6. 快速定位把“玄学”变成一张检查清单这类问题之所以显得玄学是因为报错信息和根因之间隔了好几层。我的习惯是先固定排查顺序不按顺序跳着改尤其不要一上来就重装软件。下面这张表是我平时用的第一轮检查清单按现象直接找第一动作现象第一动作看什么常见根因导入报错找不到封装看psmpath、padpath路径顺序、同名旧封装只配了符号路径漏了焊盘路径导入后器件全在原点列器件坐标是否大量 x0 y0只导入了逻辑没有放置约束设了 DRC 不报查区域属性REGION是否为空区域没赋属性或规则没挂上等长组里没有差分对查 XNET电阻两端是否关联XNET 没建或只建了一半BOM 少件对比 BOM 与网表位号差集、DNP 标记属性缺失或字段映射错出问题时先收集一组环境信息比反复重装有用# 出问题时先收集这组信息比反复重装软件有用 date ls -l pstxnet.dat pstxprt.dat pstchip.dat 2/dev/null grep -E ^(psmpath|padpath|devpath) env 2/dev/null grep -Ei error|warning import.log 2/dev/null | head -20date记录时间方便对文件时间戳ls -l看三个网表文件在不在、是不是本文还有配套的精品资源点击获取