SRAM 芯片和 DRAM 芯片

SRAM 与 DRAM 的一切差别,都源自存储元用什么保存那一位:SRAM 用一个双稳态触发器把状态锁住,DRAM 用一个电容存电荷。触发器只要供电就一直保持,电容却会漏电。

这一条物理差别向外辐射出全部工程后果:DRAM 必须刷新、读出是破坏性的、存取周期显著大于存取时间、集成度高因而便宜、延迟大因而只能做主存。记住”触发器 vs 电容”这一条,其余七八条特征都可以现场推出来,不需要背表。

这一节还是全章提问最密集的地方——DRAM 刷新和 SDRAM/DDR 各贡献了一批。它们的共同主题是:哪些改进真的让内存变快了。

机制

存储元:一个触发器 对 一个电容

SRAMDRAM
存储元六管双稳态触发器(也有四管)单管 + 电容(还有三管式)
保持信息只要不断电就保持电容漏电,必须定期刷新
读出非破坏性破坏性,读后必须重写
集成度低(每位管子多)高(每位一个管子)
功耗 / 价格高 / 贵低 / 便宜
速度快慢
用途Cache、寄存器堆、DRAM 的行缓冲主存

两者都是易失的——断电都丢,这一点在 3.1.1已经钉死过一次。

“DRAM 的行缓冲用的是 SRAM”是一条常考的细节:行缓冲要在一次行激活后长时间保持整行数据并被反复读取,用电容显然不行,所以行缓冲由锁存器/SRAM 单元构成。

DRAM 的行列组织与地址复用

DRAM 的存储阵列按行 × 列排布。访问时行地址和列地址分两次送入同一组地址引脚,由行选通信号 和列选通信号 分别锁存。

地址复用的直接收益是引脚数减半: 个单元本需 20 根地址线,复用后只要 10 根。引脚数是芯片成本的大头,这是 DRAM 便宜的又一个来源。

SRAM 不做地址复用,全部地址线一次送入。

访问一行时,整行被读进行缓冲,之后的列访问直接在行缓冲里取——这就是”同一行内连续访问更快”的原因,也是突发传送能高速连发的物理基础。

边界辨析:地址复用是芯片内部的事,与 CPU 地址总线根数无关

这是 3.3.2算芯片数时最容易被带偏的地方。 CPU 地址总线有多少根,决定的是主存地址空间有多大;芯片内部用不用地址复用,只影响该芯片的地址引脚数。两件事在计算里完全不相交。 一道题若给出”CPU 地址总线 24 根”,就用 算总容量,不要因为”DRAM 会复用地址”而去把 24 折半或加倍。

常见小题:最少引脚数怎么数

碰到”最少需要几根线 / 几个引脚 / 几个管脚”这类题,先问一句:题目问的是 CPU 总线,还是存储芯片封装?

问法算法地址复用是否参与
CPU 有多少根地址线 / 数据线,主存最大容量多少,需要多少片地址线按 CPU 给出的根数算地址空间;数据线按一次传送宽度算存储字长不参与
某 DRAM 芯片最少需要多少地址引脚先算芯片内部完整地址位数,再做行列复用参与
某 SRAM 芯片最少需要多少地址引脚直接等于完整地址位数不参与

设芯片规格为 位,即有 个可寻址单元、每个单元 位。

  • SRAM 地址引脚数 ,数据引脚数 。
  • DRAM 若行列地址位数分别为 ,且 ,则复用后的地址引脚数 。
  • 若题目只给 ,没给行列组织,通常按尽量对半分:DRAM 地址引脚数 。

例: 位芯片有 个单元。

  • SRAM:地址引脚 根,数据引脚 根。
  • DRAM:行列可分为 ,地址引脚最少 根,数据引脚仍是 根。

若题目问”总引脚数”,还要把读写、片选、RAS/CAS 等控制引脚按题设加上;若题目只问”地址引脚”,不要把数据线和控制线混进去。408 题如果没有明确给控制信号数量,通常只要求地址线 / 数据线这些可由容量和字长推出的部分。

刷新:为什么、刷什么、谁来刷

为什么:电容漏电,几毫秒后电荷不足以被正确判读。

刷什么:以行为单位。刷新的实现方式是”把一整行读进读出放大器,再原样写回”——这正好利用了 DRAM 读出必须重写的机制,所以刷新的代价就是一次行访问。

因此有三条推论,全部是考点:

  1. 刷新以行为单位,一次刷一行,刷新一遍所需的周期数 = 行数
  2. 刷新只需要行地址,不需要列地址,也不需要片选——所有芯片可以同时刷同一行
  3. 刷新对 CPU 透明,由存储器控制器(不是 CPU、不是操作系统)发起

