RISC-V 与处理器

ITCM、DTCM、Cache 和 SRAM 的区别

从处理器系统视角梳理 TCM、Cache 与 SRAM 的功能定位、访问特征和设计取舍。

目录基本定义抽象层级访问确定性ITCMDTCMCacheSRAM架构取舍与 DMA 的关系地址映射示例对加速器设计的启发阶段性总结

在处理器和专用计算架构中,ITCM、DTCM、Cache 和 SRAM 经常同时出现。它们都与存储相关,但抽象层级和设计目标不同。

如果把这些概念混在一起,很容易在读 SoC 文档或做地址映射时产生误解。例如,有人会说“把数据放到 SRAM 里会比 Cache 快”,但这句话并不完整。SRAM 是一种物理存储实现,Cache 和 TCM 是处理器系统中的存储组织方式;TCM 或 Cache 的底层通常也可以由 SRAM 宏实现。

这篇笔记从处理器系统视角梳理它们的功能定位和设计取舍。

基本定义

名称典型含义特征
ITCMInstruction Tightly Coupled Memory指令低延迟访问
DTCMData Tightly Coupled Memory数据确定性访问
Cache高速缓存自动缓存、命中率驱动
SRAM静态随机存储器宏物理存储资源

TCM 更强调确定性,Cache 更强调平均性能,SRAM 则是更底层的存储实现单元。

更准确地说:

  • ITCM 和 DTCM 是靠近处理器核的 tightly coupled memory,通常映射到固定地址空间。
  • Cache 是硬件自动管理的数据副本,用 tag、valid、dirty 等元数据判断命中和替换。
  • SRAM 是存储 bit 的电路宏,可以被组织成 TCM、Cache data array、tag array、scratchpad 或普通片上存储。

抽象层级

软件视角
  ├─ 地址空间、段、栈、heap、代码区
处理器微架构视角
  ├─ ITCM、DTCM、I-Cache、D-Cache、MMU/MPU
SoC 系统视角
  ├─ 总线、仲裁、DMA、外设、片上 SRAM
物理实现视角
  └─ SRAM macro、寄存器文件、ROM、DRAM 控制器

ITCM、DTCM、Cache 和 SRAM 分别落在不同层级。讨论时最好先说明语境:是在说软件如何放置代码和数据,还是在说硬件如何实现存储阵列,或者在说系统总线如何访问某个地址段。

访问确定性

实时系统通常偏好 TCM,因为访问延迟更可控。Cache 的访问延迟取决于命中、缺失、替换和一致性策略。

CPU
 ├─ I-Cache / ITCM
 ├─ D-Cache / DTCM
 └─ Bus Fabric
       └─ SRAM / DRAM / Peripheral

对于实时控制、音频处理、通信协议栈或中断服务程序,确定性有时比平均性能更重要。ITCM/DTCM 的优势在于程序员或链接脚本可以明确控制关键代码和数据的位置,从而减少 cache miss 带来的抖动。

Cache 的优势是对软件透明,适合较大程序和复杂访存模式。只要局部性较好,Cache 可以显著降低平均访问延迟。但它的问题是:

  • 命中和缺失路径延迟不同。
  • 替换策略会影响最坏情况。
  • DMA 和外设访问可能引入一致性问题。
  • 多核系统中还要考虑 cache coherency。

ITCM

ITCM 主要用于指令访问。它通常和处理器取指路径直接相连,目标是提供低延迟、确定性的指令读取。

典型使用场景包括:

  • 启动阶段的关键代码。
  • 中断向量表和高优先级 ISR。
  • 实时循环中的小段核心代码。
  • 对 cache miss 不敏感度要求很低的控制逻辑。

在软件构建中,ITCM 往往需要链接脚本配合,把特定 section 放到对应地址。

.itcm_text :
{
  *(.itcm_text*)
} > ITCM

然后在 C 代码中可以通过属性标记函数:

__attribute__((section(".itcm_text")))
void fast_isr_handler(void) {
    /* time-critical path */
}

这只是通用写法示意,实际语法和地址空间应以具体工具链和 SoC 文档为准。

DTCM

DTCM 主要用于数据访问。它通常适合放置栈、实时 buffer、小型查表数据或算法中的关键工作区。

与 D-Cache 相比,DTCM 的特点是访问行为更容易预测。它不需要 tag lookup,也不涉及替换策略。不过它也有明显限制:

  • 容量通常较小。
  • 地址空间固定,需要软件显式管理。
  • 多主设备访问时需要额外仲裁或限制。
  • 如果 DMA 也要访问 DTCM,需要确认系统连接方式。

在嵌入式系统中,一个常见做法是把时间敏感的 buffer 放入 DTCM,把大块数据放在普通 SRAM 或外部 DRAM,并通过 DMA 做搬运。

Cache

Cache 的基本思想是利用局部性,用较小的高速存储保存近期访问过的数据。它通常由 tag array、data array 和控制逻辑组成。

