在芯片设计这个圈子里,有一类 IP 几乎每个项目都会顺手带上一个,但很少有人愿意在会上专门花十分钟讲它——ROSC,也就是环形振荡器(Ring Oscillator)。它不像 PLL 那样有漂亮的锁定曲线,不像 ADC 那样有复杂的校准矩阵,更不像 SerDes 那样动辄几十页的规格书。它通常只有几百个门、几十微米见方,藏在芯片某个角落里,安安静静地跑着一个不太准、但非常"诚实"的频率。可就是这么一个不起眼的小模块,往往决定了整颗芯片能不能知道自己"现在处在什么状态":工艺是快还是慢,电压是不是掉了,温度是不是超了,甚至这颗片子已经老化到什么程度了。我把它叫做芯片设计里的隐形标尺——你平时看不见它,但一旦出了问题、需要有人出来作证的时候,全场只有它说话最可信。
这篇内容我打算把 ROSC 这个 IP 从里到外拆一遍。它是什么、为什么这么设计、参数怎么算、版图怎么摆、校准怎么做、硅后出问题怎么查,都会讲到。适合正在做 SoC 集成、做 PVT 监测、做低功耗管理、做安全模块的同行看,也适合刚入行、想知道"为什么每个项目都要塞一个环形振荡器"的朋友。文中涉及的工艺节点、频率、功耗都是常见量级,具体项目还要按自己的 PDK 去跑。
1. 为什么一颗芯片里要塞一个"环形振荡器"
1.1 ROSC 的本质:奇数个反相器咬住自己的尾巴
把奇数个反相器首尾相连,形成一个闭环,这就是最原始的 ROSC。第 1 级输出的下降沿推到第 2 级,第 2 级再推第 3 级……绕了一圈之后回到第 1 级,恰好是一个反相的沿,于是环路无法稳定在任何一个中间电平上,只能不停地翻转。这个"停不下来"的特性,就是振荡。
它的振荡周期有个非常朴素的表达式:T = 2 × N × Td,其中 N 是反相器级数(必须是奇数),Td 是单级延迟,前面乘 2 是因为信号要绕两圈才能回到初始状态。反过来说频率就是f = 1 / (2 × N × Td)。这个公式简单到几乎不像一个"模拟电路"的公式,但它恰恰是 ROSC 全部价值的来源:Td 是一个对工艺、电压、温度极其敏感的量。工艺角从 TT 跑到 FF,Td 可能掉 30%;电压上下浮动 10%,Td 反向变化十几个百分点;温度从 -40℃ 爬到 125℃,Td 又是一条不平坦的曲线。
换个角度想,这就像你用一根橡皮筋做成的钟摆:它走时一点都不准,但你只要知道橡皮筋的软硬和长度变化规律,就能反过来用它测量温度和拉力。ROSC 就是这根橡皮筋。我们从来不需要它"准",我们需要它"敏感且单调"。
也正是因为它太敏感,绝大多数场合它都不能直接当时钟源用。一个不做任何处理的 ROSC,频率随工艺角漂 ±20% 是常态,随温度再漂 ±10%,加起来能差出半个数量级。拿它去驱动一个需要精确时序的接口,基本等于自找麻烦。所以工程上我们给它的定位非常清晰:它不是时钟,它是传感器。
1.2 "隐形标尺"这个名字的由来
叫它隐形标尺,有两层意思。第一层是物理上的隐形:ROSC 通常被放在芯片的电源管理区、安全模块区或者角落的监测区,不在任何数据通路上,功能上不参与运算,验证时也很容易被漏掉。第二层是功能上的标尺:整颗芯片里,别的模块都在"做事",只有它在"量事"。
举个很典型的场景。一颗 SoC 在实验室里跑得好好的,到了客户板子上偶尔死机,复现困难。这时候如果片上有分布式的 ROSC 阵列,每个 ROSC 旁边配一个计数器,你就相当于在芯片内部不同位置装了若干个"电压探头"。出问题时把计数值 dump 出来,哪个区域的 ROSC 频率异常偏低,基本就能锁定是哪片区域的供电网络在负载突变时塌了。这个手段比外部示波器探针直观得多,因为你根本探不到芯片内部。
提示:ROSC 的价值不在精度,而在"就地"和"实时"。外部仪器再准,也进不到硅片里面。
还有一层工程上的意义:ROSC 是少数几个能同时在数字流程里被综合、又能真实反映模拟特性的模块。它的 RTL 可以跟着数字后端一起跑 P&R,不需要单独开模拟版图,却又能输出一个和真实硅片状态强相关的模拟量。这种"数字外壳、模拟内核"的双重身份,让它在项目里格外好用。
1.3 谁在用它:四类高频场景
我把实际项目里见到 ROSC 的用法归成四类,从最常见的说起。
第一类是 PVT 监测。这是绝对的主力场景。片上放若干 ROSC,配合一个相对精准的参考时钟(通常是晶振分频或者带隙基准产生的低频时钟),用一个计数窗口去数 ROSC 的周期数。计数值的变化就反映了 PVT 的变化。这类设计通常还会配一张校准表,把计数值映射成电压或温度。
第二类是 droop 检测。高性能计算类芯片在负载突变时会出现电压瞬间塌陷,几十毫伏的跌落就足以让关键路径时序违例。用响应速度快的 ROSC 加一个小计数器做短窗口采样,可以在几百皮秒到几纳秒量级捕捉到跌落事件。相比专门的电压监测 ADC,ROSC 方案面积小一个数量级,代价是绝对精度差,但 droop 检测要本来也不是绝对精度。
第三类是老化与可靠性监测。ROSC 的频率会随着 HCI、BTI 等效应慢慢漂移,这个漂移量本身就是一份"健康档案"。量产的片子跑几年之后,把片上 ROSC 的读数和出厂时比一比,就能估算出器件退化程度。这个方法现在在车规和高可靠场景里用得越来越多。
第四类是熵源。ROSC 的振荡存在相位噪声和抖动,把多个不同频率的 ROSC 做异或采样,可以累积出真正的随机性,这是真随机数发生器里非常经典的一种结构。用环形振荡器采样的方式实现熵累积,好处是不依赖模拟电路的特殊结构,纯数字实现,可移植性极强。
四类场景对 ROSC 的要求其实差别很大:PVT 监测要的是单调性和可重复性,droop 检测要的是响应速度,老化监测要的是长期稳定性,熵源要的是抖动足够大。同一个 ROSC 结构想同时满足这四条,几乎不可能,所以真做项目的时候,通常是同一个 IP 出几个变体,参数化配置。
2. ROSC IP 的内部拆解与设计取舍
2.1 三种主流拓扑怎么选
ROSC 看着简单,实际上拓扑选择会直接决定后面所有参数的走向。工程上常见的有三种。
第一种是单端反相器链。最经典、面积最小、功耗最低,N 取 3 到 31 级。优点是纯数字单元,可以直接用标准单元库里的 INV 和 NAND 搭出来,不需要定制版图。缺点是电源抑制比差,电源上任何一点噪声都会直接调制频率,做精密测量时读数会很抖。
第二种是电流饥饿型。每一级反相器的上下各串一个由偏置电压控制的晶体管,用限制充放电电流的方式来控制延迟。这一招的价值在于可调:改变偏置电压就能改变频率,这让它既能做频率微调,也能做闭环控制。代价是引入了模拟偏置电路,面积和功耗都上去了,而且偏置电压本身的噪声也会串进来。
第三种是差分延迟单元结构。用差分对或者电流模逻辑搭延迟单元,抗电源噪声能力明显强于单端结构,输出是差分信号,共模干扰被抵消掉一大半。代价是面积大约是单端的三倍,功耗也更高,而且需要模拟版图配合。
| 拓扑 | 相对面积 | 功耗 | 电源噪声抑制 | 可调性 | 典型用途 |
|---|---|---|---|---|---|
| 单端反相器链 | 1.0 | 低 | 差 | 弱(仅靠配置级数) | 通用 PVT 监测、熵源 |
| 电流饥饿型 | 1.5~2.0 | 中 | 中 | 强(连续可调) | 需要校准的温度/电压传感器 |
| 差分延迟单元 | 3.0 左右 | 高 | 好 | 中 | 高精度监测、抗噪场景 |
我个人在做通用型 PVT 监测 IP 的时候,第一版基本都会选单端反相器链,理由很实际:它足够便宜,可以铺很多个。一个精密但只能放两三个的传感器,信息量远不如铺二十个粗糙的。芯片内部的电压分布本来就不均匀,空间分辨率比单点精度更有价值。只有在下游明确要求做温度读数、需要绝对精度的时候,才会切到电流饥饿型。
2.2 调谐手段:电流饥饿、负载电容与分频
调谐这块有三个层级,作用点完全不同,很多人会混淆。
最粗的一层是改级数。通过配置寄存器选择接入环路的反相器个数,比如 7 级、15 级、31 级可配。这一层的作用是量程切换,频率能差好几倍。实现上用多路选择器把环路在某处断开再接到不同抽头,注意 MUX 本身的延迟也会进环路,选型的时候要用延迟匹配的做法,否则不同档位的频率关系会不单调。
中间一层是负载电容调谐。在每一级的输出挂上可控电容阵列,靠增加负载来减慢边沿。这一层能提供大约 ±20% 的调节范围,步进相对均匀。缺点是电容阵列占面积,而且开关管的寄生会让高频档位的调节非线性。
最细一层是电流 starving。前面说的偏置控制,调节范围可以做到 ±50% 甚至更大,但线性度最差,通常只在小范围内做闭环微调。
注意:三层调谐不要同时开放给软件随便写。我见过一个项目,寄存器映射把三层全暴露出去,软件同学误操作把级数配置和电容配置设成了互斥的组合,结果 ROSC 停振,整个监测模块读回来全是零,还以为是硬件挂了。稳妥的做法是把调谐封装成一个单调递增的 trim code,硬件内部翻译成三层配置,软件只写一个数。
分频这一层要单独说。ROSC 本体频率通常在几百 MHz 到几个 GHz,直接送进计数器会带来巨大的动态功耗。常规做法是先做 8 分频或者 16 分频,把频率降到几十 MHz 再计数。分频器本身是数字电路,不受 PVT 影响(相对而言),所以分频不会破坏测量结果,只要在换算时把分频比乘回去就行。但要注意分频器第一级的触发器采样频率很高,它的建立保持时间在慢角下要单独检查,别在这里翻车。
2.3 使能、复位与跨时钟域:最容易被忽略的三个细节
这三个点看着像常识,实际上是我审别人 ROSC IP 时最常挑出问题的地方。
使能怎么做。反相器链是没有"关断"概念的,环路一闭合就必然振荡,所以必须有一个可控的断点。标准做法是把环路里的某一级换成 NAND 门,用使能信号控制。使能为低时 NAND 输出恒定,环路断开;使能为高时 NAND 等效为反相器,环路闭合,振荡建立。
这里有个坑:从断到通的瞬间,环路里是任意初始态,起振需要时间。短则几十个周期,长则上百个周期,取决于环路增益和噪声水平。如果使能之后立刻就开计数器,前几个窗口的读数是偏低的、不稳定的。我的做法是使能后强制等待固定的建立周期数(用寄存器配,默认给 256 个 ROSC 周期),再开始有效计数,这个数字在硅上验证过之后基本可以固定下来。
复位与初值。有些设计为了加快起振,会在使能时给环路某个节点强灌一个初值。这么做确实能缩短建立时间,但会带来一个隐患:如果每次起振的初值都是同一个,振荡波形的相位就变得可预测,对熵源场景是致命的。所以做 TRNG 的版本必须去掉初值强制,老老实实等它从噪声里自己长起来。
跨时钟域。ROSC 输出是一个和系统时钟完全异步的信号,直接送进系统时钟域的计数器,采到的值必然是亚稳态风险。规范的写法是在 ROSC 输出后面串两到三级触发器做同步,且同步器要放在系统时钟域。更稳妥的做法是用"计数窗口 + 双缓冲":慢时钟域给一个窗口信号,ROSC 域的计数器在窗口内累计,窗口结束时把结果锁存到影子寄存器,系统时钟域读影子寄存器。这样跨域的只有一次握手,而不是每个 bit 都跨。
顺便说一句,ROSC 域的计数器本身也是要过 DFT 的。扫描测试的时候全片的 ROSC 都在跑,动态功耗会飙升,而且计数器的状态是不可预期的,会污染扫描链。所以测试模式下必须把 ROSC 使能拉死,这个信号要从测试控制器直接给,不能靠软件寄存器。
2.4 版图与供电:频率稳不稳,一半看这里
ROSC 的电路简单到让人轻视版图,但实测下来,两个同款 ROSC 放在芯片不同位置,读数值差 5% 以上一点都不稀奇。原因基本都在版图和供电上。
第一条是电源。ROSC 的输出频率直接跟它的供电电压挂钩,供电上 10mV 的纹波就能在读数上造成千分之几的波动。所以 ROSC 尽量从专用的模拟电源取电,或者至少从一条相对干净的电源网络分支取,不要和 GPU、DDR 这些大电流开关模块共用一条走线。如果实在只能共用,退而求其次的做法是在 ROSC 的供电入口加去耦电容,并且把 ROSC 的电源走线做成独立分支,避免和数字大电流路径共享阻抗。
第二条是衬底和耦合。ROSC 的环路要远离片上的电感、高速时钟走线、大电流开关路径。我见过一个布局,ROSC 被放在了 DDR PHY 旁边,结果每次 DDR 读写,ROSC 的读数就跟着大幅跳动,那个数据完全没法用。距离上的经验值:至少隔开两三百微米,中间用接地的衬底环包起来。
第三条是匹配。如果设计里有两个 ROSC 需要做比值测量(比如一个被测、一个做参考),版图上必须做对称布局,最好用 common centroid 的方式交叉摆放,周围加 dummy 保持环境一致。否则工艺梯度引入的失配会直接吃进测量结果里,而且这种误差是系统性的,校准都校不掉。
第四条是走线。ROSC 到计数器的连线不要和其他高速信号并行太长,尤其是不要跨越大电流区域。这条连线上的串扰会直接体现为计数抖动。
3. 参数计算:把一个"频率"变成可用的数字
3.1 频率预算怎么估
设计阶段第一件事是估频率,这决定了后面计数器位宽、分频比、窗口长度的选择。方法不复杂:拿目标工艺节点的标准单元延迟表,取 TT 角、标称电压、25℃ 下反相器带典型负载的延迟,套公式 f = 1 / (2 × N × Td)。
举个具体的例子。某个 28nm 级别的工艺,反相器在标称条件下带 2 个单位扇出的延迟大约是 15ps。取 N = 15 级,那么周期是 2 × 15 × 15ps = 450ps,对应频率约 2.2GHz。这个频率偏高,功耗不划算,所以再除一个 16 分频,得到约 139MHz,送进计数器就舒服多了。
但这个估值只能当起点,实际要按工艺角做上下界扫描。同样是 N = 15,FF 角可能跑到 3.5GHz,SS 角可能只有 1.4GHz,中间差 2.5 倍。这个跨度必须在计数器位宽设计时考虑进去,否则慢角下计数器不够宽、快角下计数溢出,两种翻车方式都很尴尬。
心得:频率上界的估计要留 30% 余量。我第一次做的时候按 TT 估了个整数,结果 FF 角测试芯片回来,计数窗口内直接溢出了,只能临时把窗口砍掉一半,白白损失了一位有效分辨率。
3.2 计数窗口与分辨率
这是整个 ROSC 系统里最需要算清楚的一环。测量原理是:在固定的时间窗口 Tw 内,数 ROSC 经过分频后的周期数 C = f_div × Tw。当频率发生 Δf 的变化,计数变化量是 ΔC = Δf × Tw。
由此可以定义一个"相对分辨率":一个 count 对应的频率相对变化是 1/C = 1/(f_div × Tw)。假设 f_div = 139MHz,窗口 Tw = 1ms,那么 C ≈ 139000,单 count 对应的相对分辨率约 7.2ppm。这个精度对温度测量来说绰绰有余——ROSC 的频率温度系数通常在 -0.1% 到 -0.3% /℃ 量级,也就是每摄氏度对应 1000 到 3000ppm,远远大于 7.2ppm 的分辨率。
但这只是理论分辨率,实际受限于噪声。ROSC 有周期抖动,参考时钟也有抖动,计数器采样时刻有不确定性。综合下来,单次测量的实际噪声可能比理论分辨率大一到两个数量级。解决办法很直接:在一个较长的窗口内做滑动平均,或者连续测多次取均值。比如测 16 次取平均,噪声能压下去 4 倍,代价是响应时间变成 16 个窗口。
窗口长度的选择是个典型权衡:窗口越长分辨率越高,但响应越慢,捕捉不到快速的电压跌落;窗口越短响应越快,但噪声大。做 PVT 监测通常取 0.5ms 到 10ms;做 droop 检测要取到微秒甚至纳秒量级,这时候分辨率就完全谈不上,只能用来判断"掉没掉"。
| 应用场景 | 典型窗口 | 分频比 | 单次分辨率量级 | 主要矛盾 |
|---|---|---|---|---|
| 温度监测 | 1~10ms | 16~64 | 个位数 ppm | 校准精度 |
| 电压监测 | 100μs~1ms | 16 | 几十 ppm | 噪声 |
| droop 检测 | 10ns~1μs | 1~4 | 千 ppm | 响应速度 |
| 老化监测 | 秒级累计 | 64 | 亚 ppm | 长期漂移 |
3.3 温度读数是怎么算出来的
很多人以为 ROSC 能直接测温度,其实不是。它能给的只有一个频率,要变成温度,必须有一套换算模型,而这个模型来自校准。
最常见的做法是两点校准加线性拟合。在出厂测试时,把芯片放到温箱里,分别在两个已知温度(比如 -20℃ 和 85℃)下记录计数值 C1 和 C2,存进片上的一次性可编程存储里。芯片工作时读到 C,用插值算出温度:T = T1 + (C - C1) × (T2 - T1) / (C2 - C1)。
这个线性模型的有效性取决于 ROSC 的温度特性有多接近直线。在大多数成熟工艺上,常温到高温段线性度还不错,误差能压到 ±2℃ 以内;但低温段开始出现弯曲,尤其是先进节点在低电压下的温度反转现象——温度升高时,阈值电压下降让器件变快,但迁移率下降让器件变慢,两者竞争的结果可能是在某个电压点上温度系数由负变正。一旦进入这个区域,单条直线的模型就彻底失效了,必须做分段拟合或者二阶拟合。
我建议校准点至少取三个,中间那个点用来验证线性度,如果中间点的残差超过预期,就说明必须升级到分段模型。多测一个点的成本在量产测试里几乎可以忽略,但省下的硅后返工麻烦非常可观。
3.4 一套完整的配置实例
把前面的东西拼起来,给一套可以直接抄的参数组合。目标:通用 PVT 监测,工艺 28nm 级别,供电 0.9V。
ROSC 本体取 15 级单端反相器链,NAND 门做使能断点,输出后接 16 分频,得到百 MHz 量级的信号。计数器设计 24 位,理论最大计数 1677 万,按 139MHz、1ms 窗口算实际用到约 13.9 万,位宽余量巨大——这么设计是为了兼容某些需要长窗口的低速模式。
参考时钟用 1MHz,来自带隙基准分频,精度优于 ±1%。窗口由参考时钟的 1000 个周期构成,正好 1ms。计数器在窗口起点清零、终点锁存。
建成时间配 256 个分频后周期,约 1.8μs。校准点取 -40℃、25℃、125℃ 三点,采用分段线性。老化监测用秒级窗口,每秒累计一次,累积 3600 次做一次长期趋势记录。
| 参数 | 取值 | 说明 |
|---|---|---|
| 环路级数 | 15 | 兼顾频率与面积 |
| 分频比 | 16 | 降功耗、便于计数 |
| 标称输出频率 | ≈139MHz | TT 角 0.9V 25℃ |
| 频率工艺跨度 | 约 60~350MHz | SS 慢角到 FF 快角 |
| 计数窗口 | 1ms | 1000 个 1MHz 参考周期 |
| 计数器位宽 | 24 bit | 兼容长窗口模式 |
| 起振等待 | 256 周期 | 保证读数稳定 |
| 典型功耗 | 十几 μW | 含分频与计数 |
| 典型面积 | 几百 μm² | 不含电源走线 |
4. 从 RTL 到硅片的实操流程
4.1 规格定义阶段要把哪些事钉死
ROSC IP 的规格书通常很短,但有几个点必须在第一版就写死,否则后面改起来牵扯面很大。
第一个是接口协议。用 APB 还是自定义寄存器接口,地址空间多大,是否需要中断输出。我的建议是永远至少给一个"阈值越界中断",因为绝大多数应用最终都会变成"平时不读,越界才读",没有中断的话软件要轮询,功耗和实时性都很难看。
第二个是参考时钟来源。ROSC 的测量精度上限完全由参考时钟决定。如果片上没有可靠的参考时钟,ROSC 就只能做相对测量(自己和自己比),做不了绝对测量。这一点在项目早期一定要和应用方对齐,我见过做完才发现没参考时钟,最后只能拿系统主时钟凑合,精度直接掉一个档次。
第三个是数量与位置。放几个 ROSC、分别放在哪些物理区域。这个要等 floorplan 出来才能定,但规格阶段要明确"支持 N 个实例"的架构,包括寄存器映射怎么扩展、读回数据怎么打包。
第四个是校准数据的存放方式。一次性可编程存储、熔丝、还是外挂?存在片上就要考虑读出接口和可靠性;存储在外就要考虑怎么关联,别到时候几十万颗芯片的校准数据对不上号。
4.2 数字与模拟的协同:电源域、隔离与 DFT
ROSC 虽然大部分是数字单元,但它的行为和模拟量强相关,所以在后端流程里必须当作"半个模拟模块"对待。
电源域要单独规划。理想情况下 ROSC 挂在一个常开的、干净的电源域上,不要跟着 CPU 核一起被关断。因为 PVT 监测最需要用的时刻,往往就是某个域刚被唤醒、电压还没稳的时候。如果 ROSC 跟着一起断电,那关键时刻就什么都测不到。
隔离单元不能省。ROSC 电源域和主数字域之间的电平信号,要过隔离单元,避免一侧掉电时另一侧浮空漏电。
DFT 的处理前面提过,这里补充细节。除了测试模式拉死使能,还要考虑扫描链插入时不要把 ROSC 内部的分频器、计数器打散到不同的链上导致时序混乱。常规做法是给这个 IP 加一个 wrapper,扫描时整个 IP 旁路,只在功能模式下工作。同时要确保旁路之后,IP 的输出端口有确定的驱动值,不能悬空。
时序约束要单独写。ROSC 输出是异步的,必须在约束里把它设为伪路径或者做同步处理,绝不能让它进普通时序分析。同时给同步器加 set_max_delay 约束,保证同步失败的概率可控。
4.3 校准:出厂一次,上电一次
校准分两级,缺一不可。
出厂校准在晶圆测试或者成品测试时做,目的是消除工艺偏差带来的个体差异。做法是把芯片置于已知环境,测量 ROSC 读数,把校准系数写进非易失存储。这一步的精度直接决定了后续所有读数的绝对精度,所以测试程序里的温度稳定时间、测量等待时间都要留足。
上电自校准在每次上电时做,目的是消除本次上电时的初始状态偏差,比如起振相位、供电爬升的残留影响。最简单的做法是上电后丢弃前若干个窗口的读数,然后连续测若干次取中位数作为基准。这一步不需要外部环境配合,成本极低,但对抑制偶发的异常读数非常有效。
经验:校准流程里最容易出问题的是"被测芯片和测试机之间的热平衡"。我遇到过一次量产数据整体偏移 5℃,查了很久才发现是测试座的热阻导致芯片实际温度比测试机显示的低。后来在测试程序里加了一段额外的稳定等待,问题才消失。
4.4 硅后验证与量产数据回读
硅回来之后,验证 ROSC 的第一件事不是看精度,而是看它到底振不振、频率在不在预期范围内。用示波器或者片上其他模块抓一下分频后的输出,确认频率落在 TT 估值的 ±40% 区间内。如果完全没输出,先查使能、再查电源、最后查版图有没有把环路接错。
频率正常之后,再做 PVT 扫描。用外部电源扫描电压,用温箱扫描温度,记录计数值随两者的变化曲线。这一步拿到的数据决定了校准模型能不能用。重点看两件事:曲线是不是单调,斜率是不是和仿真在一个量级。如果斜率差得远,多半是版图寄生或者供电阻抗的问题。
量产阶段,建议把每颗芯片的校准值和几组标称条件下的读数一起记录下来,形成一份"健康基线"。后续做老化监测、做现场失效分析时,这份基线就是唯一可比对的参照。没有基线的老化数据基本没有价值,因为你不知道它出厂时是多少。
5. 常见问题与排查实录
5.1 频率偏差超标怎么查
硅后最常见的抱怨是"读数比仿真低/高十几个百分点"。这个问题我按优先级排了个排查顺序。
先看电源。用片上的电压监测或者外部探针确认 ROSC 供电的实际值,很多时候仿真按 0.9V 跑,实际到片上只有 0.85V,频率自然低一截。这个原因占比最高,而且最好查。
再看版图寄生。把 ROSC 环路的提取寄生参数带进后仿,重新跑一遍。如果后仿频率本来就偏低,那说明前仿是理想化的,属于预期之内,改校准表就行。
然后看温度。测试环境温度是不是和仿真假设一致。有些测试座在长时间运行后会发热,芯片结温比环境高十几度。
最后看工艺角。拿几颗不同批次的样片对比,如果偏差方向一致、幅度接近,那就是工艺角偏移,属于正常范围;如果同一批次内部离散度很大,那就是工艺均匀性问题或者版图匹配问题。
5.2 读数抖动、跳变怎么查
抖动问题比偏差难查,因为它往往是间歇性的。
第一步是区分抖动来源。让 ROSC 在没有任何其他模块工作的状态下连续测 1000 次,看抖动幅度。如果静默状态下就抖,那是 ROSC 自身或者参考时钟的问题;如果只有其他模块工作时才抖,那是电源或者衬底耦合。
第二步看抖动频谱。把计数值序列做个简单分析,看抖动是不是和某个周期性事件(比如 DDR 刷新、CPU 调度周期)相关。相关性一旦找到,基本就锁定干扰源了。
第三步检查同步器。如果抖动是大幅度的、偶发的,很可能是跨时钟域同步失败。加大同步器级数、或者在同步器前加一级握手,通常能解决。
第四步检查参考时钟。参考时钟本身的抖动会直接乘进测量结果。用示波器看一下参考时钟的相位噪声,如果它的抖动已经接近测量分辨率,那 ROSC 再怎么改也没用,得先修参考时钟。
5.3 常见问题速查表
| 现象 | 可能原因 | 排查动作 | 处理方式 |
|---|---|---|---|
| 完全无输出 | 使能未生效、环路断开、电源未上 | 查使能信号、量供电、查 NAND 连接 | 修 RTL 或版图 |
| 频率整体偏低 | 供电不足、后仿寄生大、温度高 | 量实际供电、跑后仿、量结温 | 更新校准表或改供电 |
| 读数间歇性跳变 | 电源耦合、同步失败、参考时钟抖动 | 静默对比测试、查频谱相关性 | 加去耦、加同步级数 |
| 不同位置读数差异大 | 版图失配、局部压降 | 对比各实例读数与供电 | 优化供电网络、加匹配 |
| 扫描测试功耗超标 | 测试模式未关断 ROSC | 查 DFT 控制信号 | 测试模式强制关断 |
| 高温读数不单调 | 温度反转、校准模型失效 | 全温区扫描 | 改分段或二阶模型 |
| 老化后读数漂移大 | 器件退化、校准数据过期 | 对比出厂基线 | 定期重校准或修正模型 |
6. 几条踩过坑才明白的经验
第一条,别指望 ROSC 给你绝对值。它的天职是给趋势和相对变化。任何要求"ROSC 直接读出 ±0.5℃ 精度"的需求,我都会先问一句"能不能接受相对变化"。如果不能,那得上专门的温度传感器,ROSC 只能做辅助校验。
第二条,校准数据一定要和芯片唯一标识绑定。我见过一个项目,校准数据是按批次存的,结果批次内部离散度超预期,整批读数的误差都超标。按颗存虽然麻烦,但它是唯一可靠的方式。
第三条,ROSC 的读数要配"可信度标志"。至少包含三个状态:正常、起振未完成、参考时钟异常。没有这三个标志,上层软件拿到一个异常值也没法判断该不该信。这个设计成本极低,但在失效分析时价值巨大。
第四条,做熵源的版本和做传感器的版本一定要分开。前者的设计目标是抖动大、不可预测;后者的设计目标是抖动小、可重复。用同一套配置两处都用,最后两边都不满意。
第五条,留一个旁路通道。让 ROSC 的输出可以被强制旁路成已知频率的时钟,用于硅后调试时快速判断是 ROSC 本身的问题还是后级计数器的问题。这个功能平时用不上,出问题的时候能省掉好几天。
最后分享一个小技巧:如果项目里 ROSC 实例比较多,建议在寄存器映射里给每个实例留一个"原始计数值直读"寄存器,绕过所有校准和换算逻辑。硅后调试的时候,直接读这个原始值做对比,能最快看出问题出在校准环节还是采集环节。这个寄存器在正式版本里可以留着,不影响功能,属于典型的一劳永逸型设计。