AXI5 原子操作 LCAM:AxATOMIC 事务与单操作原子更新机制
更新时间:2026-09-25。上一代 AXI 独占原子访问 用「独占读登记、独占写验收」两笔事务换原子性,代价是从机乃至互连必须长期保存监控状态。AXI5(AMBA 5 AXI,IHI0022)换了一条思路:把比较交换做成一笔自包含的原子事务,发给一块称为 LCAM(Logical Compare-and-swap Memory,逻辑比较交换内存)的地址空间。阅读本文前建议先了解 AXI4 完整协议 的五个通道,以及独占监控器的工作方式。文中信号位宽与编码凡记忆不确凿处,均标注「需核对 IHI0022」,设计与验证时以规约原文为准。
本文要回答的问题
- AXI4 独占访问在实现上还有什么遗留负担,AXI5 为什么要另立原子事务?
- AxATOMIC 信号里的原子ID(AtomicID)如何区分普通事务、AtomicStore 与 AtomicCompare?
- AtomicStore 为什么一笔事务就能完成 SWAP,原始值怎么回到主设备?
- AtomicCompare 的比较数据与交换数据如何携带,比较成功与失败分别返回什么?
- 互连在 LCAM 方案里还要不要维护 monitor 状态,什么情况下仍需协议转换桥?
一、独占访问的遗留负担:状态被「拆」在两笔事务之间
先回顾 AXI4 独占机制留给系统集成者的三笔账。
第一笔账记在从机里:独占读完成后,本地独占监控器要保存 ID、地址区域和访问大小,直到独占写到来。第二笔账可能记在互连里:多级 NoC、缓存集群之间往往还要全局监控器配合一致性消息,一个集群把监控行改脏,即使没有写事务真正落到内存控制器,另一个集群的独占写也必须失败。第三笔账记在时序窗口上:两笔事务之间可以隔任意多拍,主设备甚至被调度切走,监控表项就一直被占用——监控资源只有寥寥几项,表项耗尽后后来的独占写只能失败重试。
这套设计的根本约束是:原子序列的状态被拆在两笔时间上分离的事务中间,于是链路上的每一级都可能要替它记账。 还有一笔流量账容易被忽略:独占失败一次,主设备要把独占读、计算、独占写整段重来,竞争越激烈,总线上往返的空转事务越多;而原子事务的比较失败只回送一个原值、重发一笔事务,省掉了一次完整的读往返。AXI5 的切入点正是把两笔事务重新合并成一笔,让状态不再跨越事务边界。
这张对比图点出两代设计的分野:独占方案让链路替原子序列保存状态,LCAM 方案让链路只传递一个自包含的请求,真正的读改写在终点内部完成。对主设备而言它仍然是一次「带条件的写」,但条件不再需要沿途各级帮忙记住。
二、AxATOMIC 与 LCAM:原子ID 标识三类事务
AXI5 在地址通道引入 AxATOMIC(读写地址通道各一份,具体位宽与字段排列需核对 IHI0022)。其中最核心的子字段是原子ID(AtomicID),它告诉接收方这笔事务属于哪一类:
| 事务类别 | AtomicID 语义(编码值需核对规约) | 携带数据 | LCAM 行为 |
|---|---|---|---|
| 非原子事务 | 普通读写 | 常规 | 按普通事务处理 |
| AtomicStore | 原子存储 | 交换值一笔 | 无条件写入,回送原值,实现 SWAP |
| AtomicCompare | 原子比较交换 | 比较值 + 交换值 | 原值与比较值相等才写入交换值 |
LCAM 不是一块新内存工艺,而是一个协议视角的概念:支持原子事务、能在内部完成比较交换的地址区间或外设端点,就是一个 LCAM。 片上 SRAM 控制器、DDR 控制器端口、PCIe 控制器窗口都可以声明自己是 LCAM 端点;不支持的外设仍然是普通从机。
读图注意区分两个 ID:AtomicID 是事务类别标签,回答「这是不是原子事务、是哪一种」;常规 AxID 仍然承担在途事务的区分与保序职责,当主设备同时挂出多笔原子事务时,响应的匹配靠的是 AxID 而非 AtomicID。把两者混为一谈,是写 driver 和 monitor 时最常见的低级错误。
三、AtomicStore:一笔事务完成 SWAP
SWAP 的语义是「把新值写进去,同时把旧值拿回来」,这正是构造锁与无锁队列的基础动作。在 AXI4 上它至少需要独占读、本地保存、独占写三次总线交互;在 AXI5 上,主设备只发一笔 AtomicStore 写事务,W 通道放上交换值即可。

