ARTICLE DETAIL

资讯详情

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

深入理解DRAM存储结构:从1T1C单元到刷新机制

深入理解DRAM存储结构:从1T1C单元到刷新机制 如果你写过程序可能对“内存”又爱又恨变量多了担心不够用Cache miss 多了程序变卡。但很少有人想过当 CPU 往某个地址写一个 0x3F 时这一位最终在硅片上落在哪个角落它是靠什么物理机制待在那里的。DRAM也就是动态随机存取存储器正是现代电脑和手机主存的基本盘。DRAM 的存储结构、读写过程、刷新机制以及“暂存”这个概念决定了它为什么便宜、为什么容量大、为什么断电丢数据、为什么每过几十毫秒就得停下来“续命”。这篇继续我的内存学习系列第三篇重点拆解 DRAM 的基础存储结构帮学计算机组成、写驱动或做嵌入式开发的朋友真正看懂主存的工作原理。1. 存储层级里DRAM的位置与设计取舍1.1 从一次变量访问说起数据到底躺在哪你写了一句int a 1;CPU 执行这条指令时并不会直接到那根内存条上找a。它会先翻自己的寄存器再翻 L1 Cache、L2 Cache、L3 Cache最后才轮到 DRAM。这沿途每一层都比下一层快但也比下一层贵。拿一张简化的表来说层级典型容量典型延迟存储方式寄存器几十到几百字节零点几nsSRAM/触发器L1/L2 Cache几十KB到几MB1ns ~ 10nsSRAM主存几GB到几十GB几十nsDRAMSSD/HDD几百GB到几TB微秒到毫秒级NAND/磁盘CPU 在寄存器里找不到数据、Cache 也 miss 的时候只能停下等主存。这个等待时间就是 DRAM 的延迟通常几十纳秒。听起来很短但 CPU 主频已经跑到 3GHz 以上一个周期才 0.33ns几十 ns 的等待相当于干等了一百多个周期。1.2 为什么偏偏是 DRAM 当主存主存这个位置的要求很苛刻容量要足够大按 GB 算成本要足够低普通人买得起速度还不能太拉胯至少要能跟 Cache 的 miss 惩罚形成折中最后还得支持随机读写软件开发者才不会崩溃。DRAM 就是为这组条件而生的。它的存储单元极其简单一个晶体管加一个电容1T1C用物理面积换来了超高密度。在同样工艺下DRAM 的每 bit 成本可能只有 SRAM 的几十分之一容量能做到几个数量级更大。这正是“主存用 DRAM、Cache 用 SRAM”的根本原因——不是不想用更快的是钱包不允许。1.3 主存性能成为瓶颈的现实很多人优化代码时习惯数for循环里算了几条指令实际遇到性能问题时大头往往在内存访问。一次 Cache miss 导致的停顿可以抵消几十条算术指令的执行时间如果是随机访问模式DRAM 行切换、Bank 冲突导致的额外延迟会更可观。所以理解 DRAM 不只是一件“涨姿势”的事。你知道了行激活、列选择、预充电这些概念就能明白为什么“按顺序遍历数组”会比“乱序访问指针链”快这么多也能理解为什么现代 CPU 要搞预取器、为什么数据库要讲究按主键聚簇存储。DRAM 的存储结构最终会在软件运行效率上体现出来。2. 1T1C单元一位数据的物理底座2.1 一个晶体管加一个电容如何表达 0 和 1DRAM 的存储单元叫 1T1C全称是 1 Transistor 1 Capacitor。顾名思义一个 bit 只用一个晶体管加一个电容。电容用来存电荷充了电、保有足够电量的状态记为“1”几乎没电荷的状态记为“0”。晶体管在这里当开关用由“字线”控制。这里的关键结构是阵列每一行对应一根“字线”Word Line, WL它横跨整行存储单元连接到这一行所有晶体管的栅极。每一列对应一根“位线”Bit Line, BL它连接到这一列所有晶体管的源极/漏极一侧。行列交叉的位置就是那个晶体管和电容。什么时候这个开关会打开当某一行字线被拉高时这一行所有晶体管全部导通于是这一整行的每一个电容都通过自己的晶体管接到了对应的位线上。注意是整行同时接入不是一个一个来。这就是 DRAM 访问的最小粒度总是“一行/一页”的原因。2.2 为什么这个简单结构能撑起 GB 级容量1T1C 最厉害的地方在于面积。现代 DRAM 工艺发展到 1y nm、1z nm 时代一个存储单元可以做得非常小。业界习惯用F表示特征尺寸一个 DRAM 单元的面积大概可以做到 6F² 左右而 SRAM 的 6T 单元动辄需要 100F² 以上。这意味着同样面积的硅片DRAM 能塞进去的 bit 数比 SRAM 多出一个数量级以上。代价是外围电路复杂了。因为存储单元太简单它不会主动输出一个稳定的逻辑电平而是在读取时给出一个微弱的电压差。于是每根位线上都要配感测放大器Sense Amplifier行列地址要分时复用还要有专门的刷新逻辑。这部分“隐性成本”是为了换取密度和低价格。2.3 “动态”二字的代价漏电与刷新电容不是理想的它一定会漏电。PN 结漏电、栅极漏电、电容介质本身的泄漏都会让存进去的电荷慢慢跑掉。如果放着不管几毫秒到几十毫秒后“1”就会变成“0”。所以 DRAM 必须定期“刷新”Refresh在电荷还没漏光之前把每个单元的电平重新读出来、再重新写进去。正因为这个“必须周期性刷新”的特性它才叫“动态”随机存取存储器英文里的 Dynamic 指的就是这件事。SRAM 不需要刷新所以叫静态随机存取存储器。2.4 和 SRAM 的细胞级对比拿 6T SRAM 对比一下差异一目了然项目DRAM (1T1C)SRAM (6T)存储原理电容存电荷需要刷新触发器/交叉耦合结构稳态保持单元面积约 6F²约 100F² 以上读取方式破坏性读出靠感测放大器恢复直接输出全摆幅逻辑电平刷新必须周期性刷新不需要速度相对慢几十ns快1ns ~ 几ns主要用途主存Cache、寄存器、小容量快速存储为什么 Cache 不用 DRAM除了速度还有一个原因是 DRAM 的读操作会破坏存储状态。虽然感测放大器在读完之后会把数据“写回来”但这个“读-放大-写回”的过程需要时间。SRAM 读的时候数据本身不会被破坏所以能跑得飞快。3. 一次读写的完整旅程行激活、列选择与预充电3.1 第一步行激活与电荷共享DRAM 的一次读操作绝不是“给个地址数据直接出来”这么简单。它分阶段进行第一步叫“行激活”ACTIVATE。系统先把行地址送到 DRAM对应字线被拉高。这一行所有电容通过晶体管接到各自的位线上。位线在访问前已经被预充电到 Vcc/2也就是中间电位。当电容和位线连通后两边会发生“电荷共享”。我举个具体数字假设存储电容 30fF位线电容 200fFVcc1.5V位线预充到 0.75V。如果电容存的是“1”1.5V接通后最终电压大约变成 0.85V 左右位线只升高了约 100mV如果存的是“0”0V最终电压大约是 0.65V位线只下降了约 100mV。100mV 的电压差在芯片内部已经足够被感测放大器辨认了。感测放大器会把这个微小差值快速放大到完整的 0 或 1 电平。与此同时它还会把放大后强驱动电平“灌回”电容相当于顺手完成了恢复。这就是 DRAM 读操作是破坏性读出、但又能自动恢复的原因。3.2 第二步列选择与突发传输行激活之后这一整行的数据其实都已经到了感测放大器里相当于一个“打开的行缓冲区”。但 CPU 只要其中的某一个或某几个字节所以接下来要根据列地址从这一行里挑出需要的那部分。这一步由 CAS列地址选通控制只有被选中的感测放大器才允许把数据送上内部数据总线。这里还有一个重要概念突发传输Burst。与其一次只传一个你要的数据不如一次把相邻的几个数据都传出去提高带宽。DDR 内存的突发长度通常是 8也就是一个列访问会连续输出 8 个数据块。现代 DDR 内部还引入了“预取”Prefetch技术每一次读时DRAM 内部先并行取出 8n 位数据暂存起来再按时钟边沿高速送出去。外部看到的频率很高但内部阵列操作其实没这么快全靠预取把并行变串行。3.3 第三步预充电为下一次访问做好准备数据读出来之后这一行不能一直开着。如果下一笔访问要操作另一行当前行必须先关闭把所有位线恢复成 Vcc/2 的预充状态这个过程叫“预充电”Precharge。预充电的时间用参数 tRP 表示。这期间当前 Bank 不能接受新的行激活命令要等位线稳定下来。你可能会觉得这纯粹是浪费但随着 Bank 数量增加这个问题被巧妙缓解了——一个 Bank 在预充电的时候可以访问其他 Bank。写操作和读操作在流程上类似只是方向相反行激活后外部数据先写到感测放大器再由感测放大器强制驱动位线和电容完成充电如果是“0”就把电容里的电荷抽走。所以理解了读操作写操作也基本理解了。3.4 地址复用与时序参数为什么会有 tRCD/tRP/tRAS/CLDRAM 的地址引脚很有限不可能把 32 位地址一次性传进去。于是就把地址拆成两半分时复用先用 RAS 信号锁存行地址再用 CAS 信号锁存列地址。这也是为什么叫“行地址选通”和“列地址选通”。时序参数直接决定了 DRAM 到底有多快tRCDRAS to CAS Delay行激活命令发出后要等多久才能发列命令。行地址要经过译码、字线拉高、电容和位线电荷共享、感测放大器完成放大急不得。CLCAS Latency列命令发出后到第一个数据出现在引脚的延迟。tRPRow Precharge预充电需要的时间。tRASActive to Precharge一行激活后至少要保持多少时间防止刚激活就关闭导致数据没恢复好。举一个直观的计算DDR3-1600 的典型参数是 CL11、tRCD11、tRP11时钟周期 1.25ns。一次随机读操作如果不考虑 Bank 冲突理论上至少需要 tRCD CL tRP也就是(11 11 11) × 1.25ns 41.25ns这还只是理想情况实际还有命令排队、地址冲突、刷新抢占随便翻一倍很正常。所以 DRAM 从来不是“一按地址、立等可取”的存储设备它需要你按行、列阶段性地去伺候。4. 刷新机制给电容“续命”的系统工程4.1 64ms 这个数字是怎么来的JEDEC 标准规定商用 DRAM 在 85℃ 以下必须保证每一行在 64ms 内至少被刷新一次。也就是说全片所有存储行最晚 64ms 必须完整走一圈刷新。为什么是 64ms这是晶体管工艺、电容工艺、可靠性和功耗多方妥协的结果。刷新间隔太短刷新开销和功耗就太大刷新间隔太长某些漏电较快的单元就会丢数据。高温会让漏电急剧加快所以工业级/车规级芯片通常会要求更短刷新周期或者要求开启温度补偿刷新TCSR。有的芯片内部集成温度传感器检测到温度升高后自动把刷新间隔从 64ms 缩短到 32ms甚至更短。4.2 刷新不是“把数据抽出来再放进去”那么简单很多人以为刷新就像我们用 U 盘时那样把数据读出来再写回去。实际上 DRAM 的刷新命令更“暴力”它本质上是执行一次“行激活 感测放大 预充电”。外部刷新控制器发出 REFRESH 命令DRAM 内部有一个刷新行计数器自动产生下一个要刷新的行地址然后内部执行一遍“类似读操作”的流程字线拉高、电容电荷共享、感测放大器放大并把电平写回电容、关闭字线、位线预充。整个过程不需要外部数据总线参与你完全看不出数据被碰过。所以刷新对软件是透明的。但对 DRAM 控制器来说刷新是有代价的刷新期间对应 Bank 不能响应正常的读写访问必须等刷新完成。4.3 分布式、集中式与隐蔽刷新根据刷新命令的排布方式有几个经典策略分布式刷新Distributed Refresh把 64ms 平均切成 many 段每隔 tREFI 时间刷新一行。比如 8192 行64ms / 8192 ≈ 7.8μs也就是平均每 7.8μs 就要刷一行。这种方式的优点是停顿分散对持续访问比较友好。集中式刷新Burst Refresh一次把 8192 行全部刷完期间外部访问被长时间阻塞。实现简单但性能冲击大。隐蔽刷新Hidden Refresh尽量利用 DRAM 不访问的空闲时间插入刷新试图让读写请求完全感知不到刷新存在。现代 DDR3/DDR4/DDR5 普遍采用分布式刷新并且把刷新粒度提升到 Bank 级别。DDR5 进一步支持“同一 Bank 刷新”和“所有 Bank 刷新”多种命令让刷新调度更灵活可以在一个 Bank 刷新时继续访问另一个 Bank大幅降低刷新对性能的影响。4.4 刷新和普通访问打起来怎么办刷新不能拖拖久了数据就漏没了但也不能太霸道否则 CPU 的每次访存都会被延迟。所以 DRAM 控制器里会有一个仲裁逻辑专门决定“现在这个时钟周期是发读写命令还是发刷新命令”。常见的做法是设置一个刷新计数到时间节点就会强制插入刷新命令。如果当前 Bank 正在被访问控制器可能会等这个访问完成再刷新如果有多个 Bank 空闲就优先把刷新插到空闲窗口里。这里体现的是一个典型工程折中既要保证数据安全又要尽量减少刷新对性能的干扰。4.5 Self-Refresh 与温度补偿刷新当系统进入低功耗模式外部时钟可以停掉但 DRAM 里的电荷还在漏。这时候如果什么都不做数据会丢。解决办法是让 DRAM 进入“自刷新”Self-Refresh状态芯片内部自带的振荡器会继续产生刷新命令不需要外部时钟、不需要外部控制器干预以极低功耗维持数据。移动设备里的 LPDDR 对自刷新功耗尤其敏感。手机息屏只是关屏幕、系统还在待机DRAM 时刻处于自刷新状态。为了进一步省电和保证可靠性LPDDR 内部往往有温度传感器温度低的时候把自刷新间隔拉长一点温度高的时候自动缩短一切由芯片自己管理。4.6 刷新开销到底有多大可以用一个粗算公式感受一下刷新对性能的影响。以 8Gb DDR3 为例典型行数为 8192刷新周期 64ms所以tREFI 64ms / 8192 ≈ 7.8μs每次刷新一行所需时间 tRFC依密度不同大约在 90ns 到 160ns 之间。若取 110ns则刷新占用的时间比例大约是110ns / 7.8μs ≈ 1.4%看起来不大但这只是理想排队时间。实际系统中刷新会打断 burst 传输、引起 Bank 冲突、破坏原有的访问流水真实开销往往更高。密度越大的 DRAM行数越多刷新压力越大所以 DDR5 在刷新调度上做了大量优化甚至允许部分刷新命令和读写命令并行处理。5. “暂存”这个词在DRAM语境里到底指什么5.1 两种语义数据暂住 vs 电路锁存“暂存”在 DRAM 语境下有两层意思很多资料混在一起讲容易把人绕晕。第一层是系统视角DRAM 作为主存本质上是整个系统的大仓库CPU 跑的程序、打开的文件、网络收发的 buffer暂时都要放这里。这个“暂存”是相对于硬盘/SSD 这种持久存储而言的——断电即失所以叫易失性存储。第二层是电路视角DRAM 芯片内部从位线上的微弱电荷到感测放大器锁存出来的逻辑电平再到内部数据总线上的一次性缓冲处处都有“暂存”的环节。严格说这些不是传统意义上的“内存暂存区”但它们的物理实质就是靠电容/锁存器把数据临时hold住。5.2 Sense Amplifier从微小电荷到逻辑电平的暂存锁存感测放大器Sense Amplifier值得单独拿出来讲因为它是 DRAM 读取路径上最重要的暂存点。它的核心是两个交叉耦合的反相器结构上像一个锁存器Latch。当位线上出现约 100mV 的电压差时感测放大器会感应这个差值然后快速翻转成完整的“0”或“1”电平并稳定保持住。一旦锁定它就把这 1 bit 数据牢牢暂存在内部直到列选择电路决定是否将数据送出去。这个过程就像在嘈杂环境中听一个很轻的声音你先听到了一点动静微小电荷差然后集中注意力把这句话完整复述出来并记住感测放大并锁存。整个 DRAM 读操作的成败全看感测放大器能不能准确捕捉并锁定那一点微弱信号。5.3 数据路径上的各级暂存从内部总线到 DQ 引脚在感测放大器之后数据还要经过多级“暂存”才能送到芯片引脚列选择导通后选中列的数据进入内部数据总线总线上有驱动器和接收锁存器负责把数据送到 IO 缓冲。DDR 里的输出寄存器会把数据按时钟沿对齐等到相位正确时才推到 DQ 引脚。预取机制本身也是一种“暂存-重组”DRAM 内部一次读出 8n 位暂存在预取缓存里再按外部时钟分成多拍高速发送。这些环节对使用者透明但对想要做高速信号完整性调试的人来说很重要。如果某一级暂存的时序不对现象往往是某个速率档位能跑、另一个速率档位一跑就错或者低温正常、高温出错。5.4 系统视角下的“暂存区”逻辑把视角拉高现代计算机的整个存储系统其实是一个层层暂存的模型Cache 是 DRAM 的暂存区DRAM 是 SSD 的暂存区寄存器又是 Cache 的暂存区。每一层都存在更靠近处理器的一层都是为了掩盖下一层慢得多的事实。软件里常说的“暂存 buffer”如果最终落在 DRAM 里也同样受刷新机制管辖。这里要顺便澄清一个误区有人认为“频繁访问的地址不用刷也行因为一直在读写”这是错误的。刷新是周期性、无条件进行的和数据访问频率没有任何关系。哪怕你每秒读写同一个地址一万次到了 tREFI 时间点该行还是得刷新否则电荷一样会漏没。6. DRAM、DDR、PSRAM三个容易搞混的名字6.1 DDR 只是 DRAM 家族中的“高速接口版本”很多初学者把 DRAM 和 DDR 当成两种东西实际上 DDR 是 DRAM 的一种实现方式。DRAM 本身是一种存储技术家族几十年来演进出了很多形态早期的异步 DRAM靠处理器提供时序速度慢。SDR SDRAM引入同步时钟开始按时钟沿工作。DDR SDRAM在 SDR 基础上搞“双倍速率”一个时钟周期上升沿和下降沿都传数据。DDR2/DDR3/DDR4/DDR5不断提升预取宽度、Bank 数量、电压优化和命令调度。面向移动的 LPDDR、面向显卡的 GDDR、面向高带宽计算的 HBM也都在 DRAM 家族里。DDR 的关键不是“它终于不用刷新了”而是它在保持 DRAM 基本存储单元不变的前提下把外部接口带宽压榨到了极致。1T1C 还是那个 1T1C感测原理也没变变的是接口协议、预取宽度、内部 Bank 组织。6.2 PSRAM换了一张 SRAM 脸芯还是 DRAMPSRAM全称 Pseudo Static RAM伪静态随机存取存储器名字起得很有欺骗性。它骨子里就是 DRAM用的也是 1T1C 存储单元也需要刷新但它在封装内部集成了刷新控制/自刷新逻辑对外接口做得跟 SRAM 一样简单你不需要发 REFRESH 命令它自己会把刷新打理好。为什么会有这种产品因为嵌入式领域的人有时很矛盾SRAM 接口简单但贵、容量小DRAM 便宜容量大但刷新控制麻烦还得有专用控制器。PSRAM 就是折中外部你当它 SRAM 用读写时序简单不需要管行激活、列激活、刷新内部它自动完成一切脏活累活。很多低成本的 WiFi 模组、MCU 方案扩展内存时用的就是 SPI/OPI 接口的 PSRAM。6.3 一张对比表理清 SRAM / PSRAM / SDR SDRAM / DDR项目SRAMPSRAMSDR SDRAMDDR3/DDR4存储单元6T1T1CDRAM核1T1C1T1C外部刷新控制不需要不需要内部管理必须由控制器发刷新命令必须由控制器发刷新命令接口复杂度极简简单类SRAM中等多Bank管理复杂时序训练、ODT、Bank group典型容量几Mb~几十Mb几十Mb~百Mb百Mb~GbGb级~几十Gb典型成本高中中低低按bit算速度快中等中等高你要做产品选型这表基本就是决策依据。要速度要极简选 SRAM要便宜但不想管刷新选 PSRAM要容量大、接口现成选 SDR SDRAM要性能再往上走就得上 DDR。6.4 选型建议什么时候用 DDR什么时候用 PSRAM碰到 MCU 方案CPU 主频 100MHz 不到内存需求就几 MB那上 DDR 纯属给自己找麻烦——板子层数增加、控制器复杂度上升、初始化调试要人命。这时候 PSRAM 是更好的选择接口简单代码写起来跟用 SRAM 一样容量还能给到 8MB、16MB 甚至更多。碰到 Linux 系统、运行频率上 GHz、内存需求按 GB 算那就老老实实上 DDR。DDR 控制器的复杂度是系统设计的一部分从原理图布局、阻抗匹配到布线等长、Training 参数每一步都要按规格书来。还有其他特殊情况如果产品对断电数据保持有硬性要求DRAM 类方案根本不能考虑得上 MRAM、FRAM 或者外挂 Flash 做掉电保护。理解 DRAM 家族的边界选型时才能少走弯路。7. 给开发者的实践建议刷新配置、初始化与排查7.1 拿到 DRAM 先找这几个参数不管你是用 STM32 的 FMC 接 SDR SDRAM还是给 Linux 板子调 DDR拿到 DRAM datasheet 后不要只盯着容量和速度等级。有几个参数必须第一时间确认tREFI刷新间隔。通常就是“刷新周期/行数”比如 7.8μs 这类值。tRFC单行刷新命令需要占用的时间。Refresh Row Count比如 8192 行、16384 行。工作温度范围和刷新周期是否随温度变化。如果是 LPDDR还要看自刷新功耗和自刷新入库/退出时间。MCU 的 SDRAM 控制器里通常有一个刷新计数器寄存器里要填的值本质是“每隔多少个时钟周期发一次刷新命令”。计算公式基本都是刷新计数 tREFI / 时钟周期然后还要留一点余量或者按参考手册减去几个周期作补偿。你得确认控制器是按 tREFI 均匀刷新还是按行数分摊刷新不同厂商外设设计不同填错一个寄存器轻则性能下降重则数据随机错乱。7.2 初始化最容易踩的坑DRAM 不是一个上电就能用的器件它有严格的初始化时序。以常见的 SDR SDRAM 为例大概流程是上电后先维持一段稳定延时通常几百微秒期间不能发任何命令。对所有 Bank 执行预充电。连续发多条刷新命令。设置模式寄存器突发长度、CAS 等。如果是 DDR后面还有 ZQ 校准、DQS 读写延时训练。这里最常见的两个坑第一个是上电稳定时间不够。有的人急着初始化上电几十微秒就发命令结果 DRAM 内部电压还没稳定训练结果就是错的最后表现为“偶尔开机失败”或“跑着跑着数据坏了”。正规做法是严格按 datasheet 的初始化时序图来该等 200μs 就等 200μs别省。第二个是跳过刷新配置。很多参考代码只配置了时序和 Bank 参数刷新寄存器没认真算。如果刷新间隔被设得太长电容里的电荷早就漏没了数据表面看是写进去了过一会儿读出来全是乱码。这种问题很隐蔽因为它和主频、电压、温度都有关系时好时坏。7.3 高低温不稳定优先查刷新我做过的板子里最折磨人的一次故障是常温下跑 memtest 一整天都没问题放到高温箱里 60℃ 跑半小时就报错有时是单个 bit 翻转有时是整行数据花掉。排查顺序通常是这样先怀疑刷新配置高温漏电加快标准 64ms/8192 行在高温下可能不够。确认芯片支持的温度补偿刷新或者手动缩短刷新周期是否开启。再看电源纹波DRAM 的感测放大器对电源波动很敏感VDD 纹波大时微弱信号可能被误判。最后查信号完整性DQ/DQS 的时序余量、ODT 配置、PCB 走线等长是否合格。其中刷新相关参数是最容易被人忽略的。因为常温下芯片裕量足够刷新间隔长一点也发现不了温度一高漏电加速所有问题就都暴露出来了。如果你在调试一个“常温稳定、高低温不稳定”的内存问题第一步就应该把刷新周期按规格书最严格条件重算一遍。7.4 验证“刷新链路”的一个实测方法分享一个我常用的验证方法适合嵌入式板卡在 DRAM 某片地址连续写入 0xA5、0x5A、0xFF、0x00 等 Pattern。开一个定时器每 10ms 读一遍并比较连续跑几小时。同时用温箱或加热片控制芯片温度从常温升到 70℃ 以上。观察错误模式如果错误是随机单 bit 翻转且温度越高错得越多大概率是刷新周期不够或电源纹波问题。如果错误集中在某几位、某几个地址更像布线/数据线/地址线问题。如果错误按很规律的周期出现往往和刷新命令插入点冲突有关需要查控制器的刷新仲裁配置。如果是 PC 上跑大内存测试memtest86 这类工具会循环覆盖不同 Pattern 和地址能暴露大部分问题。但要注意跑测试时的内存温度未必达到极端工况有条件还是应该做高低温测试内存是最怕“常温没问题”的器件之一。7.5 个人经验不要迷信“自动刷新”最后说一个容易被误解的事。很多人看到 datasheet 里有 Auto-Refresh、Self-Refresh 字样就以为“刷新是芯片自己搞定的控制器不用管”。实际上除非 DRAM 进入了 Self-Refresh 模式否则外部控制器必须按照 JEDEC 时序周期性地发送 REFRESH 命令一次都不能漏。Auto-Refresh 只是说“控制器发一条刷新命令芯片内部会自动完成一整行或一组行的刷新动作”但发这条命令的职责还是你的。真正全自动的只有 Self-Refresh而且通常只在低功耗休眠场景下用。我在做一款带 SDR SDRAM 的板子时初始化代码是从参考工程抄的没改刷新计数结果设备在南方夏天高温时偶发数据损坏。后来把刷新计数按规格书重算并加了温度补偿问题消失。从那以后我养成了看 datasheet 先看刷新章节的习惯。DRAM 的存储结构虽然看起来很深但真正落到工程上往往是这些“很基本”的知识在关键时候救人。
返回列表