一、内存架构概览:无线SoC内存子系统组成

各位同学好,我是老张。在无线SoC领域摸爬滚打了十几年,今天咱们聊聊内存架构。

说实话,内存子系统是SoC里最容易被低估的部分。很多人觉得不就是存数据嘛,有什么难的?但我在项目中吃过不少亏——有一次因为Cache命中率没算对,整个芯片的功耗直接超标30%,改版多花了三个月。从那以后,我对内存架构就格外上心。

1.1 内存子系统都包含什么?

无线SoC的内存子系统,说白了就是这几样东西:SRAM、Cache、ROM、Flash。咱们一个一个说。

核心要点:无线SoC的内存架构设计,本质是在面积、功耗、性能三者之间找平衡。没有完美的方案,只有最适合你应用场景的方案。

SRAM(静态随机存取存储器)

SRAM是SoC里最常用的片上存储器。速度快,但面积大、功耗高。我习惯把SRAM比作「芯片里的临时工」——干活利索,但养着贵。

  • 特点:访问延迟通常在1-2个时钟周期
  • 用途:CPU的紧耦合存储器(TCM)、数据缓冲区、FIFO
  • 痛点:面积大,6T结构占地方。我在做一款蓝牙SoC时,SRAM占了芯片面积的40%多,心疼得不行

Cache(高速缓存)

Cache是解决「处理器太快、内存太慢」这个矛盾的产物。你想想看,CPU主频跑到几百兆甚至上GHz,但片外Flash的访问延迟可能要几十个周期,这中间差了两个数量级。

  • L1 Cache:紧贴CPU核心,延迟1-2周期,容量通常16-64KB
  • L2 Cache:芯片内共享,延迟5-10周期,容量128KB-1MB
  • L3 Cache:部分高端SoC才有,延迟更高,容量更大

我的经验:无线SoC的Cache设计有个坑——别盲目追求大Cache。我曾经在一个低功耗项目中把L2从256KB加到512KB,结果功耗翻倍,性能只提升了5%。得不偿失。

ROM(只读存储器)

ROM用来存放Bootloader、固件启动代码。无线SoC的ROM通常很小,几KB到几十KB就够了。

  • 类型:Mask ROM(掩膜ROM)、OTP(一次性可编程)
  • 特点:只读、非易失、面积小
  • 注意:Mask ROM改一次要重新流片,成本极高。所以我建议把需要频繁修改的代码放到Flash里

Flash(闪存)

Flash是无线SoC的「大仓库」。代码、配置参数、固件升级都靠它。

  • 嵌入式Flash:集成在SoC内部,成本高但访问快
  • 外部Flash:通过SPI/QSPI接口连接,成本低但延迟大
  • 典型容量:256KB到16MB不等,看应用场景

避坑指南:我曾经遇到过一个项目,Flash的擦写次数没算够,产品用了半年就开始出现数据损坏。后来才知道,无线SoC的OTA升级会频繁擦写Flash,一定要选支持至少10万次擦写的型号。

1.2 内存层次结构:L1/L2/L3

内存层次结构,说白了就是「把最快的存储器放在离CPU最近的地方,把最慢的放在最远的地方」。这个思想从计算机诞生就有了,但在无线SoC里,我们更关注功耗和面积。

下面这张图是我手绘的内存层次结构,你一看就明白:

无线SoC内存层次结构 CPU Core L1 Cache (I-Cache + D-Cache) 16-64KB | 1-2周期延迟 L2 Cache (共享) 128KB-1MB | 5-10周期延迟 系统总线/互联 SRAM (TCM/缓冲区) Flash (代码/数据) 处理器 L1 Cache L2 Cache SRAM Flash

看到这个结构图,你应该能理解:越往上,速度越快、容量越小、成本越高。越往下,速度越慢、容量越大、成本越低。

无线SoC和桌面CPU有个很大的不同——我们通常没有L3 Cache。为什么?因为无线SoC的应用场景对实时性要求高,但对绝对性能要求没那么高。加L3 Cache带来的面积和功耗开销,在大多数场景下不划算。

1.3 内存控制器基础

内存控制器,就是CPU和存储器之间的「交通警察」。它的职责包括:

  • 地址映射:把CPU发出的虚拟地址转换成物理地址
  • 访问调度:决定哪个请求先被处理(比如CPU请求优先于DMA请求)
  • 时序控制:确保读写操作符合存储器的时序要求
  • 错误纠正:ECC校验、奇偶校验等

我举个例子,你就明白内存控制器有多重要了:

// 简化的内存控制器状态机
typedef enum {
    IDLE,       // 空闲
    READ_CMD,   // 发送读命令
    READ_WAIT,  // 等待数据
    READ_DATA,  // 读取数据
    WRITE_CMD,  // 发送写命令
    WRITE_DATA, // 写入数据
    REFRESH     // 刷新(DRAM需要)
} mem_ctrl_state_t;

// 无线SoC中常用的仲裁策略:固定优先级
// CPU优先级最高,DMA次之,外设最低
if (cpu_req) {
    serve_cpu_request();
} else if (dma_req) {
    serve_dma_request();
} else if (periph_req) {
    serve_periph_request();
} else {
    // 空闲时做预充电或刷新
    do_maintenance();
}

我的建议:设计内存控制器时,一定要考虑「原子操作」。无线SoC经常处理多任务,如果两个核心同时访问同一个内存地址,没有原子操作保护,数据就乱了。我在一个WiFi SoC项目中就踩过这个坑,调试了整整两周才发现是原子操作没做好。

1.4 无线SoC内存架构的特殊性

和通用处理器相比,无线SoC的内存架构有几个特殊之处:

特性 无线SoC 通用处理器
功耗优先级 极高(电池供电) 中等
实时性要求 高(无线协议时序)
Cache策略 常关闭或部分开启 全开
SRAM占比 高(30-50%面积) 低(5-10%面积)
Flash类型 嵌入式NOR Flash 外部NAND/SSD

你看这个表格就明白了——无线SoC的内存设计,处处都要考虑功耗。我做过一个极端案例:为了省电,把L1 Cache在待机时完全关掉,只保留SRAM里的关键数据。这样待机功耗从2mW降到了0.1mW,但唤醒后第一次访问会慢一些。嗯,这就是取舍。

核心总结:无线SoC内存架构设计的三个关键词——低功耗、实时性、小面积。所有优化都围绕这三个目标展开。后面的章节,我会逐一深入讲解每个模块的设计技巧和实战经验。


公众号:蓝海资料掘金营,微信deep3321