时序里有两个要点。其一,整段过程对互连来说就是一笔普通写的路由形态,没有任何标记需要在事务之间保存;读旧值、写新值全部封在 LCAM 内部。其二,主设备在拿到写响应之外还要拿回原始数据——原始数据经哪个通道、与 B 响应的先后次序如何,记忆中是由 LCAM 在响应路径上回送一拍 R 数据再完成 B,确切通道与拍序需核对 IHI0022,验证时不能只断言 BRESP 而漏掉数据回收。
与独占机制类似,原子事务也有大小与对齐约束(允许的操作数宽度、字节选通规则、首地址对齐要求需核对规约),目的同样是让终点的读改写逻辑保持简单、可在窄存储上高效实现。实现上还要注意,LCAM 内部读旧值到条件写回之间存在一个很短的内部互斥窗口,终点必须自己保证这一窗口不被端口上的其他访问打断,这是端点设计的责任,而不是推给互连;理解了这一点,才算真正明白「无状态互连」的代价是端点变重。
四、AtomicCompare:一笔事务里的比较交换
AtomicCompare 对应软件里的 compare-and-swap:内存原值等于期望值(compare data)时才写入新值(swap data),无论是否写入,调用方都要知道内存里原来是什么。AXI5 让主设备在一笔事务中把比较值和交换值都发给 LCAM,由终点一次性完成判定。

