自刷新(Self-Refresh)的基本概念与作用
说起自刷新,很多刚入行的朋友第一反应是:这不就是DRAM刷新吗?嗯,没错,根上确实是一回事。但在芯片设计里,尤其是SoC中挂着一块SRAM或者伪静态RAM的时候,自刷新就有它专门的讲究了。
我刚开始做低功耗芯片那会儿,有一次在验证一个IoT芯片的睡眠模式,发现唤醒后SRAM里的数据全乱了。查了三天,最后发现是自刷新保持时间没给够,控制器没等SRAM内部状态稳定就把时钟切回来了。那次教训让我彻底搞懂了自刷新的本质——它不是一个简单的"定时刷新",而是一整套时序交互过程。
什么是自刷新?
自刷新,说白了就是让存储器在没有外界主动读写的时候,自己把自己内部的数据保住。你想想看,不管是DRAM还是某些类型的SRAM,它们的存储单元本质上都是靠电容或小电荷保持状态的。时间一长,电荷会漏掉,数据就丢了。所以要定期"刷"一下,把数据重新写回去。
在数字芯片里,自刷新通常出现在两种场景:
- 片外DRAM接口——比如DDR控制器进入自刷新模式,让DRAM自己管理刷新时序,主控可以睡大觉。
- 片内嵌入式存储器——比如某些伪静态SRAM(PSRAM)或基于DRAM单元的嵌入式存储,在休眠模式下需要自刷新电路维持数据完整性。
我个人习惯把自刷新理解成"内存的呼吸":正常工作时,主控负责吹气(读写);进入睡眠后,内存得自己喘气(自刷新)。喘气节奏慢了,数据就憋死了。
为什么需要自刷新?
问你一个问题:芯片进入低功耗模式后,时钟关了,核心电压降了,那片上存储器的数据凭什么还在?
答案就是——自刷新专门为低功耗场景设计。它的核心作用有这几点:
- 数据保持:在时钟停摆、主控制器休眠期间,通过内部定时器周期性产生刷新操作,防止存储单元漏电丢失数据。
- 降低功耗:相比正常全速读写,自刷新的操作频率低得多(典型DRAM是64ms刷新4096行,平均周期约15.6µs),功耗可以降到正常工作的1/10甚至更低。
- 简化系统控制:一旦进入自刷新模式,主控不用再操心跳过正常请求去插入刷新周期,省掉了复杂的调度逻辑。
我在一个车规级项目里遇到过个坑:芯片从自刷新退出时,数据是保住了,但SLP(睡眠退出)信号和自刷新完成信号之间的保持时间没满足,导致存储器控制状态机跳错,部分存储单元被意外写坏。这种问题在仿真里很难跑出来,因为仿真默认理想时序,实际芯片里一堆工艺偏差。
自刷新的基本过程
别看自刷新听起来挺智能,它的过程其实就三步:
自刷新三步曲
- 主控制器发出自刷新进入请求,等待存储器准备好
- 存储器内部的刷新定时器接管,周期性地对所有行执行刷新操作
- 主控制器退出自刷新时,需要确保最后一次刷新完成、内部状态稳定,再恢复时钟和操作
但这里的关键是时序衔接点。每次自刷新操作都有固定的保持时间要求,比如从刷新命令发出到数据真正被恢复的时间窗口。如果在这个窗口内你动了时钟或者控制信号,数据可能就糊了。
我建议你把自刷新的时序分成三个关键区间来看:
| 区间名称 | 说明 | 典型要求 |
|---|---|---|
| 进入锁定时序 | 从自刷新命令采样到内部刷新状态机稳定 | 通常需要几个时钟周期,保持CKE等信号稳定 |
| 刷新执行时序 | 每行刷新操作的内部维持时间 | 看存储单元特性,一般几十纳秒到微秒级 |
| 退出恢复时序 | 从退出命令到最后一次刷新完成,恢复到正常时钟 | 需要满足tXSR等参数,典型值为几十个时钟周期 |
你想想看,这三个区间里,最容易出问题的就是退出恢复时序。因为这时候时钟正在重启,电压也可能还在爬坡,任何一个控制信号的抖动都会被放大。我曾经碰过一个案例:退出自刷新时,外部时钟恢复早了半个周期,结果内部刷新计数器还没归零,下一次刷新操作被截断,读出来全是乱码。
自刷新与保持时间的关系
前面说的都是概念,现在咱们把核心问题点出来:自刷新的保持时间验证,本质上是在检查存储器内部状态更新与外部控制信号之间的时序裕量。
保持时间(hold time)要求的是数据在采样时钟沿之后必须保持稳定一段时间。正常读写路径上的保持时间,大家一般都会做STA(静态时序分析)。但自刷新路径上的保持时间常常被忽略——因为自刷新是在低功耗模式下发生的,很多EDA工具觉得"时钟都停了还分析什么"。这就是你容易踩的坑。
重要提醒:自刷新保持时间的验证不能完全依赖静态时序分析工具。因为自刷新过程涉及异步域交互(低功耗域与正常域),而且刷新定时器是独立于主时钟运行的。建议结合动态仿真和形式化验证来覆盖自刷新进入/退出时的关键路径。
那么具体需要验证哪些保持时间呢?我列了个清单:
- 自刷新进入命令的保持时间:从CKE拉低到刷新状态机稳定,确保命令被正确识别。
- 刷新操作内部的数据恢复保持时间:每个存储单元从读刷新到写恢复的间隔。
- 退出自刷新时的最后刷新完成保持时间:这个最容易被忽略,它决定了退出后读取的数据是新的还是旧的。
- 时钟重新使能时的保持时间:时钟稳定之前,任何控制信号都不能变化。
自刷新的知识框架
为了让你对整个体系有个直观感觉,我画了一张图。你可以把它看作本章乃至后续章节的导航图:
这张图把自刷新的几个核心维度串起来了。从中间的数据保持原理出发,左边指向刷新定时器(你怎么定刷新周期?),中间指向进入退出协议(你用什么状态机?),右边指向保持时间检查(你的时序裕量够不够?),再往右是指向功耗管理(你怎么切电源域?)。这五个方面就是自刷新验证要覆盖的完整拼图。
自刷新应用场景举例
聊完概念,我给你说两个实际项目里碰到的场景:
场景一:MCU睡眠模式下的片内SRAM自刷新
某MCU有一块32KB的伪静态SRAM,深度睡眠模式下需要保留数据。设计采用内部RC振荡器做自刷新时钟(频率约32kHz),每隔30µs刷新一行。这里的问题在于:RC振荡器精度只有±30%,温度和电压变化时刷新周期可能漂到40µs。如果存储单元的数据保持时间只有35µs(工艺角最差),那就可能会有行来不及刷新,数据丢失。我就是在后仿真的工艺角分析里发现这个问题,把刷新周期安全裕量从20%提到50%才过的。
场景二:DDR3自刷新退出恢复
某个AI加速器芯片用DDR3做帧缓存,系统进入待机时让DDR进自刷新。但芯片里有个电源管理单元把自刷新电压也降了(为了省电),结果退出自刷新后电压还没完全恢复,DDR内部的数据感测放大器工作异常,读出来的比特位有1%的翻转率。这个问题的根因就是自刷新保持时间没有覆盖电压恢复的时序窗口。后来我们在验证计划里单独加了"电压斜坡期间保持时间检查"这个case。
避坑指南
说了这么多,我最后给你总结几条实战经验:
- 不要只看STA报表——自刷新路径上的异步交互,STA默认不会分析。要用仿真把进入/退出的每个状态跳转都拉出来看。
- 注意工艺角组合——自刷新时序受温度影响极大(高温漏电快,低温刷新慢),至少覆盖SS、FF、TT三个角。
- 关注电压域切换——如果自刷新发生在降电压模式,退出时电压恢复的斜率会影响内部逻辑门的门限电压,从而缩短保持时间裕量。
- 检查时钟门控——退出自刷新时,时钟可能不是瞬间恢复的,时钟门控的打开延迟需要被计入保持时间。
嗯,到这我相信你已经对自刷新是什么、为什么需要它、它和保持时间验证的关系有了清晰的认识。下一部分我们会深入到具体的保持时间参数和验证方法上,到时候我会拿几个实际波形拆给你看。