RISC-V 与处理器
ITCM、DTCM、Cache 和 SRAM 的区别
从处理器系统视角梳理 TCM、Cache 与 SRAM 的功能定位、访问特征和设计取舍。
在处理器和专用计算架构中,ITCM、DTCM、Cache 和 SRAM 经常同时出现。它们都与存储相关,但抽象层级和设计目标不同。
如果把这些概念混在一起,很容易在读 SoC 文档或做地址映射时产生误解。例如,有人会说“把数据放到 SRAM 里会比 Cache 快”,但这句话并不完整。SRAM 是一种物理存储实现,Cache 和 TCM 是处理器系统中的存储组织方式;TCM 或 Cache 的底层通常也可以由 SRAM 宏实现。
这篇笔记从处理器系统视角梳理它们的功能定位和设计取舍。
基本定义
| 名称 | 典型含义 | 特征 |
|---|---|---|
| ITCM | Instruction Tightly Coupled Memory | 指令低延迟访问 |
| DTCM | Data 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 读访问大致可以抽象为:
- 根据地址拆分 tag、index 和 offset。
- 用 index 读取对应 cache set。
- 比较 tag 并检查 valid 位。
- 命中时返回 data array 中的数据。
- 缺失时从下一级存储取回 cache line,并根据策略替换。
Cache 的设计参数包括:
| 参数 | 含义 | 影响 |
|---|---|---|
| Line size | 每次填充的数据块大小 | 空间局部性、带宽浪费 |
| Associativity | 组相联度 | 冲突 miss、tag 比较成本 |
| Capacity | 总容量 | 命中率、面积和功耗 |
| Write policy | write-through/write-back | 一致性和写性能 |
| Replacement | LRU、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 宏需要考虑端口数、位宽、深度、时钟和工艺约束。
可以用下面的表做一个快速比较:
| 维度 | ITCM | DTCM | Cache | 普通 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 会有不同的总线协议、地址映射和一致性设计。具体项目中应以真实架构文档为准。