Cadence Allegro排阻快速创建Xnet完整流程与TAB技巧 搞过高速PCB设计的人基本都绕不开Xnet这个东西。尤其在Cadence Allegro里当你手里握着一堆排阻、滤波电阻、串阻却怎么都建不出合格的Xnet时那种挫败感谁做谁知道。我今天就把给排阻快速创建Xnet的完整流程掰开了讲顺带分享一个能让你手速起飞的TAB键小技巧。这篇东西适合谁看凡是需要在Allegro里做DDR、PCIe、USB等高速接口仿真的朋友或者被要求在Constraint Manager里把拓扑约束、长度匹配做完整的工程师都应该认真看看。排阻作为高速信号链路上最常见的器件之一建不建Xnet直接决定了你在约束管理器里看到的网络是断裂的一截一截还是一个完整的逻辑链路。实际项目里一组DDR数据线穿过一排排阻如果不建Xnet等长约束根本做不下去。这篇文章我尽量用最直白的方式把原理、步骤、坑全讲清楚你跟着操作一遍就能上手。1. 排阻建Xnet这件事到底图什么1.1 什么是Xnet先把这个概念掰扯清楚Xnet的全称是Extended Net翻译过来叫扩展网络。在Cadence Allegro里普通Net指的是PCB上一段连续的铜箔从器件A的引脚到器件B的引脚算一条Net。但真实电路里信号往往要穿过一个电阻、电容、磁珠或者排阻到达下一级芯片。这时候从逻辑上看这是一条完整的信号链路但在物理上它被一个分立器件切成好几段独立的Net。Xnet的作用就是把被分立器件切开的这些Net在逻辑上“拼”回成一条完整的链路。Allegro会根据器件的模型定义自动识别哪些Net通过器件内部相连然后合成一个Xnet。这个Xnet在Constraint Manager里面可以被当作一条完整的网络来处理可以做长度约束、拓扑约束、等长匹配、时序分析信号完整性仿真也能直接拿它来跑。拿排阻来举例。一个8引脚的独立式排阻内部有4个独立的电阻。如果我把一个电阻的一端接到CPU的地址线A0另一端接到DDR颗粒的地址引脚那物理上A0被分成了三段CPU到排阻引脚1排阻内部排阻引脚8到DDR。不建Xnet的话Allegro看到的是两条互不相干的Net中间隔着一个器件。建完Xnet之后Constraint Manager里就会出现一条名为“A0_RN1_1_A0_DDR”之类的完整链路。1.2 不建Xnet对设计和分析有什么实际影响很多人觉得排阻就是串个小电阻抗反射不建Xnet好像也能出板子。这话在低速低要求的设计里勉强成立但一到高速电路问题就全冒出来了。第一等长匹配做不了。DDR走线要求地址线和数据线长度误差控制在mil级别。信号穿过排阻前是一段Net穿过排阻后是另一段Net。如果不建Xnet你在Constraint Manager里加Match Group的时候这两段是分开的长度加不起来根本没有办法对整条链路做等长约束。你只能手动把几段长度加加减减费时费力还容易出错。第二时序仿真拿不到完整拓扑。用SigXplorer或者SystemSI做仿真的时候Xnet是建立拓扑的基本单位。没有Xnet仿真工具根本不知道你的信号链路是从哪里到哪里内部的电阻参数也带不进去。结果就是你辛辛苦苦做了阻抗匹配、端接方案但在仿真里体现不出来。第三串扰分析无从谈起。相邻Xnet之间的耦合计算、攻击网络和受害网络的识别都建立在Xnet正确建立的基础上。不建Xnet串扰分析结果基本是废的。第四DRC检查会出现误报或者漏报。Allegro在检查同一网络不同段的间距、长度时如果没有Xnet可能会把本来属于同一条信号链路的两个Net当成无关网络来检查导致一些间距问题检查不出来。2. 动手前先搞懂排阻的“家底”2.1 常见的排阻结构和引脚对应关系排阻这器件看着简单内部结构其实有好几种建Xnet之前一定要先看懂你用的到底是哪一种否则引脚映射做错了Xnet就算建出来也是错的。最常见的是独立式排阻英文叫Isolated Resistor Network。这种排阻内部有多个互相独立的电阻每个电阻两端分别接两个引脚。拿8引脚封装来说典型接法是引脚1和引脚8是第一个电阻的两端引脚2和引脚7是第二个电阻引脚3和引脚6是第三个引脚4和引脚5是第四个。类似MNR04、YC124这种封装就是典型代表。另一种是总线式排阻英文叫Bussed Resistor Network也叫公共端排阻。这种排阻内部多个电阻的一端全部接到一个公共引脚上另一端各自接一个独立引脚。常用的9引脚封装就是引脚1是公共端引脚2到引脚9分别对应8个电阻的另一端。这种排阻在数字电路里常用来做上拉、下拉比如I2C总线的上拉排阻。还有一种叫双端终结排阻内部是两个电阻串联中间抽头接一个引脚两端各接一个引脚。这种排阻在DDR端接里用得多不过建Xnet的原理和前面两种一样。建Xnet之前必须去翻你手里的排阻datasheet确认内部结构对应的是哪种类型然后记住一份非常关键的引脚对照表。比如8引脚独立式排阻你要记清楚引脚1和引脚8是同一个电阻。如果记反了比如把引脚1和引脚2当成一个电阻那建出来的Xnet全乱套。2.2 开工前的三项检查正式动手前我建议你花三分钟做一下三个检查能省下后面排查的大把时间。第一项确认排阻在PCB里不是一个“空壳”。打开Allegro点选排阻看右边的属性面板。最关键的是看有没有DEVICE和VALUE这两个属性。DEVICE一般是RES或者RNETVALUE就是电阻的阻值比如33、22。如果没有这两个属性Xnet大概率建不出来。遇到过不少次原理图里排阻没有填Value导入PCB后Xnet死活不生成根源就在这里。第二项确认排阻的引脚封装和datasheet一致。有些排阻在封装库里做的时候引脚号顺序是反的或者乱序的。点一个引脚看它的Refdes和Pin Number对不对再对照datasheet确认内部连接关系。这一步虽然基础但意义重大因为Xnet的映射完全依赖引脚编号。第三项确认当前操作的版本和视图。Allegro 16.6和17.x的界面菜单有一些差异我后面讲操作步骤会以17.x为主16.6的差异点也会提一嘴。再有就是建议在PCB Editor的常规视图下操作不要在全屏3D模式下搞这些眼会花。3. 保姆级实操给排阻创建Xnet3.1 打开Property Editor的三种方式给排阻建Xnet的核心战场是Property Editor也就是属性编辑器。打开它有几种常见方式你习惯哪个用哪个。方式一在PCB Editor里直接点击选中你的排阻然后右键在弹出菜单里找到Edit Properties点进去就打开了Property Editor。方式二用菜单栏的Edit - Properties然后会弹出一个Find框让你选择要编辑的对象类型。注意要把Find框里的All On或者Components勾上然后在画布里点选排阻或者直接在Find By Name里输入排阻的位号比如RP1。方式三用快捷键。排阻被选中之后直接按键盘上的P键在Find面板里选Component再输入位号定位。这里不多展开快捷键的详细设置你只要知道Property Editor是入口就行。打开之后界面左侧会有一个Categories树形菜单下面列了General、Model、Pin等好几个类目。要想创建Xnet重点操作Model类目。3.2 配置模型参数的完整步骤在Property Editor里给排阻配模型其实是给Allegro“上一课”——告诉它这个排阻内部到底是怎么连接的。下面是完整步骤第一步在左侧Categories菜单里点击Model。这时候右侧表格会显示当前器件的模型信息如果之前没配置过表格基本是空的。第二步在表格里找到模型名称那一列输入一个名字。这个名字你可以随便起但是建议用有意义的名称比如RN1_MODEL、RP_33R这样。后续Xnet名称里会带上这个模型名起得规范一点后面自己查起来也方便。第三步设置Model Type。这列一般是个下拉菜单选中Discrete Device。这里有个容易踩的坑就是Silicon类型是给芯片用的Discrete Device才是给电阻电容这些分立器件用的。选错的话Xnet建的逻辑就不对。第四步填入Value也就是排阻的阻值。比如排阻上标的是33那这里就填33。有些排阻是多路同阻值的填一个公共值就行。注意没有Value值是建不了Xnet的。第五步填写Pin Count就是排阻的引脚总数。8引脚独立式就填89引脚总线式就填9。这个数字务必和封装库里的引脚数一致填少了系统会报错填多了后面引脚映射会留下空洞。填完这五步之后Properties里会多出一组模型参数。最关键的是你要在Pins类目中确认每个引脚的分配情况。对于排阻来说Pins类目会出现每一对引脚的连接关系比如独立式排阻会显示P1-P8、P2-P7这样的组合。如果显示得不正确你需要手动修正把同一对电阻的引脚配在一起。全部确认无误后关掉Property Editor。Allegro会自动根据你设置的模型把这个排阻相关的Net组合成Xnet。3.3 在Constraint Manager中验证Xnet是否创建成功这一步很多人会忽略我建议每次都做一遍养成习惯。打开约束管理器路径是菜单栏的Constraint Manager或者用快捷键直接打开。进入之后左侧选择Net类目你会看到所有网络和Xnet的列表。Xnet的命名格式一般是“网络名_器件位号_引脚号_另一网络名”比如A0_RN1_1_A0_DDR。凡是排阻参与的网络在列表里应该显示为Xnet而不是普通的Net。如果还是普通的Net说明模型没有生效或者排阻的DEVICE属性有问题需要回到Property Editor检查。另外还可以用一个小技巧验证Xnet是否正确在PCB Editor里用显示元素命令Display - Element勾选Net然后点一下排阻的引脚。弹出来的信息里Net属性那一栏显示的应该是Xnet的完整名称并且会带上模型信息。如果只是显示普通Net名说明这个引脚没有成功并入Xnet。3.4 批量处理多个排阻的操作建议实际板卡上通常不止一个排阻DDR部分可能有七八个排阻密密麻麻排成一排。一个一个打开Property Editor配置手都要断。这里说两个批量操作的方法。方法一在PCB Editor里用鼠标框选所有要处理的排阻然后右键一起打开Edit Properties。在Property Editor里可以同时为选中的多个器件填写相同的Model信息一次搞定一批。方法二在Property Editor里用过滤器Filter只显示器件类对象然后选中所有排阻位号在Model类目里批量填入参数。批量操作时TAB键的价值就体现出来了。你在第一行输完Model Name按一下TAB跳到Model Type再按TAB跳到Value一路按下去顺畅无比。4. TAB键小技巧三个场景让你的手速翻倍4.1 场景一四连键完成模型参数录入铺了不少理论现在讲讲我标题里承诺的TAB键小技巧。这个技巧就一句话在Property Editor里用TAB键替代鼠标点击实现连续输入。具体来说当你配置排阻模型时需要依次填写Model Name、Model Type、Value、Pin Count这四个信息。很多人习惯填一个用鼠标点一格再填一个再点一格其实完全没必要。正确做法输入完Model Name之后手指直接按TAB键焦点会自动跳到Model Type那一格输入或者选择好之后再按TAB跳到下一格继续填Value再按TAB填Pin Count。整个过程手完全不用离开键盘非常顺畅。如果要往回退一格就按ShiftTAB。如果到了表格的末尾再按TAB会自动换行跳到下面一行的第一个输入格。这个特性在批量处理多个排阻的时候特别有用。4.2 场景二批量排阻的快速复制处理一整排排阻的时候比如RP1到RP8每个排阻的Model配置都是一样的。这时候TAB键配合复制粘贴效率直接起飞。操作流程是这样先给RP1配置好Model在Property Editor里全选这几列的单元格按CtrlC复制。然后选中RP2到RP8这些器件在同样的位置按CtrlV粘贴。之后用方向键和TAB键逐个检查确认每行的Model Type和Value都正确。还有一个更隐蔽的技巧。如果你发现某个排阻的Pin Count比别的少比如8引脚和9引脚混用可以在Pin Count那一列用TAB键很快跳过不一样的然后单独手动修改而不是用鼠标去一行一行找。4.3 场景三在Constraint Manager中快速切换核对Xnet建好之后去Constraint Manager里核对也是个体力活。列表很长鼠标滚轮滚来滚去看着眼花。这个小技巧是在Constraint Manager的表格里输入完某个约束值后按TAB可以直接跳到下一个网络或下一列不用鼠标重新定位。当你想依次检查一排Xnet的约束设置时用TAB键从第一个Xnet一路跳到最后一个十几秒就能完成一次完整核对非常顺手。另外在Property Editor里有时候需要选择模型类型Model Type下拉菜单你可以直接输入几个字母然后用方向键上下选择想要的选项TAB键确认。这样比用鼠标点开下拉菜单再选择快得多尤其是型号很多的下拉菜单。5. 翻车现场常见问题和排查清单5.1 排阻怎么建都不出Xnet这是出现频率最高的问题按我的经验十有八九是下面三个原因。第一个原因排阻缺少DEVICE属性或者DEVICE类型不对。解决办法选中排阻在Property Editor里找到DEVICE属性手动改成RES或者RNET。同时确保VALUE属性非空且不为0。第二个原因Model Type选错了。这里重点提示在Allegro 17.x中如果你碰到选择下拉菜单里找不到Discrete Device的情况大概率是当前器件的模型类型已经在别的地方被定义过你需要先把旧的模型清掉再重新选。这个清旧模型的操作一般在Model类目的右上方有一个删除或者清除模型的小图标。第三个原因Property Editor的配置保存了但实际上没生效。Allegro有时候会抽风特别是用了不少Skill插件之后。建议配置完Model之后保存一下板子关掉再打开Constraint Manager看多半就能显示出来。5.2 Xnet名称一个对一个不对如果同一排排阻里面有些建出来了Xnet有些没有或者命名规则不统一十有八九是引脚映射错误。排阻引脚那么多比如8引脚独立式排阻你要确认内部配对是1-8、2-7、3-6、4-5。如果某个电阻的内部连接关系在模型里定义错了Allegro就会把对应的两个Net当成互不相通Xnet自然就建不出来或者建出来的Xnet网络关系是错的。排查方法很简单在Property Editor的Pins类目里仔细看每一对引脚的映射关系对照datasheet逐一核对。尤其是那些有特殊引脚序号的封装比如有些排阻的设计是1-2、3-4、5-6、7-8这种相邻结构特别容易搞混。5.3 改了模型参数但Xnet不更新有时候你发现之前的模型配置有问题改了参数之后Xnet还是没有更新。这种情况一般不是操作问题而是Allegro的缓存机制在捣鬼。解决办法一关闭Constraint Manager再重新打开。解决办法二执行一次Tools - Database Check勾选Update All DRC让系统强制刷新物理和逻辑信息。解决办法三把排阻旁边的走线稍微动一下或者删掉重画触发重算。如果以上都不行还有个终极大招把排阻先删除保存再撤销删除CtrlZ或者直接重新导入网表。这招虽然粗暴但是好用遇到顽固不更新的情况百分之百能解决。5.4 几个容易忽略的细节最后说几个我在实际项目里反复踩过的坑。第一不是所有排阻都需要建Xnet。如果只是低速控制信号比如GPIO上的上下拉排阻不建Xnet完全不影响出板。我在项目里一般只给高速信号链路相关的排阻建Xnet低速部分保持普通Net即可。建太多Xnet虽然对物理上没坏处但会让Constraint Manager的列表变得很长看起来乱糟糟的。第二创建Xnet之后一定要跑一遍DRC。因为Xnet建立之后同一个Xnet内部的不同段会被逻辑地连在一起这会改变一些间距检查、长度检查的判断逻辑。所以建立Xnet之后重新跑一次DRC排除因为网络关系变化导致的新问题。第三如果项目是多人协作建议把Xnet的配置规则写进团队的设计规范里。谁负责建、命名怎么统一、哪些器件必须建Xnet都提前约定好。否则你按你的习惯建别人按别人的规则来最后合并设计的时候光是统一命名就够你头疼一上午。第四养成随手保存的习惯。给排阻建完Xnet随手按一下CtrlS保存板子。别问我为什么特意提这个有一次我配了半个多小时的模型参数结果软件崩溃全部白干从那以后我十分钟必按一次CtrlS。在实际操作中我自己最深的体会是建Xnet这事儿看着是软件操作实际上考的是对器件本身的了解。你对手里那颗排阻的内部结构、引脚定义、电气特性越清楚建Xnet就越快越准。工具只是帮你表达意图前提是你得先知道自己要表达什么。最后再分享一个小经验如果你经常和排阻、串阻打交道建议自己在本地维护一个常用排阻型号的模型配置表包含型号、内部结构、引脚配对照建Xnet的时候直接抄参数就行既省时间又不容易出错。