• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

SOC/IP验证工程师

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

详细解释axi协议中提到的内存类型Write-back Read and Write-allocate

好的,我们来对 AXI 协议中的 Write-back with Read and Write-Allocate 内存类型进行一个终极详尽的解析。这可以说是面向最高性能的缓存策略组合,是现代处理器架构的基石。

核心结论:它是什么?

这是一种 “全功能” 或 “最大化性能” 的缓存策略。

  • Write-back (回写): 这是写入行为。当写入一个已在缓存中的数据时,处理器只更新缓存副本,并将其标记为“脏”(Modified/Dirty)。不会立即将数据写回主内存。数据只在缓存行被替换出缓存时,才被写回主内存。
  • Read-Allocate (读分配): 这是读未命中行为。当读取的数据不在缓存中时,系统会从主内存加载整个缓存行的数据到缓存中。
  • Write-Allocate (写分配): 这是写未命中行为。当写入的数据不在缓存中时,系统会先从主内存加载整个缓存行的数据到缓存中,然后再在缓存中执行写入操作。

最终效果是: 任何缓存未命中(无论读或写)都会导致数据被缓存。而一旦数据在缓存中,所有后续的读写操作都将在高速的缓存中完成,从而实现极致性能。


深入工作机制:分解操作流程

1. 读操作 (Read)

  • 场景一:读命中

    1. 数据在缓存中。
    2. 直接从缓存返回数据给处理器。
    3. 速度极快,延迟极低。
  • 场景二:读未命中

    1. 数据不在缓存中。
    2. Read-Allocate 策略触发: 在缓存中分配一个空白的缓存行。
    3. 发起 AXI 总线读事务: 从主内存读取整个缓存行(例如 64 字节)的数据。
    4. 将读取到的数据填充到刚分配的缓存行中。
    5. 从缓存中返回处理器所请求的特定数据。
    6. 结果: 该缓存行被载入缓存,为后续的访问加速。

2. 写操作 (Write)

  • 场景一:写命中

    1. 要写入的地址已经在缓存中。
    2. Write-back 策略触发: 处理器只更新缓存中的数据,并将该缓存行状态标记为 “脏”。
    3. 不会立即发起 AXI 写事务到内存。
    4. 结果: 写入速度极快,且消耗的总线带宽为零。这是性能提升的关键。
  • 场景二:写未命中 - 这是 Write-Allocate 的精髓

    1. 要写入的地址不在缓存中。
    2. Write-Allocate 策略触发: 在缓存中分配一个空白的缓存行。
    3. 发起 AXI 总线读事务: 从主内存读取整个缓存行的数据。(这一步是反直觉但至关重要的)
    4. 将读取到的数据填充到缓存行中。
    5. 处理器在缓存中更新目标数据,并将该行标记为 “脏”。
    6. 结果: 写入操作完成,但数据只存在于缓存中,主内存中的数据是旧的。

为什么需要这种策略?—— 追求极致性能

这种策略的唯一目标就是:让处理器尽可能快地从内存系统中获取数据。它基于计算机科学中最著名的两个局部性原理:

  1. 时间局部性: 如果一个数据被访问,那么它很快可能会再次被访问。

    • 策略响应: 一旦数据被访问(读或写),就将其保留在缓存中(Read/Write-Allocate),以便快速响应下一次访问。
  2. 空间局部性: 如果一个数据被访问,那么它附近的数据很快可能会被访问。

    • 策略响应: 以缓存行为单位(如 64 字节)进行加载(Allocate),而不是只加载请求的 4 或 8 字节。这预取了相邻数据,极大提高了后续访问的命中率。

应用场景与优势:

  • 通用程序执行: 这是处理器默认的内存访问模式。你的程序代码、堆、栈中的数据都通过此模式访问。循环、函数调用、变量访问都极大地受益于时间局部性和空间局部性。
  • 高性能计算: 处理大型数组、矩阵运算时,访问模式通常是可以预测的、连续的。Write-Allocate 在第一次写入一个元素时,就将后续多个元素加载到缓存中,使得整个循环体的运算速度接近缓存速度。
  • 带宽和功耗效率: Write-back 策略将多次写入合并为一次缓存行写回操作,极大地减少了总线活动和内存访问次数,节省了带宽并降低了系统功耗。

代价、风险与硬件支持

这种策略并非没有代价,其实现需要强大的硬件支持:

  1. 缓存污染: 过于积极的缓存策略可能将一些“冷”数据(只访问一次的数据)也加载到缓存中,挤占了更有价值的“热”数据。
  2. 复杂的硬件需求:
    • 缓存一致性协议 (Cache Coherency Protocol): 这是最关键的一点。由于数据可能只存在于缓存中(“脏”状态),而在多核系统中,其他核心可能需要访问这份数据。必须有一个硬件协议(如 MESI、MOESI)来保证所有核心看到的内存视图是一致的。AXI 协议本身不处理一致性,它只传递属性。一致性由更上层的协议(如 ARM 的 ACE 或 CHI)实现。
    • 写缓冲区 (Write Buffer): 当“脏”的缓存行被替换时,需要将其写回内存。写缓冲区可以暂存这些回写请求,避免处理器停滞等待。
  3. 写未命中延迟: 第一次写入一个未知地址时,需要先执行一个完整的缓存行读取,延迟较高。但这笔“投资”是为了后续操作的巨大“收益”。

在 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) = 1 (Bufferable) (此位为1表示写入可由缓存系统管理,是Write-back的特征)
    • 这告诉互联结构:如果写未命中,应该分配缓存行,并且写入由缓存处理。

一个典型的 Write-back with Read and Write-Allocate 配置是:

  • ARCACHE = 4'b1111 (或 4'b1011,取决于实现)
  • AWCACHE = 4'b1111

这个 4'b1111 的值代表了缓存属性的“完全体”,开启了所有性能优化选项。


总结对比

特性 Write-back with R&W Allocate Write-through Normal Non-cacheable
性能 极高(读写均在缓存) 低(每次写入都需访问内存) 极低(每次访问都需访问内存)
带宽效率 高(写入被合并延迟) 低(每次写入都消耗带宽) 中
一致性 需硬件协议(如MESI)维护 自然强一致 自然强一致
硬件复杂度 高 中 低
适用场景 处理器私有内存(代码、数据) 设备寄存器、共享DMA缓冲区 设备寄存器

最终总结

Write-back with Read and Write-Allocate 是现代高性能计算架构的性能引擎。

  • 它的设计哲学是: “大胆预测,积极缓存”。它假设程序行为符合局部性原理,并极尽所能地利用缓存来隐藏缓慢的内存延迟。
  • 它的价值在于: 它使得处理器的计算速度不再被内存速度所束缚,是支撑现代GHz级别处理器和复杂操作系统、应用程序高效运行的底层基础。
  • 对开发者的启示: 理解这一模式有助于你编写缓存友好的代码。例如,通过优化数据结构布局、访问模式(如顺序访问),可以最大限度地利用 Read/Write-Allocate 带来的预取优势,从而显著提升程序性能。

简单来说,当你对一个普通变量进行赋值时,背后正是这个强大的策略在确保你的操作以纳秒级的速度完成。

posted on 2025-09-19 20:59  SOC验证工程师  阅读(16)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3