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

SOC/IP验证工程师

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

公告

View Post

内存类型write-through No-allocate详解

好的,我们来深入解析 AXI 协议中 Write-Through No-Allocate 这一内存属性。这是一个非常精细的缓存策略,用于特定的优化场景。

核心结论先行

  • 是什么: Write-Through No-Allocate 是一种缓存策略组合。Write-Through 指写入时同时更新缓存和主内存;No-Allocate 指仅在缓存命中时使用缓存,不主动填充缓存。
  • 目标: 针对写入频繁但后续很少读取的数据,避免其污染缓存。它通过 No-Allocate 策略节省宝贵的缓存空间,同时通过 Write-Through 策略保证写入的数据能立即被系统其他主设备看到。
  • 本质: 一种选择性、保守的缓存使用策略,在保证数据一致性的前提下,最大化缓存效率。

深入解析:拆解概念

要理解这个组合,我们最好将其拆分为 Write-Through 和 No-Allocate 两部分,并看看它们如何协同工作。

1. Write-Through (透写)

  • 工作原理: 当 CPU 执行存储(写)操作时,如果数据在缓存中(缓存命中),则同时更新缓存行和主内存。如果数据不在缓存中(缓存未命中),则通常直接写入主内存(具体行为再与 Allocate 策略结合)。
  • 优点: 数据一致性极佳。缓存和主内存中的数据始终保持一致。任何其他总线主设备(如 DMA、另一个 CPU 核心)都能立即看到 CPU 写入的最新数据,无需等待缓存行被后期刷回。
  • 缺点: 性能开销大。每次写入都必须要完成相对缓慢的主内存访问,这限制了写入的吞吐量,消耗了更多总线带宽和功耗。

2. No-Allocate (不分配)

  • 工作原理: 这是一个关于缓存未命中(Cache Miss) 时行为的策略。
    • 当发生读未命中时,数据从主内存读取后,不会将其放入缓存。
    • 当发生写未命中时,不会为要写入的数据在缓存中分配一个新的缓存行。
  • 优点: 节省缓存空间。防止那些只访问一次或很少重复访问的数据占用缓存空间,避免了“缓存污染”(Cache Pollution)。这确保了缓存中只保留最有可能被再次访问的“热”数据,提高了缓存的命中率整体效率。
  • 缺点: 如果判断错误,对后续会频繁访问的数据也采用了 No-Allocate,会导致性能下降,因为每次访问都必须直接访问慢速的主内存。

3. Write-Through No-Allocate 的组合效应

现在我们将两者组合起来,看看一次写入操作的全过程:

场景: CPU 发起一次对地址 A 的写操作,该地址当前不在缓存中(写未命中)。

  1. No-Allocate 策略生效: 由于是写未命中且策略是 No-Allocate,CPU不会为地址 A 分配一个新的缓存行。这意味着数据不会被载入缓存。
  2. Write-Through 策略生效: 数据将直接写入主内存。
  3. 操作完成。

如果是对一个已缓存地址(写命中)的写入呢?

  1. 数据同时更新缓存行和主内存(Write-Through)。
  2. 缓存行状态变为脏(Dirty),但由于是 Write-Through,它其实时刻与内存同步,所以从一致性协议的角度看,它更像是“独占”但干净的状态。

这个组合的最终效果是:

  • 写未命中: 数据直达内存,且不进入缓存。
  • 写命中: 更新缓存和内存。(这种情况较少,因为 No-Allocate 策略使得这些数据很难被缓存起来)

为什么需要它?—— 应用场景

这种策略非常适用于处理短暂的生命周期或写入后共享的数据。

  1. 视频帧缓冲区 / 显示缓冲区:

    • 特点: CPU 或 GPU 会连续地写入一大片像素数据(写入频繁),但每个像素数据在写入后,在很长一段时间内都不会再被 CPU 读取(后续很少读),而是由显示控制器(一个独立的 DMA 主设备)直接从内存中读取并显示。
    • 为什么用它:
      • No-Allocate: 避免了巨大的帧缓冲区数据挤占缓存空间。这些数据只用一次,缓存它们毫无益处,反而会迫使更有价值的代码和数据被挤出缓存,导致性能急剧下降(缓存污染)。
      • Write-Through: 保证了显示控制器总能从内存中读到最新写入的帧数据,实现了CPU和显示控制器之间的数据一致性。
  2. 网络数据包缓冲区:

    • 特点: CPU 准备一个网络数据包并写入缓冲区,然后通知网卡通过 DMA 将其发送出去。数据包一旦发出,缓冲区就会被重用。
    • 为什么用它: 与帧缓冲区同理。避免短暂的网络数据污染缓存,同时保证网卡 DMA 能读到最新数据。
  3. 大量且随机的写入操作:

    • 特点: 对一个非常大的数组进行稀疏的、无规律的写入,且每个地址只写一次。
    • 为什么用它: No-Allocate 策略完美适配。如果使用普通的 Write-Back 策略,每次写未命中都会分配一个缓存行,但这条缓存行可能只被写一次后就再也不用了,这浪费了缓存空间。Write-Through 确保了写入立即可见。

在 AXI 协议中的表示

在 AXI 协议中,这是通过 ARCACHE 和 AWCACHE 信号实现的。

  • AxCACHE[1] (Cacheable): 1 (表示是 Cacheable 的)
  • AxCACHE[3] (Write-Allocate): 0 (表示 No Write-Allocate)
  • AxCACHE[2] (Read-Allocate): 0 (表示 No Read-Allocate)
  • AxCACHE[0] (Bufferable): 通常为 0 (但与其他位组合决定最终模式)

对于 Write-Through 行为,通常 AxCACHE 会设置为 4'b1010 或类似的值。关键在于 WA=0 和 RA=0 实现了 No-Allocate 策略,而 C=1 表明缓存可以参与(在命中时),最终与缓存控制器本身的配置结合,实现 Write-Through 的写入行为。

对比总结

属性 写入行为 (命中时) 写入行为 (未命中时) 优点 缺点 适用场景
Write-Through No-Allocate 更新缓存和内存 直接写内存,不分配缓存行 避免缓存污染,数据立即可见 写入延迟高,带宽占用大 写入后共享的数据(帧缓冲、网络包)
Write-Back 只更新缓存 分配缓存行,只更新缓存 写入性能高,带宽占用小 数据不一致性风险,需要复杂协议 处理器私有的频繁读写数据
Non-cacheable (不适用) 直接写内存 数据立即可见,简单 所有访问都慢,性能最差 严格共享的设备寄存器和DMA缓冲区

总结

Write-Through No-Allocate 是一种针对特定工作负载的优化型缓存策略。

  • 它的设计哲学: “用时方存,过后即弃”。只有当数据很可能被再次访问时(通过缓存命中),才让它留在缓存中;对于那些明确知道只会使用一次的数据,坚决不让它们进入缓存。
  • 它的核心优势: 在保证数据强一致性(Write-Through)的同时,极大地提升了缓存的利用效率(No-Allocate),将宝贵的缓存空间留给更重要的数据。
  • 它的应用标志: 当你处理的数据具有 “写入密集” 且 “读取稀疏” 的特性,并且需要与其他系统主设备共享时,就应考虑使用此属性。

posted on 2025-09-15 22:13  SOC验证工程师  阅读(9)  评论(0)    收藏  举报

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