Self-Refresh时序关键参数解析:tRAS、tRP、tRC、tRFC
好,咱们进入正题。Self-Refresh 能不能稳定工作,说白了就看你那几个时序参数设没设对。不少人做低功耗设计时,总盯着电流降了多少,时序却放水了。结果一进 Self-Refresh 就丢数据,或者退出来时直接挂掉。嗯,这章咱们就把最核心的几个参数拆开揉碎讲清楚。
tRAS:行激活时间,别急着关门
tRAS 的全称是 Row Address Strobe Active Time。意思是从你打开一行,到你能关闭它之间的最短时间。
- 太长:页面一直开着,漏电大。
- 太短:存储单元还没完全恢复,数据就没了。
我个人习惯是把 tRAS 看成“充电时间”。你打开一行,每个 bit 的电容都需要时间充满。没充满就关,读取时电压抖动一下,直接翻车。我记得有一次查数据丢失问题,最后定位到就是因为 tRAS 设小了 2ns,量产中出现偶发失效。
tRP:预充电时间,别急着开门
tRP 是行预充电时间。关闭当前行之后,要等一会才能打开下一行。
为什么呢?因为预充电本质上是把位线电压拉平,再次回归到参考电平 Vref/2。如果 tRP 不够,位线还没均衡好,下一行打开后读出来就是错的。
你想想看,DRAM 之所以叫动态,就是因为它天然需要保持一个稳定的参考。tRP 太短,参考电平乱飘,后续所有操作都受影响。我曾经历过一次回调,发现 controller 把 tRP 设成了 spec 下限,结果在高温 85°C 下频繁出错。改了参数就恢复了。
| 参数 | 我叫它 | 主要影响 | 容易犯的错 |
|---|---|---|---|
| tRAS | 充电时间 | 数据保持完整 | 设太小,低温没事,高温翻车 |
| tRP | 均衡时间 | 下一行读取正确 | 贴下限,高温噪声引入错误 |
| tRC | 行周期 | 刷新速率 | 忽略 tRC = tRAS + tRP 约束 |
| tRFC | 刷新循环 | Self-Refresh 周期最短间隔 | 设太小,刷不过来丢数据 |
tRC:行周期时间,锁死刷新节拍
tRC 就是同一行两次有效操作之间的最短间隔。说白了,一行刚被预充完,你不能立刻激活它。
tRC = tRAS + tRP。
这个公式不是约等于,是下限。你可以设更长,但不能设更短。不少新手只看 tRAS 和 tRP 各自满足规范,忽略了它们的和必须 ≤ tRC。我就遇到过一个设计,内部状态机把 tRC 写死成 55ns,tRAS 35ns + tRP 25ns = 60ns,直接违约。后来靠 ECO 改了控制器才救回来。
tRFC:刷新循环时间,Self-Refresh 的呼吸节奏
tRFC 是刷新一本行(多个 Bank 并发刷新)所需的最短时间。它是所有参数里最影响 Self-Refresh 功耗的。
为什么?因为 Self-Refresh 期间,DRAM 内部的刷新定时器会自动触发刷新。每次触发,都要用掉 tRFC 这么长的时间。期间部分电路是工作的,不省电。tRFC 越大,每次刷新占用的时间越长,平均功耗就越高。
我习惯把 tRFC 看成“刷新肚子里的消化时间”。你得给它完整的时间把整批行刷完,中间不能插入任何读写或别的刷新操作。
- 设小:刷不完,电荷漏光,数据丢失。
- 设大:功耗浪费,刷新间隔拉长,容易触发 TDie 温度升高。
我记得有一次做低功耗 IoT 芯片,产品要求 Self-Refresh 电流低于几十微安。我花了大量精力优化刷新间隔和 tRFC 取值,在工艺角、温度循环下反复验证。最终靠动态调整 tRFC(低温用大间隔,高温用小间隔)通关了。
我的避坑清单
归纳一下,我在这几个参数上踩过的坑,或者见过的同行翻车案例:
- tRAS 踩下限:常温验证全过,高温箱一跑过不了。加 2ns 回来就稳定。
- tRP 忽略温度效应:位线均衡时间在低温下勉强够,高温时噪声耦合变大,参考电平漂移。留够余量。
- tRC 和 tRAS+tRP 没对齐:这是最隐蔽的时序违约点。后仿真都不会报错,但真正操作时状态机能走到你不期望的组合。
- tRFC 没分温度等级:同一芯片在 -40°C 和 85°C 需要的刷新间隔差别很大。固定一个值,要么浪费功耗,要么丢数据。
- Self-Refresh 入口出口时序没管好:退出 Self-Refresh 时,需要保证最近一次刷新完整做完,才允许开始新操作。否则就打破了 tRFC 的完整性。
参数关系图
下面这张图,我把四个参数的时序关系画出来了。你可以看到从激活开始,到预充完成,再到下一次激活,以及中间穿插的刷新循环。
实际项目中,我建议在验证 Self-Refresh 时序时,不要只对着 spec 表格静态检查。最好做一个 UVM 验证用例,动态注入最坏情况:比如刚进入 Self-Refresh 立刻退出的边界,或者在温度跳变过程中刷新间隔被压缩的瞬间。那种 bug 仿真跑 1000 次未必抓到一次,但芯片回来一用就暴露。