ARTICLE DETAIL

资讯详情

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

SoC存储体系全解析:寄存器、Cache、SRAM、DDR与Flash的分工与选型

SoC存储体系全解析:寄存器、Cache、SRAM、DDR与Flash的分工与选型 做SoC相关开发这些年我发现自己面试应届生或者带新人时最爱问的一个问题就是“你画一块SoC的框图里面的存储模块都有哪些”答案五花八门有说SRAM的、有说DDR的、有说Flash的但很少有人能把寄存器、Cache、SRAM、ROM、OTP、外接DDR、NOR Flash、NAND Flash这些存储类型之间的关系和分工讲清楚。其实不光是新人很多做嵌入式软件的朋友常年跟SoC打交道也未必认真梳理过这些存储类型背后的核心差异。今天我就把这个话题摊开聊透从用途、原理到选型、排查把SoC系统里各类存储类型的底细给捋明白。这个内容适合谁如果你是做芯片验证的、写BSP板级支持包的、做嵌入式底层开发的或者单纯就想搞懂手机SoC天梯图背后那些跑分差异是怎么来的这篇应该能帮你省下不少自己折腾的时间。我会尽量用大白话加实际工程案例把那些文档里写得云山雾罩的概念掰开揉碎。SoC存储体系全景一个芯片里为什么要塞那么多“存储”1.1 从“速度越快的存储越贵”说起先从一个基本事实出发没有一种存储技术能同时做到大容量、高速度、低成本。这是SoC内部堆满各种存储模块的根本原因。CPU的运行速度动辄几GHz它希望数据一伸手就能拿到。如果让CPU直接访问几十GB的NAND Flash按Flash几十微秒的读延迟算CPU每取一条指令都要等上千个周期性能直接归零。所以SoC内部按照“速度从快到慢、容量从小到大、成本从低到高”的原则搭了一个金字塔。最顶端是寄存器跟CPU核心同频往下是Cache和片上SRAM几十KB到几MB不等再往下是片外DDR容量从几百MB到几十GB最底层是大容量Flash类存储比如eMMC、UFS、NAND。这套体系跟公司组织架构很像。公司CEOCPU核心做决策不能等员工把全公司所有文件都搬来他身边得有几个助手把最常看的材料放在手边Cache需要详细查看时再去档案室DDR历史归档则放到库房Flash。每个层级查资料的时间差了好几个数量级但容量也差了好几个数量级。1.2 SoC存储家族的完整版图为了接下来讨论方便先给这些存储类型排个队。我按“存储介质和物理位置”分个类后面所有章节都会围绕这张表展开。存储类型典型介质位置容量规模掉电后数据寄存器触发器Flip-FlopCPU核心内部数百字节丢失CacheL1/L2/L3SRAMCPU核心内部或SoC内部几十KB到几MB丢失片上SRAMSRAMSoC内部几十KB到几MB丢失Boot ROM掩膜ROM / OTPSoC内部几十KB到几百KB保留eFuse/OTP熔丝/反熔丝SoC内部几KB到几十KB保留DDR SDRAMDRAM颗粒SoC外部几百MB到几十GB丢失NOR FlashFlash单元SoC外部几MB到几十MB保留NAND Flash/eMMC/UFSFlash单元SoC外部几GB到1TB保留这张表看着简单但每一个存储类型都有自己独特的访问协议、时序要求和失效模式工程上踩的坑基本都是因为这些差异没搞清楚。接下来我按“易失性”“物理位置”“实际用途”三条线分别展开把这堆技术点逐个击破。易失性与非易失性先把“断电就丢”和“断电还在”分清楚2.1 易失性存储为什么寄存器、SRAM、DRAM都怕断电易失性存储的本质是靠持续供电来保持电荷状态。寄存器用两个反相器交叉耦合构成的触发器存储1或0SRAM每个bit用6个晶体管锁存状态DRAM则是靠电容上的电荷存储数据。这三种电路有一个共同特点一旦断电状态信息立刻消失或者在一段时间后因漏电而消失。这里有个容易被忽略的知识点DRAM比SRAM更容易丢数据。SRAM只要供电稳定数据可以无限期保持DRAM的电容会持续漏电所以每个bit都必须周期性刷新Refresh通常每毫秒级就要刷一次。这就是为什么DDR内存控制器里必须内置刷新逻辑刷新间隔的参数如果配错系统就会不定期出软故障表现为某个随机进程报奇奇怪怪的错误。寄存器、Cache、片上SRAM、DDR都属于易失性存储。它们的特点是速度相对快适合存放运行时数据。在SoC的电源管理设计里这类存储的供电域设计特别讲究比如在休眠模式下如果希望系统快速唤醒保留一部分SRAM数据和DDR自刷新就是常见手段。2.2 非易失性存储Boot ROM、eFuse、Flash如何做到断电保留非易失性存储的核心是以物理方式改变材料状态来记录数据。掩膜ROM在制造时就把晶体管连不连写死这个掉不了eFuse和OTP通过熔断金属丝或击穿栅氧化层改变电阻状态这个也掉不了Flash则通过浮栅晶体管里是否存在电荷来区分0和1浮栅外面包着一层绝缘层电荷就被“锁”在里面了断电也不会泄漏。Flash也不是完全不掉电保持这个很多人不知道。浮栅里的电荷会缓慢泄漏NAND Flash的数据保持时间通常标称10年左右NOR Flash会好一些。温度越高泄漏越快。所以工业级产品做存储老化测试时有时会在高温下烘烤来加速验证数据保持能力。这个特性在选型时必须考虑不是所有数据都适合放进普通Flash长期保存。SoC里的非易失性存储模块典型的就是Boot ROM和eFuse。Boot ROM是出厂就固化好的启动代码负责上电后从外部存储加载程序eFuse则用来存放芯片唯一ID、安全密钥、配置熔丝等信息。板级设计中的外部Flash则用来存固件、文件系统、日志这类需要断电保留的大容量数据。2.3 为什么SoC设计要同时保留两大阵营如果非易失性存储这么可靠为什么不干脆把全部存储都做成Flash因为Flash的缺点是速度和寿命都不行。Flash写入必须先擦除再写擦除操作以block为单位延迟动辄几毫秒写寿命也只有十万到百万次擦写。DDR的访问延迟是纳秒级别Flash写入延迟是毫秒级别中间差了百万倍。所以SoC设计的铁律是可以掉电丢失但速度极快的存储负责跑代码、存中间结果不能掉电丢失但速度较慢的存储负责固化程序和数据。这也是为什么几乎所有SoC都有一套完整的非易失启动路径加易失运行路径。理解了这一点再去看启动流程就会非常清晰。最容易被搞混的几种存储寄存器、Cache、片上SRAM3.1 寄存器跟CPU同频的存在寄存器是CPU核心内部的一小撮存储单元通常由触发器构成数一下ARM核的寄存器文件大概也就几百字节到几KB级别。寄存器的特点是读写延迟跟CPU运行频率完全同步一条指令执行时需要对操作数做的读改写全部在寄存器层面完成不存在“访存等待”这个说法。工程上跟寄存器打交道最多的地方是配置外设控制器。开发者平时操作UART、GPIO、DMA这些外设时往寄存器里写值来改变外设行为读寄存器来获取状态。这类寄存器从CPU视角看是“特殊功能寄存器”它的存储介质本质和通用寄存器一样但映射到外部设备。这些寄存器配置错了外面设备的表现就会千奇百怪这也是底层开发调试时最常检查的对象。3.2 Cache对软件透明的硬件缓存Cache是SoC里最像“魔法”的模块它建在SRAM介质上但对软件完全不可见。CPU朝某个地址发一个读请求Cache控制器先判断这个地址的数据在不在Cache里命中则直接返回不命中则向下一级存储发起访问并把读到的数据连同相邻地址的数据一起填充进Cache这样下次访问附近地址时就能命中。这种对软件透明、由硬件维护的特性是Cache和普通SRAM最核心的区别。软件工程师写代码时根本不需要知道Cache具体存了什么只需要在处理“缓存一致性”问题时主动执行清Cache、无效化Cache等操作。这里最常见的坑是DMA操作外设DMA直接读写内存时绕过了CPU的Cache如果CPU之前缓存了一份数据没写回DDRDMA读到的就是旧数据。正确做法是在启动DMA前先把相关Cache行clean掉DMA搬完后把相关Cache行invalidate掉才能保证数据一致。3.3 片上SRAM软件自己管理的“手工Cache”片上SRAM也是用SRAM细胞实现的但它跟Cache的区别在于它是用软件显式管理的一块数据缓冲区硬件不会自动维护它的一致性。片上SRAM往往挂在高性能总线如AXI上有固定的内存地址CPU访问它的延迟比访问片外DDR小很多但比访问Cache要慢。实际应用中低延迟、可预测性要求高的代码和数据结构会放到片上SRAM里比如实时操作系统的任务栈、中断向量表、关键数据缓冲、加密引擎的上下文。Classic做法是把最在乎实时性的代码段和数据段链接到SRAM起始地址。还有一个典型用途是作为DDR初始化前的临时程序运行区这点在下一章详细讲。3.4 三者的关键差异速查我整理了一张速查表建议直接收藏后面调试遇到相关困惑时拿出来对照。对比项寄存器Cache片上SRAM物理介质触发器SRAMSRAM软件可见性可见透明可见一致性维护不涉及硬件维护软件维护访问延迟1个周期2到30个周期比DDR快但不固定典型容量几百字节几十KB到几MB几十KB到几MB数据保存掉电丢失掉电丢失掉电丢失这里的“软件可见性”差异最重要。如果你是做嵌入式开发的寄存器你天天写Cache一致性你得靠API维护片上SRAM则完全是你自己规划的内容。好多从MCU单片机场景转过来做SoC开发的同学会习惯性地把变量放在DDR里然后抱怨性能不够其实如果想榨干SoC能力认真规划片上SRAM和Cache策略才是正路。片外存储DDR、NOR Flash、NAND Flash、eMMC/UFS的分工4.1 DDRSoC的“主记忆体”DDRDouble Data Rate SDRAM是SoC最主要的易失性大容量存储操作系统和应用程序的主内存就落在这里。从DDR3、DDR4到LPDDR4X、LPDDR5每一代的核心变化都是更高的传输速率和更低的功耗。DDR和SoC之间不是单纯总线连接中间隔着内存控制器和PHY。内存控制器负责地址映射、行列管理、刷新调度、QoS仲裁PHY负责信号完整性处理和时序校准。DDR颗粒本身对时序要求极其苛刻上电初始化要按非常严格的步骤走先稳定电源和时钟再经历复位、CKE拉高、需要写入模式寄存器、ZQ校准最后还要做读写训练Read/Write Training来校准DQ/DQS的相位关系。这个流程任何一步出错系统就直接跑不起来或者随机崩溃。工程上有个常见的估算题DDR带宽怎么算以DDR4-3200、64bit总线为例数据传输率3200MT/s总线宽度64bit理论带宽就是3200乘以64再除以8也就是25.6GB/s。这个数字是峰值实际能跑到的有效带宽通常只有理论值的百分之六七十瓶颈往往在内存控制器的调度效率和总线协议开销上。我遇到过一个项目DDR理论带宽很高但内存控制器配置没开高优先级请求抢占再加上Cache miss率偏高实际性能和预期差了三分之一最后调整了QoS配置才追回来。4.2 NOR Flash与NAND Flash一个适合启动一个适合存数据NOR Flash和NAND Flash都是非易失闪存但特性差异极大。NOR Flash支持随机读取可以像内存一样直接映射到地址空间直接用总线读指令执行不需要先把代码搬到RAM里。NOR的读延迟在几十到几百纳秒级别对这个品类来说相当快但写速度慢擦除操作要几十毫秒甚至更久。NAND Flash则是块状读取设备它按页读写、按块擦除读延迟在几十微秒级别但连续读吞吐非常高价格也便宜得多单位比特成本远低于NOR。NAND不能直接执行代码CPU要跑到NAND里的程序必须先经过NAND控制器把程序读到RAM里再跳过去执行。嵌入式系统中典型的组合是小容量NOR Flash放Bootloader和UEFI固件大容量NAND/eMMC放系统镜像和应用数据。SoC芯片如果要支持从NOR启动会在Boot ROM里集成NOR Flash控制器如果支持从NAND启动Boot ROM往往有限容量的“加载前512字节”逻辑把固化在NAND介质里但位于固定偏移位置的SPL加载进片上SRAM这个机制我在下一节启动流程里细讲。4.3 eMMC与UFS两个移动存储标准的差异eMMC和UFS是嵌入式SoC最常用的外部大容量存储封装手机、平板、路由器、机顶盒、车载域控制器里到处都是它们的身影。它们本质都是把NAND Flash颗粒和管理逻辑封装在一起的存储芯片但对外接口协议完全不同。eMMC走的是并行总线8bit数据线时钟通常在200MHz左右理论最高带宽约400MB/s协议栈简单兼容性好缺点是半双工模式读写不能同时进行而且发指令有较长延迟。UFS走的是串行差分接口类似PCIe和SATA的高速串行协议支持全双工和命令队列最新UFS 4.0单通道带宽可以做到28GBps原文有误UFS 4.0每通道最高约23.2Gbps就是约2.9GB/s这里要注意准确度。从实测来看UFS顺序读速度能达到eMMC的五倍以上随机读性能差距更大这也是为什么手机SoC天梯图排名中支持UFS的机型在应用安装启动、游戏加载场景上的体验明显优于eMMC机型。选型上低功耗低成本物联网设备用eMMC通常足够追求性能或者要做高码率视频录制的平台则应该上UFS。两者引脚和协议都不兼容设计时需要提前定好平台支持方向。4.4 从手机SoC天梯图看存储子系统的影响力很多人看手机SoC天梯图时只关注CPU核数和GPU频率其实跑分和应用体验的不少差异都来自存储子系统。同一个SoC平台搭配UFS 2.1和UFS 3.1的机型冷启动应用速度和游戏加载时间能有肉眼可见的差别。天梯图排名的背后SoC的存储接口能力往往比核心数量更关键DDR支持几代、内存总线宽度多少、是否支持LPDDR5、存储接口是eMMC 5.1还是UFS 3.1、Cache容量和prefetch策略是不是先进这些直接决定了系统运行时能不能及时喂饱CPU和GPU。做SoC架构评估时如果只盯着CPU Benchmark不分析存储子系统的带宽和延迟方案多半经不起实测检验。这也是为什么有些SoC纸面数据很猛真机体验却平平无奇根源就在存储架构的瓶颈上。从SoC启动流程看存储的实际用途5.1 冷启动时每一级存储的接力理解SoC各类存储最好的方式是跟着冷启动流程走一遍。SoC上电时片外DDR还没初始化外部Flash里的程序又不能直接被CPU执行那CPU从哪里取第一条指令答案就是内部的Boot ROM。SoC的Boot ROM出厂就固化了一段微码上电后CPU从固定地址开始执行这段微码。Boot ROM会检测启动引脚或eFuse配置确定从哪个外设启动NOR Flash、SD卡、eMMC、UFS、USB下载模式等。然后Boot ROM驱动相应控制器把外部存储里固定偏移位置的一段引导程序搬运到片上SRAM里。为什么只能先搬到SRAM因为DDR此时还没被初始化SRAM是SoC内部就绪的“唯一一块比较大还能跑程序的易失存储”。这段引导程序通常叫SPL或U-Boot SPL它拿到控制权后的第一件事就是初始化DDR控制器和内存颗粒。完成DDR初始化后再把完整的Bootloader如U-Boot完整版从Flash/eMMC/UFS加载到DDR最后跳转过去执行。完整Bootloader接着初始化操作系统所需的各种控制器然后加载内核镜像到DDR设置启动参数最后跳转执行内核。内核起来后会加载文件系统文件系统里的用户程序则根据需要从NAND/eMMC/UFS动态调到DDR里运行。这整条链路中每一级存储都承担了特定时期的特定任务任何一级出问题启动就会卡死在对应阶段。5.2 地址映射与存储布局设计从软件视角来看上述存储都映射到了CPU的地址空间里只是映射方式不同。Boot ROM和片上SRAM在SoC内部通常在系统地址空间中拥有固定的私有地址区域外部DDR的地址范围由SoC的存储控制器配置Bootloader启动时通过配置控制器寄存器来确定DDR的基地址和大小NOR Flash通常在总线地址空间中有固定映射地址NAND/eMMC/UFS则走存储控制器不直接暴露线性地址CPU需要借助相应控制器寄存器来访问。下面是一个典型的32位地址空间布局示例跟具体芯片细节无关仅供理解地址范围存储模块用途0x0000_0000Boot ROM上电启动微码0x0001_0000片上SRAM启动早期代码和实时数据0x0800_0000NOR Flash映射区固件/数据片外存储直接访问0x4000_0000DDR区域操作系统和应用程序主内存0xE000_0000外设寄存器区各种外设控制寄存器设计存储布局时有一个实操要点中断向量表应当优先放在SRAM或DDR开头的固定低地址保证中断响应路径不经过复杂的地址转换。另外如果SoC支持Cacheable和Bufferable属性配置DDR区域的page属性Cache策略要根据内存用途区分普通代码数据用CacheableDMA缓冲区用Non-Cacheable外设寄存器一律Device类型不能随便Cache缓存。常见问题排查与实操心得6.1 启动失败排查存储初始化时序前面提到我最常被问起的故障就是板子启动不起来。这类问题有七成以上出在存储子系统。排查思路一般按启动流程逐级追查现象排查方向典型原因完全不跑、引脚无信号电源复位、时钟Boot ROM未运行或外部复位异常有SPL加载动作但SRAM段校验失败Flash读取时序、SPL偏移地址Boot配置引脚错误或Flash初始化配置错误到DDR初始化阶段卡住DDR初始化训练流程时钟/电源时序错误、DDR颗粒型号不匹配、PHY校准失败DDR能跑通但加载内核后死机DDR频率/时序不稳定、总线仲裁刷新率设置过低、信号完整性不良、访问越界排查DDR初始化的具体手段是看训练日志。多数SoC的DDR控制器驱动支持调试打印会输出训练阶段的通过/失败信息比如DQS gate training失败往往意味着信号质量问题需要检查PCB阻抗、布线长度匹配、参考电压精度。这里有个很坑的细节同样的DDR型号在不同频率下的tCK值和tRCD/tRP时序参数可能都不同不能照抄其他工程的配置文件。正确做法是用SoC厂商提供的DDR配置工具按颗粒数据手册重新生成参数再上板验证。6.2 性能瓶颈定位存储延迟与带宽实测思路当系统运行卡顿时很多人第一时间怀疑CPU频率我认为应该先怀疑存储链路。一个简单有效的观测方法给一段循环代码加时间戳统计分别测试从Cache命中、片上SRAM、片外DDR读取数据的延迟再配合反汇编看编译器有没有把关键数组放到正确区域。实测中常见的一个情况是变量定义时编译器默认放到DDR访问延迟几十纳秒但如果一个热循环的代码段本身只有几百KB完全可以把它放到片上SRAM性能立刻会显著改善。看带宽的方法也很多通常用DMA持续搬数据通过统计搬数量和耗时间接计算实际带宽。我之前在某个平台实测过UFS理论带宽接近2.9GB/s但实际大文件连续读只能跑到1.8GB/s左右瓶颈不在存储介质而在SoC的存储控制器软件栈优化时要去盯协议层的命令队列深度和中断频率而不是盲目换更快的存储芯片。6.3 选型与设计避坑指南最后总结几条我在多个项目里反复验证过的选型经验。不要为了省成本取消片上SRAM哪怕只省几十KB后续做低功耗快唤醒、做安全关键模块的上下文保存都会非常痛苦。NOR Flash容量要看存不存得下第二份固件做OTA升级的嵌入式设备NOR至少要有双bank容量不然升级风险极大。DDR选型不要贴太近极限频率标称3200MT/s的平台如果PCB布线质量和叠层一般建议降一档跑稳定压倒一切。eMMC随机小IO性能和顺序性能差别巨大做视频码流存储时关注顺序写做数据库类应用时关注随机IOPS不要只看标称最高值。注意UFS/eMMC的坏块管理和掉电保护这类封装芯片虽然内部有FTL闪存转换层但异常掉电条件下还是可能出现映射表损坏产品设计要保留修复机制。我在实际项目里的体会是SoC存储体系并不是一堆孤立模块的拼盘它是一整套层次化的协作机制。把每一级存储的用途、差异和相互配合关系吃透比背一百个外设寄存器都有价值。以后再有人问起SoC存储类型你应该能从头到尾把这个齿轮咬合的链路讲明白而不是只会背一堆名字。
返回列表