ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Allegro 17.4差分对等长检查三种方法:约束管理器、Show Element与Skill脚本

Allegro 17.4差分对等长检查三种方法:约束管理器、Show Element与Skill脚本 1. 差分对等长检查为什么总在后期才暴露问题做过高速板的人大概都有过这种经历板子画完DRC跑了一遍又一遍约束管理器里看着全是绿的结果投板回来一测眼图睁不开或者时序余量差得离谱。回头一查差分对组内两根线差了七八十mil而约束里明明设的是5mil。问题出在哪出在检查这个动作本身——很多人以为约束管理器设好了就万事大吉实际上Allegro的等长检查分好几个层次默认的DRC根本不会主动帮你抓组内偏差得你自己去触发、去分析、去定位。差分对组内等长这件事说穿了就是保证差分信号的正负两根线从驱动端到接收端的传播延迟尽可能一致。延迟不一致差分信号就会产生偏斜skew共模分量增大EMI变差接收端眼高眼宽都会被吃掉。在低速时代几十mil的偏差可能无所谓但到了DDR3以上、PCIe、SATA、USB3.0这些接口5mil的偏差都可能要命。Allegro 17.4作为Cadence的主力PCB设计工具在约束管理和等长检查方面功能其实很完整但功能完整和你会用是两码事。这篇文章面向的是已经有一定Allegro基础、正在做高速板设计、被差分对等长问题折磨过的PCB工程师。我会把Allegro 17.4里差分对组内等长检查的三种方法从头到尾拆一遍包括约束怎么设、检查怎么触发、偏差怎么定位、定位到了怎么改。每种方法都有它最适合的场景没有哪种是万能的关键是你得知道什么时候用哪种。提示本文所有操作基于Allegro 17.4版本不同版本菜单路径可能有细微差异但核心逻辑一致。2. 约束管理器里的差分对等长规则到底该怎么设在讲检查方法之前必须先把约束设对。约束设错了后面检查出来的结果全是误导。我见过太多人约束管理器里Delta:Tolerance填了个值就以为组内等长已经管住了实际上那个值管的是差分对之间的相位容差跟组内两根线的长度差是两回事。2.1 差分对创建与组内等长规则的区别先厘清一个概念。在Allegro的约束管理器Constraint Manager里跟差分对相关的约束分两个层面第一个层面是差分对自身的物理约束包括线宽、线间距、过孔样式这些在Physical规则里设。第二个层面是电气约束包括组内等长Intra-pair Skew、差分对间等长Inter-pair Skew、相位容差这些在Electrical规则里设。组内等长管的是差分对内部P线和N线之间的长度差这个值通常设得很小5mil到10mil是常见范围有些苛刻的接口要求3mil以内。差分对间等长管的是同一组内多个差分对之间的长度差比如DDR3的DQ和DQS之间这个值可以放宽到几十mil甚至上百mil。很多人搞混的地方在于在Electrical规则里设了Delta:Tolerance以为这就是组内等长其实那个是差分对之间的相位容差。真正的组内等长在Allegro 17.4里是通过Relative Propagation Delay规则来管的你需要把差分对的两个pin pair分别设进去然后设一个匹配组Match Group在匹配组里设Tolerance。2.2 用Relative Propagation Delay管住组内偏差具体操作路径是这样的打开Constraint Manager切换到Electrical工作表找到Relative Propagation Delay这一栏。在这里你需要为每个差分对创建pin pair。比如一个差分对从U1的A1/A2引脚到U2的B1/B2引脚你需要创建两个pin pairU1.A1到U2.B1以及U1.A2到U2.B2。创建完pin pair之后把这两个pin pair选中右键创建一个Match Group。在Match Group的Tolerance列里填入你允许的最大长度差比如5mil。这个Tolerance就是组内等长的核心约束Allegro在后续的等长检查中会以这个值为基准来判断是否超标。这里有个细节容易被忽略pin pair的创建顺序和方向。如果你创建的是U1.A1到U2.B1但实际布线时信号是从U2流向U1的Allegro在计算长度时仍然会按你创建的pin pair方向来算但长度值是绝对值方向不影响。真正影响的是如果你创建pin pair时选错了引脚那后面所有检查都是错的。注意Match Group的Tolerance设好之后不会自动触发DRC。你需要在Analyze菜单里手动开启Relative Propagation Delay的检查或者用后面要讲的几种方法主动去查。2.3 约束设好之后为什么DRC还是绿的这是最坑人的地方。约束管理器里设了ToleranceDRC跑完却全是绿的你以为没问题实际上Allegro默认的Online DRC和Batch DRC都不包含Relative Propagation Delay检查。这个检查属于分析型检查不是规则型检查需要你主动去触发。为什么这么设计因为等长检查需要计算实际的布线长度这个计算量比较大如果每次移动一根线都实时算一遍软件会卡得没法用。所以Cadence把它做成了按需触发的分析功能。理解了这一点你就知道为什么约束设了不等于检查做了。3. 方法一用Constraint Manager的Analyze功能做批量检查第一种方法是最正统的直接在约束管理器里触发分析。适合在布线基本完成、准备做最终检查的阶段使用能一次性把所有差分对的组内偏差都列出来。3.1 触发Relative Propagation Delay分析的完整步骤打开Constraint Manager切到Electrical工作表找到Relative Propagation Delay。在菜单栏里找到Analyze点击Analysis Mode确保Relative Propagation Delay这一项是勾选状态。然后点击Analyze按钮Allegro会开始计算所有pin pair的实际布线长度。计算完成后你会看到每个pin pair的Actual值被填上了实际长度。Match Group里会显示组内所有pin pair的长度差如果超过了Tolerance那一行会标红。这是最直观的批量检查方式一眼就能看出哪些差分对超标了。但这个方法有个局限它只告诉你超了不告诉你哪里超了。你看到某个差分对组内差了15mil但具体是哪一段线导致的偏差是过孔数量不一致还是某一段绕线多了约束管理器里看不出来。这时候就需要用到后面两种方法。3.2 分析结果里的Actual值与预期不符怎么办有时候你会发现Actual值跟你预估的差很多比如你明明布了2000mil的线Actual显示2500mil。这种情况通常是以下几个原因pin pair创建错误检查pin pair的起始和终止引脚是否跟实际布线一致。如果pin pair创建时选了一个中间经过的测试点或者过孔长度计算就会包含额外的段。布线未完成如果有飞线没连上Allegro会把未布线的部分按曼哈顿距离估算导致Actual值偏大。过孔长度未计入默认情况下Allegro会把过孔的长度计入总长度但如果你的叠层设置里过孔长度没定义或者过孔被设为了零长度计算结果就会偏小。差分对内有T点或分支如果差分对中间有分支或者T点长度计算会变得复杂Actual值可能跟你手动量的不一致。排查的时候我习惯先用Display菜单里的Element功能点一下走线看看Allegro报告的长度是多少跟约束管理器里的Actual值对一下。如果对不上基本就是pin pair或者叠层设置的问题。3.3 批量检查的适用场景与效率评估这个方法最适合在布线完成度80%以上的时候做一次全面体检。它的优势是快、全一次操作能把整板所有差分对都过一遍。缺点是定位精度不够只能告诉你哪个差分对有问题不能直接告诉你问题出在哪一段。我的习惯是布线过程中每完成一个区域就用这个方法扫一遍把明显超标的先改掉。等到全部布完再做一次最终检查。这样避免最后一次性面对几十个超标项改起来手忙脚乱。提示Analyze之前记得先保存文件。分析过程中如果Allegro崩溃17.4偶尔会至少不会丢工作。4. 方法二用Show Element逐段定位偏差来源约束管理器告诉你这个差分对差了15mil接下来你要做的就是找到这15mil差在哪。Show Element是Allegro里最基础但也最实用的工具用好了能解决大部分定位问题。4.1 Show Element看单根线长度的正确姿势在Allegro主界面点击Display菜单选择Element。然后在Options面板里确保勾选了Length相关的选项。接着点击你要检查的那根走线Allegro会在报告窗口里显示这根线的详细信息包括总长度Total Length各段长度Segment Length过孔数量及每个过孔的长度起始和终止的pin关键是要看Total Length和各段长度。把差分对的两根线分别点一遍把两个Total Length一减就是实际的组内偏差。然后对比两根线的各段长度哪一段差得多问题就在哪一段。比如P线总长2000milN线总长2015mil差了15mil。你再看各段P线在某个区域有一段绕线是300milN线对应区域是315mil那问题就出在这个绕线区域。可能是绕线的时候两根线没有严格等间距绕或者其中一根多绕了一个弯。4.2 过孔数量不一致导致的隐性偏差差分对组内偏差最常见的原因之一就是过孔数量不一致。P线换了两次层N线换了三次层每个过孔在Allegro里默认按叠层厚度计算长度比如一个过孔穿过8层板大约60mil那多一个过孔就多了60mil的偏差。这个偏差在约束管理器里会体现出来但你不点开看根本不知道是过孔导致的。用Show Element点走线的时候报告里会列出过孔的数量和每个过孔的长度。如果发现两根线的过孔数量不一样那基本就是问题所在。解决办法要么是让两根线换层次数一致要么是在换层少的那根线上补一段绕线来补偿长度。但这里有个经验之谈能用换层一致解决的尽量不要用绕线补偿。因为绕线补偿会引入额外的寄生参数而且绕线区域的阻抗控制更难。如果实在没法做到换层一致补偿绕线也要放在阻抗控制比较好的区域避开敏感区域。4.3 用Report功能导出长度报告做对比如果差分对比较多一个个点太慢可以用Allegro的Report功能批量导出长度信息。在Tools菜单里找到Reports选择Etch Report或者Length Report可以导出所有走线的长度列表。导出成CSV或者文本格式用Excel打开把差分对的两根线长度做个差值一眼就能看出哪些超标。这个方法的精度取决于你的pin pair设置。如果pin pair设得准Report出来的长度就是准确的。如果pin pair没设或者设错了Report出来的长度可能包含整条网络的所有分支那就没参考价值了。我一般会在布线完成后导出一份Length Report跟约束管理器里的Actual值交叉验证。两边对得上说明数据可信对不上就得回去查pin pair或者叠层设置。4.4 逐段定位的实操心得用Show Element定位偏差有几个我踩过坑之后总结的技巧第一先看总长再看分段。不要一上来就一段段看先确认总长差多少心里有个数。第二重点关注绕线区域和换层区域。这两个地方是偏差的高发区。第三注意单位。Allegro默认单位可能是mil也可能是mm看报告的时候先确认单位别把mil当成mm那就差大了。第四过孔长度要确认。不同叠层、不同孔径的过孔长度不一样Allegro按叠层设置计算如果叠层设置不准过孔长度就不准。5. 方法三用Skill脚本自动化检查与偏差定位前两种方法都是手动操作差分对少的时候没问题但如果板子上有几百个差分对一个个手动查会疯掉。这时候就该Skill上场了。Allegro的Skill是基于Lisp的脚本语言可以调用Allegro的各种API实现自动化检查。5.1 为什么需要Skill来做等长检查Constraint Manager的Analyze功能虽然能批量检查但它只告诉你结果不告诉你过程。你看到100个差分对里有20个超标然后你得一个个用Show Element去定位这个工作量是巨大的。Skill脚本可以做到自动遍历所有差分对计算组内偏差把超标的差分对和具体的偏差段都列出来甚至可以直接在PCB上高亮显示偏差最大的那一段。另一个场景是定期检查。在布线过程中你可能想每隔一段时间就自动跑一次等长检查把结果输出到一个文件里跟踪偏差的变化趋势。这种需求用Skill来做最合适。5.2 一个可用的Skill脚本框架与关键API下面是一个Skill脚本的基本框架用来遍历所有差分对并计算组内长度差。这个脚本不是完整的生产级代码但能跑通核心逻辑你可以基于它扩展。; 获取所有差分对 diff_pairs axlDBGetDesign()-diffpairs ; 遍历每个差分对 foreach(dp diff_pairs ; 获取差分对的两根线 p_net dp-true n_net dp-false ; 获取每根线的总长度 p_length axlGetNetLength(p_net) n_length axlGetNetLength(n_net) ; 计算差值 skew abs(p_length - n_length) ; 如果超过阈值输出报告 when(skew 5.0 printf(差分对 %s 组内偏差 %.2f mil\n dp-name skew) printf( P线长度: %.2f mil\n p_length) printf( N线长度: %.2f mil\n n_length) ) )这个脚本的核心是axlGetNetLength这个API它能返回指定网络的总布线长度。axlDBGetDesign()-diffpairs返回设计中的所有差分对。遍历一遍把每对差分对的两根线长度算出来差值超过阈值的就打印出来。实际使用的时候你可能需要更精细的控制比如只检查特定Match Group里的差分对或者把结果输出到CSV文件方便后续分析。这些都可以在框架基础上扩展。5.3 脚本跑出来的结果怎么跟约束管理器对照Skill脚本算出来的长度跟约束管理器里的Actual值理论上应该一致因为它们用的是同一套长度计算引擎。但实际使用中可能会发现细微差异原因通常是pin pair定义不同约束管理器里的长度是基于pin pair算的Skill脚本如果直接算整条网络可能会包含pin pair之外的分支。过孔长度计算方式约束管理器可能对过孔长度做了特殊处理而Skill脚本用的是默认计算方式。单位换算Skill脚本返回的长度单位可能跟约束管理器显示的单位不同需要做换算。我的做法是先用Skill脚本做粗筛把明显超标的差分对找出来然后再用约束管理器的Analyze功能做精确确认。两者结合效率最高。5.4 Skill方案的局限性与维护成本Skill脚本不是万能的。首先它需要你有一定的编程基础至少能看懂Lisp的基本语法。其次Allegro的Skill API在不同版本之间可能有变化17.4能跑的脚本升级到24.1可能就要改。第三脚本的调试比较麻烦Allegro的Skill调试环境不如现代IDE那么友好。所以我的建议是如果你只是偶尔做一块高速板差分对数量不多前两种手动方法足够了。如果你经常做高速板差分对数量上百那花点时间学Skill是值得的。但不要指望一个脚本能解决所有问题脚本只是工具核心还是你对等长检查逻辑的理解。6. 三种方法的对比与选用策略三种方法各有优劣我整理了一个对比表格方便你根据实际情况选用。对比维度Constraint Manager AnalyzeShow Element逐段查Skill脚本自动化操作难度低菜单操作低但繁琐高需要编程检查速度快批量慢逐个最快全自动定位精度低只到差分对级别高到段级别中可定制适用阶段布线后期全面检查问题定位阶段定期检查/大批量对小白友好度高高低维护成本无无高需随版本更新实际工作中我通常是这么组合使用的布线过程中用Constraint Manager Analyze定期扫发现超标项后用Show Element定位到具体段改完之后再Analyze确认。Skill脚本只在差分对特别多或者需要做趋势分析的时候才用。还有一个经验不要等到布线全部完成才做等长检查。我见过太多人布完线才查结果发现几十个差分对超标改起来牵一发动全身。正确的做法是每布完一个区域就查一次把问题消灭在局部。这样最后整体检查的时候基本不会有大的意外。7. 等长检查中那些约束管理器不会告诉你的坑约束管理器能告诉你长度差了多少但有些坑它不会告诉你。这些坑都是我实际项目中踩出来的分享出来让你少走弯路。7.1 绕线补偿的等长是假等长很多人发现差分对组内偏差大了第一反应是在短的那根线上绕几个弯来补长度。绕完之后约束管理器里显示等长了DRC也过了但实际信号质量可能更差了。为什么因为绕线补偿只补了长度没补延迟。信号的传播延迟不仅跟长度有关还跟走线的阻抗、周围的介质材料、参考平面的完整性有关。你在一个阻抗不连续的区域绕线虽然长度补上了但延迟可能跟另一根线还是不一致。更麻烦的是绕线区域如果离其他信号太近还会引入串扰。所以我的原则是能用换层一致解决的不用绕线能用调整布线路径解决的不用绕线实在要绕线也要在阻抗控制好、远离敏感信号的区域绕。7.2 过孔长度在不同叠层下的计算差异Allegro计算过孔长度是基于叠层设置的。如果你的叠层设置里介质厚度填的是理论值而不是实际值过孔长度就会算错。比如一个8层板理论叠层总厚62mil但实际板厂做出来可能是58mil或者65mil这个差异会直接影响过孔长度的计算进而影响等长检查的结果。我的做法是在叠层设置里介质厚度尽量用板厂提供的实际值而不是理论值。如果板厂还没确定就用一个保守的估计值然后在投板前跟板厂确认实际叠层再更新一次。这个细节看起来小但在做苛刻的等长要求时几十mil的过孔长度差异可能就是压死骆驼的最后一根稻草。7.3 差分对内的pin delay要不要算Pin delay是芯片封装内部的延迟对于高速信号来说这个延迟有时候不能忽略。Allegro支持在约束管理器里输入pin delay值然后在等长检查时把pin delay也算进去。但问题是pin delay的值通常只有芯片厂商能提供而且不同批次的芯片可能还有差异。我的经验是对于速率在5Gbps以下的接口pin delay通常可以忽略因为封装内部的延迟差异一般很小。但对于10Gbps以上的接口pin delay就必须考虑了。这时候你需要找芯片厂商要pin delay的准确值然后在Allegro里设进去。如果拿不到准确值那就只能按最坏情况估算留足够的余量。7.4 检查通过不等于信号没问题最后说一个最重要的认知等长检查通过不代表信号一定没问题。等长只是高速信号设计的一个必要条件不是充分条件。阻抗控制、参考平面完整性、串扰、EMI这些都会影响信号质量。我见过等长做得完美但眼图一塌糊涂的板子问题出在参考平面被分割了差分线的回流路径不连续。所以等长检查做完之后如果条件允许最好还是做一次信号完整性仿真。Allegro自带的Sigrity或者外部的HyperLynx都可以。仿真能发现很多等长检查发现不了的问题。当然仿真也需要时间和精力不是每个项目都有条件做。但至少你要知道等长检查只是第一步不是终点。8. 从检查到修改的闭环怎么跑通检查出问题只是开始改完并验证才是闭环。我通常的流程是这样的第一步用Constraint Manager Analyze做全面扫描把所有超标的差分对列出来。第二步按超标程度排序先改偏差大的因为偏差大的通常问题更明显改起来也更容易见效。第三步用Show Element定位到具体段判断是过孔问题、绕线问题还是路径问题。第四步修改布线优先调整路径和换层其次才是绕线补偿。第五步改完一个区域就重新Analyze一次确认改到位了不要攒着一起改。这个流程看起来简单但实际操作中容易犯的错误是改了一处忘了另一处。特别是差分对比较多的时候改着改着就乱了。我的建议是建一个检查清单每改完一个差分对就打个勾确保不遗漏。另外修改的时候要注意不要引入新的问题。比如你为了等长把某根线绕了一下结果那根线跟旁边的信号间距不够了产生了串扰。所以改完之后不仅要看等长还要跑一遍常规DRC确认没有新的违规。提示Allegro 17.4的Undo功能在等长修改时很好用但不要依赖它。改之前先保存改坏了直接回退到保存点比一步步Undo靠谱。9. 一些提高效率的快捷键与界面设置最后分享几个我在用Allegro 17.4做等长检查时常用的快捷键和界面设置能省不少时间。快捷键方面F5是刷新改完线之后按一下刷新界面约束管理器里的Actual值会更新。CtrlE是Show Element的快捷键比去菜单里点快得多。F10是打开Constraint Manager我习惯把它设成常驻面板随时能看。界面设置方面在Color面板里把差分对的颜色设成醒目的颜色比如红色和蓝色这样在PCB上找差分对的时候一眼就能看到。在Options面板里把Length相关的选项勾上这样点走线的时候直接就能看到长度信息不用再去Report里查。约束管理器的列设置默认的列可能不显示Actual值和偏差值你需要手动把这些列加出来。在Constraint Manager里右键列标题选择Customize Columns把Actual、Margin、Tolerance这些列都勾上。这样一眼就能看出哪些超标了。还有一个我常用的技巧在Constraint Manager里按Margin列排序Margin是负数的就是超标的排在最前面。这样不用一个个找直接看最上面几个就行。这些设置看起来是小事但每天用、每个项目用累积下来省的时间很可观。PCB设计这个活效率往往就体现在这些细节上。
返回列表