免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

数字后端时序收敛必懂:Delta Delay与Timing Window全解析

数字后端时序收敛必懂:Delta Delay与Timing Window全解析 每次跑完place和CTS我打开时序报告的姿势基本都是先深吸一口气。不是因为怕看到violation——数字IC后端工程师谁没见过成百上千条violation——而是怕看到那种“在PR工具里明明还有余量、到PT一签核全是红”的诡异差异。曾经我花了两周时间追一条hold path最后发现里面根本没有setup或者hold的计算错误而是Delta Delay和Timing Window这两个变量把整条路径的时序结论“平移”了几十皮秒。从那天起我就意识到做后端如果只懂得看slack数值不搞懂这两个影子变量是怎么产生的、怎么参与分析的时序收敛基本就是在靠运气。这个“后端”跟网上那些Java后端、Spring Boot后端完全是两回事。芯片后端是物理实现后端要负责把逻辑网表变成可以流片的版图而时序分析是这个环节里最硬的一块骨头。下面这篇总结我想把Delta Delay和Timing Window从概念到实操、从计算逻辑到修复手段完整拆一遍特别是那些在不同分析模式下容易让人翻车的差异点希望能给正在做PR、STA或者刚转入物理实现方向的工程师一些参考。1. 先把两个“影子变量”的区别钉死1.1 Delta Delay到底是什么Delta Delay叫法很多有的叫delay change有的叫crosstalk-induced delay variation。它的本质是在一个网络(net)上的信号跳变过程中相邻网络的耦合电容通过电荷注入改变了这个网络的充放电速率导致信号到达翻转阈值的时间发生了变化这个变化量就是Delta Delay。可以类比成两辆车并排在高速上开中间隔着一条很窄的隔离带。你本来匀速加速旁边一辆车突然从对面方向冲过来气流会把你往一边顶一下你的速度就会瞬间变快或变慢。这一下“气流扰动”造成的时间差就是Delta Delay。数字芯片里的耦合电容就相当于那条隔离带上传递的气流。具体到STA里Delta Delay分为两类一类是正向Delta Delaydelay derating即aggressor与victim同向翻转耦合电容帮助victim更快跳变延迟变小。另一类是反向Delta Delay即aggressor与victim反向翻转耦合电容拖着victim的反向充放电延迟变大。在先进工艺中信号沿越陡、耦合电容越大、victim的驱动能力越弱Delta Delay越明显。最坏情况下它能把一条原本满足时序要求的路径直接拉红。1.2 Timing Window到底在划什么范围Timing Window也经常写成timing window / switching window描述的是“某个节点上的信号翻转可能发生的时间区间”。为什么要用“可能”因为在芯片工作时一个节点的跳变不是固定发生在某一时刻的它会受到PVT、输入矢量、拥塞、串扰等因素的共同影响信号可能早一点到达也可能晚一点到达。STA按照early mode和late mode两条路径分别计算到达时间arrival time于是每个节点都有两个边界最早到达时间和最晚到达时间。Timing Window就是由这两个边界定义的一个时间区间。如果只用一句话解释那就是Timing Window回答的是“这条线在什么时候会动”这个问题。这个问题在串扰分析里极其关键因为一个aggressor只有在victim也在翻转的时候互相重叠才可能产生明显的Delta Delay。假如victim在时刻10ns翻转aggressor在时刻5ns就翻完了两者在时间上压根没有交集那么即便它们空间上靠得很近也不会产生时序上的耦合影响。1.3 两者之间为什么总是“纠缠不清”很多人一开始容易把这两个概念混在一起原因在于它们总是出现在同一个SI分析流程里。Delta Delay计算的时候要考虑Timing Window而Timing Window推演的过程中又要考虑串扰引起的延迟变化。两者互为输入输出形成了一个复杂的耦合系统。我的理解方式是这样的Delta Delay是串扰的“结果量”描述的是victim延迟被干扰后的净变化属于输出。Timing Window是串扰的“判断条件”用来决定哪些aggressor在时间维度上会对victim构成威胁属于前置输入。打个比方Timing Window像是一张“哪些时间段会有车经过”的班次表Delta Delay则是“真的会遇到会车时车速被影响了多少”。你不会在没有班次重叠的情况下纠结会车影响同样在Timing Window不重叠时谈Delta Delay是没有意义的。2. Delta Delay的来源拆解从库表到物理网表2.1 单元延迟建模NLDM与CCS/ECSM的分水岭想要深刻理解Delta Delay先得知道单元延迟是怎么算出来的。传统上标准单元库使用NLDMNon-Linear Delay Model来建模延迟。NLDM把每个单元的延迟与输入transition time、输出load capacitance关系做成二维查找表通过查表插值得到延迟。这个模型计算快速、运行高效但它本质上假设了单元输出波形是一个理想化的一阶RC响应。问题来了在先进工艺下输入波形不再是好看的单调斜线输出负载也不再是单纯的电容NLDM的一阶近似已经扛不住串扰和波形畸变带来的误差。于是后来的库开始采用CCSComposite Current Source或ECSMEffective Current Source Model模型用电流源加输出波形的方式描述单元行为。CCS/ECSM的好处在于它能够更准确地建模输出波形的非线性也能够更真实地反映外部噪声对输出延迟的影响。当你打开SI分析开关让工具计算Delta Delay时使用CCS/ECSM模型的库通常能给出比NLDM更贴近硅实测的结果。这也是后端flow里一个容易忽略的细节如果你的库里明明支持CCS却为了压缩运行时间把库降级为NLDM那Delta Delay的分析精度会明显下降时序收敛后冒出来的问题会非常难排查。2.2 线延迟、耦合电容与金属层的关系线延迟是Delta Delay的另一半源头。一段net上的延迟可以拆成两部分一部分是self capacitance对地电容带来的延迟另一层是coupling capacitance耦合电容带来的延迟。在先进工艺中coupling capacitance往往会占据总电容的60%甚至更高这就是为什么线延迟对串扰如此敏感。具体到金属层越往上层走的线间距越大、线宽越宽、线高也越高对应的侧向耦合电容占比通常有所不同。底层金属因为更细更密coupling占比同样不低。后端绕线时如果两条长距离并行线恰好走在相邻层并且重叠较长它们之间的耦合电容就会相当可观。还有一点via的影响。信号线换层之后via产生的电阻和电容会叠加到整条路径上。via数量越多路径上的RC散落点越多Delta Delay被放大的概率越大。这也是在优化长走线时我们尽量少绕线、少换层的物理原因之一。2.3 OCV derate和Delta Delay叠加时的坑时序签核的时候绝大多数团队都会做OCVon-chip variation处理常见做法是设置timing derate。比如# 在PrimeTime/Tempus中设置derate set_timing_derate -early 0.95 set_timing_derate -late 1.05这个derate是在原始路径延迟基础上乘以一个系数用来模拟片上偏差。问题是Delta Delay作为“额外增加的延迟或减少的延迟”在STA工具里通常是在derate之后再叠加的。这就导致了一个比较隐蔽的坑late path上如果Delta Delay让路径变慢那么它不仅要算上自身的变慢量还被derate进一步放大。early path上如果Delta Delay让路径变快它同样会被early mode的derate系数再压缩一次。所以如果你的设计里本身SI噪声严重你又额外加了激进的高derate系数时序报告会同时把两边的余量都吃掉。有些团队一看到setup大量违例就拼命拉大derate结果越修越乱其实问题源头在最基础的SI分析上。2.4 工具里怎么把Delta Delay“看”出来PrimeTime/Tempus中打开SI delta delay分析通常需要配置set_si_options这类命令。让我给一个常见的查询思路# 打开SI分析中的delta delay计算 set_si_options -delta_delay true # 在report_timing时同时报出delta delay分量 report_timing -delay_type max -si_delta_delay yesInnovus里面查看noise/si问题的方法也很多常用的是report_noise -violating这里必须提醒一句不同工具、不同版本之间的命令写法千差万别上面的命令主要是给大家一个概念千万别把它当万能模板。真正要做的是理解报告里那些数值的含义。通常在报告timing时工具会输出类似“Delay delta xx ps”的字段这个数就是当前路径上所有victim-aggressor耦合造成的累计延迟变化。如果这个值占整条路径延迟的比例超过10%这条路径基本就可以判定为受串扰影响严重单纯靠优化驱动和load不一定能解决还需要考虑physical层面的shielding或者绕线。3. Timing Window不是可有可无的参数是SI分析的判据3.1 Timing Window怎么计算出来Timing Window的计算其实不需要额外做一套复杂算法它就是基于STA中arrival time的传播结果。对一个给定节点工具会分别沿着early mode和late mode两条路径计算earliest arrival time对应最快路径、最小延迟、最激进的PVT条件组合。latest arrival time对应最慢路径、最大延迟、最悲观的PVT条件组合。Timing Window就是[earliest_arrival_time, latest_arrival_time]。它的宽度反映了这个节点“可能跳变的波动范围”。窗口越宽说明该节点受PVT、OCV、串扰等因素的影响越大窗口越窄说明这个节点的时序行为越稳定。在时钟树上Timing Window还天然受到clock insertion delay的影响。同样一个寄存器数据端口的窗口位置和时钟端口的窗口位置是不同的这在串扰分析中会直接关系到数据信号和时钟信号的相互影响。3.2 窗口重叠是串扰发生的时间前提SI分析中判断一个aggressor是否会影响victim第一步不是看耦合电容有多大而是先看两个节点的Timing Window是否重叠。假设victim的窗口是[2ns, 2.5ns]aggressor的窗口是[1ns, 1.2ns]那么即便两条线物理上完全相邻aggressor翻转时victim还没开始翻转等到victim翻转时aggressor早就稳定了两者根本不会在时间上相遇串扰效应近似为零。反之如果aggressor的窗口是[2.1ns, 2.3ns]那这个窗口完全包含在victim的窗口内两者存在显著的时间重叠工具就会进一步计算这个aggressor的翻转方向和victim的翻转方向组合得到具体的Delta Delay值。这里有一个容易忽视的细节Timing Window本身也会因为SI修复而变化。工具在迭代计算时会根据初步算出的Delta Delay更新aggressor和victim的到达时间从而更新各自的窗口。最终的窗口是一个经过多次迭代后的收敛结果。3.3 Timing Window对时钟树和hold预算的影响Timing Window不只是用于数据路径的串扰分析对时钟树同样很重要。CTS之后时钟路径上的每个节点都有自己的Timing Window。如果一条时钟路径与一条数据路径靠得很近两者窗口重叠就可能在时钟信号上叠加额外的Delta Delay最终体现在clock skew上。这意味着什么意味着你在CTS阶段精打细算出来的hold margin可能因为布线后串扰引起的时钟到达时间偏移而被吞噬。这也是为什么很多熟练的后端工程师不会完全信任ideal clock阶段的hold报告他们心里会预留一个基于Timing Window重叠情况的hold budget。3.4 在IR-drop和噪声验证里的另一重身份Timing Window还有另外一重身份IR drop分析中的“开关密度窗口”。芯片局部电压降严重往往是因为某个区域大量cell在同一时间窗口内同时翻转瞬间拉高电流需求。如果你的IR drop分析只考虑静态平均电流不结合Timing Window就会严重低估动态压降。结合Timing Window做动态压降分析时工具会计算在每个时间窗口内有多少个cell发生翻转。大量cell集中在同一个窗口翻转局部供电网络就会瞬时电压崩落进而增大信号延迟。这种延迟增幅虽然不完全等同于串扰Delta Delay但它在时序报告里的表现形式非常相似又会和Delta Delay叠加在一起让人难以分辨到底是谁拖垮了时序。4. 后端工程里的高频翻车现场4.1 GBA和PBA用不好Delta Delay会骗人时序分析有两大模式GBAgraph-based analysis和PBApath-based analysis。GBA沿时序图传播公共路径时对所有可能路径取最大/最小值天然更加保守PBA则会沿着具体路径重新计算结果更贴近实际。问题是GBA下计算的Delta Delay通常也比PBA更悲观。因为GBA在传播arrival time时会把同一个aggressor的干扰效果在所有可能的victim上重复计算而PBA只计算在当前路径实际发生的情况。我见过不少团队在GBA模式下看到一条路径有大量hold违规于是疯狂插delay cell结果到PBA模式下发现违例其实不存在白白增加了面积和功耗。反过来也有团队在PBA下看到没有violation就提前签核结果GBA模式下漏了一堆问题。正确的做法是根据项目的sign-off要求确定主分析模式再用另一种模式做交叉验证重点检查那些在两个模式下相差很大的路径。4.2 CTS之后的“时序窗口漂移”CTS阶段跑的时序使用的是较早的RC抽取结果时钟树还没有真正绕线。到了detail routing之后时钟树上的物理RC会发生变化时钟路径上每个节点的到达时间随之变化Timing Window整体向右或向左漂移。窗口漂移之后原本没有时间重叠的aggressor和victim可能变得重叠了原本没有串扰的路径突然冒出一堆Delta Delay。很多工程师遇到这类问题就会奇怪为什么routing前后的时序报告差这么多答案往往就出在窗口漂移后的SI重算上。解决这个问题的思路是在CTS后不要只看ideal clock的时序结果而是做一次带初步RC的SI分析提前发现那些窗口边缘靠得很近的路径在布线阶段就通过约束或者physical guidance避免潜在问题。4.3 MaxTransition设太紧反而制造Delta Delay后端优化时为了确保信号沿够快很多工程师会把MaxTransition约束设得很紧。这本身没错问题在于违例一旦出现工具最直接的手段是插buffer或者换大驱动cell。缓冲区一多网络数量变多、相连的coupling节点变多、整个区域内的信号跳变活动也变多。结果a路径的transition是改善了但它周围的静态时序和串扰环境却被搅乱了b路径和c路径反而出现了新的Delta Delay。这就是典型的“按下葫芦浮起瓢”。更合理的做法是在过渡时间违例不是特别严重时优先调整单元位置、缩短走线长度比盲目插buffer有效得多。只有当你通过SI report确认某个节点确实是驱动能力不足导致的transition问题再插buffer也不迟。4.4 修hold修出了一堆新crosstalkHold修复的本质是在数据路径上增加延迟让数据晚到一点。最常见的操作是插入delay cell。但delay cell同样有输入输出端口同样会与周围网络产生耦合。你每插一个delay cell就相当于在物理世界里新增了一个“信号发射源”。假设原本一条路径上没有crosstalk问题你为了hold违例插了三个delay cell这三个cell接入后改变了周边的信号环境反而让相邻的agg与victim之间产生了新的Timing Window重叠导致新增的Delta Delay变大。所以我的习惯是在修复hold之前先把目标区域的SI情况和Timing Window分布摸清楚。如果发现附近有高度活跃的aggressor网络优先选择把delay cell放到相对空旷的区域或者直接复用已有的spare cell避免在拥塞区域制造新的耦合源。5. 怎么用Timing Window做“该修不该修”的判断5.1 按Delta Delay和窗口重叠度分优先级修时序不能眉毛胡子一把抓。我一般会把violating path按照Delta Delay和Timing Window重叠情况分成三档档次判断标准处理动作一档Delta Delay小于路径延迟的5%窗口重叠度低暂不处理继续观察二档Delta Delay占比5%~15%窗口部分重叠局部优化驱动/负载选择性修三档Delta Delay占比超过15%或者窗口高度重叠必须物理修复考虑屏蔽、绕线、改层这套分档标准我用了很久在大多数工艺节点下都比较有效。它帮你把有限的人力用在真正影响收敛的路径上而不是被满屏的violation带偏节奏。5.2 修复策略哪些节点先动哪些别动Timing Window的实际应用在于它可以告诉我们“什么时候动”比“动不动”更重要。举个例子一条victim网络与三条aggressor网络存在窗口重叠但其中两条aggressor只在victim窗口的边缘发生跳变实际重叠时间非常短真正有威胁的只有那一条完全落在victim窗口中间的agg。这种情况下修复的优先级就很明确优先处理窗口完全重叠的、驱动能力较强的、耦合电容较大的agg。可以从三个方向同时入手通过换驱动、加buffer把victim的窗口变窄减少重叠机会。通过加大线间距或插入shield线降低耦合电容。通过调整绕线层将受害线和攻击线分开到不同金属层。很多时候只要处理掉最关键的1~2条aggressor整条victim路径的Delta Delay就会大幅下降这个优先级判断比盲目“把全部violating net都修一遍”高效得多。5.3 回归验证的常用手段每一次SI修复之后都要重新跑timing并观察Delta Delay的变化。我会习惯性保存修复前后的两版时序报告做一个快速对比重点看这几个字段victim net上的Delta Delay绝对值变化。victim net上的Timing Window宽度变化。相邻aggressor的窗口是否发生了移动。修复之后有没有新增的crosstalk violator。如果发现Delta Delay变小了但Timing Window宽度反而变大说明修复动作可能只是暂时绕开了当前aggressor但整体信号稳定性并没有变好后面还可能反弹。反之只要Timing Window逐渐收窄Delta Delay稳定下降这条路径就算真正修住了。6. 先进工艺下的两个放大效应6.1 线延迟占比越来越高Delta Delay从“噪声”变“主信号”在28nm及以上的工艺节点单元延迟占路径延迟的绝对主导线延迟只占一小部分。那时候即使出现串扰Delta Delay也常常是几十ps以内对时序收敛影响有限。到了7nm、5nm互连线电阻变大、耦合电容占比升高线延迟在路径延迟中所占比重越来越大。Delta Delay不再是路径延迟上的一层“毛刺”而是直接决定路径正负余量的关键项。这也是为什么在先进工艺节点的后端项目中SI分析不再是可选的“加分项”而是和setup、hold检查一样必须全程开启的“必选项”。如果你还在用老工艺时代的flow把SI分析关了跑PR之后的时序收敛和sign-off基本会是一场灾难。6.2 低电压下Timing Window更容易发生整体偏移另一个先进工艺的显著变化是工作电压越来越低。电压降低后单元本征延迟对电压的敏感性大幅度提高同一个单元在相同负载和相同slew下不同corner之间的延迟差异会拉大。这直接导致early mode与late mode之间的到达时间差变大Timing Window变得更宽。Timing Window变宽意味着什么意味着aggressor和victim之间的时间重叠概率变大了。以前只有完整的窗口重叠才会触发串扰影响现在只要窗口有交叉就可能产生非零的Delta Delay。换句话说低压下不仅是窗口本身变宽了整个设计受串扰影响的范围也被放大了。所以做低电压、低功耗项目时我通常会额外关注两件事一是确认库模型在低压下依然使用CCS/ECSM这类高精度建模二是仔细检查多电压域之间的Timing Window边界避免不同电压域的信号在转换过程中出现意外的窗口重叠。讲了这么多最后说点个人体会。有一回我接手一个28nm的MCU项目hold收敛反复做了三轮都没过每次修完一批又冒出一批新的。那时我只盯着report_timing里的slack看压根没有去查SI报告里的Delta Delay分布。后来仔细一查发现问题出在CTS阶段和布线后阶段之间时序窗口发生了明显漂移原本没有重叠的两个网络在布线后被拉在了一起产生了一条很大的串扰delay。我做的第一件有效修复不是加buffer而是手动引导那根victim线绕开了攻击线然后再配合调整驱动强度两层下来整个设计就收干净了。从那以后我养成了一个习惯拿到任何一条时序违例先不急着改电路先问三个问题——这条路径的Delta Delay是多少Timing Window有多大和周围的aggressor窗口是否真的重叠这三个问题想清楚再动手修速度快很多也不容易返工。做数字后端的人最值钱的不是敲命令的手速而是对时序分析背后这些模型和逻辑的理解深度。
返回列表