
在Allegro里做DDR等长很多人一上来就被Xnet劝退。一组地址线从主控出来中间串了一排0201的匹配电阻再进到内存颗粒你兴冲冲打开约束管理器想给总线建Match Group结果发现这一路上的网络被电阻从中间切开了——电阻前是一段Net电阻后是另一段Net两段长度根本无法合并起来算等长。明明就是一颗0欧或几十欧的电阻物理上只贡献了一小段引线却让整条总线的等长无从下手。这时候就要请Xnet登场。XnetExtended Net扩展网络是Cadence在Allegro里做的一项“逻辑短路”技术原理上就是把串联在链路里的无源元件看成一段虚拟短线让分割出来的多段物理网络在约束计算时重新连成一根完整的网络。这篇不绕弯子直接讲怎么把电阻模型建好、怎么生成Xnet、怎么用Match Group把等长约束落地以及我在实际项目里踩过的坑。正在做DDR、SerDes这类源同步接口被等长问题卡住的朋友可以按这个流程走一遍。1. 先看清本质Xnet到底在算什么1.1 一段被电阻切成两半的走线在网表里会变成两个独立Net在OrCAD/Allegro这套工具链里Net的定义就是“连续铜皮”。从主控引脚出发走到电阻一端的焊盘这是一段Net电阻另一端焊盘走到DDR引脚又是另一段Net。当原理图网表导入后约束管理器看到的是两个互相独立的网络它们之间只有一条“没有铜皮”的逻辑通路。你没法在一个Match Group里同时选中这两段做等长因为在软件眼里它们确实不是同一个对象。这就像你量一根绳子的总长结果中间系了个铁环手里拿着的是两截断绳别人和你说“你现在量的是两根绳子”。物理上确实是两段电气上信号流经电阻时也有一点延迟但对时序约束来说真正重要的是信号从源端到负载端总共走多远中间串了什么其实无所谓。Xnet就是让软件把这几段物理网络连同中间那颗电阻重新当作一条完整链路来计算后面所有等长规则都建立在这条完整链路上。1.2 不是所有元件都能进Xnet能进的也有优先级Cadence把Xnet的适用范围圈得很清楚只处理两端无源器件R、C、L、磁珠Ferrite Bead、短跳线0欧电阻都在范围内。原因是这些元件的电气模型比较简单可以把两端焊盘之间的引脚等效成一段低阻通路算长度时误差可接受。而BJT、MOS管这类有源器件不行它们不具备两端导通特性Xnet没法对它们做逻辑短路。我项目里最常用的Xnet对象排行大概是0欧电阻、串联匹配电阻、隔直电容、磁珠。前两者在DDR3/DDR4里几乎每条地址线都有所以做DDR等长时Xnet避不开。顺便说一句有的朋友问过磁珠要不要算进Xnet我的建议是高频信号通路上的磁珠尽量算进去。磁珠的DCR虽然小但封装焊盘到焊盘之间也有几十mil的物理路径整组等长如果默认忽略它基线会整体偏短。1.3 清楚了Xnet的底细后面所有操作才有依据后面要做的模型创建、Xnet生成、Match Group设置本质上都是在围绕“把分段网络重新连起来算长度”展开。模型是为了让软件识别出“这颗器件是可短路的无源元件”Xnet生成是软件真正执行短路动作Match Group则是把重新连好的完整网络纳入等长规则。三层关系理清了菜单路径记得再熟也不会用错。2. 电阻模型创建整个流程里最被低估的一步2.1 为什么只是算个长度也得先建模型很多人的惯性思维是等长嘛不就是量长度跟模型有什么关系我第一次做Xnet时也这么想结果在Constraint Manager里怎么都生成不了Xnet后来才明白Cadence在创建Xnet这件事上非常较真——它必须确认这颗元件是R、L、C还是Ferrite必须知道阻值才能在内部生成等效的串联通路。没有模型的电阻在软件眼里就是一块没有电气属性的占位符谁来都不认账。所以电阻模型创建是整个Xnet流程的地基。就算完全不做信号完整性仿真也建议把模型挂上。而且现在Allegro建RLC模型几乎是半自动的代价很低不建模型的代价反而很高后面所有和Xnet相关的操作都会卡壳。2.2 在Capture侧把属性备齐能省后面很多事模型不是说到了PCB Editor才临时抱佛脚原理图阶段就要把底子打好。用OrCAD Capture画原理图时电阻库里的标准Symbol默认会带上Required属性比如Reference、Value、Device。我通常会在Part Properties里确认三样东西Device属性等于RESISTOR这是Allegro识别器件类型的依据Value属性填实际阻值比如33表示33欧不写单位也没关系PCB Footprint属性对应Allegro里的封装名格式要和PCB库一致。这三项在导出Allegro网表时会一并带过去。很多时候Xnet建不出来追根溯源发现原理图里的Device属性被改过或者丢了这种问题在Capture阶段一分钟就能补好跑到Allegro里再查会浪费一下午。如果你想更进一步让电阻模型能用于后续的信号仿真可以在Capture属性里加PSpice Template格式类似R1 1 2 33。Allegro的Model Integrator会读取这个模板生成标准SPICE模型。虽然纯等长不强制作这一步但模板在后面做仿真就不用回头补。2.3 Allegro里分配模型Model Assign的实际操作路径网表导进Allegro之后打开PCB Editor我习惯先做一次完整的位置摆放然后把所有电阻选中执行Analyze - SI/EMI Sim - Model Assign打开Model Assign对话框。界面左侧是器件列表右侧能看到RefDes、Value、Device等信息。对于没有模型的元件Model Assign会自动把它识别为R/C/L并提示可以自动创建模型。我通常直接选择Auto Generate/Create Model软件会根据Value值生成一个最简单的SPICE模型比如33欧电阻就生成一条R值为33的模型记录。如果公司有统一模型库也可以从库里选R_33_0402这类命名规范的模型批量Assign。分配完成后器件列表里的Model Status会从No Model变成Modeled这一步就是后续创建Xnet的入场券。需要注意Model Assign这个菜单在极少数精简License下会被隐藏如果找不到可以去Setup - User Preferences里搜SI相关的显示开关或者确认License里包含Analysis Option。公司环境里如果被砍了SI功能Xnet这条路确实走不通只能催IT开权限。2.4 Pin Delay别忽略Xnet总长度里的隐形成本Xnet把串联元件短路后算出的长度包含各段走线长度和元件封装焊盘之间的物理路径但还有一个经常被漏掉的项目是Pin Delay。Pin Delay指的是信号从器件引脚进入封装内部在Bond Wire、Die Pad、过孔里走的那一段距离它对BGA、QFN这类封装尤其明显。对电阻本身来说Pin Delay通常接近0可以忽略。但对DDR控制器BGA和内存颗粒BGA而言Pin Delay可能有几十到上百mil的差异。如果你的Xnet等长做了半天发现总长度比其他工具拉出来的数据偏大或偏小可以先看Pin Delay设置。Allegro里可以在封装Symbol编辑环境给pin加PINDELAY属性或者在IBIS模型里自带Pin Delay软件会把它叠加进Xnet的Total Etch Length计算。这个细节不处理等长精度很难满足高速接口的要求。3. 生成Xnet以及确认它真的被软件认出来了3.1 Create Xnet的操作入口和版本差异模型分配好之后真正“焊回”网络的动作在Analyze菜单下完成。以17.4为例路径是Analyze - SI/EMI Sim - Xnet - Create Xnet打开后软件会扫描当前版图里所有具备模型的无源器件把串联在同一个信号通路里的R/C/L识别出来然后生成Xnet。老版本Allegro里这条路径可能在Analyze - Xnet - Create Xnet菜单层级略有变化但关键字都是Create Xnet。如果你的菜单里死活找不到Create Xnet可以先在命令行输入xnet status看软件是否提示Xnet功能可用或者用help xnet调出帮助。还有一种常见情况是License不完整软件直接禁用了该菜单。这时候别硬用命令先确认License再继续。3.2 生成后怎么判断成功Net树和SigXplorer双保险Xnet生成不是弹个窗告诉你Done就完事了我建议做两层验证。第一层打开Constraint Manager在左侧Net目录树里找到刚才那组网络。正常情况你会看到一个Xnet条目它会把原来电阻前、电阻后的两个Net合并显示成一个条目展开之后能看到该Xnet包含的Pin Pair。如果原来两段Net还在原地没有合并说明Xnet创建没生效回到上一节查模型状态。第二层选中Xnet右键Open SigXplorer看到的是以元件为边界的完整拓扑电阻会显示成一个位于链路中间的元件符号。这一步能直观看到Xnet把网络连成了一条线。我在很多项目里发现光在CM里看树状结构可能被误判打开拓扑才放心。3.3 三种最常见的生成失败原因按顺序自查按我踩坑频率排Xnet生成失败基本逃不开这三个原因一是模型没分配成功这是占比最高的。Model Assign完之后记得确认状态变成Modeled如果只是选中但没保存等于白做。二是元件Device属性不对。电阻被原理图误标成CAPACITOR或IC软件就不会把它当串联通路。检查Capture里的Device字段重新出网表。三是元件两边网络本身就断着比如电阻一端没接任何网络或者网络名被定义成了Power/GND。Xnet要求元件必须完整串联在一个信号链路里一端悬空或者直接接地软件没办法做短路计算。4. Match Group等长设置把“要一样长”变成可执行的规则4.1 在约束管理器里创建Match GroupXnet生成好后等长设置的重点转移到Constraint Manager。我常用的操作是打开CM左侧Category选择Electrical - Net - Routing - Total Etch Length右侧工作表里会列出所有支持长度约束的网络。Xnet创建成功后这些Xnet也会出现在列表里并且名字通常能看出它包含了哪些段。用鼠标框选需要等长的一组信号比如DDR的Address、Control、Clock选中之后右键选择Create - Match Group弹框里给这个组起个名字比如MG_DDR_ADD_CTRL。创建完之后在CM左侧的Net - Routing目录下就能看到新建的Match Group。这一步是把松散的网络约束变成一个成组的等长目标后续画板时软件就知道这几根线需要被统一管理。4.2 目标长度和Tolerance怎么定才靠谱Match Group创建时最让人纠结的是目标长度和公差。不同总线有不同的习惯我通常按下面这个表来估具体还是要看芯片手册总线/信号类型Tolerance建议备注DDR2/DDR3地址、控制±25mil视拓扑和速率可放宽到±50milDDR3/DDR4数据组以DQS为基准±10~25mil数据组通常用DQS做参照DDR4地址/命令组±25~50mil相对数据组更宽松高速SerDes差分对组内P/N等长±5mil对间有时不用严格等长Target Length有两种处理方式。一种是手动填一个目标值比如6000mil软件按这个值检查每一根Xnet另一种是不填让软件以组内最长的那根为基准其他线绕到跟它差不多长。我最常用的是第二种因为布线结果更自然只要保证组内最长线不超预期其他线挨个追平。如果你对系统时序余量有明确要求再手工填目标值也不迟。4.3 布线时的Delay Tune看仪表盘绕线Match Group规则建好之后剩下的核心动作就是布线。等长信号不是一次性走出来的通常是先把所有线大致拉通再用Delay Tune工具绕线找齐。在Allegro里点击Route - Delay Tune或命令行直接输入delay tune然后点选要调的那根Xnet。鼠标一上去屏幕上的HUD会立即显示当前Xnet的Actual Length和Target Length实时刷新。你拖着鼠标走线软件会按设置好的绕线参数自动生成曲折的绕线段。绕线形状一般有Accordion、Trombone、Sawtooth我在DDR上最常用Accordion占面积小、对阻抗影响可控。绕线的间距要满足3W原则不然后面的信号完整性会找你麻烦。Delay Tune绕线是个体力活但技巧都在细节里先绕最短的那根再依次追平绕完一根立刻看CM里的状态有没有从红色变成绿色组里有多根线要绕时注意别把绕线区全部堆在某一层不然板子很难看也给生产埋下隐患。4.4 把等长结果变成报告给上下游一个交代Match Group全部变绿之后我会在CM里导出一次表交给结构、仿真和产线的人用。操作是CM菜单File - Export把Total Etch Length工作表导出成CSV或者HTML。这个表里能看到每根Xnet的实际长度、目标长度、Tolerance、状态后面投板评审时可以直接贴在评审单里。别小看这一步很多板子在工厂被追问等长是否满足有这个表就能快速自证。5. 实际项目中容易翻车的几个地方与完整排查链路5.1 Xnet方向颠倒导致所有长度参考全部错乱这个坑我印象极深。某次DDR3项目一组地址线等长怎么调都不对CM里显示的长度永远是负数或者绕完之后目标差越来越大。查了半天发现Xnet创建时软件把信号的方向判断反了——它以为源端在电阻后面负载在电阻前面导致Pin Pair的起点和终点完全颠倒长度计算就变成反向累加。排查链路供参考首先看Xnet在CM里的Pin Pair确认From端是真正的源端其次看电阻两端网络名确认哪边靠近驱动器最后如果需要手动翻转在Create Xnet的时候可以选择Swap方向或者在Xnet的属性里调整Pin Pair顺序。方向一改所有负数长度立刻恢复正常。5.2 绕完线Match Group还在报错先刷新再查Etch还有一种情况是Delay Tune绕得很漂亮屏幕上看着也达到目标了可CM里的状态还是红的。这种问题有一半是CM没刷新随手按F5或者右键Refresh就解决了。另一半是真问题当前选中的Xnet在CM中被布线的Pin Pair和Delay Tune实际操作的Pin Pair不是一个对象。比如你实际绕的是电阻前段但CM最关心的是电阻后段或者绕在一个分支上总长没变。排查时重点看CM的Total Etch Length工作表里那个Xnet对应的是哪一对Pin Pair结合Delay Tune HUD里显示的Xnet名一起核对。顺带提一句有时候看到屏幕上的走线只有轮廓没有实心填充这是显示设置的Outline/Filled切换和网络长度无关别被它带偏。5.3 多颗串阻、T型分支下的Xnet表现信号链路里只有一颗串阻时Xnet很单纯就是一个二端网络。但DDR地址线经常一串就是两颗电阻甚至中间还分出分支去两颗芯片这时Xnet会变成一个多Pin Pair的结构。在CM里你会看到这个Xnet下挂了多个Pin Pair短的到第一颗电阻长的到第二颗电阻甚至还有分支到各个颗粒的长度。遇到这种结构等长规则最好不要用笼统的Total Etch Length一刀切改用Relative Delay并明确选择基准Pin Pair。我常用的做法是先确定一条“主干路径”比如从主控到最远端DDR的那条链把它设为目标然后让其他分支和中间节点跟着追平。T型分支处理不好整组等长就是表面绿、实际乱。5.4 原理图与PCB联动时模型丢失的断链问题很多人在搜“OrCAD关联Allegro”我猜多半是原理图和PCB联动出了问题。我这边也遇到过Capture里改了一颗电阻的阻值重新导网表进Allegro结果这颗电阻的模型状态从Modeled变回No Model原来建好的Xnet全没了一半。原因是Allegro重新导入网表时把元件的旧属性整体覆盖了模型记录如果挂在板级数据库里元件更换后自然被清掉。避坑方法很简单每次Capture改完回Allegro后先跑一遍Model Assign把所有模型状态重新刷成Modeled再决定要不要重建Xnet。另外如果用的是Capture的Logic Link联动方式更新前先备份现在的约束文件防止约束被同步操作覆盖。6. 几个让我少加班的日常习惯6.1 布局阶段就把Xnet和Match Group建好很多人喜欢先拉通所有走线再建约束结果发现某段信号路径被一颗电感切断了或者Xnet没建等长规则根本套不进去只能删了重来。我现在习惯在布局完成、还没走线之前就把Xnet建好、Match Group全部创建完哪怕此时线还没走规则先立在那边。这样后续走线过程中每拉一根线CM都能实时反馈长度状态等长是走的过程中追的而不是走完了补的。6.2 给Delay Tune配一套顺手的快捷键Allegro默认菜单点Delay Tune不慢但手工绕几十根线时鼠标反复点菜单会让人抓狂。我习惯在env文件里加一条alias把delay tune绑定到一个快捷键再配合原有的move、spin、slide绕线效率能高一截alias dt delay tune alias ms measure顺便把measure命令也绑上绕线间隙随手量个间距比开DRC刷一遍快得多。快捷键文件维护好之后换电脑再也不用手动点半天菜单。6.3 别急着auto gloss绕线收尾有个先后顺序Allegro自带自动修线优化工具auto gloss很多新手拉完等长直接全局gloss想清一遍线。我吃过亏后才改了顺序等长绕线全部结束后先确认所有Match Group都绿再跑glossgloss跑完必须重新跑一遍DRC和等长检查。因为gloss的优化算法并不总是理解你的等长意图某一次它可能把一根绕好的绕线拉直Match Group立刻红给你看。正确的收尾顺序是等长绕线 - 检查Match Group - 手动清理明显短路/间距问题 - 跑gloss - 复查等长和DRC。这样既享受了工具的效率又不至于等长被偷偷破坏。