4、片上存储系统:Cache层级设计、SRAM与eDRAM选择、TCM紧耦合内存、DDR控制器接口

存储系统,说白了就是芯片的“粮草官”。

CPU核心再快,如果数据搬不过来,那也是白搭。我在做第一颗基带SoC的时候,就吃过这个亏——CPU跑到了1.2GHz,结果总线带宽不够,核心有一半时间在“空转”。从那以后,我对存储系统的设计就格外上心。

4.1 Cache层级设计:别让CPU饿着

Cache的设计,核心就一句话:让最常用的数据离CPU最近

我个人习惯把Cache分成三级:

  • L1 Cache:跟CPU同频,延迟1-2个周期。容量别贪大,32KB到64KB就够了。太大反而影响访问速度。
  • L2 Cache:容量256KB到1MB,延迟10-20个周期。这里要注意,L2通常是所有核心共享的。
  • L3 Cache:可选,容量几MB到十几MB。延迟50个周期以上。说白了就是给DDR当“缓冲垫”。

你想想看,为什么L1不能做大?因为SRAM的访问延迟跟容量是成正比的。容量翻倍,延迟大概增加10%。所以L1做大了,反而得不偿失。

关键设计参数

  • Cache Line大小:64字节是业界标准。太短了浪费tag存储,太长了浪费带宽。
  • 相联度:4路到8路比较常见。16路以上,硬件复杂度就上去了。
  • 替换策略:LRU(最近最少使用)效果最好,但硬件开销大。我一般用伪LRU,性能接近,面积小很多。

4.2 SRAM与eDRAM选择:鱼和熊掌

这里有个经典问题:为什么不用eDRAM做L1?

嗯,我来解释一下。SRAM和eDRAM的区别,说白了就是“速度”和“密度”的取舍。

特性 SRAM eDRAM
速度 快(1-2ns) 慢(3-5ns)
密度 低(6晶体管/bit) 高(1晶体管+电容/bit)
功耗 静态功耗高 需要刷新,动态功耗高
工艺兼容性 标准逻辑工艺 需要额外工艺步骤

我在项目中遇到过这样的情况:为了省面积,把L2从SRAM换成了eDRAM。结果发现,eDRAM需要定期刷新,刷新期间不能访问。这就导致了一些实时性要求高的任务出现了延迟抖动。后来我学乖了——L1和L2必须用SRAM,L3可以考虑eDRAM

我的建议

  • 对延迟敏感的场景(如中断响应),用SRAM。
  • 对容量敏感的场景(如视频缓冲),用eDRAM。
  • 混合使用?可以,但要处理好刷新和访问的冲突。

4.3 TCM紧耦合内存:实时性的保障

TCM,全称Tightly Coupled Memory。它跟Cache最大的区别是:访问延迟是确定的

Cache有命中率的问题,你永远不知道这次访问是命中还是miss。但TCM不一样,它就像CPU的“私有领地”,访问时间固定,没有miss惩罚。

我曾经在一个基带项目中,把关键的协议栈代码和数据放到了TCM里。效果立竿见影——协议处理的延迟抖动从原来的几十微秒降到了几百纳秒。嗯,这就是TCM的价值。

TCM的设计要点:

  • 容量:一般64KB到512KB。太大不划算,毕竟SRAM面积贵。
  • 接口:直接挂在CPU的AXI slave端口上,不走总线。
  • 用途:放中断向量表、实时任务栈、关键数据缓冲区。

注意:TCM不是万能的。它占用了CPU的地址空间,而且不支持虚拟地址映射。所以,只有那些对延迟极度敏感的数据才适合放TCM。

4.4 DDR控制器接口:最后的防线

DDR控制器,是片上存储系统和片外DRAM之间的“桥梁”。

设计DDR控制器,我最看重三个指标:

  1. 带宽利用率:DDR的峰值带宽很高,但实际利用率往往只有60%-70%。为什么?因为行激活、预充电、刷新这些操作都在“偷”带宽。
  2. 访问延迟:从CPU发出读请求,到数据回来,一般要50-100ns。这个延迟对Cache miss惩罚影响很大。
  3. QoS(服务质量):不同的master(CPU、GPU、DMA)对延迟的敏感度不同。DDR控制器要能区分优先级。

我记得有一次,系统里CPU和GPU同时访问DDR,结果CPU的延迟飙升到了200ns以上。查了半天,发现是DDR控制器的仲裁策略有问题——它用的是简单的轮询,没有考虑优先级。后来改成了“带优先级的加权轮询”,问题就解决了。

DDR控制器的关键模块:

  • AXI接口:把AXI协议转换成DDR协议。
  • 命令调度器:对读写命令进行重排序,提高效率。
  • 数据通路:处理数据对齐和ECC校验。
  • PHY接口:物理层,处理DDR的时序和电气特性。

避坑指南

  • 我曾经在DDR控制器的设计中,忽略了“写数据掩码”的处理。结果导致某些写操作覆盖了不该覆盖的数据。嗯,这个bug查了我整整两天。
  • DDR的刷新周期要算准。刷新太频繁,影响性能;刷新太少,数据会丢失。
  • 多通道DDR设计时,要注意地址映射的均衡性。别让一个通道忙死,另一个通道闲死。

4.5 知识体系总览

下面这张图,是我对片上存储系统的一个总结。你可以看到,从CPU核心到DDR,每一层都有它的职责和取舍。

片上存储系统架构总览 CPU Core L1 Cache 32KB-64KB SRAM TCM 64KB-512KB SRAM L2 Cache 256KB-1MB SRAM L3 Cache 几MB eDRAM/SRAM DDR控制器 AXI -> DDR协议 DDR4/LPDDR4 图例 CPU核心 L1 Cache (SRAM) TCM (SRAM) L2 Cache (SRAM) L3 Cache (eDRAM/SRAM) DDR控制器 DDR颗粒

这张图里,我特意把TCM和L1 Cache放在了同一层。为什么?因为它们都直接连到CPU,延迟都很低。但TCM是“确定性”的,Cache是“统计性”的。这个区别,在实时系统中至关重要。

好了,关于片上存储系统,我就讲这么多。记住一句话:没有最好的存储方案,只有最合适的。设计的时候,多想想你的应用场景,多算算你的带宽和延迟需求。嗯,这样就不会出大问题。

专注资料整理