搞过高速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或者RNET,VALUE就是电阻的阻值,比如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. 保姆级实操:给排阻创建Xnet
3.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引脚独立式就填8,9引脚总线式就填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。整个过程手完全不用离开键盘,非常顺畅。
如果要往回退一格,就按Shift+TAB。如果到了表格的末尾,再按TAB会自动换行,跳到下面一行的第一个输入格。这个特性在批量处理多个排阻的时候特别有用。
4.2 场景二:批量排阻的快速复制
处理一整排排阻的时候,比如RP1到RP8,每个排阻的Model配置都是一样的。这时候TAB键配合复制粘贴,效率直接起飞。
操作流程是这样:先给RP1配置好Model,在Property Editor里全选这几列的单元格,按Ctrl+C复制。然后选中RP2到RP8这些器件,在同样的位置按Ctrl+V粘贴。之后用方向键和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,让系统强制刷新物理和逻辑信息。解决办法三,把排阻旁边的走线稍微动一下,或者删掉重画,触发重算。
如果以上都不行,还有个终极大招:把排阻先删除,保存,再撤销删除(Ctrl+Z),或者直接重新导入网表。这招虽然粗暴,但是好用,遇到顽固不更新的情况,百分之百能解决。
5.4 几个容易忽略的细节
最后说几个我在实际项目里反复踩过的坑。
第一,不是所有排阻都需要建Xnet。如果只是低速控制信号,比如GPIO上的上下拉排阻,不建Xnet完全不影响出板。我在项目里一般只给高速信号链路相关的排阻建Xnet,低速部分保持普通Net即可。建太多Xnet,虽然对物理上没坏处,但会让Constraint Manager的列表变得很长,看起来乱糟糟的。
第二,创建Xnet之后一定要跑一遍DRC。因为Xnet建立之后,同一个Xnet内部的不同段会被逻辑地连在一起,这会改变一些间距检查、长度检查的判断逻辑。所以建立Xnet之后重新跑一次DRC,排除因为网络关系变化导致的新问题。
第三,如果项目是多人协作,建议把Xnet的配置规则写进团队的设计规范里。谁负责建、命名怎么统一、哪些器件必须建Xnet,都提前约定好。否则你按你的习惯建,别人按别人的规则来,最后合并设计的时候,光是统一命名就够你头疼一上午。
第四,养成随手保存的习惯。给排阻建完Xnet,随手按一下Ctrl+S保存板子。别问我为什么特意提这个,有一次我配了半个多小时的模型参数,结果软件崩溃,全部白干,从那以后我十分钟必按一次Ctrl+S。
在实际操作中,我自己最深的体会是:建Xnet这事儿,看着是软件操作,实际上考的是对器件本身的了解。你对手里那颗排阻的内部结构、引脚定义、电气特性越清楚,建Xnet就越快越准。工具只是帮你表达意图,前提是你得先知道自己要表达什么。最后再分享一个小经验,如果你经常和排阻、串阻打交道,建议自己在本地维护一个常用排阻型号的模型配置表,包含型号、内部结构、引脚配对照,建Xnet的时候直接抄参数就行,既省时间又不容易出错。