片上偏差(on-chip variation, OCV)
想象两名一模一样的跑者,在同一家健身房训练、吃同样的饮食、穿同样的鞋子。按理说他们跑一圈应该用完全相同的时间。可实际上总有一个会快上那么一丁点儿,因为没有两副身体能精确到每一根纤维都完全相同。同一颗晶粒上并排而坐、号称完全相同的两条时序路径,也是这么回事。哪怕你已经定好了一个工艺角——比如慢慢硅、低电压、高温这样一个全局条件——在这一颗芯片上,细微的差别仍会从一处到另一处地变化:这里某个晶体管的栅极长了零点几纳米,那里掺杂原子落得不太均匀,某根导线刻蚀得稍窄了些,繁忙模块中央的供电轨塌陷了几毫伏,晶粒的某一角比另一角更热。片上偏差(OCV)就是给这种只存在于一颗晶粒「之内」的散布起的名字——于是同一种类型的两个单元给不出完全一样的延迟,两条匹配的路径也跑不出完全一样的速度。
这为什么对签核要紧?因为一次建立(setup)检查,是让一条发射数据的发射路径,和负责接住它的捕获时钟,在共享同一个时钟的前提下相互较劲,而保持(hold)检查更是脆弱。如果数据路径恰好落在偏慢的硅上,而捕获时钟恰好落在偏快的硅上,余量就被吃掉了,一条在工艺角下看着安全的路径,实际上可能失败。光凭工艺角看不出这一点——它给整颗晶粒只分配一个速度。所以签核会在工艺角之上再对时序做降额(de-rate):对一次建立检查,它故意把数据路径、连同携带数据的发射时钟一起放慢,而把设定截止期限的捕获时钟加快(保持检查则方向相反),各自乘上一个小小的降额系数,买下足够的余量去吸收两者之间最坏的、合理可能出现的失配。粗糙的「平直 OCV」只是把每个延迟统统乘上一个固定百分比,这很悲观,因为它假定一条长路径上的每一个单元都同时朝坏的方向偏。现代签核更聪明:先进 OCV(AOCV)会随着路径变长(随机误差部分抵消)、以及随着路径在物理上变短,把降额收窄;参数化/统计 OCV(POCV/SOCV,常通过 Liberty 的 LVF 数据)则给每个单元各自的 sigma,再以统计方式合并——这样你只为真正需要的那点余量买单。
真正的功夫在于把不该承受的悲观去掉。当发射时钟和捕获时钟在分岔之前走过同一段共享的导线,那一段共同路径不可能在同一瞬间对一边偏快、对另一边偏慢,于是工具会把它「退还」回来——这就是共同路径悲观度消除(CPPR,也叫 CRPR)。归根结底,OCV 就是你在工艺角「之上」再加的那一层安全余量,用来尊重一个朴素的事实:一颗晶粒并不均匀,而那种只因为假定检查的两半完全相同才勉强收敛的时序,到了硅片上会反过来背叛你。
对一次建立检查,平直 OCV 把数据路径连同它的发射时钟一起放慢、把捕获时钟加快一个小小的系数,让检查能在最坏的、合理可能出现的晶粒内失配下依然过关;AOCV/POCV 则用按路径、按单元定制的余量来取代这个生硬的数字。
OCV 余量说的是一颗晶粒「之内」的散布,和工艺角不是一回事(工艺角是片与片之间、板与板之间那种全局的 PVT 条件);你是在正在签核的那个工艺角「之上」再叠加 OCV 降额,而过度降额会悄悄丢掉时钟速度,所以团队会从平直 OCV 转向 AOCV/POCV,把这部分性能抠回来。