**刷新周期(最大刷新间隔)**通常规定为 2 ms,题目也可能给 8 ms 或 64 ms,一律以题目为准。

行数必须从芯片的行列组织求,不能从容量直接猜。 若题目未给组织方式,按行列位数对半分(阵列尽量接近正方形): 位芯片有 个单元,地址 16 位,行列各 8 位,行数 。

三种刷新方式

设刷新周期为 ,行数为 ,存取周期为 。

集中刷新:把 分成两段,前段正常读写,末尾集中用 个存取周期把所有行刷完。

  • 存取周期不变
  • 存在一个长死区 ,死区内 CPU 完全无法访存

分散刷新:把刷新塞进每一个存取周期的后半段,读写完一个单元顺带刷一行,按行号依次轮转。

  • 系统存取周期 = 读写时间 + 刷新时间,被拉长(通常近似加倍)
  • 没有死区,任何时刻都能访存
  • 刷新过于频繁(每 次访存就刷遍全表),属于浪费

异步刷新:把 均分成 份,每隔 刷一行。

刷新信号间隔
  • 存取周期不变
  • 死区被打散成 个短死区,每个仅一个存取周期
  • 总死区时间与集中刷新相同,但因为被打散,CPU 几乎不会长时间等待——这是实际采用的方式

疑问点:分散刷新是"在访存后半段随机选一行刷新"

分散刷新确实是把刷新安排在每个存取周期的后半段,但选哪一行不是随机的,而是按行号依次轮转:第 1 次访存刷第 0 行,第 2 次刷第 1 行,……第 次刷第 行,然后回到第 0 行。 随机选行无法保证”每一行在 内都被刷到”,而这正是刷新方案必须满足的唯一硬性约束。

边界辨析:没有任何一种刷新方式能与访存真正同时进行

一个自然但错误的推论是”分散刷新拉长了访存时间,所以刷新和访存不能同时进行;而异步刷新可以同时进行(只要要访问的地址没在刷新中)”。 前半句对,后半句错。 刷新要占用行译码器和读出放大器——这正是访存也要用的部件。在同一片 DRAM 内部,刷新期间该芯片无法响应访存,异步刷新也不例外,它的”死区”正是这个意思。 三种方式的真正区别不在能不能并行,而在死区怎么摆: 集中刷新把死区攒成一大块;分散刷新把死区摊进每次访存(表现为存取周期变长,于是”没有死区”);异步刷新把死区打散成 个一个存取周期长的小块。 “地址不冲突就能并行”在多 bank 的现代 DRAM 上部分成立(不同 bank 可以一个刷新一个访问),但 bank 级并行属于工程背景,不在 408 的模型内。

计算模板:刷新题的四步

第一步:求行数 。 从芯片规格得单元数 → 地址位数 → 行列位数(题目给了就用,没给就对半分)→ 行地址位数。

第二步:确认刷新周期 。 题目给什么用什么,常见 2 ms。

第三步:按问的方式套。

问的公式
异步刷新的刷新信号间隔
刷新一遍最少需要的读/写周期数
集中刷新的死区时间
集中刷新的死区率
分散刷新的系统存取周期读写时间 + 刷新时间

第四步:检查多片扩展的影响。 扩展成多少片都不改变行数——各片行地址相同、可同时刷新。刷新周期数只由单片行数决定。

疑问点:异步刷新与集中刷新的两问该怎么算

题目:用 位的 DRAM 芯片构成 位的存储器,采用异步刷新且每单元刷新间隔不超过 2 ms 时,刷新信号的间隔是多少;采用集中刷新时,刷新一遍最少用多少个读/写周期。

第一步,行数。 ,地址 16 位,行列各 8 位, 行。 第二步,异步刷新间隔。 。 第三步,集中刷新周期数。 刷新一遍 = 刷完全部 256 行 = 256 个读/写周期。 第四步,检查扩展。 需要 16 片(2 组字扩展 × 8 片位扩展),但各片行地址相同、可并行刷新,行数仍是 256,两问的答案都不受影响。

答案为 7.8 μs、256。 这一题的全部难点就在第一步和第四步: 里的""要还原成 再取平方根式地对半分;片数无论多少都不进入计算。 需要留意题面的刷新周期:若抄成 12 ms,则 ,与任何一个选项都对不上——这正是反过来确认”刷新周期应为 2 ms”的方法。

SDRAM 与 DDR:同步的是接口

传统异步 DRAM 的读写靠 、 电平握手,CPU 发出地址后要等待存储器”准备好”,等多久取决于器件,控制器只能保守地插入等待周期。

SDRAM(同步 DRAM) 引入了与系统总线共用的时钟:命令、地址、数据全部在时钟沿上传递,读延迟以”多少个时钟周期”给出(CAS Latency),控制器可以按固定拍数取数,并在等待期间继续发下一条命令。

