ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

从晶体管到DIMM:深入解析DRAM内存原理与DDR4时序

从晶体管到DIMM:深入解析DRAM内存原理与DDR4时序 内存这东西平时大家装机、写代码、调性能都绕不开它但真要问一句“你插在主板上的那根内存条里面到底发生了什么”能从头讲到尾的人其实不多。我们平时挂在嘴边的 DDR4、2666、时序、CL 值这些名词背后其实是一整套从晶体管到 DIMM 的精密协作体系。这篇内容我打算把 DRAM 从最底层的存储单元一路拆到整根内存条把内部结构和工作原理讲透顺带把时序图这件事说明白——因为很多人看时序图只看个热闹不知道每一根线在什么时候该干什么。如果你是做硬件调试的、写底层驱动的、搞性能优化的或者只是单纯好奇“为什么 DDR4 默认频率是 2666”这种问题这篇都值得往下看。我会尽量用从业者之间聊天的口吻把电容、晶体管、行地址列地址、预充电、刷新这些概念串成一条线而不是丢一堆术语让你自己拼。看完之后你再看一根内存条的基板电路图或者再对着示波器看读写波形心里应该就有谱了。1. 从一颗晶体管说起DRAM 存储单元的物理本质1.1 一个晶体管加一个电容就是一位DRAM 的存储单元cell结构简单到有点反直觉一个晶体管加一个电容就负责存一个 bit。这个晶体管通常是 NMOS它的栅极接的是字线Word LineWL漏极接的是位线Bit LineBL源极接电容的一端电容的另一端接一个固定电位一般是 Vcc/2 或者地不同工艺有差异。工作原理说白了就是字线拉高晶体管导通位线和电容连通这时候就可以往电容里充电或者把电容里的电荷读出来。字线拉低晶体管关断电容和位线隔离电荷就被“锁”在电容里这就是“存储”。为什么用这么简单的结构因为 DRAM 追求的是单位面积存储密度。一个 cell 只占一个晶体管加一个电容的面积才能做到一根内存条上塞几十亿个 cell。SRAM 用的是六个晶体管组成一个锁存器稳定、快但面积大、成本高所以 SRAM 只用在 CPU 缓存这种小容量高速场景主内存必须用 DRAM。这里有个关键点很多人会忽略电容是会漏电的。电容里的电荷会随着时间慢慢流失如果不处理数据过一会儿就没了。这就是 DRAM 需要**刷新Refresh**的根本原因也是 DRAM 被称为“动态”的原因——它需要不停地“动”才能保住数据。1.2 电容存储带来的三个天然约束理解了“电容存电荷”这件事DRAM 的三个核心特性就顺理成章了需要周期性刷新电容漏电所以每隔一段时间典型是 64ms 内把所有行刷新一遍必须把数据读出来再写回去。刷新是 DRAM 控制器自动做的对软件透明但它会占用带宽也会带来刷新功耗。读取是破坏性的读操作本质上是把电容里的电荷通过位线释放出来电容里的电荷被“用掉”了所以每次读完之后必须回写Write Back / Restore。这也是为什么 DRAM 的读操作在时序上比很多人想象的复杂。读出的是微小差分信号电容容量极小飞法级别位线上的电荷变化非常微弱必须靠**灵敏放大器Sense Amplifier**把这点微小差异放大成完整的逻辑 0 或 1。提示很多人第一次看 DRAM 原理图会疑惑“为什么读还要回写”根源就在电容读取的破坏性。这一点和 SRAM 完全不同SRAM 读多少次都不会改变存储值。1.3 灵敏放大器把飞法级电荷变成逻辑电平灵敏放大器是 DRAM 里最精妙的部分之一。位线在预充电之后被拉到 Vcc/2 左右这个电压叫预充电电压。当某个 cell 被选中电容和位线连通如果电容里存的是 1位线电压会略微上升如果存的是 0位线电压会略微下降。这个变化可能只有几十毫伏甚至更小。灵敏放大器利用差分放大的原理把位线和参考位线或者位线的互补端之间的微小电压差迅速放大最终把位线拉到完整的 Vcc 或者 GND。放大完成之后这个值既被输出给外部也被写回原来的 cell完成“破坏性读取后的恢复”。这个过程听起来简单但实际电路里对时序要求极高预充电要到位、字线开启时间要够、灵敏放大器使能时机要准。这些时序约束最终就体现为我们看到的 DRAM 时序参数比如 tRCD、tRAS、tRP。2. 从 cell 到阵列行、列、Bank 的组织逻辑2.1 为什么内存要按“行”和“列”来寻址单个 cell 没法直接用必须组织成阵列。DRAM 的存储阵列是二维的行Row和列Column。一根字线对应一整行一根位线对应一整列。要访问某个 cell先通过行地址选中一行激活这一行再通过列地址从这一行里选出具体的列。这种二维寻址的好处是地址解码成本低、布线规整。如果是一维寻址几亿个 cell 需要几亿条选择线根本没法做。二维阵列把地址分成行地址和列地址行解码器和列解码器各管一半硬件复杂度大幅下降。行地址和列地址是分时复用同一组地址引脚的这就是为什么 DRAM 会有RASRow Address Strobe和 CASColumn Address Strobe这两个信号。先送行地址、拉 RAS再送列地址、拉 CAS这是 DRAM 寻址的基本节奏。2.2 Bank 的引入让内存能“并行干活”如果整个内存只有一个大阵列那么每次激活一行、读一列、预充电整个过程是串行的效率很低。为了解决这个问题DRAM 内部被划分成多个Bank。Bank 可以理解成“独立的子阵列”每个 Bank 有自己的行解码器、灵敏放大器和部分外围电路。不同 Bank 之间可以部分并行操作比如 Bank A 正在做预充电Bank B 可以同时进行激活Bank C 可以同时进行读写。这种并行性叫Bank-Level ParallelismBLP是提升内存实际带宽的关键手段。DDR4 通常有16 个 Bank分成 4 个 Bank Group每组 4 个 BankDDR3 是 8 个 Bank。Bank Group 的引入是 DDR4 的一个重要变化它让同一 Group 内的 Bank 共享部分时序约束而不同 Group 之间可以更灵活地交错操作从而进一步提升并行度。代际Bank 数量Bank Group典型预取数据速率起点DDR38无8n800 MT/sDDR4164 组 × 48n1600 MT/sDDR5328 组 × 416n4800 MT/s2.3 行激活、列读写、预充电一次访问的完整链路一次典型的 DRAM 访问如果目标行当前没有被激活流程是这样的预充电Precharge把位线拉到预充电电压为下一次激活做准备。对应时序参数 tRP。行激活Activate送行地址拉 RAS字线拉高cell 和位线连通灵敏放大器放大信号。对应时序参数 tRCD从激活到可以读列的时间。列读写Read/Write送列地址拉 CAS选中具体列数据通过数据总线输出或输入。读操作对应 CAS 延迟CL。回写与预充电读完之后数据回写然后这一行需要预充电才能再次激活。对应 tRAS行激活到预充电的最小时间。这几个参数串起来就是我们在 BIOS 或内存 SPD 里看到的时序表CL-tRCD-tRP-tRAS。比如“16-18-18-38”就是 CL16、tRCD18、tRP18、tRAS38。注意这些数字的单位是时钟周期数不是纳秒。同样的时序数字在不同频率下对应的绝对时间不同。所以比较内存性能时不能只看时序数字要结合频率一起看。3. DDR4 的预取与突发传输为什么默认频率是 26663.1 预取Prefetch内核慢接口快DRAM 内核cell 阵列的工作频率其实远低于接口传输频率。以 DDR4-2666 为例接口传输速率是 2666 MT/s但内核时钟只有 333MHz 左右2666 / 8。这个 8 就是预取位数Prefetch。预取的意思是内核一次从阵列里取出 8 个 bit对 DDR4 是 8n 预取然后通过并串转换在接口上以 8 倍的速度串行发出去。这样内核不用跑那么快接口却能跑很高兼顾了成本和带宽。DDR3 也是 8n 预取DDR5 提升到 16n。预取位数越大接口速率相对内核速率的倍数越高对内核和接口之间的缓冲设计要求也越高。3.2 突发长度Burst Length与 64 字节缓存行CPU 访问内存是以**缓存行Cache Line**为单位的典型是 64 字节。DDR4 的数据总线是 64 位8 字节所以一次完整的突发传输需要 8 个传输周期正好凑齐 64 字节。这就是BL8Burst Length 8的由来。BL8 和 8n 预取是配套的内核一次取 8n 的数据接口分 8 个周期发出去每个周期 64 位合起来 64 字节。这个设计让内存的突发传输和 CPU 缓存行完美对齐避免浪费带宽。3.3 2666 这个数字是怎么来的DDR4 的默认频率JEDEC 标准里的基础速率是2133 MT/s但市面上大量 DDR4 默认跑在2666 MT/s。这个 2666 不是随便定的它和内存控制器、CPU 内存倍频、JEDEC 标准演进都有关系。简单说2666 MT/s 对应内核时钟约 333MHz接口时钟 1333MHzDDR 是双边沿传输所以 1333MHz × 2 2666 MT/s。这个速率在功耗、信号完整性和成本之间取得了比较好的平衡成为很多平台默认的“甜点频率”。再往上2933、3200就需要更好的 PCB 布线、更严格的信号完整性控制成本上升明显。速率接口时钟内核时钟单通道带宽64bitDDR4-21331066 MHz266 MHz17.0 GB/sDDR4-26661333 MHz333 MHz21.3 GB/sDDR4-32001600 MHz400 MHz25.6 GB/s提示带宽计算公式是 速率 × 总线位宽 / 8。比如 2666 × 64 / 8 21328 MB/s ≈ 21.3 GB/s。双通道就是再乘 2。4. 时序图到底该怎么看从命令到数据的每一拍4.1 时序图上的几条关键信号线看 DRAM 时序图先认清几条线CLK / CLK#差分时钟所有操作的节拍基准。CS#片选低有效。RAS# / CAS# / WE#命令编码线三者组合决定是激活、读、写还是预充电。地址线 A[0:n]行地址和列地址分时复用。DQ数据线。DQS / DQS#数据选通读写时用来对齐数据。命令的真值表大致是RAS#0、CAS#1、WE#1 是激活RAS#1、CAS#0、WE#1 是读RAS#1、CAS#0、WE#0 是写RAS#0、CAS#1、WE#0 是预充电。4.2 读操作的时序链路从 ACT 到数据出来一次读操作时序图上会看到这样的节奏ACT 命令在某个时钟上升沿发出同时行地址送上。经过tRCD个时钟周期后可以发RD 命令同时列地址送上。再经过CL个时钟周期数据出现在 DQ 上DQS 翻转。数据连续输出BL8个周期4 个时钟周期双边沿共 8 次传输。所以从 ACT 到第一个数据出来总延迟是tRCD CL个时钟周期。这就是为什么降低 CL 和 tRCD 能提升响应速度——它们直接决定了“从发命令到拿到数据”要等多久。4.3 写操作的时序链路与写恢复写操作类似但有几个区别写命令发出后经过CWLCAS Write Latency个周期数据才开始写入。写完之后需要tWRWrite Recovery时间让数据真正写进 cell然后才能预充电。写操作还涉及ODTOn-Die Termination的切换因为写的时候是内存控制器驱动内存颗粒接收端接电阻要相应调整。写时序里最容易出问题的是DQS 与 DQ 的对齐。DDR 用 DQS 作为数据选通写的时候 DQS 由控制器发出和 DQ 一起到颗粒读的时候 DQS 由颗粒发出和 DQ 一起回控制器。如果 DQS 和 DQ 之间的偏斜skew太大采样就会出错。这就是为什么内存训练Memory Training里有一大块是在调 DQS 和 DQ 的延迟。4.4 刷新时序看不见但一直在跑刷新操作在时序图上表现为REF 命令它不针对具体地址而是让 DRAM 内部自己按行计数器逐行刷新。刷新分两种Auto Refresh控制器定期发 REF 命令每次刷新一行或一个 Bank 组的一行。Self Refresh进入低功耗状态时DRAM 自己内部定时刷新控制器不用管。刷新会占用命令总线和部分带宽所以高负载场景下刷新策略会影响性能。有些控制器支持Fine Granularity RefreshFGR把一次大刷新拆成多次小刷新减少对突发性能的影响。5. 从颗粒到 DIMM一根内存条上还有什么5.1 DRAM 颗粒、Rank 与通道一根内存条上焊着多颗 DRAM 颗粒。Rank是指一组共同响应同一个片选信号的颗粒它们的数据线并联共同组成一个位宽比如 64 位。一根单 Rank 内存条上颗粒的位宽加起来正好是 64 位ECC 的话是 72 位。多 Rank 内存条上不同 Rank 共享数据总线但片选信号不同。控制器通过片选来选择访问哪个 Rank。多 Rank 的好处是容量大坏处是 Rank 切换会带来额外延迟而且负载更重信号完整性更难做。通道Channel是更上层的概念一个通道对应一组独立的内存控制器和数据总线。双通道就是两组可以并行访问带宽翻倍。通道和 Rank 是两个维度不要混。5.2 SPD 与温度传感器内存条上的“身份证”每根内存条上有一颗SPDSerial Presence Detect芯片通常是一个小 EEPROM通过I2C / SMBus和主板通信。SPD 里存着这根内存的容量、频率、时序、电压、制造商等信息。BIOS 启动时读 SPD才知道该怎么配置内存控制器。SPD 通信用的就是 I2C 时序起始条件、地址帧、数据帧、停止条件。如果你用逻辑分析仪抓过 SMBus会看到典型的 I2C 波形。DDR4 的 SPD 还支持温度传感器可以实时读内存温度用于温度补偿刷新Temperature Compensated Refresh。注意SPD 的 I2C 地址是固定的通常 0x50 起多根内存条通过地址低位区分。如果地址冲突BIOS 可能识别不到某根内存。5.3 基板电路图里能看到什么看一根 DDR4 内存条的基板电路图能看到几类关键走线数据线 DQ / DQS等长走线差分对阻抗控制严格。地址/命令线通常走 Fly-by 拓扑从控制器出发依次经过各颗粒末端端接。电源和地多层板电源平面和地平面完整去耦电容密集。SPD 和温度传感器走线I2C 两根线相对简单。Fly-by 拓扑是 DDR3 之后的主流它让地址/命令信号依次到达各颗粒通过控制器端的延迟补偿来对齐。相比树形拓扑Fly-by 布线更容易信号质量更好但需要做Write Leveling来补偿各颗粒之间的到达时间差。6. 实操中容易踩的坑与调试经验6.1 时序参数不是越小越好很多人调内存喜欢把时序往小里压觉得 CL 越小越快。实际上时序和频率是耦合的你把频率拉高时序数字往往要放宽否则信号来不及稳定。盲目压时序会导致偶发性的位翻转表现为系统随机蓝屏、程序计算结果错误而且很难复现。我的经验是先保证稳定再谈性能。用 MemTest86 或类似工具跑足够长时间至少几轮完整测试确认没有错误再去微调。任何一次时序调整后都要重新验证。6.2 内存训练失败的表现和排查内存训练Training是 BIOS 在启动时自动做的包括Write Leveling补偿 Fly-by 拓扑下各颗粒的时钟到达差异。Read/Write DQS 对齐调整 DQS 和 DQ 的相位。Vref 训练调整参考电压优化采样点。训练失败时常见表现是开不了机、反复重启、跑不到标称频率。排查思路先降频到 JEDEC 默认比如 2133看能不能稳定。检查内存条是否插在推荐插槽很多主板双通道要插 2、4 槽。适当放宽时序或加一点电压在安全范围内。更新 BIOS厂商经常通过 BIOS 更新改善内存兼容性。6.3 用示波器看 DRAM 波形的注意事项如果你有条件用示波器看 DRAM 信号有几个坑探头负载普通探头电容几 pF接上去可能就改变了信号。要用低电容探头或者差分探头。触发设置DRAM 信号速率高要用足够带宽的示波器至少 2GHz 以上看 DDR4触发要稳。看什么重点看 DQS 和 DQ 的对齐、眼图张开度、过冲和下冲。眼图闭合通常意味着时序或端接有问题。6.4 刷新对性能的实际影响刷新是必须的但它确实吃带宽。在高负载、大内存带宽场景下刷新开销可能占到几个百分点。有些平台支持调整刷新间隔tREFI但改这个要非常小心改大了可能导致数据丢失。一般不建议普通用户动刷新相关参数。7. 几个常见问题的直接回答7.1 SRAM 和 DRAM 的区别与联系维度SRAMDRAM存储单元6 晶体管锁存器1 晶体管 1 电容是否需要刷新不需要需要周期性刷新速度快相对慢密度/成本低密度、高成本高密度、低成本典型用途CPU 缓存主内存联系在于它们都是易失性存储断电都丢数据SRAM 常作为 DRAM 的缓存或缓冲两者在存储层次里配合工作。7.2 为什么 DDR4 默认是 2666前面讲过2666 MT/s 是功耗、成本、信号完整性的平衡点也是很多平台和 JEDEC 标准演进的结果。它不是物理极限而是工程和经济上的“甜点”。更高频率需要更好的硬件和更严格的调试默认频率取一个大多数平台都能稳定跑的值。7.3 内存现在紧张吗内存供需是周期性波动的受产能、需求、库存等多重因素影响。DRAM 和 HBM 的产能分配也会互相影响——HBM 用于高性能计算领域占用大量先进产能可能间接影响普通 DDR 的供应。具体行情要看专业机构的调研数据这里不做预测。7.4 时序图工具能不能自动生成现在有些工具可以根据描述生成时序图比如一些基于文本的绘图工具或 AI 辅助工具。但 DRAM 时序图的关键在于信号之间的精确时间关系自动生成的图往往只能表达大致顺序精确的周期数、建立保持时间还是得手工核对。我的建议是用工具画草图关键时序手工标注和验证。8. 写在最后的一点个人体会搞 DRAM 这块最大的感受是层次感特别强从一颗晶体管的物理特性到 cell 阵列的组织到 Bank 并行到 DDR4 的预取和突发再到 DIMM 上的走线和 SPD每一层都有自己的约束而上层的性能又受下层物理极限的制约。理解了这条链路再看那些时序参数和频率数字就不再是死记硬背而是能推出来“为什么是这样”。如果你刚开始接触我的建议是先从一颗 cell 的工作原理入手把电容、晶体管、灵敏放大器这条线搞清楚然后再往上走。时序图不要一上来就啃最复杂的先看单次读操作的 ACT-RD-DATA 三段把 tRCD 和 CL 的位置找准再扩展到写、刷新、多 Bank 交错。这样一层层搭上去比一上来就背时序表要扎实得多。另外动手验证很重要。有条件的话用逻辑分析仪抓一次 SPD 的 I2C 通信或者用示波器看一次 DQS 波形比看十张图都管用。理论加实测才是真正把这块知识变成自己的。
返回列表