详细解释axi协议中提到的内存类型Write-through Read and Write-allocate
好的,我们来对 AXI 协议中的 Write-through with Read and Write-Allocate 内存类型进行一个极其详尽的解析。这是一种非常特殊且强大的缓存策略组合,理解它对于掌握高性能共享内存设计至关重要。
核心结论:它是什么?
这是一种 “激进缓存” 与 “绝对一致” 的结合体。
- Write-through (透写): 所有写入操作在更新处理器缓存的同时,必须立即、同步地写回到主内存(Main Memory)。这保证了主内存中的数据永远是最新的。
- Read-Allocate (读分配): 当发生读缓存未命中时,系统会将所请求数据及其所在的整个缓存行从主内存加载到缓存中。
- Write-Allocate (写分配): 当发生写缓存未命中时,系统不会直接写入内存,而是会先将目标地址所在的整个缓存行从主内存加载到缓存中,然后在缓存中完成写入操作。
最终效果是: 任何对内存的访问(无论是读还是写),只要发生缓存未命中,都会导致该数据被缓存。而任何写入操作,都会立刻让缓存和主内存保持一致。
深入工作机制:分解操作流程
1. 读操作 (Read)
-
场景一:读命中
- 数据在缓存中。
- 直接从缓存返回数据给处理器。
- 速度极快。
-
场景二:读未命中
- 数据不在缓存中。
- Read-Allocate 策略触发: 在缓存中分配一个空白的缓存行。
- 发起 AXI 总线读事务: 从主内存读取整个缓存行(例如 64 字节)的数据。
- 将读取到的数据填充到刚分配的缓存行中。
- 从缓存中返回处理器所请求的特定数据。
- 结果: 该缓存行被载入缓存,为后续的访问加速。
2. 写操作 (Write) - 这是最复杂且关键的部分
-
场景一:写命中
- 要写入的地址在缓存中。
- 处理器同时执行两个操作:
- 在缓存中更新数据。
- 发起一个 AXI 总线写事务,将更新后的数据写回到主内存。
- 结果: 缓存和主内存中的数据立即保持一致。
-
场景二:写未命中 - 这是 Write-Allocate 的精髓
- 要写入的地址不在缓存中。
- Write-Allocate 策略触发: 在缓存中分配一个空白的缓存行。
- 发起 AXI 总线读事务: 从主内存读取整个缓存行的数据。(这一步是反直觉的!为了写一个数据,要先执行一次读操作)
- 将读取到的数据填充到缓存行中。
- 处理器在缓存中更新目标数据。
- Write-Through 策略触发: 由于缓存已被更新,紧接着发起一个 AXI 总线写事务,将刚刚更新的这个新数据写回到主内存。
- 结果: 缓存中拥有了该内存区域的完整副本,并且主内存中的特定数据也被更新。
这个过程的代价很高,因为它为了写入一个可能很小的数据(如 4 字节),却执行了:
- 一次整个缓存行的读传输(例如 64 字节)。
- 一次实际数据的写传输(例如 4 字节)。
它用巨大的带宽开销,换来了缓存的填充和最强的一致性。
为什么需要这种看似“低效”的策略?
这种策略的核心优势不在于单次操作的性能,而在于全局性能和数据一致性的绝对保证。它适用于以下特定场景:
-
高度共享且访问模式未知的内存:
- 场景: 一块内存区域可能被多个处理器核心、DMA 控制器、硬件加速器等频繁且随机地访问。系统架构师无法预测其访问模式(是读多还是写多)。
- 优势:
Read/Write-Allocate确保了无论第一个访问者是读还是写,该数据都会被立刻缓存,为所有后续访问提供加速。Write-Through则保证了任何一个写入者的操作都能被所有其他访问者立即看到,提供了最强的数据一致性,无需复杂的缓存一致性协议来维护。
-
对数据一致性要求极苛刻的场景:
- 场景: 金融交易、安全密钥、设备控制寄存器等。这些数据必须保证在任何时刻,主内存中的值都是绝对正确的,绝不能因为数据在缓存中而未刷回导致一致性问题。
- 优势:
Write-Through像一种“同步写”机制,牺牲写入速度换取绝对的可靠性。任何写入成功都意味着数据已经持久化到主内存。
-
简化软件复杂度:
- 场景: 在一些实时操作系统或对执行时间有严格要求的系统中,使用
Write-Through可以避免使用内存屏障指令来手动确保数据写回。软件可以确信一旦存储指令完成,数据就已全局可见。 - 优势: 开发者无需担心缓存一致性问题,降低了软件设计的复杂性。
- 场景: 在一些实时操作系统或对执行时间有严格要求的系统中,使用
-
用于不具备缓存一致性协议的系统:
- 场景: 当系统中有多个主设备(如 CPU 和 DMA),但它们之间没有硬件缓存一致性协议时。
- 优势:
Write-Through确保了 CPU 的数据对 DMA 立即可见,Read-Allocate确保了 CPU 能及时看到 DMA 写入的数据(因为 DMA 写内存后,CPU 缓存中的旧数据会失效,下次读取时会发生未命中并从内存重新加载最新值)。
在 AXI 协议中的实现
在 AXI 协议中,这是通过 ARCACHE 和 AWCACHE 信号域来控制的。
-
对于读事务 (
ARCACHE):ARCACHE[1](C) = 1 (Cacheable)ARCACHE[2](RA) = 1 (Read-Allocate)- 这告诉互联结构:如果读未命中,应该分配缓存行。
-
对于写事务 (
AWCACHE):AWCACHE[1](C) = 1 (Cacheable)AWCACHE[3](WA) = 1 (Write-Allocate)AWCACHE[0](B) = 0 (Non-bufferable) 这是关键!它确保了写操作必须到达终点(内存),才能返回完成信号,实现了真正的 Write-Through。- 这告诉互联结构:如果写未命中,应该分配缓存行,并且写入必须到达最终目的地。
一个典型的配置是 AxCACHE = 4'b1110。
总结对比
| 特性 | Write-through with R&W Allocate | Write-back | Normal Non-cacheable |
|---|---|---|---|
| 一致性 | 最强 | 弱(需协议维护) | 强 |
| 读性能 | 高(一旦缓存) | 非常高 | 非常低 |
| 写性能 | 低(尤其是未命中时) | 非常高 | 低 |
| 带宽效率 | 低(多次总线事务) | 高 | 中 |
| 缓存污染 | 高(积极缓存) | 高 | 无 |
| 使用场景 | 共享且访问模式未知的强一致性内存 | 处理器私有数据 | 设备寄存器、严格共享DMA缓冲区 |
最终总结
Write-through with Read and Write-Allocate 是一种用带宽和延迟换取最强数据一致性和缓存加速潜力的策略。
- 它的设计哲学是: “确保安全,不惜代价”。它不信任异步的写回操作,因此选择同步透写。它希望最大化缓存利用率,因此选择对所有未命中进行分配。
- 它的价值在于: 为那些数据正确性绝对优先于性能、且访问模式不可预测的共享内存场景,提供了一个简单而可靠的解决方案。它是一种非常保守但极其安全的设计选择。
浙公网安备 33010602011771号