信号完整性(SI)签核
本篇是芯片物理签核专家系列的一篇。它建立在 00-crosstalk-si-signoff 对串扰机理的整体介绍之上,重点把「功能噪声失败」和「耦合延迟失败」两条签核轨道拆开讲清楚,并和后文 ECO 自动化、物理 ECO 收敛衔接。
本文要回答的问题
- 一根相邻线翻转,为什么能在本来稳定的信号线上「凭空」打出一个毛刺?
- 同样的耦合,为什么既能让一根线变慢、又能让它变快?分别威胁哪条时序约束?
- 签核工具凭什么判断两根线「真的会同时翻转」?开关窗口是怎么来的?
- 一个毛刺高到什么程度才算危险?谁决定这个阈值?
- 修串扰时,spacing、shielding、加缓冲、调驱动各解决什么问题,副作用是什么?
一、两种效应:功能噪声与延迟噪声
在 180nm 以上的老工艺里,金属线间距大、线间侧向电容占总电容比例低,互连主要考虑线对地的电容,串扰基本可以忽略。进入深亚微米后,线宽和线间距一起缩小、金属叠层变高,侧向耦合电容 Cc 在一根线总电容中的占比可以升到 60%~80%。这意味着一根线的电气行为越来越强地受它左右邻居支配,信号完整性(Signal Integrity, SI)因此成为独立签核项。
串扰在受害线(victim)上产生两类性质完全不同的效应,必须分开分析、分开修复:
- 功能噪声(functional noise / glitch):受害线本来应当保持稳定(比如是一根已经建立好的数据、或一个低有效的控制信号),相邻的攻击线(aggressor)发生跳变,通过耦合电容
Cc向受害线注入一个电荷脉冲,使受害线电压瞬间被拉离稳态,形成一个毛刺。如果这个毛刺在触发器采样窗口内出现在数据输入端、且幅度足够大,就可能被错误地锁存进去;如果出现在异步复位、时钟门控使能等控制端,后果更直接。 - 延迟噪声(delay noise / crosstalk delta delay):受害线自己也在跳变。此时耦合电容上流过的电流取决于攻击线与受害线的相对跳变方向。两者反向跳变(一个 0→1、一个 1→0)时,耦合电流要额外把对方「往反方向拽」,等效于受害线负载变重、跳变更慢,延迟增大;两者同向跳变时,耦合电流「帮」受害线一起摆,等效负载变轻、延迟减小。延迟增大主要威胁 setup(建立时间),延迟减小主要威胁 hold(保持时间)。
关键区别在于:功能噪声威胁的是「电平正确性」,受害线在那一刻不该动却动了;延迟噪声威胁的是「边沿到达时刻」,受害线该动,但动得太快或太慢。前者是模拟幅度问题,后者是时序问题,工具、报告和修复手段都不同。
下图把两种效应的产生路径画在一起:同一套耦合网络,根据受害线当时是稳定还是跳变,分流到 glitch 检查或 delta delay 检查。
读图时抓住中间那个判定:受害线是否也在跳变,决定了同一份耦合电荷被工具计入「噪声预算」还是「延迟增量」。后面所有签核流程都是围绕这个分叉展开的。
二、glitch 毛刺:幅度、宽度与传播
并不是攻击线一跳,受害线上的毛刺就一定致命。一个毛刺最终造成功能错误,要同时满足三个条件,签核工具正是逐级检查这三道关卡:
- 毛刺要够高、够宽。受害线不是只有耦合电容,它还被自己的驱动级牢牢钳在稳态电压上。攻击线注入电荷,受害线驱动级同时在把电荷抽走,两者竞争决定毛刺的峰值和宽度。驱动级越弱、互连电阻越大、耦合越强,毛刺峰值越高。工具用「直流/动态噪声容限(noise immunity)」来判:把一个宽度和幅度不同的噪声脉冲加到接收单元输入端,看输出端是否产生超过允许值(如 Vdd 的一定比例)的响应。低于这条曲线的毛刺,即使传到接收端也会被单元的模拟增益衰减掉,不构成威胁。
- 毛刺要能传播到敏感端点。毛刺经过一级级组合逻辑会衰减,多数毛刺在到达触发器前就被门电路滤平。工具做「噪声传播(noise propagation)」分析,把前级产生的毛刺和本级攻击产生的毛刺叠加,跟踪它能否一路传到触发器的 D 端、时钟、异步置复位或带 memory 的门(如锁存器使能)。只有能传播到这些「噪声敏感点」的毛刺才需要修。
- 毛刺要出现在采样窗口。即使毛刺到达 D 端,只要它发生在触发器根本不采样的时刻(远离时钟有效沿),就不会被锁存。工具结合时序窗口判断毛刺到达时间是否与接收触发器的有效采样区间重叠。
毛刺按来源还可细分:除了最典型的邻居翻转产生的耦合毛刺,还有多条攻击线同时跳变叠加的协同毛刺、经过电源网络耦合的电源噪声毛刺等。签核时要确认工具是否启用了多攻击线同时作用(而不是只看单条最强攻击线),否则会低估真实噪声。
下图画出毛刺从产生到被判为危险的三道关卡,任何一道没过,毛刺都不会造成功能错误。
工程上有个反直觉点:最弱的单元反而最容易出问题。一根长线末端如果由一个最小尺寸、高阈值的驱动级驱动,它对受害线的钳位能力最差,攻击线轻轻一拉就能拉出高毛刺;而长走线本身电阻电容又大。所以高扇出、长走线、弱驱动这三者叠加的网络,是功能噪声报告里的常客,通常也是优先插缓冲、增强驱动的对象。
三、delta delay:开关窗口与同向/反向耦合
延迟噪声的核心是「开关窗口(switching window / timing window)」。攻击线只有在受害线自己也正在跳变的那段时间附近翻转,耦合才会显著改变受害线延迟;如果攻击线在受害线早已稳定之后才翻转,对受害线这一跳的延迟毫无影响(那只会产生上一节的 glitch)。
工具先用普通时序分析算出每条网络可能跳变的最早时刻和最晚时刻,得到一个时间区间,即开关窗口。攻击线窗口与受害线窗口的重叠程度,决定了两者「同时翻转」的可信程度:
- 窗口完全不重叠:不会发生耦合延迟,无需计入。
- 窗口部分重叠:按重叠程度计算有效的耦合影响。
- 悲观处理无法确定时:早期或保守做法直接假定攻击线在最不利时刻翻转(worst-case alignment),这会给出偏悲观的结果,可能报出一堆实际不可能发生的违例。
在算出的重叠窗口内,再按跳变方向分别计算:
- 反向耦合使受害线延迟增大,记为正的增量,叠加到到达时间上去检查 setup;
- 同向耦合使受害线延迟减小,记为负的增量,用来检查 hold(受害边沿到得太早,可能追上同一沿被前一位数据占用的窗口)。
这就解释了为什么 SI 延迟分析必须和 STA 在同一份数据、同一组 scenario 下做:开关窗口本身就是时序分析的产物,而串扰改了延迟又会反过来改变窗口,严格来说需要迭代,直到窗口和延迟相互一致(收敛)。多模式多角(MMMC)下,不同 corner 的窗口位置和耦合强度都不同,慢角、快角、best-case/worst-case RC 要分别签。
四、噪声失败与时序失败的对照
下表把两条轨道并排,便于在看报告时快速对号入座。混为一谈是常见错误来源:比如拿修 hold 的思路去给一根纯功能噪声网络加延迟,往往越修越糟。
| 维度 | 功能噪声(glitch) | 延迟噪声(delta delay) |
|---|---|---|
| 受害线状态 | 本应保持稳定 | 自己也在跳变 |
| 威胁对象 | 电平被误采样,功能错误 | 边沿到达时刻,setup/hold |
| 判据 | 噪声峰值/宽度 vs 单元噪声容限 | 耦合后到达时间 vs 时序约束 |
| 关键输入 | 驱动强度、传播路径、采样窗口 | 开关窗口重叠、跳变方向 |
| 反向耦合 | 不区分方向,主要看注入 | 减速,威胁 setup |
| 同向耦合 | 不适用 | 加速,威胁 hold |
| 典型修复 | 增强驱动、插缓冲、spacing、shield | spacing、shield、缓冲打断、平衡窗口 |
| 报告类型 | noise/glitch 报告 | SI-aware timing 报告 |
五、签核条件与噪声预算
一次可被接受的 SI 签核,至少要保证输入条件真实可信,常见要点:
- 正确的寄生角:耦合电容、互连电阻随工艺角变化。crosstalk setup 通常在电容偏大的 worst-case RC 角、hold 在 best-case RC 角签,具体以 foundry 推荐的 corner 组合为准。
- 真实的开关窗口来源:窗口要由带真实时钟、真实时序例外的 STA 提供。时钟没约束、false path 没写,会让窗口变成「随时可能跳」,工具只能按最坏对齐,报告一片飘红却无法收敛。
- 多攻击线叠加:确认工具允许多条攻击线在同一时刻共同作用,而非逐条独立取最坏。
- 噪声预算(noise budget):在设计早期就给关键网络分配可接受噪声上限(考虑后续电源压降 IR drop、地弹、串扰的叠加),而不是等到签核阶段才发现某根线噪声全面超标。串扰噪声往往和电源噪声同时作用——IR drop 让供电电压降低、单元变慢且噪声容限下降,二者会互相放大,先进工艺签核时需要联合考虑。
- 迭代一致:ECO 改动后重新提取寄生、重算窗口、重跑两类检查,直到没有新的违例出现。
六、修复手段与各自代价
修串扰没有单一银弹,工具按违例类型和物理空间给出组合,常见手段及其副作用:
- 增大间距 spacing:把攻击线和受害线拉开,直接减小侧向耦合电容,是最干净的修法。代价是占用布线资源、可能引起别处拥塞,往往需要局部重布线。
- 屏蔽 shielding:在攻击线和受害线之间插入一根接地或接电源的屏蔽线(并尽量多打过孔保证低阻),把耦合从「线对线」变成「线对地」。对时钟等高敏感网络有效,但屏蔽线增加电容、让信号变慢、且占用通道。
- 插入缓冲 buffer:在一根长耦合线中段插缓冲,把它切成两段较短的线,缩短每段与攻击线平行耦合的长度,同时缓冲还能重新驱动、增强后段的钳位能力。代价是增加延迟、面积和功耗,插太多会改变时序。
- 调整驱动强度 / 换单元:增强受害线驱动能更好地钳位稳态、压低 glitch;或反过来削弱过强的攻击线驱动以降低注入。需要重新做时序,因为驱动一变延迟就变。
- 重新布线 / 换层:让攻击线与受害线走不同金属层(垂直方向耦合天然较小),或缩短平行走线长度。
- 调整开关窗口:通过插缓冲等手段让两根线的跳变时刻错开,使窗口不再重叠,专门用于 delta delay。
所有修复都遵循同一条铁律:改动物理布线后必须重新提取寄生参数。spacing 和重布线改了电容,加缓冲改了网络结构,若还用旧 SPEF 跑签核,结论全部失效。而且修一根线可能把耦合压力转移到它的另一侧邻居,需要在多轮迭代里确认总违例数确实单调下降。
常见坑
- 只做延迟 SI,不查功能 glitch:时序干净不代表没有毛刺,控制信号和保持稳定的数据网络要单独跑 noise 签核。
- 不看窗口一律按最坏对齐:在早期能快速筛风险,但拿最坏结果直接判定流片会过度悲观、逼出无意义的面积代价;签核要用基于真实时序的窗口。
- 修完不重提取 RC:用旧寄生重跑等于没修,是最普遍也最隐蔽的失误。
- 忽视电源噪声叠加:IR drop 降低噪声容限,单看串扰达标、叠加电源压降后可能超标。
- 只盯单条攻击线:多攻击线同时翻转的叠加才是真实最坏情况。
- 修复转移耦合:拉开一侧间距可能让另一侧受害,需多轮确认整体收敛。
这一篇在知识体系里的位置
串扰的整体签核流程和修复清单见 00-crosstalk-si-signoff;耦合寄生的来源与提取见 07-parasitic-rc-extraction;签核窗口依赖多模多角时序,见 02-mmmc-advanced-sta;修串扰引发的局部改动如何纳入收敛闭环,见 03-physical-eco-timing-closure 与 16-eco-automation-postroute;噪声容限随供电下降而恶化,与 11-power-signoff-ir-drop-em 相关。
总结
先进工艺中线间耦合电容占主导,使攻击线翻转既能在保持稳定的受害线上打出可能被误采样的功能毛刺,也能按同向/反向相对翻转让受害线延迟减小或增大,分别威胁 hold 与 setup;SI 串扰签核要在真实寄生角、由时序驱动的开关窗口和多攻击线叠加下,把「噪声失败」和「延迟失败」分开判定,毛刺要越过单元噪声容限、能传播到敏感端点、又落在采样窗口才算危险,修复优先用 spacing、shielding、插缓冲、调驱动和重布线,并在每次改动后重新提取耦合寄生、联合电源噪声重跑两类检查直到收敛。