
1. 为什么要花大力气搞DDR等长做PCB设计的朋友应该都有感触DDR这块是硬骨头。跑不上去、数据出错、系统不稳定很多时候根源就在时序上而时序能不能满足很大程度取决于你的等长约束做没做对、做没做细。Allegro里把DDR的等长约束拆成一个个Match Group来做是Cadence这套工具的标准玩法也是业内Layout工程师的基本功。我这篇文章就专门讲一件事怎么用Allegro在5分钟内把DDR信号线的Match Group等长规则设置好从创建到测量到调整把实操路径一次说透。先说适合谁看。如果你正在画DDR3/DDR4的板子或者刚接触Allegro没多久对着Constraint Manager里面一堆表格不知道该填什么参数那这篇文章就是给你写的。哪怕你只画过一两次DDR看完也能自己动手把规则建起来。已经熟练的老手可以直接跳到后面的常见问题部分那里有几个坑值得你对照检查。这篇文章不是那种照搬手册的教程里面的操作步骤和参数选择都是我在实际项目里验证过的。DDR3和DDR4虽然协议不同但Allegro里等长规则的设置思路基本一致文中我会把差异点单独拿出来讲。2. 开工前必须想清楚的三件事2.1 先搞懂Match Group到底管什么Match Group在Allegro里不是随便把几根线绑在一起就算完事。它背后管的是信号组内部的相对延时关系也就是组内信号之间的Skew偏斜。DDR总线里面每组数据信号是跟对应的DQS走在一起的CPU或者控制器靠DQS来采样DQ所以DQ对DQS的等长就特别关键。地址、控制、命令这一类信号则是跟CLK走相对等长。所以你在建Match Group之前心里要先有一张表哪几根信号属于同一个Group参考时钟线是哪根目标容差是正负多少mil。比如DDR3的DQ0到DQ7通常跟DQS0、DQS0#组成一组目标等长一般做到正负10到20mil以内。地址组A0到A15连同片选、时钟使能这些信号跟CK一组容差宽松一点正负50mil甚至100mil都有设计在做。具体数值要看你的芯片手册和主控要求每个项目不一样别照抄网上的模板。2.2 单位选择决定你后面会不会算错Allegro里等长约束的单位可以走mil也可以走ps新手最容易在这上面翻车。DDR3和DDR4走的是源同步时钟真正决定时序的是时间不是物理长度。同样一段走线在板子不同层、不同参考平面下信号传播速度不一样。FR4板材上表层微带线的信号速度大约每英寸170ps左右内层带状线大约每英寸180ps左右这个差异会让你按长度做的等长在时间上并不严格相等。不过实际项目中绝大多数情况下大家还是用mil做等长单位原因是操作直观布线时看长度报告也方便。只要你的走线基本走在同一个层或者不同层走线占比不大mil等长和ps等长的差别基本可以忽略。如果设计要求很严比如DDR4到了2400MT/s以上建议直接用ps建Match Group或者至少把长度和延时两个维度都检查一遍。我在实际项目中见过因为表层和内层混走导致等长在约束范围内、时序却过不了的情况根源就在传播速度差异上。2.3 找准入口Constraint Manager的两种打开方式Allegro里设置等长规则的入口在Constraints菜单下常用的打开方式有两种。第一种是从菜单栏点击Constraints - Constraint Manager这是最标准的路径。第二种更快捷在工具栏的图标区找到Constraint Manager的快捷图标一个像表格一样的小按钮点一下直接打开。打开之后你会看到左边是工作簿导航树里面有Physical和Electrical两大类约束。等长规则属于Electrical类别下的Relative Propagation Delay也就是相对传播延时。这个路径要记牢Electrical - Net - Routing - Relative Propagation Delay。创建的Match Group就在这一层里管理。注意如果你用的是Allegro 17.4或更新的版本界面和旧版16.6有些出入但Constraint Manager的操作逻辑没有大变按这个路径能找到。3. 五分钟实操从建组到验证一把过3.1 两步把信号线加入Match Group假设你已经在Constraint Manager里打开了Electrical分类现在要创建第一个Match Group。左侧导航树展开Net - Routing - Relative Propagation Delay先点选中这一项然后在右边的工作表区域点右键选择Create - Match Group。这时候会弹出一个对话框让你给Match Group命名同时选择要加入的Net。命名建议用有业务含义的名字比如DQ0_GROUP、ADDR_GROUP不要叫Group1、Group2不然过两个月你自己都记不清哪组是哪组。我习惯命名规则是“信号类型_总线号”比如DQ[0:7]_DQS0一眼就能看出这组包含了DQ0到DQ7和对应的DQS0。选Net的时候有个效率技巧。如果总线信号命名规范比如DDR_DQ0到DDR_DQ7你可以在过滤栏输入DDR_DQ*系统会把匹配的信号全部筛出来按住Shift批量选中一次加入。如果信号分散命名就老老实实一个一个选选完点Add最后点OK确认。DQS信号别漏了它是组的参考基准后面设置容差的时候要单独指定。3.2 关键一步指定参考基准线Match Group创建完之后工作表的表格里会出现一个Gather Control列和Delta列。这里有一个在手工程序里最容易被忽略的地方。Gather Control列默认可能是Relative to Longest意思是参考组内最长的那根线或者Relative to Target意思是参考你指定的基准线。DDR等长我强烈建议选Relative to Target然后在Gather Control这一列对应的单元格里点右键选择Set as Target来指定哪根线是基准。DQ组就指定DQS0为Target地址组就指定CK为Target。为什么不用“相对最长”呢因为最长的那根一旦后面布线调整会变化你的等长检查结果也跟着飘容易产生误判。固定基准线你做等长的时候目标明确检查结果也稳定。指定Target之后你会在工作表里看到所有信号相对于Target的Delta值单位默认是mil或者ps取决于你前面设置的单位。表格里的数字是当前实际走线的长度差有正有负正数代表比Target长负数代表比Target短。3.3 填空把容差写进规则表现在到了设置等长规则的核心动作。同样是在Relative Propagation Delay工作表里每根信号对应一行的Delta列在这列的任意单元格上点右键选择Spreadsheet - Properties或者有些版本是直接右键选择Setup会弹出属性设置窗口。在这里你能看到两个关键字段。一个是Delta也就是目标相对延时的数值一般填0意思是信号要和Target等长。另一个是Tolerance也就是容差范围填你想要的正负偏差。比如DDR3的DQ组Tolerance填25mil意思就是允许信号长度比Target长25mil或短25mil。实际项目里DQ对DQS做到正负10到20mil很常见地址组对CLK正负50mil也能跑。具体多少看芯片手册要求和你的布线空间别死套。写完之后点OK规则就生效了。你会在工作表的每一行看到类似0 : 25这样的显示冒号前面是Delta冒号后面是Tolerance。这时候Match Group的等长规则已经设置完毕接下来要做的就是把线布到满足这个规则为止。3.4 用表格和延迟报告核对结果规则建好不等于事情干完你还需要实时知道当前走线离目标还差多少。Allegro里最简单的办法是直接在Constraint Manager里看Delta列的数字。每当你走完一段线回到Constraint Manager按一下F5刷新Delta就会更新。正数超了负数欠了一目了然。更直观的做法是在Allegro板框界面里打开Show Measure命令或者直接按快捷键ShiftF5在Find面板里选择Pin然后依次点选Target信号和待检查信号窗口里会直接显示两者之间的长度差。这个操作在线调等长的时候配合交互式布线用效率很高。还有一招是跑延迟报告。在Constraint Manager里选中你的Match Group右键选择Analysis - Delay Report系统会生成一份当前所有信号的走线长度和相对延时报告。走线完成后建议跑一次这个报告把结果截图存档后续做设计评审或者跟硬件工程师对齐时有据可查。我在项目里出图前一定会跑一遍全DDR的Delay Report检查没有红色超标项才放心发出去打样。4. 好用的招数布线时如何快速绕等长4.1 巧用Delay Tune让鼠标自动找路径规则设置好之后真正布线时你是拿鼠标一点一点绕线还是让工具帮你绕当然是让工具帮。Allegro的Route - Delay Tune命令就是干这个的中文版也叫延时调节。执行命令后选中一根需要做等长的信号鼠标移动的时候会带出一个蛇形线的预览轮廓你滑动鼠标滚轮或者按逗号句号键可以调整蛇形绕线的幅度和间距走到目标长度附近时约束管理器里的Delta值会实时变化。实际操作时有个手感问题。Delay Tune默认的蛇形绕线间距有时候偏大或者偏小可以通过Option面板里的参数调整。幅度Amplitude一般设为线距的3到4倍比如线距6mil就设20mil左右太大容易造成耦合太小绕线效率低。间距Spacing保持不小于普通线距的2倍推荐3倍以上防止串扰超标。4.2 蛇形绕线的幅度和间距到底怎么定这里展开讲一下因为这部分直接决定你DDR跑不跑得稳。蛇形绕线的本质是增加走线长度但增加长度不是白加的绕线区域相邻走线之间的耦合会加大。如果绕线间距只有常规线距的1倍那两根平行线的串扰可能大得离谱。DDR总线频率高、沿又陡串扰会直接影响时序余量。我自己的经验是控制类、地址类信号线距按常规走绕线间距做到常规线距的3倍以上安全。DQ数据类信号本身就是跟DQS同步的绕线时更要小心间距至少做到3倍幅度不要太大宁可多绕几个小蛇也不要一个又高又胖的大蛇。绕完之后用Allegro的Shape Check功能检查一下绕线区域有没有违反间距规则。还有一种情况如果组内某根信号比Target长了很多Delay Tune会提示你已经超出范围这时候不要硬绕检查一下是不是这根线走的路由绕了大圈。很多情况下重新优化一下走线路径比在后面接一堆蛇形线效果更好等长绕线只是微调手段不是用来补大差的。4.3 批量等长一次给整组信号做绕线的骚操作Allegro其实支持给整个Match Group做批量等长。在Delay Tune命令下Find面板选择Net Group然后直接点击板上的任意一根属于该组的走线Allegro会自动识别整个Match Group的所有信号。你可以在右侧Option面板里看到当前正在调节的信号索引按Tab键在组内信号之间切换逐根把Delta调到0附近。这个批量操作效率很高但有个前提组内所有信号必须先有差不多的布线基础不能有的差几百个mil还没走完。实际操作时我的顺序是先把整组信号全部连通然后从最长的那根开始调把最长作为基准或者以Target为准先看谁最长。短的信号做等长容易长的信号做等长等于要把相邻信号都拉长套路反了就费工夫。5. 玄学还是科学等长绕线后的串扰与电气检查5.1 串扰风险不能只靠肉眼很多工程师做等长喜欢往一个方向堆蛇形线结果就是那一小片区域全是平行走线串扰爆表。Allegro有专门的串扰分析工具但这个属于Sigrity的范畴普通的PCB Editor本身做不了详细的串扰仿真。那是不是就不管了不是。至少你要用肉眼检查绕线区域做到蛇形线的平行段不要跨层交叠上下相邻层的布线方向保持垂直这是基础。另外蛇形绕线之后一定要重新检查一次DRC。等长绕线经常会触发Spacing违例因为蛇形线挤占了周边空间旁边的信号线或者过孔可能间距不够了。在Allegro里Display - Status运行DRC更新重点看Spacing Constraint的报错位置逐个修正。我遇到过绕完等长之后一堆DRC冒红的情况基本都是绕线太靠近旁边的过孔或者焊盘微调一下绕线的起始位置就好。5.2 平面完整性和回流路径检查DDR走线下面必须有完整的参考平面这是铁律。等长绕线的地方尤其要注意因为蛇形线拉长了走线路径很容易走到参考平面的边缘或者跨越分割区域。Allegro里可以用Manufacture - Design Rule Check的Plane检查功能来确认走线下方平面没有大面积掏空。检查方法比较暴力也直接有效打开走线所在的叠层把平面层选为可见然后在走线区域框选缩放肉眼查看有没有跨越分割线或者窄桥区域。如果发现某个蛇形绕线正好跨在平面分割上那这组信号的回流路径会出现大环路时序和EMC都会出问题。这种问题靠改绕线形状是改不回来的必须先调整信号走向让整段走线都在同一个完整平面上。5.3 能仿就仿不仿心里不踏实DDR跑高速之后等长只是必要条件不是充分条件。板子画完之后有条件的话把DDR部分的Layout导到Sigrity里跑一下DDR仿真看眼图、看时序余量。这一步能提前发现很多等长解决了但其他问题导致的不满足。没有仿真条件的项目至少要做到上面几步等长规则设置正确、绕线区域没有DRC违例、参考平面完整。用Allegro的Timing Vision在较新的版本中可用也能快速查看DDR相关信号的时序报告。很多项目实际打样回来一次过靠的就是这些基础功夫扎实用到位。6. 新手必踩的坑和排查技巧6.1 Match Group设置了却不生效这是问得最多的问题。规则建了Delta也填了但布线时约束管理器里就是不显示等长状态走线也没有自动约束引导。排查思路先看约束管理器左下角是不是当前生效的Constraint Set有时候你改了规则但页面停在另一个CMConstraint Manager视图上。再看物理规则里走线的约束是不是同一个约束集如果信号被分配到了Physical Constraint Set而等长规则属于Electrical Constraint Set两边没有关联那电气规则就管不到它。最简单的排查方法在Constraint Manager里找到这根信号看它的Electrical Constraint Set是什么再打开CM的Net窗口确认这里显示的等长规则不是你新建的那个CSConstraint Set。如果CS名对不上右键把信号重新分配到正确的CS上刷新就行。6.2 等长数据刷新不及时的解决用Delay Tune绕线的时候有时候发现了等长数值已经对了但是CM里刷新之后还是红色报错。这个情况多半是CM缓存的问题按F5无果的话把Constraint Manager整个关掉重新打开基本都能解决。另外检查一下是否处于交互式布线状态有些版本在布线命令未结束时CM刷新会卡住不更新退出布线命令再刷新就正常了。6.3 长和短傻傻分不清Delta正负号含义这是小细节但特别容易搞混。Delta为负表示这条信号长度比Target短需要绕长Delta为正表示已经比Target长了要考虑优化路径或者把基准目标换成长的那根。我在一个项目中因为看反了正负号把不该绕的线绕了一圈白白浪费半天时间。养成习惯短了绕、长了查。6.4 DQS差分信号怎么进Match GroupDQ要跟DQS做等长那DQS差分对本身要不要进Match Group要的。DQS和DQS#这一对差分线要先保证对内等长比如正负5mil然后把DQS0通常选正端作为DQ组的Target写进同一个Match Group。操作上就是把DQS0和DQS0#都加进组里Set as Target指向DQS0。DQS对内等长做得好DQ对DQS的等长才有意义。6.5 常见问题速查表现象可能原因解决方法Match Group无法创建信号类型不允许加入或已被其他组引用检查信号是否被分配到其他Group解散后再建等长规则不生效信号的电气约束集不对在CM中重新分配正确的CSDelta数值不变CM缓存或布线命令未退出关闭CM重开或退出命令后刷新DRC大量红色蛇形线间距违例或平面不完整调整绕线间距检查参考平面Delay Tune无法选中信号信号未加入任何Match Group先建Group再加入信号目标基准失效Target信号被误操作或删除重新Set as Target指定基准线7. 实操心得5分钟做完之后还该做点什么上面这些步骤走完你的Match Group等长规则确实已经能在5分钟之内建立起来并投入使用了。但我个人的体会是等长规则的设置其实是DDR设计里面最机械、最不费脑的一步真正花时间的是后面的反复调整和验证。规则建好只是开始布线时你要时刻开着Constraint Manager一边走线一边看Delta变化走完一组刷新一次对照Delay Report确认所有信号都在容差内。还有很多工程细节可以延伸到后续工作里比如布完线把DDR区域的走线按层做一次长度统计看看表层和内层的比例是否合理比如检查DQS差分对内等长是否在约束范围内比如在出Gerber之前生成一份完整的等长报告交给硬件工程师确认。这些工作没有一项需要很高深的技术但每一项都能避免你的DDR板子回来之后因为时序问题跑不起来。最后再说一个小技巧如果你在DDR颗粒周围实在没有空间绕等长了先别急着铺铜或者移过孔把Target基准线换一下选择一个居中的信号做Target有时候能让整组的绕线量大幅减少。这个思路很多老工程师都在用但很少有人写在文档里。你下次遇到绕线空间紧张的板子可以试试。