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

SOC/IP验证工程师

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

公告

View Post

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

好的,我们来深入解析 AXI 协议中 Write-Back No-Allocate 这一内存属性。这是一个非常高级且精细的优化策略,用于解决特定场景下的性能问题。理解它需要结合缓存的工作原理和系统架构的目标。

核心结论先行

  • 是什么: Write-Back No-Allocate 是一种缓存策略组合。
    • Write-Back: 指写入时只更新缓存,而不立即更新主内存。被修改的缓存行被标记为“脏”,之后由缓存替换算法决定何时将其写回内存。
    • No-Allocate: 指仅在缓存命中时使用缓存。当发生缓存未命中时(无论是读还是写),都不会将新的数据加载到缓存中。
  • 目标: 针对 “只写一次且之后不会被本CPU核心再次访问” 的数据,避免其污染缓存。它在享受 Write-Back 带来的写入性能优势的同时,通过 No-Allocate 策略保护宝贵的缓存空间。
  • 本质: 一种 “选择性懒惰” 策略。缓存只服务于它已经认识的数据;对于陌生的新数据,它选择“无视”,从而保持自身的纯净和高效率。

深入解析:行为模式与设计哲学

让我们通过具体场景来理解这个看似矛盾组合的行为:

1. 读操作 (Read)

  • 场景一:读命中

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

    1. 数据不在缓存中。
    2. No-Allocate 策略生效: 不会在缓存中分配新行。
    3. 直接发起 AXI 总线事务,从主内存读取数据并返回给处理器。
    4. 结果: 缓存内容无任何变化。数据不会被加载到缓存,因此如果后续再次读取,还会发生未命中。

2. 写操作 (Write) - 这是关键

  • 场景一:写命中

    1. 要写入的地址已经在缓存中(说明它之前被读过或写过,并且被保留了)。
    2. Write-Back 策略生效: 处理器只更新缓存中的数据,并将其标记为 “脏”。
    3. 不会立即发起 AXI 写事务到内存。
    4. 结果: 写入速度极快。数据只在缓存中,内存中的数据是旧的。直到该缓存行被淘汰时,才会将其写回内存。
  • 场景二:写未命中 - 这是 No-Allocate 策略的核心应用

    1. 要写入的地址不在缓存中。
    2. No-Allocate 策略生效: 不会为这个新地址分配缓存行,不会将数据加载到缓存。
    3. 数据通过 AXI 总线直接写入主内存。
    4. 结果: 缓存内容无任何变化。写入完成,内存已更新,但缓存中完全没有这个数据的痕迹。

为什么需要这种策略?—— 解决“缓存污染”问题

这种策略是为了优化一种非常具体但常见的工作负载:大型、稀疏、一次性的写入。

经典问题场景:缓存污染
想象一个 CPU 核心正在向一块巨大的帧缓冲区写入像素数据。这个缓冲区有 10MB 大,而 CPU 的 L1 缓存只有 64KB。

  • 如果使用标准的 Write-Back Write-Allocate 策略,每次写入一个未被缓存的像素,CPU 都会分配一个缓存行(例如 64 字节),并将整个像素块加载进来。
  • 由于缓冲区巨大,CPU 很快就会被这些只写一次的像素数据填满。这意味着之前缓存的所有经常被访问的指令和关键数据(例如,处理图像的算法代码、操作系统内核数据)都会被挤出缓存。
  • 当 CPU 接下来需要执行代码时,会发生大量的缓存缺失,必须从更慢的主内存中获取,导致性能急剧下降。这就是缓存污染。

Write-Back No-Allocate 如何解决这个问题:

  • 当 CPU 向帧缓冲区写入时,由于是 No-Allocate,这些一次性像素数据根本不会进入缓存。
  • 它们被直接写入内存,虽然单次写入延迟较高,但保护了缓存的内容不被破坏。
  • CPU 的缓存里依然充满了宝贵的代码和其他热数据,保证了核心计算部分的高效执行。
  • 整体的系统性能反而得到了提升,因为缓存用在了“刀刃”上。

典型应用场景

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

    • 特点: CPU 或 GPU 执行大量顺序或随机的写入操作,每个地址通常只写入一次,之后由显示控制器从内存读取。
    • 为什么用它: 完美避免缓存污染。缓存得以保留给图形渲染和合成的算法代码,而不是被很快就会过时的像素数据占据。
  2. 网络数据包缓冲区:

    • 特点: CPU 准备一个数据包并写入发送缓冲区,然后由网卡 DMA 读取并发送。数据包一旦发出,缓冲区即被重用。
    • 为什么用它: 避免短暂的网络数据占用缓存。
  3. 大规模数据初始化:

    • 特点: 使用 memset 或循环对一大片内存进行清零或填充固定值。
    • 为什么用它: 清零操作是典型的一次性写入。使用 No-Allocate 可以防止这片巨大的、无用的零值数据污染缓存。

在 AXI 协议中的表示

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

  • 对于写事务 (AWCACHE):
    • AWCACHE[1] (C) = 1 (Cacheable)
    • AWCACHE[3] (WA) = 0 (No Write-Allocate) <- 这是核心
    • AWCACHE[0] (B) = 1 (Bufferable) (对于 Write-Back,此位通常为1,表示写入可以被缓冲,即不强制直达内存)

一个典型的 Write-Back No-Allocate 写配置是 AWCACHE = 4'b1011。

  • C=1: Cacheable

  • WA=0: No Write-Allocate

  • RA=X: Don't Care for write

  • B=1: Bufferable

  • 对于读事务 (ARCACHE):

    • 通常设置为 No-Allocate 作为配套,即 ARCACHE[2] (RA) = 0。

对比总结

特性 Write-Back No-Allocate Write-Back Write-Allocate Normal Non-cacheable
写入行为(未命中) 直接写内存 分配缓存行,只写缓存 直接写内存
写入行为(命中) 只写缓存 只写缓存 (不适用)
优点 避免缓存污染,写入性能优于Non-cacheable 写入性能极高 数据立即可见,简单
缺点 写未命中延迟高 易造成缓存污染 所有访问性能都差
适用场景 一次性写入的大容量数据(帧缓冲) 处理器私有的频繁读写数据 设备寄存器

总结

Write-Back No-Allocate 是一种极其聪明的“舍小保大”策略。

  • 它的设计哲学: “保护缓存的工作集”。宁愿承受一次性的、针对陌生数据的慢速写入,也要确保缓存这个高速资源被用于服务最需要性能的“热”数据(代码和频繁访问的数据结构)。
  • 它的核心价值: 它是应对 “写入密集型” 且 “低局部性” 工作负载的终极武器,能够有效防止这类工作负载摧毁系统的整体性能。
  • 它的决策点: 当你判断一块内存区域的数据写入后几乎不会被本CPU再次访问时,就应使用此属性。如果数据之后还可能被读取,那么经典的 Write-Back Write-Allocate 会是更好的选择。

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

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