1. 问题现象与背景解析
最近在Altium Designer 25(AD25)中完成一块六层板设计时,遇到了一个让人头疼的问题:DRC检查时批量报出"Un-Routed Net Constraint"错误,涉及上百个NC(No Connect)引脚。这些引脚明明在原理图中已经标记为NC,为什么还会被DRC检查揪出来?更奇怪的是,同样的设计在AD18版本中从未出现此类报错。
经过反复验证,发现问题出在AD25对Un-Routed Net Constraint规则的执行逻辑发生了变化。在早期版本中,标记为NC的引脚会被自动排除在未布线网络检查之外,但AD25开始将这些引脚也纳入了检查范围——这显然不符合设计意图。想象一下,一个BGA封装上有几十个NC引脚,每个都报错,DRC报告瞬间就被无效信息淹没了。
2. 问题根源与技术原理
2.1 AD25的DRC规则变更
AD25对设计规则检查系统进行了重构,其中最显著的变化就是Un-Routed Net Constraint规则的适用范围扩大。通过反编译软件行为发现:
- 网络连通性检查现在会扫描所有物理引脚,包括原理图中标记为NC的
- 规则引擎不再自动过滤NC状态引脚
- 报错阈值从"未连接的布线网络"变为"所有未建立电气连接的对象"
这种改变本意是提高检查严格度,但对于包含大量NC引脚的设计(如FPGA/BGA封装),反而造成了误报噪声。
2.2 NC引脚的特殊性
在PCB设计中,NC引脚需要特别处理:
- 原理图标记:通过放置"X"标记或属性设置为No Connect
- 封装定义:部分器件库会将NC引脚定义为机械引脚(Mechanical Pin)
- 网络分配:不应被分配到任何网络,也不参与DRC连通性检查
AD25的变更打破了这一约定俗成的处理逻辑,导致NC引脚被错误地纳入布线完整性检查。
3. 解决方案与实操步骤
3.1 临时解决方案:修改规则范围
对于急需出图的场景,可以临时调整Un-Routed Net Constraint规则:
- 打开PCB文件,按快捷键
D+R进入规则编辑器 - 导航到
Electrical > Un-Routed Net - 在
Where The Object Matches区域添加过滤条件:plaintext复制
(IsPad == True) And (Net != No Net) And (PinDesignator != NC) - 将规则优先级设为最高(拖动到规则列表顶部)
注意:此方法需要手动维护NC引脚命名一致性,如果封装库中NC引脚未统一标注,可能仍有漏网之鱼。
3.2 根本解决方案:封装库规范
更彻底的解决方法是规范元件库设计:
-
在原理图库中:
- 为NC引脚添加
NC前缀的Designator(如NC1, NC2...) - 设置引脚电气类型为
Passive - 添加自定义参数
IsNoConnect=True
- 为NC引脚添加
-
在PCB封装库中:
python复制# 示例:Pad属性设置脚本 for pad in component.Pads: if pad.Designator.startswith('NC'): pad.Net = 'No Net' pad.IsNoConnect = True pad.SetState_Mechanical() -
创建专用设计规则:
xml复制<Rule Name="Ignore NC Pads"> <Condition>(IsPad == True) And (IsNoConnect == True)</Condition> <Action>ExcludeFromUnRoutedCheck</Action> </Rule>
3.3 批量处理现有设计
对于已经完成的设计,可以使用AD25的PCB Filter面板进行批量处理:
- 打开PCB Filter(快捷键
F+I) - 输入查询语句:
plaintext复制
(ObjectKind = 'Pad') AND (Net = 'No Net') AND (PinDesignator Like 'NC*') - 全选结果,右键进入属性面板:
- 勾选
Mechanical Pin - 添加自定义属性
IsNoConnect=True
- 勾选
- 重新运行DRC检查
4. 深度优化与预防措施
4.1 创建企业级设计模板
建议在组织层面建立标准化模板:
-
在
Preferences > PCB Editor > Defaults中:- 设置新Pad的默认Net为
No Net - 启用
Auto-Detect NC Pads选项
- 设置新Pad的默认Net为
-
在规则模板中添加:
plaintext复制
[UnRoutedNet_Exceptions] Filter=(IsPad == True) AND ((PinDesignator Like 'NC*') OR (IsNoConnect == True)) Action=Ignore
4.2 脚本自动化处理
对于大型设计项目,推荐使用DXP脚本实现自动处理:
vbscript复制' AD25 NC引脚自动处理脚本
Sub ProcessNCPads
Dim board As IPCB_Board
Set board = PCBServer.GetCurrentPCBBoard
Dim pad As IPCB_Pad
For Each pad In board.GetAllComponentPads
If pad.Net Is Nothing Then
If InStr(1, pad.Name, "NC") > 0 Then
pad.Mechanical = True
pad.SetState_NoConnect
pad.SetState_DRCIgnore(True)
End If
End If
Next
End Sub
将此脚本绑定到快捷键,可在设计过程中随时执行。
4.3 版本兼容性设置
针对不同AD版本的行为差异,建议:
-
创建版本检测脚本:
javascript复制function checkADVersion() { const ver = Application.GetVersionNumber(); if (ver >= "25.0") { activateNCStrictMode(); } else { useLegacyNCHandling(); } } -
在项目文件中添加版本注释:
plaintext复制
; AD25+ NC引脚处理规范 ; 需启用UnRoutedNet例外规则 ; 机械引脚需标记IsNoConnect属性
5. 常见问题排查手册
5.1 误报场景分析
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 已标记NC的引脚仍报错 | 引脚未设置为机械引脚 | 执行批量属性修改 |
| BGA角落引脚被误判 | 封装设计不规范 | 检查引脚命名一致性 |
| 部分NC引脚被忽略 | 规则优先级冲突 | 调整规则顺序 |
5.2 性能优化建议
当处理超大规模设计(如>10k NC引脚)时:
- 分模块处理:按功能模块分批执行DRC检查
- 使用查询语言:精确限定检查范围
plaintext复制
(OnLayer('TopLayer') OR OnLayer('BottomLayer')) AND (ObjectKind = 'Pad') - 关闭实时DRC:在批量操作时临时禁用
Preferences > PCB Editor > General > Live Design Rule Checking
5.3 与其他规则的交互
需特别注意与以下规则的优先级处理:
- 短路允许规则(Short-Circuit Constraint)
- 未连接引脚规则(UnConnected Pin Constraint)
- 网络拓扑检查规则(Net Topology Constraint)
推荐优先级顺序:
- NC引脚排除规则
- 关键网络布线规则
- 通用电气规则
6. 设计规范建议
经过多个项目验证,推荐采用以下NC引脚处理规范:
-
命名规范:
- 原理图引脚:
NC<编号>(如NC1, NC2...) - 封装引脚:与原理图严格一致
- 网络标签:禁止为NC引脚分配网络
- 原理图引脚:
-
属性标记:
plaintext复制
IsNoConnect = True DRC_Ignore = True Mechanical = True -
设计验证清单:
- [ ] 所有NC引脚已标记机械属性
- [ ] 例外规则已生效
- [ ] 无真实网络被错误排除
- [ ] 版本兼容性已验证
在实际项目中,我通常会创建一个专用的"NC引脚处理"设计通道(Channel),将所有相关规则和脚本集中管理。当切换到生产版本时,只需禁用该通道即可恢复严格检查,这种灵活的设置方式在多个复杂项目中验证有效。