【芯片设计】AXI协议中那些“先不管”信号——AxLOCK

2,312 阅读8分钟

在AXI(Advanced eXtensible Interface)协议中,LOCK信号用于指示事务是否需要进行锁定操作。锁定操作确保特定事务在访问资源时不会被其他事务打断,这对于某些需要独占访问的操作至关重要。

LOCK信号的作用

LOCK信号主要用于实现以下功能:

  1. 互斥访问

    • 确保某些资源(如内存、外设等)在特定事务期间不被其他事务访问。
    • 这对于多处理器系统或多个主控器并发访问共享资源时非常重要。
  2. 事务的原子性

    • 保证某些事务的操作是不可分割的,即在事务执行期间,其他事务无法访问被锁定的资源,从而确保事务的完整性和一致性。
    • 例如,在执行读-修改-写操作时,确保在读取和写入期间资源不会被其他事务修改。

LOCK信号的编码

LOCK信号是2位宽的,它定义了事务的锁定类型。通常情况下,LOCK信号有以下几种状态:

LOCK 值含义
0b00正常访问(Normal)
0b01互斥访问(Exclusive)
0b10保留(Reserved)
0b11保留(Reserved)

LOCK信号的使用场景

场景一:多处理器系统中的互斥访问

在多处理器系统中,当多个处理器需要访问共享资源(如内存或外设)时,使用LOCK信号可以确保某个处理器在访问资源期间不会被其他处理器打断。例如,一个处理器需要对内存中的某个关键数据结构进行修改时,可以使用互斥访问(LOCK=0b01)来锁定该内存区域,确保其他处理器在修改期间无法访问该内存区域。

场景二:实现原子操作

在某些情况下,需要确保一系列操作的原子性,即这些操作在执行时不能被打断。LOCK信号可以用来实现这种需求。例如,执行读-修改-写操作时,可以使用LOCK信号来锁定目标地址,确保在读和写操作之间,数据不会被其他事务修改。

示例1:多处理器系统中的互斥访问

假设有两个处理器(CPU0和CPU1),它们都需要访问共享内存中的某个关键数据结构。为了确保数据结构的完整性,CPU0在访问时使用LOCK信号进行互斥访问。

  1. CPU0发起一个带有锁定信号的写事务:

    • AWLOCK = 0b01(互斥访问)
    • AWADDR = 0x2000(目标地址)
    • AWSIZE = 0b010(4字节)
  2. 在CPU0完成对地址0x2000的写操作之前,CPU1无法访问该地址。这确保了数据结构在CPU0操作期间保持一致。

实例2:读-修改-写操作的原子性

假设在一个多处理器系统中,有一个共享的计数器变量。多个处理器需要对这个计数器进行增减操作。为了保证操作的原子性,我们需要确保读-修改-写操作在一个事务中完成,而不会被其他处理器的操作打断。

详细步骤

假设计数器变量存储在地址0x1000处,操作流程如下:

  1. 处理器A发起读操作,读取计数器值。
  2. 处理器A对计数器值进行修改(例如,加1)。
  3. 处理器A发起写操作,将修改后的计数器值写回同一地址。

为了确保以上步骤的原子性,使用LOCK信号进行锁定。

具体操作步骤

1. 处理器A发起带锁定信号的读操作

处理器A发起一个带锁定信号的读事务:

  • ARLOCK = 0b01(互斥访问)
  • ARADDR = 0x1000(计数器地址)
  • ARSIZE = 0b010(4字节)
Read request:
ARADDR = 0x1000
ARLOCK = 0b01
ARSIZE = 0b010

2. 处理器A接收计数器值并进行修改

处理器A接收计数器值(假设值为5),然后在本地对该值进行加1操作,得到新的值6。

Original value read from address 0x1000: 5
Modified value: 6

3. 处理器A发起带锁定信号的写操作

处理器A发起一个带锁定信号的写事务,将修改后的值写回地址0x1000:

  • AWLOCK = 0b01(互斥访问)
  • AWADDR = 0x1000(计数器地址)
  • AWSIZE = 0b010(4字节)