一次 D-Cache 读访问大致可以抽象为:

  1. 根据地址拆分 tag、index 和 offset。
  2. 用 index 读取对应 cache set。
  3. 比较 tag 并检查 valid 位。
  4. 命中时返回 data array 中的数据。
  5. 缺失时从下一级存储取回 cache line,并根据策略替换。

Cache 的设计参数包括:

参数含义影响
Line size每次填充的数据块大小空间局部性、带宽浪费
Associativity组相联度冲突 miss、tag 比较成本
Capacity总容量命中率、面积和功耗
Write policywrite-through/write-back一致性和写性能
ReplacementLRU、Pseudo-LRU、Random硬件复杂度和命中率

对于 RISC-V SoC,是否有 I-Cache、D-Cache、是否支持一致性、是否有 PMP/MMU、是否允许 cache bypass,都要看具体实现。

SRAM

SRAM 是更底层的存储资源。数字后端或存储编译器通常会提供不同深度、宽度、端口和约束的 SRAM macro。

常见参数包括:

  • 深度和位宽,例如 1024 x 32
  • 端口类型,例如 single-port、simple dual-port、true dual-port。
  • 读写时序,例如同步读、写优先、读优先。
  • 字节写使能。
  • 工作电压、时钟、工艺角和功耗模式。

从架构角度看,SRAM 可以被包装成很多东西:

SRAM macro
  ├─ ITCM memory array
  ├─ DTCM memory array
  ├─ Cache data array
  ├─ Cache tag array
  ├─ DMA buffer
  └─ Accelerator scratchpad

因此,“使用 SRAM”并不能直接说明系统行为。真正需要说明的是:它连接在哪里、由谁管理、访问是否确定、是否参与 cache 一致性、是否对软件可见。

架构取舍

  • ITCM 适合存放启动代码和关键中断路径。
  • DTCM 适合存放实时数据、栈或关键 buffer。
  • Cache 适合通用负载和较大程序。
  • SRAM 宏需要考虑端口数、位宽、深度、时钟和工艺约束。

可以用下面的表做一个快速比较:

维度ITCMDTCMCache普通 SRAM
管理方式软件/链接脚本软件/链接脚本硬件自动取决于系统设计
访问延迟通常固定通常固定命中快,缺失慢取决于总线和宏
容量较小较小中等可配置
适合内容关键指令关键数据通用代码和数据buffer、共享内存
一致性问题较少视连接而定需要重点关注视连接而定

与 DMA 的关系

DMA 是理解这些存储结构时很容易被忽略的一环。CPU 看到的数据和 DMA 写入的数据是否一致,取决于 DMA 访问路径和 Cache 策略。

常见问题包括:

  • DMA 写入内存后,CPU D-Cache 中仍有旧数据。
  • CPU 修改 buffer 后,数据还在 D-Cache 中,没有写回到 DMA 可见的内存。
  • 某些地址区域被配置为 cacheable,某些区域被配置为 non-cacheable。
  • TCM 是否允许 DMA 访问,取决于 SoC 连接。

因此在驱动和裸机程序中,经常需要 cache clean、invalidate 或使用 non-cacheable buffer。具体操作必须参考目标平台文档。

地址映射示例

一个简化的嵌入式系统可能有如下地址分布:

0x0000_0000 - 0x0000_FFFF  ITCM
0x2000_0000 - 0x2000_FFFF  DTCM
0x3000_0000 - 0x3007_FFFF  On-chip SRAM
0x4000_0000 - 0x400F_FFFF  Peripheral
0x8000_0000 - 0x8FFF_FFFF  External DRAM

这只是示意,不代表任何具体芯片。真正项目中,地址映射由 SoC 集成方案决定,并会影响链接脚本、启动代码、异常向量、驱动和调试脚本。

对加速器设计的启发

在 AI 加速器或 RISC-V 协处理器设计中,TCM、Cache 和 SRAM 的区别会直接影响数据搬运方式:

  • 如果加速器通过 DMA 从普通内存取数据,需要考虑 cache coherency。
  • 如果加速器有私有 scratchpad,本质上更接近软件显式管理的 SRAM。
  • 如果处理器和加速器共享 SRAM,需要考虑仲裁、带宽和访问冲突。
  • 如果希望实时性稳定,显式管理的 TCM/scratchpad 往往比透明 Cache 更容易分析。

很多时候,硬件加速器的性能瓶颈并不在 MAC 数量,而在数据是否能按预期速度送达。因此理解这些存储层级,是做专用计算架构的基础。

阶段性总结

ITCM、DTCM、Cache 和 SRAM 都和“快存储”有关,但它们解决的问题不同。TCM 强调可控,Cache 强调平均性能,SRAM 是底层实现资源。做处理器系统或加速器设计时,不能只问“哪个更快”,而要问访问者是谁、地址如何映射、延迟是否确定、数据一致性如何保证。

不同 RISC-V SoC 会有不同的总线协议、地址映射和一致性设计。具体项目中应以真实架构文档为准。

RISC-V 矩阵处理器的基本架构

从 ISA 扩展、寄存器组织、矩阵乘数据通路和软件接口角度整理 RISC-V 矩阵处理器原型思路。