2. 约束管理器界面与对象模型
Constraint Manager(约束管理器)是 Allegro 中承载所有设计规则的中央数据库。理解它的第一步,不是记住某个按钮在哪,而是建立“对象模型”这一心智地图:约束不是挂在整块板子上的,而是挂在具体对象上,并沿着对象层级向下继承。只有先分清“约束挂在谁身上”,才能判断一条规则为什么生效、为什么被覆盖、为什么改了没反应。
一、启动方式与工作区布局
Constraint Manager 的启动入口有三个常用途径:一是菜单 Setup > Constraints > Constraint Manager;二是在工具栏点击约束管理器图标;三是通过 Setup > Constraints > Modes 先设定工作模式再进入。三者打开的是同一个数据库,区别只在于进入时的默认视图。
工作区在结构上分为左右两栏。左栏是对象浏览器(Object Browser),以树形结构列出可被约束的对象类别;右栏是工作表(Worksheet),以行列网格显示具体约束值。工作表顶部还有一行域选择器(Domain),用于在 Physical、Spacing、Electrical、Same Net 等域之间切换。理解这个“左选对象、右填数值、上切域”的三段式布局,是后续所有操作的基础。
需要特别提醒的是:Constraint Manager 中的修改是即时写入的,没有“保存”按钮。改完一个数值,规则立即进入设计数据库。因此在大批量修改前,建议先确认当前处于正确的域和对象行,避免误改。
二、四类约束域与对象类型
Constraint Manager 把规则划分为四个域,每个域对应不同的物理对象和设计意图:
- Physical(物理约束):作用于走线、过孔、铜皮等几何对象,管理线宽、过孔尺寸、差分对间距等“物理尺寸”类规则。
- Spacing(间距约束):作用于不同网络、不同对象之间的间隙,管理线到线、线到焊盘、线到铜皮等“安全距离”类规则。
- Electrical(电气约束):作用于网络或引脚对,管理时序、阻抗、延迟、拓扑等“信号完整性”类规则。
- Same Net(同一性约束):作用于同一网络内部的对象,管理同网络走线与焊盘、过孔之间的最小间距,防止同网络短路。
这四个域不是并列的四个文件夹,而是从“几何”到“电气”逐层抽象的四个视角。同一个网络可能同时受 Physical 的线宽约束、Spacing 的间距约束和 Electrical 的阻抗约束,三者互不替代。
三、约束层级与继承关系
约束对象模型的核心是层级继承。Constraint Manager 中的约束按以下层级组织:
- Global(全局):作用于整个设计,是所有对象的默认值。
- Class(类):把具有相同约束需求的网络归为一组,如
DDR_DATA、CLK、POWER。 - Net(网络):单个网络的约束,优先级高于 Class。
- Pin Pair / Xnet(引脚对/扩展网络):最细粒度,作用于具体引脚之间的连接,优先级最高。
继承规则是:下层未定义时继承上层,下层一旦定义则覆盖上层。例如,全局线宽设为 6 mil,DDR_DATA 类设为 4 mil,那么属于该类的网络自动使用 4 mil;若其中某条网络单独设为 5 mil,则该网络使用 5 mil,其余同类网络仍用 4 mil。这个“就近覆盖”原则是排查约束冲突的第一判断依据。
四、实际配置示例:为 DDR 数据组建立约束
下面以一个典型场景说明操作过程。假设设计中有 8 条 DDR 数据线 DDR_DQ0 至 DDR_DQ7,需要统一设置线宽 4 mil、间距 6 mil、单端阻抗 50 Ω。
第一步,在 Physical 域中新建一个 Class,命名为 DDR_DATA,把这 8 条网络加入该类。第二步,在 Class 行对应的 Line Width 列填入 4,单位默认为 mil。第三步,切换到 Spacing 域,在 DDR_DATA 类行填入 Clearance 为 6。第四步,切换到 Electrical 域,在 Impedance 列填入 50,并确认阻抗计算模型已关联到叠层中的对应层。
此时若发现 DDR_DQ0 因为靠近连接器需要局部加宽到 5 mil,可以在 Net 层级单独为它设置 Line Width 为 5,其余 7 条仍继承类的 4 mil。这就是“就近覆盖”的实际应用。
Analyze > Analysis Modes 确认当前哪些约束处于启用状态。如果某个域的约束被关闭,即使数值填了也不会生效,这是初学者常见的“改了没反应”原因之一。
五、约束冲突的排查思路
当设计中出现 DRC 报错或约束未按预期生效时,按以下顺序排查:先确认报错对象属于哪个域(Physical、Spacing、Electrical 还是 Same Net);再在对象浏览器中定位该对象所在的层级;然后检查该层级是否已定义约束,若未定义则向上逐层查找继承来源;最后确认该域的约束开关是否打开。这个“域 → 层级 → 定义 → 开关”的四步排查法,可以覆盖绝大多数约束相关问题。
建立对象模型概念之后,后续所有约束操作都可以归结为三个问题:这条规则挂在哪个对象上?它继承自哪里?它覆盖了谁?把这三个问题问清楚,Constraint Manager 的使用就从“记按钮”变成了“读结构”。