大家好,欢迎来到IT知识分享网。
Refresh,刷新是 DRAM 的一项重要特性,又被称为动态刷新(Dynamic refresh),而 Dynamic 就是 DRAM 中的 ‘D’ 所代表的意思。DRAM 刷新与其结构息息相关。
DRAM 基本结构
我们知道 DRAM 使用电容 充电/未充电 两个状态来分别表示二进制的 1/0 符号。
拿小学数学题中的常客——水池来打比方,电容是一个水池,晶体管是这个水池的阀门。
小明是一个记忆只有 7 秒的熊孩子,数字他统共就认识两个: 0 和 1。每次需要记下一个数字时,如果是 1 小明就用水装满池子( 1’b1 ),如果是 0 就把水全部放走( 1‘b0 )。非常不爱惜水资源,大家不要学他。
单个 DRAM 基本单元由一个电容和一个晶体管构成,称为 1-T 结构,请注意图中右边出现的第二个电容 CBL 并不是有意制造在存储单元中的,它其实是控制线 BL 的寄生电容。
相较于由 6 个或者更多晶体管组成的 SRAM, DRAM 具有结构简单的优点。简单的结构能够降低制造难度和提高良率,说中文就是:更便宜!
但是,命运馈赠的礼物,都早已在暗中标好了价格,DRAM 也不例外。单个电容和晶体管的简单结构有一个棘手的问题:漏电流。
不紧的阀门:漏电流
小明の记忆水池工作的关键在于有一个紧密不漏水的阀门。如果水池阀门漏水,那么小明面对一个干涸水池的时候,他是懵逼的:到底是本来没水( 1‘b0 ),还是本来有水但是全流光了( 1’b1 )?
不幸的是, DRAM 中的晶体管就是一个漏水的阀门。
由于制作工艺的影响,或者说这个世界上原本就不存在完美的晶体管,能够一丝不苟地实现开关功能,保证关断时没有电流流过。这些在关断时流过的电流称为漏电流,leakage current。
在没有任何 DRAM 操作的情况下,漏电流也会导致电容上的电荷随着时间流失。当电荷数量低于阈值时,DRAM 将无法正确地读取所存储的 1/0 数据。此时,数据就被没了(corrupt the data)。
DRAM 刷新
为了防止数据被破坏,为了使 DRAM 这一更廉价的存储介质可以得到普及,DRAM 设计中加入了动态刷新机制。
DRAM 刷新过程中,首先读取原本的数据,将电容的电平与参考电平进行比较,判断数据的 1/0 值后,再将原数据写回。写回的过程中将电容完全充满电荷(如果数据为 1),好比进行了一次充电操作。
DRAM 刷新每间隔一段时间进行一次,对随时间流失的电荷进行补充。
间隔的时间不能太长,间隔太长可能导致刷新时数据电平已经无法辨认。但间隔的时间也不能太短,因为充电期间不能进行正常的读写,过于频繁的刷新会导致 DRAM 的吞吐性能下降。
一般来说,间隔时间的下限由 DRAM 本身的属性决定,比如 DRAM 的容量密度、运行频率等。而间隔时间上限则由性能吞吐的需求决定。
DRAM 刷新命令
DRAM 刷新由控制器 (MC) 和 DRAM 颗粒内部电路共同实现。 MC 以发送刷新命令的方式通知 DRAM 颗粒进行刷新;DRAM 颗粒内部电路则负责进行刷新操作。这里我们重点来看 MC 侧的刷新命令发送部分。
刷新命令,Refresh Command,DRAM 命令代号为 REF。表示 REF 的 DRAM bus 信号真值表为:
如果你是第一次看到这张经典的 DRAM 命令真值表,那正好借此机会介绍一番:
H、L 标识的信号在该 DRAM 命令中必须为高或者低电平;
X,V 标识的信号在该命令中都不起任何作用,可以为任何值。区别在于 V 表示信号可以为高电平或者低电平。X 更近一步,信号还可以为悬空值(float)。
用 OP Code 等具体名称标识的信号是命令的一部分,它们的值用于表示命令的某个字段的值;
比如发送 REF 命令时,CS_n 必须为低电平,ACT_n 信号必须为高电平。而 Ax 地址信号可以为高,也可以为低电平。
DRAM 刷新时序参数
REF 不是一个持久性(persistent)命令,需要间隔一个平均周期循环发送,这个周期称为 tREFI。tREFI 与 DRAM 容量密度和工作温度有关。
REF 命令发出后,DRAM 内部电路会对所有存储单元进行刷新,这需要一些时间,称为 tRFC, Refresh Cycle Time。在此期间不能向 DRAM 发出任何有效命令。tRFC 与 DRAM 容量密度和工作频率有关。
tREFI 和 tRFC 是 REF 命令唯二的时序参数,可以用以下的时序图表示:
图中,REF 命令与其他有效命令(VALID 表示)的最小间隔为 tRFC,两个 REF 命令之间的最小间隔也需要大于 tRFC,这段时间用于等待刷新操作完成。
两个 REF 命令之间的间隔一般等于 tREFI,但为什么图中标出的最大间隔为 9*tREFI ?这是因为 DDR 支持超前/延后刷新命令这一机制。
超前/延后刷新命令
一般而言,REF 命令两两之间保持着相同的车距,等周期间隔 tREFI。但是正如前文所提到的,在大吞吐量的场景中,频繁的刷新命令会降低吞吐效率。
超前/延后刷新命令机制可以在不改变刷新命令总数的情况下,拉开 REF 命令之间的间距,从而提高密集 DRAM 读写期间的效率。
最多可以抽取 8 个 REF 命令,提前或者延后进行,因此两个 REF 命令之间的最大间隔为 9 tREFI。
结语
本文从 DRAM 的基本结构出发,讨论了 DRAM 需要刷新的原因以及刷新的过程。基于 DDR4 标准讨论了 REF 命令、刷新相关的时序参数以及超前/延后刷新命令机制。
在 DDR 的命令真值表中还存在着另一个与刷新相关的名词,Self Refresh,自刷新。
而所谓”自“刷新,即无需控制器发出刷新命令,DRAM 也会基于内部的定时器进行定时刷新。那么在哪些场景下会使用到自刷新特性呢?
笔者理解有两种典型的情况
- 系统异常掉电。
因为现代系统中 DRAM 采用一路独立电源供电(V_DDR),区别于系统剩余部分的电源(V_CORE)。所以,当系统的其余部分因为故障或者受到外部条件影响掉电(Power down)或者崩溃时, DRAM 仍能够保存数据。
但是由于控制器已经掉电, DRAM 无法继续收到刷新指令,如果系统不能马上恢复,数据仍然将会丢失。因此,系统在检测到掉电时,比如在 power down 中断中,可以使 DRAM 进入自刷新状态以保护数据。更近一步,系统还可以将掉电时的状态信息存入 DRAM,用于调试系统掉电故障。
当然如果是整个系统的外部电源掉电了,那就没什么好说的了,肯定全玩完了。
- 系统进入低功耗模式。
当系统进入深度睡眠状态以节约电能消耗时,不会产生 DRAM 读写请求。此时使用控制器来维持 DRAM 状态已经没有必要。因此可以关闭控制器,并停止 DRAM 的外部时钟,使用自刷新状态来维持 DRAM 中的数据,以节约电能。
低功耗自刷新模式
DDR4 支持多种低功耗自刷新模式,以适应不同的工作温度。这里主要考虑到高温对于漏电流的促进作用,在高温下需要提高刷新的密度,以防止潜在的数据丢失。
那么在工作温度不高的低功耗场景中,则可以适当减少刷新的密度,多少也能省点电。蚊子腿也是肉啊。
如果温度范围发生了变化,可以通过先退出当前的自刷新状态,切换自刷新模式,重新进入自刷新状态这样一个流程切换模式。
DDR4 定义了一种自动刷新模式 (ASR) 减少上层应用的麻烦。在 ASR 中 DRAM 会自动根据工作温度调整刷新密度,这应该需要 DRAM 内置温度传感器来实现。
自刷新命令
进入/退出自刷新状态分别使用 SRE/SRX 命令。
SRE 命令
SRE 命令要求控制器置低 CKE、CS_n、RAS_n、CAS_n,置高 ACT_n、WE_n。
Before SRE
在进入自刷新,DRAM 必须处于 IDLE 状态
- 所有 BANK 已经完完全全关闭
- 所有先前的命令已经完全结束
- 没有传输中的数据
- CKE 信号为高
After SRE
CKE 信号保持为高,使 DRAM 处于自刷新状态。所以我们一般可以通过 CKE 的电平判断 DRAM 是否处于自刷新状态。
DRAM 在自刷新期间, 只在乎 CKE 信号(什么时候退出自刷新)和 RESET_n 信号 (什么时候复位),其他信号一概不在乎,包括外部输入的时钟信号。
SRX 命令
SRX 命令使 DRAM 退出自刷新状态,SRX 有两种实现方式:
- CKE 置低一个周期后置高,置高 CS_n。
- CKE 置低一个周期后置高,置低 CS_n,置高 ACT_n、WE_n、RAS_n、CAS_n。
其中前者只能在 Max Power Saving 模式中使用。
Before/After SRX
和进入时一样,退出自刷新状态时我们必须满足一定条件:
在发送 SRX 命令前,
- 恢复稳定的外部时钟输入,如果自刷新期间时钟关闭的话。
在发送 SRX 后,
- CKE 信号需要保持为高,直至完全退出自刷新状态。
- SRX 命令之后的第一条命令,需按照该命令是否使用 DLL 满足一定时序。
- 在 SRX 命令与下一次 SRE 命令之间必须有至少一条 REF 命令。
DRAM 自刷新相关时序
上图是 Specification 中关于自刷新的时序图,一上来就看这张图可能信息量比较大。我们可以分成几个阶段来看。
阶段一 SRE 之前
tRP
这里假设 SRE 之前是一个 PRE 命令,SRE 命令必须与之间隔 tRP 以上,以确保进入自刷新状态时,所有的 Bank 都已经真正被关闭了。
阶段二 Self Refresh 期间
tCPDED
与自刷新无关
tCKESR
一次自刷新至少要持续的时间。在 DDR4 中一般为 5ns+ 1 个时钟周期。(JESD79-48 P231)
tCKSRE/tCKSRX
在进入自刷新后,外部时钟可以停止输入以减少功耗。但是,自刷新期间停止的外部时钟输入,必须在退出自刷新前 tCKSRX 时间重新启动并稳定。
阶段 SRX 之后
tXS
tXS 是 SRX 命令距离第一个有效命令的间隔时间,按照有效命令是否需要 DLL 可分为两种类型。(下图为了便于理解有略微修改)tXS 的数值为 tRFC + 10ns。
tXS_fast 和 tXS 代表那些无需 DLL 的命令距离 SRX 命令的间隔,具体 tXS/tXS_fast 分别对应的命令可以查看 JESD70-4B 的 4.27。
tXSDLL 代表需要 DLL 的命令与 SRX 命令的间隔,基本上也就是各类读命令。
结语
本期我们讨论了 DRAM 的自刷新特性,以及一些相关的时序与细节。总的来说有三点需要了解:
- 自刷新状态用于在系统异常掉电或者低功耗状态下,保持 DRAM 中的数据。
- 自刷新状态需要根据工作温度选择不同模式,发出足够密度的自刷新命令,以维持数据。
- tXS 是自刷新相关的重要时序参数,代表有效命令与 SRX 命令的间距。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/146728.html