前言
这几天在研究Ramulator的使用,因此先跳过SRAM,整理DRAM的学习笔记。
关于DRAM的工作原理,强烈推荐观看Branch Education的讲解视频,该视频的可视化做得非常优秀。
存储器:DRAM(一)基本单元
DRAM的基本单元
DRAM的基本单元,亦称为Memory Cell。主要有两种,一种是3管单元,另一种是1管单元。其中,1管单元的使用最为广泛。下面我们介绍1管单元。
DRAM的1管单元如下图所示。其中,WL为Word Line,称为”字线“,是地址线;而BL为Bit Line,称为“位线”,是读写数据线。因为一次读一个bit,所以称为Bit Line。
可以看到,1管单元物如其名,只由一个晶体管(见图中M1)组成。此外,我们还可以看到两个电容。一个是位于晶体管一侧的存储电容,用Cs表示;另一个是Bit Line上的寄生电容,用CBL表示。
这样一个单元是如何存储和输出电荷的呢?首先我们要知晓CMOS管(即图中M1)的工作原理。我们先回忆一下中学所学的电路元件:电阻、电容、电感等,这些器件都只有两个端口,一个进一个出。然后我们再看看图中的M1,注意到它和我们中学所学电路元件的不同之处在于:它有三个端口。其中,左右两个端口依然是一进一出,与其他器件无异。第三个端口,也就是上面那个和WL相连的端口,是干什么用的呢?答案是开关。
- 当WL传输高电压(用1或VDD表示)时,M1导通,此时Cs与BL相连;
- 当WL传输低电压(用0或VGND表示)时,M1关闭,此时Cs与BL隔绝。
半导体器件
半导体器件与普通器件的最大区别就在于,半导体器件可以通过电压或电流这两个电学量来控制其电学特性。因此其通常是三端器件,多出来一个端口用于连接控制电压/电流。非专业的读者可以将其简单理解为使用电信号控制的开关。
了解了CMOS的工作原理后,我们来分析一下该单元是如何读写电荷的。
写(Write)
如何往存储电容Cs上写入电荷呢?非常简单。首先我们将位线BL拉至要写入的电平,然后选通字线WL,使Cs与BL之间导通。
此时分两种情况讨论:
-
我们要写入低电压0,即VGND。那么此时VCs被拉至0。
-
我们要写入高电压1,即VDD。由于经过CMOS会有一个阈值损失VTH,导致最终VCs只能被拉到VDD−VTH。解决这个问题也很简单,我们预先把BL线拉至VDD+VTH以抵消阈值损失即可。
读(Read)
读过程是电荷在位线BL与存储电容Cs重新分配的过程。在读之前,位线会先被预充电(Pre-charge)至VPRE(这一步很重要,后面会讨论)。而后WL传输高电压,M1导通。我们记此前Cs上的电压为VCs,导通后位线上的电压为VBL。
重新分配后CBL和Cs上的电荷VBL(Cs+CBL)∴VBL=重新分配前Cs上的电荷VCs⋅Cs+重新分配前CBL上的电荷VPRE⋅CBL=Cs+CBLVCs⋅Cs+VPRE⋅CBL(1)
为什么要预充电?
由于CBL实际上同一条BL线上几十个基本单元的源漏寄生电容,也就是说CBL≫Cs,导致仅凭Cs难以将处于任意电位的CBL拉到0或1。举个例子,原来BL线的电平为1,VCs=0,由于Cs比CBL弱,谁拉谁不好说,最终大概率反而是VBL把VCs拉到1。不仅没把0读出来,还把它破坏了。
因此我们一般统一给BL线设置一个初始电压,并且VPRE一般取2VDD。这样一来,只要VCs=0,VBL就更加靠近0;反之更加靠近1。实现了0和1的区分。
此时VBL关于VCs存在两种情况:
-
Cs原先存储的电压为1,即VCs=VDD。若考虑写入过程经过CMOS的阈值损失VTH,则为VDD−VTH。那么
VBL=Cs+CBLVDD⋅Cs+VPRE⋅CBL
-
Cs原先存储的电压为0,即VCs=VGND。代入(1)式:
VBL=Cs+CBLVGND⋅Cs+VPRE⋅CBL
灵敏放大器(Sense Amplifier)
考察BL线前后的电平变化ΔV
由(1)式可得:
ΔV=VBL−VPRE=Cs+CBL(VCs−VPRE)⋅Cs=1+CsCBL(VCs−VPRE)
数字电路往往不允许亚稳态的出现,我们希望VBL要么是0,要么是1。这就要求ΔV尽量大,即CsCBL就得尽量小。然而正如前文所说,CBL≫Cs,这就导致最终VBL往往仅比VPRE=2VDD大一点或小一点,这是不符合数字电路的要求的,我们要是DRAM我们肯定也不好意思把这么个东西交给CPU。
怎么办呢?设计者们在BL线加一个灵敏放大器(Sense Amplifier),用于将该电平拉到严格的0或1。
此外,我们可以观察到,在读取数据以后,VCs=VBL,原来存储的数据被破坏了。这是DRAM独有的“破坏性读取”。想要解决这一问题也很简单,只要将灵敏放大器放大后的电压写会Cs即可。
周期性刷新(Refresh)
由于DRAM的1管单元仅采用一个无源电容来存储电荷,很容易漏电,因此需要周期性地充电来保持存储电容存储的数据。JEDEC(Joint Electron Tube Engineering Council)指定了一个标准,DRAM的刷新时间间隔tREF≤64ms。
如何周期性刷新呢?注意到前文描述的读过程有一个“写回补偿”的阶段,该阶段会将灵敏放大器放大后的电压(标准的0或1)重新写回到Cs上。因此要想刷新Cs上的数据,我们只需要对所有Cs重新读一遍。当然,由于CPU并没有发出请求,DRAM并不需要真的把数据"读"出来送到bus上。因此周期性刷新时间只是读时间的32左右。