SRAM 芯片和 DRAM 芯片
SRAM 与 DRAM 的一切差别,都源自存储元用什么保存那一位:SRAM 用一个双稳态触发器把状态锁住,DRAM 用一个电容存电荷。触发器只要供电就一直保持,电容却会漏电。
这一条物理差别向外辐射出全部工程后果:DRAM 必须刷新、读出是破坏性的、存取周期显著大于存取时间、集成度高因而便宜、延迟大因而只能做主存。记住”触发器 vs 电容”这一条,其余七八条特征都可以现场推出来,不需要背表。
这一节还是全章提问最密集的地方——DRAM 刷新和 SDRAM/DDR 各贡献了一批。它们的共同主题是:哪些改进真的让内存变快了。
机制
存储元:一个触发器 对 一个电容
| SRAM | DRAM | |
|---|---|---|
| 存储元 | 六管双稳态触发器(也有四管) | 单管 + 电容(还有三管式) |
| 保持信息 | 只要不断电就保持 | 电容漏电,必须定期刷新 |
| 读出 | 非破坏性 | 破坏性,读后必须重写 |
| 集成度 | 低(每位管子多) | 高(每位一个管子) |
| 功耗 / 价格 | 高 / 贵 | 低 / 便宜 |
| 速度 | 快 | 慢 |
| 用途 | Cache、寄存器堆、DRAM 的行缓冲 | 主存 |
两者都是易失的——断电都丢,这一点在 3.1.1已经钉死过一次。
“DRAM 的行缓冲用的是 SRAM”是一条常考的细节:行缓冲要在一次行激活后长时间保持整行数据并被反复读取,用电容显然不行,所以行缓冲由锁存器/SRAM 单元构成。
DRAM 的行列组织与地址复用
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 读出必须重写的机制,所以刷新的代价就是一次行访问。
因此有三条推论,全部是考点:
- 刷新以行为单位,一次刷一行,刷新一遍所需的周期数 = 行数
- 刷新只需要行地址,不需要列地址,也不需要片选——所有芯片可以同时刷同一行
- 刷新对 CPU 透明,由存储器控制器(不是 CPU、不是操作系统)发起
**刷新周期(最大刷新间隔)**通常规定为 2 ms,题目也可能给 8 ms 或 64 ms,一律以题目为准。
行数必须从芯片的行列组织求,不能从容量直接猜。 若题目未给组织方式,按行列位数对半分(阵列尽量接近正方形):
三种刷新方式
设刷新周期为
集中刷新:把
- 存取周期不变
- 存在一个长死区
,死区内 CPU 完全无法访存
分散刷新:把刷新塞进每一个存取周期的后半段,读写完一个单元顺带刷一行,按行号依次轮转。
- 系统存取周期 = 读写时间 + 刷新时间,被拉长(通常近似加倍)
- 没有死区,任何时刻都能访存
- 刷新过于频繁(每
次访存就刷遍全表),属于浪费
异步刷新:把
- 存取周期不变
- 死区被打散成
个短死区,每个仅一个存取周期 - 总死区时间与集中刷新相同,但因为被打散,CPU 几乎不会长时间等待——这是实际采用的方式
疑问点:分散刷新是"在访存后半段随机选一行刷新"
分散刷新确实是把刷新安排在每个存取周期的后半段,但选哪一行不是随机的,而是按行号依次轮转:第 1 次访存刷第 0 行,第 2 次刷第 1 行,……第
次刷第 行,然后回到第 0 行。 随机选行无法保证”每一行在 内都被刷到”,而这正是刷新方案必须满足的唯一硬性约束。
边界辨析:没有任何一种刷新方式能与访存真正同时进行
一个自然但错误的推论是”分散刷新拉长了访存时间,所以刷新和访存不能同时进行;而异步刷新可以同时进行(只要要访问的地址没在刷新中)”。 前半句对,后半句错。 刷新要占用行译码器和读出放大器——这正是访存也要用的部件。在同一片 DRAM 内部,刷新期间该芯片无法响应访存,异步刷新也不例外,它的”死区”正是这个意思。 三种方式的真正区别不在能不能并行,而在死区怎么摆: 集中刷新把死区攒成一大块;分散刷新把死区摊进每次访存(表现为存取周期变长,于是”没有死区”);异步刷新把死区打散成
个一个存取周期长的小块。 “地址不冲突就能并行”在多 bank 的现代 DRAM 上部分成立(不同 bank 可以一个刷新一个访问),但 bank 级并行属于工程背景,不在 408 的模型内。
计算模板:刷新题的四步
第一步:求行数
第二步:确认刷新周期
第三步:按问的方式套。
| 问的 | 公式 |
|---|---|
| 异步刷新的刷新信号间隔 | |
| 刷新一遍最少需要的读/写周期数 | |
| 集中刷新的死区时间 | |
| 集中刷新的死区率 | |
| 分散刷新的系统存取周期 | 读写时间 + 刷新时间 |
第四步:检查多片扩展的影响。 扩展成多少片都不改变行数——各片行地址相同、可同时刷新。刷新周期数只由单片行数决定。
疑问点:异步刷新与集中刷新的两问该怎么算
题目:用
位的 DRAM 芯片构成 位的存储器,采用异步刷新且每单元刷新间隔不超过 2 ms 时,刷新信号的间隔是多少;采用集中刷新时,刷新一遍最少用多少个读/写周期。 第一步,行数。
,地址 16 位,行列各 8 位, 行。 第二步,异步刷新间隔。 。 第三步,集中刷新周期数。 刷新一遍 = 刷完全部 256 行 = 256 个读/写周期。 第四步,检查扩展。 需要 16 片(2 组字扩展 × 8 片位扩展),但各片行地址相同、可并行刷新,行数仍是 256,两问的答案都不受影响。 答案为 7.8 μs、256。 这一题的全部难点就在第一步和第四步:
里的" "要还原成 再取平方根式地对半分;片数无论多少都不进入计算。 需要留意题面的刷新周期:若抄成 12 ms,则 ,与任何一个选项都对不上——这正是反过来确认”刷新周期应为 2 ms”的方法。
SDRAM 与 DDR:同步的是接口
传统异步 DRAM 的读写靠
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。
对照速查
| 项 | SRAM | DRAM |
|---|---|---|
| 存储元 | 触发器 | 电容 |
| 刷新 | 不需要 | 需要 |
| 读出 | 非破坏 | 破坏,需重写 |
| 地址复用 | 不复用 | 行列复用 |
| 接近 | ||
| 易失性 | 易失 | 易失 |
| 典型用途 | Cache / 行缓冲 | 主存 |
| 刷新方式 | 存取周期 | 死区 | 刷新频度 |
|---|---|---|---|
| 集中 | 不变 | 一个长死区 | 恰好够 |
| 分散 | 加倍 | 无 | 过于频繁 |
| 异步 | 不变 | 恰好够 |
考点
- SRAM 用触发器、DRAM 用电容,一切差别由此推出
- 两者都易失;DRAM 读出破坏、必须重写
- DRAM 地址行列复用,引脚数减半;SRAM 不复用
- DRAM 的行缓冲由 SRAM 构成
- 刷新以行为单位,一遍的周期数 = 行数,与扩展了多少片无关
- 异步刷新间隔
;集中刷新死区 ;分散刷新存取周期加倍且无死区 - 刷新由存储器控制器完成,对 CPU 透明,不需要列地址和片选
- 刷新与访存不能在同一片内并行
- SDRAM 的”同步”是接口同步,DDR 的双沿是数据率翻倍——两者都只提高带宽,不降低延迟
链接
- 🏠 返回总览:计算机组成原理第 3 章:存储系统总览
- ⬅️ 上一节:3.1.3 多级层次的存储系统
- ➡️ 下一节:3.2.2 只读存储器
- 🔗 3.1.2 存储器的性能指标(延迟与带宽的分工)
- 🔗 3.2.4 多模块存储器(另一种带宽手段)
- 🔗 3.3.2 主存容量的扩展(地址复用不参与片数计算)
- 📖 名词库:第 3 章名词库