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控制器,我最看重三个指标:
- 带宽利用率:DDR的峰值带宽很高,但实际利用率往往只有60%-70%。为什么?因为行激活、预充电、刷新这些操作都在“偷”带宽。
- 访问延迟:从CPU发出读请求,到数据回来,一般要50-100ns。这个延迟对Cache miss惩罚影响很大。
- 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,每一层都有它的职责和取舍。
这张图里,我特意把TCM和L1 Cache放在了同一层。为什么?因为它们都直接连到CPU,延迟都很低。但TCM是“确定性”的,Cache是“统计性”的。这个区别,在实时系统中至关重要。
好了,关于片上存储系统,我就讲这么多。记住一句话:没有最好的存储方案,只有最合适的。设计的时候,多想想你的应用场景,多算算你的带宽和延迟需求。嗯,这样就不会出大问题。