疑问点:SDRAM 既然与 CPU 同步,DRAM 和 CPU 的速度就一样了

“同步”同步的是接口时序,不是访问延迟。 SDRAM 消除的是握手等待与不确定性,它让控制器知道”发出读命令后第 拍数据一定出来”,于是可以流水地连续发命令、连续收数据。它没有改变存储元的物理特性:电容充放电、行激活、预充电所需的时间一点没变。 量级对比最能说明问题:DRAM 的行访问延迟至今仍在几十纳秒量级,而 3 GHz CPU 的时钟周期约 0.33 ns——差两个数量级。 所以 SDRAM 提高的是带宽(单位时间能完成多少次传输),不是延迟。 这正是 3.1.2 那张表的第一行。 顺带说明:SRAM 与 CPU 的速度也并不”一样快”。SRAM 快到可以做 Cache,但 L1 命中仍需数个时钟周期,L2、L3 更多。存储层次存在的理由,正是没有任何一级能真正跟上 CPU。

疑问点:现代的 DDR 是否改变了这个结论

没有改变,反而是同一条结论最好的例证。 DDR 在时钟的上升沿和下降沿各传一次数据,数据率翻倍;但地址和命令仍然只在上升沿传,DRAM 核心的工作频率没有变。 DDR2 / DDR3 / DDR4 继续提速的方式是加大预取位宽( 位预取:内部一次读出 倍位宽,再由接口以 倍速率串行送出),核心频率的增长远慢于标称数据率的增长。 一个可以直接检验的现象:内存条代数越新,标称速率(MT/s)越高,而 CAS 延迟折算成纳秒后几乎不变,一直在 13~15 ns 附近徘徊。 DDR 家族三十年来提高的几乎全部是带宽。 延迟的改善要靠 Cache,不靠 DRAM 本身。

边界

层次辨析:DRAM 刷新在 408 里考什么、不考什么

现代 DRAM 的实际接口是一套命令:ACT(激活某一行)、READ / WRITE(列读写)、PRECHARGE(预充电,关闭当前行)、REFRESH(刷新)。这套命令连同 、、、CL 等时序参数属于 JEDEC 标准,在 408 的考纲之外。

408 会考的: 刷新以行为单位;刷新一遍的周期数 = 行数;刷新周期(通常 2 ms);三种刷新方式的安排与时间计算;异步刷新间隔 ;刷新由存储器控制器完成、对 CPU 透明;刷新不需要片选和列地址;刷新期间不能访存;地址复用与引脚数。

408 不会考、但值得知道的: ACT/PRECHARGE 的具体时序、bank/rank/channel 的组织、行缓冲命中率、自刷新与低功耗模式。

这些工程知识的正当用途是”解释”而不是”作答”:它能让人明白为什么行缓冲用 SRAM、为什么同一行连续访问更快、为什么”同步”改善不了延迟——但答题时仍然只写教材模型内的那几条。

“DRAM 刷新时不需要片选信号”这条要小心用。 它的准确含义是刷新不通过片选来选择要刷的芯片(所有芯片一起刷),而不是”刷新电路不需要任何控制信号”。

“分散刷新没有死区”是对的,但它的代价是存取周期加倍。 一道题若问”哪种方式对 CPU 访存效率影响最小”,答案是异步刷新;若问”哪种方式没有死区”,答案是分散刷新。两个问题的答案不同,不要混。

SRAM 不需要刷新,但需要供电。 “SRAM 不需要刷新所以不易失”是错的,见 3.1.1。

对照速查

项SRAMDRAM
存储元触发器电容
刷新不需要需要
读出非破坏破坏,需重写
地址复用不复用行列复用
与 接近
易失性易失易失
典型用途Cache / 行缓冲主存
刷新方式存取周期死区刷新频度
集中不变一个长死区 恰好够
分散加倍无过于频繁
异步不变 个短死区恰好够

考点

  • SRAM 用触发器、DRAM 用电容,一切差别由此推出
  • 两者都易失;DRAM 读出破坏、必须重写
  • DRAM 地址行列复用,引脚数减半;SRAM 不复用
  • DRAM 的行缓冲由 SRAM 构成
  • 刷新以行为单位,一遍的周期数 = 行数,与扩展了多少片无关
  • 异步刷新间隔 ;集中刷新死区 ;分散刷新存取周期加倍且无死区
  • 刷新由存储器控制器完成,对 CPU 透明,不需要列地址和片选
  • 刷新与访存不能在同一片内并行
  • SDRAM 的”同步”是接口同步,DDR 的双沿是数据率翻倍——两者都只提高带宽,不降低延迟

链接