存储器:DRAM(一)基本单元

前言

这几天在研究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。

image-20240417171255056

可以看到,1管单元物如其名,只由一个晶体管(见图中M1)组成。此外,我们还可以看到两个电容。一个是位于晶体管一侧的存储电容,用CsC_s表示;另一个是Bit Line上的寄生电容,用CBLC_{BL}表示。

这样一个单元是如何存储和输出电荷的呢?首先我们要知晓CMOS管(即图中M1)的工作原理。我们先回忆一下中学所学的电路元件:电阻、电容、电感等,这些器件都只有两个端口,一个进一个出。然后我们再看看图中的M1,注意到它和我们中学所学电路元件的不同之处在于:它有三个端口。其中,左右两个端口依然是一进一出,与其他器件无异。第三个端口,也就是上面那个和WL相连的端口,是干什么用的呢?答案是开关

  • WL\text{WL}传输高电压(用11VDDV_{DD}表示)时,M1导通,此时CsC_sBL\text{BL}相连;
  • WL\text{WL}传输低电压(用00VGNDV_{GND}表示)时,M1关闭,此时CsC_sBL\text{BL}隔绝。

半导体器件

半导体器件与普通器件的最大区别就在于,半导体器件可以通过电压或电流这两个电学量来控制其电学特性。因此其通常是三端器件,多出来一个端口用于连接控制电压/电流。非专业的读者可以将其简单理解为使用电信号控制的开关

了解了CMOS的工作原理后,我们来分析一下该单元是如何读写电荷的。

写(Write)

如何往存储电容CsC_s上写入电荷呢?非常简单。首先我们将位线BL\text{BL}拉至要写入的电平,然后选通字线WL\text{WL},使CsC_sBL\text{BL}之间导通。

此时分两种情况讨论:

  • 我们要写入低电压00,即VGNDV_{GND}。那么此时VCsV_{C_s}被拉至00

  • 我们要写入高电压11,即VDDV_{DD}。由于经过CMOS会有一个阈值损失VTHV_{TH},导致最终VCsV_{C_s}只能被拉到VDDVTHV_{DD}-V_{TH}。解决这个问题也很简单,我们预先把BL\text{BL}线拉至VDD+VTHV_{DD}+V_{TH}以抵消阈值损失即可。

读(Read)

读过程是电荷在位线BL\text{BL}与存储电容CsC_s重新分配的过程。在读之前,位线会先被预充电(Pre-charge)至VPREV_{PRE}(这一步很重要,后面会讨论)。而后WL\text{WL}传输高电压,M1导通。我们记此前CsC_s上的电压为VCsV_{C_s},导通后位线上的电压为VBLV_{BL}

VBL(Cs+CBL)重新分配后CBLCs上的电荷=VCsCs重新分配前Cs上的电荷+VPRECBL重新分配前CBL上的电荷VBL=VCsCs+VPRECBLCs+CBL(1)\begin{align} \underbrace{V_{BL}(C_s+C_{BL})}_{重新分配后C_{BL}和C_s上的电荷}&=\underbrace{V_{C_s}\cdot C_s}_{重新分配前C_s上的电荷} + \underbrace{V_{PRE}\cdot C_{BL}}_{重新分配前C_{BL}上的电荷} \\ \therefore V_{BL}&=\frac{V_{C_s}\cdot C_s + V_{PRE}\cdot C_{BL}}{C_s+C_{BL}} \end{align} \tag{1}

为什么要预充电?

由于CBLC_{BL}实际上同一条BL\text{BL}线上几十个基本单元的源漏寄生电容,也就是说CBLCsC_{BL}\gg C_s,导致仅凭CsC_s难以将处于任意电位的CBLC_{BL}拉到0011。举个例子,原来BL\text{BL}线的电平为11VCs=0V_{C_s}=0,由于CsC_{s}CBLC_{BL}弱,谁拉谁不好说,最终大概率反而是VBLV_{BL}VCsV_{C_s}拉到1。不仅没把00读出来,还把它破坏了。

因此我们一般统一给BL\text{BL}线设置一个初始电压,并且VPREV_{PRE}一般取VDD2\frac{V_{DD}}{2}。这样一来,只要VCs=0V_{C_s}=0VBLV_{BL}就更加靠近00;反之更加靠近11。实现了0011的区分。

此时VBLV_{BL}关于VCsV_{C_s}存在两种情况:

  • CsC_s原先存储的电压为11,即VCs=VDDV_{Cs}=V_{DD}。若考虑写入过程经过CMOS的阈值损失VTHV_{TH},则为VDDVTHV_{DD}-V_{TH}。那么

    VBL=VDDCs+VPRECBLCs+CBLV_{BL}=\frac{V_{DD}\cdot C_s + V_{PRE}\cdot C_{BL}}{C_s+C_{BL}}

  • CsC_s原先存储的电压为00,即VCs=VGNDV_{C_s}=V_{GND}。代入(1)式:

    VBL=VGNDCs+VPRECBLCs+CBLV_{BL}=\frac{V_{GND}\cdot C_s + V_{PRE}\cdot C_{BL}}{C_s+C_{BL}}

灵敏放大器(Sense Amplifier)

考察BL\textbf{BL}线前后的电平变化ΔV\Delta V

由(1)式可得:

ΔV=VBLVPRE=(VCsVPRE)CsCs+CBL=(VCsVPRE)1+CBLCs\Delta V =V_{BL}-V_{PRE}=\frac{(V_{C_s}-V_{PRE})\cdot C_s}{C_s+C_{BL}}=\frac{(V_{C_s}-V_{PRE})}{1+\frac{C_{BL}}{C_{s}}}

数字电路往往不允许亚稳态的出现,我们希望VBLV_{BL}要么是00,要么是11。这就要求ΔV\Delta V尽量大,即CBLCs\frac{C_{BL}}{C_s}就得尽量小。然而正如前文所说,CBLCsC_{BL}\gg C_s,这就导致最终VBLV_{BL}往往仅比VPRE=VDD2V_{PRE}=\frac{V_{DD}}{2}大一点或小一点,这是不符合数字电路的要求的,我们要是DRAM我们肯定也不好意思把这么个东西交给CPU。

怎么办呢?设计者们在BL\text{BL}线加一个灵敏放大器(Sense Amplifier),用于将该电平拉到严格的0011

image-20240417204836800

此外,我们可以观察到,在读取数据以后,VCs=VBLV_{C_s}=V_{BL},原来存储的数据被破坏了。这是DRAM独有的“破坏性读取”。想要解决这一问题也很简单,只要将灵敏放大器放大后的电压写会CsC_s即可。

周期性刷新(Refresh)

由于DRAM的1管单元仅采用一个无源电容来存储电荷,很容易漏电,因此需要周期性地充电来保持存储电容存储的数据。JEDEC(Joint Electron Tube Engineering Council)指定了一个标准,DRAM的刷新时间间隔tREF64mst_{REF}\le64\text{ms}

如何周期性刷新呢?注意到前文描述的读过程有一个“写回补偿”的阶段,该阶段会将灵敏放大器放大后的电压(标准的0011)重新写回到CsC_s上。因此要想刷新CsC_s上的数据,我们只需要对所有CsC_s重新读一遍。当然,由于CPU并没有发出请求,DRAM并不需要真的把数据"读"出来送到bus上。因此周期性刷新时间只是读时间的23\frac{2}{3}左右。