ACE协议介绍(三):ace协议中的make和clean操作

在 ACE(AXI Coherency Extensions)协议中,CleanMake 是两类核心的缓存一致性操作,用于管理缓存行的状态和权限,确保多核系统中数据的一致性。


一、Clean 操作(清理操作)

核心目的

将本地缓存中处于 Dirty 状态(数据与主存不一致)的缓存行,写回到下一级存储(如 L2 或主存),并将其状态更新为 Clean (数据一致,无修改权限)或 Invalid(无效)。

典型场景

  • 当一个缓存行需要被替换(Eviction)时,若其为 Dirty 状态,必须先执行 Clean 操作写回数据,以避免数据丢失。
  • 当其他 Master 发起对同一地址的读操作时,本地 Master 需执行 Clean 操作,确保其他 Master 能读到最新数据。

常见 ACE 事务

  • CleanShared:将 Dirty 缓存行写回,状态变为 Shared(共享可读)。
  • CleanInvalid:将 Dirty 缓存行写回,状态变为 Invalid(无效)。
  • CleanUnique:将 Dirty 缓存行写回,状态变为 Unique(独占)。

二、Make 操作(置位操作)

核心目的

主动将本地缓存中的某一缓存行的状态设置为 Unique(独占),从而获得对该数据的修改权限。这是执行写操作前的关键步骤。

典型场景

  • 当 CPU 需要对一个缓存行进行写操作,但该缓存行当前处于 Shared 或 Invalid 状态时,必须先执行 MakeUnique 操作,获取独占修改权。
  • 这会触发总线事务,通知其他所有 Master 使它们对应的缓存行副本变为 Invalid,确保本地 Master 是唯一拥有者。

常见 ACE 事务

  • MakeUnique:将缓存行状态置为 Unique,获得独占修改权限。
  • MakeInvalid:将缓存行状态置为 Invalid,放弃所有权。

三、Clean vs. Make:核心区别

特性 Clean 操作 Make 操作
核心目标 确保数据一致性,将 Dirty 数据写回 获取修改权限,将状态置为 Unique
状态转换 Dirty → Clean / Invalid / Shared / Unique Shared / Invalid → Unique
总线事务 CleanShared, CleanInvalid, CleanUnique MakeUnique, MakeInvalid
触发时机 缓存替换、响应其他 Master 的读请求 执行写操作前,需要独占权限时

四、结合状态机的理解

  1. Dirty → CleanShared :执行 CleanShared 操作,数据写回,状态变为 Shared,允许其他 Master 读取。
  2. Dirty → CleanInvalid :执行 CleanInvalid 操作,数据写回,状态变为 Invalid,放弃所有权。
  3. Shared → Unique :执行 MakeUnique 操作,获得独占权限,准备修改数据。
  4. Unique → Dirty:本地修改数据后,状态自动变为 Dirty,等待后续 Clean 操作。

下面是 ACE 协议中 Clean / Make 操作与缓存行状态转换对照表,覆盖常见场景和典型事务类型:


五、Clean 操作(写回 + 状态更新)

操作 / 事务 前状态 后状态 核心行为 典型触发场景
CleanShared Dirty Shared 将 Dirty 行写回下一级存储,变为 Shared(共享可读) 响应其他 Master 的读请求,保证数据一致
CleanInvalid Dirty Invalid 将 Dirty 行写回,然后置为 Invalid(放弃该缓存行) 缓存行替换(Eviction),或主动放弃数据所有权
CleanUnique Dirty Unique 将 Dirty 行写回,保持 Unique 独占权限 写操作完成后,仍需独占该缓存行,避免频繁重新获取权限
CleanShared Clean Shared 无写回,直接转为 Shared(数据已一致) 响应其他 Master 的读请求,共享数据
CleanInvalid Clean Invalid 无写回,直接置为 Invalid 主动放弃缓存行,或响应 snoop 使无效

注:Clean 操作的核心是 "写回 Dirty 数据",如果缓存行本来就是 Clean(与主存一致),则只做状态转换,不写回。


六、Make 操作(获取 / 放弃权限)

操作 / 事务 前状态 后状态 核心行为 典型触发场景
MakeUnique Shared / Clean / Invalid Unique 发起总线事务,通知其他 Master 使对应缓存行无效,本地获得独占权限 执行写操作前,必须先获取 Unique 权限
MakeUnique Unique Unique 无变化,保持独占权限 再次确认独占,或处理 snoop 后重新获取
MakeInvalid Shared / Unique / Clean Invalid 主动放弃缓存行,置为无效 响应 snoop 使无效,或主动释放数据所有权

七、常见完整流程示例

  1. 写前准备:Shared → Unique

    • 触发:MakeUnique
    • 行为:通知其他 Master 使对应缓存行无效 → 本地变为 Unique → 可安全写入
    • 写入后:Unique → Dirty
  2. 缓存替换:Dirty → CleanInvalid

    • 触发:CleanInvalid
    • 行为:写回 Dirty 数据 → 置为 Invalid → 腾出缓存空间
  3. 响应读请求:Dirty → CleanShared

    • 触发:CleanShared
    • 行为:写回 Dirty 数据 → 变为 Shared → 其他 Master 可安全读取