比较失败时 LCAM 不做任何写入,存储原样不动,原值照常回送,响应给出「比较未命中」的指示——具体用哪个响应编码区分成功与失败需核对 IHI0022,不要凭 AXI4「EXOKAY 成功、OKAY 失败」的旧印象直接套用。举个具体例子:主设备期望锁变量空闲(比较值 0)、申请置位(交换值 1),但 LCAM 里的原值已经是 7,比较不相等,写入不发生,原值 7 随响应回到主设备;主设备据此知道锁被持有者占用,稍后基于新的原值重新尝试,而不是拿着旧参数盲目重发。软件语义与独占失败一致:重试必须基于回送的原值重新判断。
对比独占方案还能看到一个能力边界。独占的两段式允许主设备在读出值上做任意计算再写回;LCAM 的两种原子操作只提供固定语义:无条件 SWAP 与比较交换。想要 FetchAdd 之类的派生操作,由主设备用比较交换循环实现(规约或互连是否对 PCIe FetchAdd 提供额外映射支持,需核对 IHI0022 及互连文档)。这是「单事务自包含」必然付出的代价:通用性换成了无状态传递。
五、与 EXOKAY 独占的取舍:互连还需不需要记账
现在可以正面回答选型问题。关键判据是原子状态放在哪、放多久。
| 维度 | AXI4 EXOKAY 独占 | AXI5 LCAM 原子事务 |
|---|---|---|
| 事务形态 | 独占读 + 独占写两笔,间隔任意 | AtomicStore/AtomicCompare 各一笔,自包含 |
| 互连状态 | 可能需全局监控器配合 | 直通路由时无状态,不保存任何标记 |
| 从机/端点状态 | monitor 表项跨事务长期占用 | 状态只活在单笔事务处理窗口内 |
| 操作语义 | 读后任意计算,通用 | 仅 SWAP、比较交换 |
| 原值获取 | 独占读的 R 数据 | 原子事务响应中回送 |
| 失败信号 | BRESP=OKAY,整段重读 | 比较未命中响应,基于原值重试 |
| 适用端点 | 所有 AXI3/AXI4 从机 | 需 LCAM 端点或协议转换 |
在一条全 AXI5、终点都是 LCAM 的互连上,NoC 可以彻底甩掉 monitor 表项和跨事务失效逻辑,原子操作对它与普通写路由毫无二致。但系统里只要存在只认独占的 AXI4 从机,转换就不可避免。
这张图澄清了一个容易说过头的结论:「AXI5 互连无状态」只在原子事务直通 LCAM 时成立。 转换桥为了在 AXI4 一侧合成独占读/独占写,自己又变成了状态部件——它要保存地址预约、翻译两边的成败响应,独占失败时还要把 OKAY 重新包装成原子事务的「比较未命中」。反方向(AXI4 主设备经互连接 LCAM)是否支持、如何映射,同样需核对 IHI0022 与互连实现。
此外规约对 LCAM 上原子事务与普通写之间的顺序、以及一类用于强制原子操作排空/定序的控制事务(记忆中称 AtomicFlush 一类机制)有专门规定,确切名称与使用条件需核对 IHI0022。在含非原子主设备的系统里,这类排序保证是集成时不能跳过的检查项。含缓存的系统还要先确认 LCAM 端点落在哪一级:原子事务直达内存控制器与先经过集群缓存,看到的原值和并发写的来源完全不同,单端点 testbench 测通不代表多核场景正确,这与独占机制里必须分清本地/全局监控器是同一条经验。保序与在途事务的一般规则可参考 outstanding 与 ID 排序。
六、适用场景与验证常见坑
LCAM 原子事务最能发挥价值的场景有四类。一是 PCIe 控制器窗口:PCIe 的 Swap/CAS 等 AtomicOp 可以近乎无损地映射到 AXI5 原子事务直达终点,不必在根复合体里拆成独占序列。二是多核、DMA、NPU 共享的 MMIO 寄存器——队列头尾指针、软件门铃计数、无锁环缓冲索引,用 AtomicCompare 更新既不用额外 硬件信号量 IP,也不占 monitor 表项。三是把片上 SRAM 或紧耦合内存直接做成锁存储,NoC 无需为每个从机端口配置监控逻辑。四是新建 AXI5 SoC 中替代独占访问,简化跨缓存域的全局监控设计;缓存一致性背景见 MESI 缓存一致性。反过来,legacy AXI4 从机、只提供独占监控的外购 IP,则应走转换桥或继续使用独占,总线代际选型见 片上总线与 AMBA 协议 与 AMBA 总线选型指南。
设计与验证中需要逐项设防:
- 凭记忆写编码:AxATOMIC 位宽、AtomicID 取值、响应编码一律以 IHI0022 原文核对后再建模,driver/monitor 里每一处魔数都要有规约出处。
- 漏掉原值回收:只检查写响应、不检查回送的原始数据,等于没验 SWAP;应同时断言原值与写后存储内容。
- 比较值/交换值拍序写反:AtomicCompare 两拍 W 数据的次序、字节选通与大小约束必须按规约驱动并反向检查。
- 用 AxID 之外的东西匹配响应:多笔原子事务在途时,AtomicID 只区分类别,响应匹配靠 AxID。
- 只测直通不测桥:转换路径要覆盖桥内预约、独占失败包装、原子事务重试,以及桥表项耗尽时的退化行为。
- 把旧 EXOKAY 直觉搬到新响应:两代成功/失败编码不同,断言按场景区分;错误响应 SLVERR/DECERR 的处理见 AXI 错误响应与总线超时。
- 忽视原子事务与普通写的排序:含非原子主设备的系统必须覆盖规约要求的排空/定序场景,不能假设终点总能自行摆平。
- 派生操作的重试纪律:FetchAdd 一类用比较交换循环实现时,失败后必须基于回送的原值重新运算,这与独占失败整段重读是同一个道理;相关内存序要求见 写缓冲与内存屏障。
这一篇在知识体系里的位置
直接前序是 AXI 独占原子访问,通道与握手基础在 AXI4 完整协议,互连结构在 AXI Crossbar 与 Interconnect,在途与保序在 outstanding 与 ID 排序,事务优先级在 AXI4 QoS 服务质量(该篇同样标注了 AXI5 差异)。软件与原理侧延伸阅读 硬件信号量与自旋锁、MESI 缓存一致性、写缓冲与内存屏障 与 原子操作的底层实现。
总结
AXI5 原子操作 LCAM 用地址通道上的 AxATOMIC 把原子性收进单笔自包含事务:AtomicID 区分 AtomicStore 与 AtomicCompare,前者一笔写事务即完成 SWAP 并回送原值,后者把比较值与交换值一次发齐、由 LCAM 内部判定后才落盘;直通 LCAM 时互连无需维护任何 monitor 状态,面对 AXI4 独占从机则仍需有状态的转换桥,比较失败后主设备基于回送原值重试——信号位宽与响应编码一律以 AMBA 5 IHI0022 规约为准。