Write request:
AWADDR = 0x1000
AWLOCK = 0b01
AWSIZE = 0b010
Write data: 6

image.png

确保原子性

由于读操作和写操作都带有锁定信号,AXI总线协议会确保在这两个操作之间,其他处理器无法访问地址0x1000。这就保证了读-修改-写操作的原子性。

锁定序列必须始终以未设置AxLOCK信号的最终事务完成,最后一个事务仍包含在锁定序列中,但有其效地移除了锁定。

完整事务流程

  1. 读操作

    • 处理器A发起读请求,带ARLOCK = 0b01。
    • AXI总线锁定地址0x1000,其他处理器的访问请求会被挂起。
    • 处理器A读取值5。
  2. 修改值

    • 处理器A在本地将值5修改为6。
  3. 写操作

    • 处理器A发起写请求,带AWLOCK = 0b01。
    • AXI总线继续锁定地址0x1000,其他处理器的访问请求继续被挂起。
    • 处理器A将值6写回地址0x1000。
    • 写操作完成后,AXI总线解除锁定,其他处理器可以访问地址0x1000。

协议补充

关于原子访问和锁定访问,AMBA5 AXI协议的规范中有以下补充信息,下面是对协议中部分内容的翻译。在此规范中,AxLOCK 表示 ARLOCK 或 AWLOCK。

锁定访问

规范中说明从AXI4协议起不支持锁定事务。然而,AXI3实现必须支持锁定事务。AXI4 移除了对锁定事务的支持,因为:

  • 大多数组件不需要锁定事务。
  • 实现锁定事务对以下方面有显著影响:——互连的复杂性——对服务质量保证的能力 当管理器使用 AxLOCK 信号进行事务以表明它是一个锁定事务时,互连必须确保只有该管理器才能访问目标从属区域,直到来自同一管理器的未锁定事务完成。互连中的仲裁器必须强制执行此限制。在管理器开始一系列锁定的读写事务之前,它必须确保没有其他事务等待完成。任何带有 AxLOCK 指示锁定事务的事务都会强制互连锁定以下事务。因此,锁定序列必须始终以不带有 AxLOCK 指示锁定事务的最终事务完成。这个最终事务包含在锁定序列中,并有效地移除锁定。在完成锁定序列时,在发出最终解锁事务之前,管理器必须确保所有先前的锁定事务都已完成。然后,它必须确保最终解锁事务已完成,然后才能开始任何进一步的事务。管理器必须确保锁定序列中的所有事务具有相同的AxID值。注意,锁定访问要求互连在锁定序列进行时阻止任何其他事务发生,因此可能会对互连性能产生影响。此规范建议仅使用锁定访问来支持旧设备。此规范建议以下限制,但它们不是强制性的:
    • 将任何锁定事务序列保持在单个4 KB地址区域内。
    • 将任何锁定事务序列限制为两个事务。

原子访问

在 AXI3 中,AxLOCK 信号指定普通、独占和锁定访问。

LOCK 值含义
0b00正常访问(Normal)
0b01互斥访问(Exclusive)
0b10锁定访问(Locked)
0b11保留(Reserved)

AXI4 移除了对锁定事务的支持,仅使用 1 位锁信号。

LOCK 值含义
0b00正常访问(Normal)
0b01互斥访问(Exclusive)
0b10保留(Reserved)
0b11保留(Reserved)

在AXI4及以上环境中,任何AXI3锁定事务将按以下方式转换:

  • AWLOCK[1:0] = 0b10 转换为普通写事务,AWLOCK = 0b0
  • ARLOCK[1:0] = 0b10 转换为普通读事务,ARLOCK = 0b0

此规范建议,执行此类转换的任何组件,通常是互连,包括一个可选机制来检测并标记此类转换发生。如果任何组件在执行此转换时不能正确操作,则不能在AXI4环境中使用。

注意:对于许多使用锁定事务的遗留案例,例如执行SWP指令,可能需要软件更改以防止使用任何强制锁定事务的指令。