AXI(Advanced eXtensible Interface)协议规范
参考:ARM (IHI 0022H.c) AMBA AXI and ACE Protocol Specification
文章目录
Part A: AMBA AXI 协议规范
A1: 介绍
A1.1 AXI架构
AXI协议基于突发,定义了五个独立的事务通道:
- 读地址,信号名称以AR开头。
- 读数据,信号名称以R开头。
- 写地址,信号名称以AW开头。
- 写数据,信号名称以W开头。
- 写响应,信号名称以B开头。
图A1-1显示了写事务如何使用写地址、写数据和写响应通道。
图A1-2显示了读事务如何使用读地址和读数据通道。
1. 通道定义
五个独立通道中的每一个都由一组信息信号以及提供双向握手机制的VALID
和READY
信号组成。
信息源使用VALID
信号来显示通道上何时有有效的地址、数据或控制信息。目的地使用READY
信号显示何时可以接受信息。读数据通道和写数据通道都包括一个LAST
信号,以指示事务中最终数据项的传输。
读写地址通道:读写事务都有自己的地址通道。适当的地址通道承载了事务所需的所有地址和控制信息。
读数据通道:读取数据通道从管理者的下属处带来读取的数据和读取的响应信息,包括:
- 数据总线,可以是8、16、32、64、128、256、512或1024位宽。
- 指示读取事务完成状态的读取响应信号。
写数据通道:写数据通道将写数据从管理器传送到从属设备,包括:
- 数据总线,可以是8、16、32、64、128、256、512或1024位宽。
- 针对每八个数据位即一个字节的通道选通信号,指示有效的数据字节。
写数据通道信息始终被视为缓冲的,因此管理器可以执行写事务,而无需从属确认以前的写事务。
写响应通道:下属使用写响应通道来响应写事务。所有写事务都需要写响应通道上的完成信令。
2. 接口和互连
一个典型的系统由几个管理器和从属设备组成,它们通过某种形式的互连连接在一起,如图A1-3所示。
大多数系统使用三种互连拓扑之一:
- 共享地址和数据总线
- 共享地址总线和多条数据总线
- 多层,具有多条地址和数据总线
在大多数系统中,地址通道带宽要求明显低于数据通道带宽要求。这种系统可以通过使用具有多条数据总线的共享地址总线来实现并行数据传输,从而在系统性能和互连复杂性之间实现良好的平衡。
3. 寄存器切片
每个AXI信道仅在一个方向上传输信息,并且该架构不需要信道之间的任何固定关系。这些特性意味着寄存器片几乎可以插入任何通道的任何点,代价是额外的延迟周期。
A2: 信号描述
A2.1 全局信号
表A2-1显示了全球AXI信号。AXI3和AXI4协议使用这些信号。
所有信号都在全局时钟的上升沿进行采样。
A2.2 写地址通道信号
表A2-2显示了AXI写地址通道信号。除非另有说明,AXI3和AXI4使用这些信号。
A2.3 写数据通道信号
表A2-3显示了AXI写数据通道信号。除非另有说明,AXI3和AXI4使用这些信号。
A2.4 写响应通道信号
表A2-4显示了AXI写响应通道信号。除非另有说明,AXI3和AXI4使用这些信号。
A2.5 读地址通道信号
表A2-5显示了AXI读地址通道信号。除非另有说明,AXI3和AXI4使用这些信号。
A2.6 读数据通道信号
表A2-6显示了AXI读取数据通道信号。除非另有说明,AXI3和AXI4使用这些信号。
A3: 单接口要求
A3.1 时钟和复位
本节描述实现AXI全局时钟和复位信号ACLK
和ARESETn
的要求。
1. 时钟
每个AXI接口都有一个时钟信号ACLK
。所有输入信号都在ACLK
的上升沿采样。所有输出信号变化只能发生在ACLK
的上升沿之后。在管理器和从属接口上,输入和输出信号之间必须没有组合路径。
2. 复位
AXI协议使用单个低电平有效复位信号ARESETn
。复位信号可以异步置位,但去置位只能与ACLK
的上升沿同步。
复位期间,以下接口要求启用:
- 管理者接口必须驱动
ARVALID
,AWVALID
和WVALID
LOW。 - 从属接口必须驱动
RVALID
和BVALID
LOW。 - 所有其他信号可以驱动到任何值
复位后,允许管理者开始驱动ARVALID
、AWVALID
或WVALID
高电平的最早时间点是在ARESETn
设置为高电平后的ACLK
上升沿。图A3-1显示了复位后最早的一点,即ARVALID
、AWVALID
或WVALID
可以被驱动为高电平。
A3.2 基本读写事务(握手)
1. 握手过程
所有五个事务通道都使用相同的VALID
/READY
握手过程来传输地址、数据和控制信息。这种双向流量控制机制意味着管理者和从属都可以控制信息在管理者和从属之间移动的速度。信号源产生VALID
信号,指示地址、数据或控制信息何时可用。目的地产生READY
信号,表示它可以接受信息。只有当VALID
和READY
都为高电平时,传输才会发生。在管理器和从属的接口上,输入和输出信号之间必须没有组合路径。图A3-2至图A3-4显示了握手过程的示例。
如图A3-2所示,源在T1之后提供信息,并断言VALID
信号。目的地在T2之后断言READY
信号。源必须保持其信息稳定,直到在T3传输发生,此时该断言被识别。
不允许源在断言VALID
之前等待,直到READY
被断言。当VALID
被置位时,它必须保持置位,直到某一时钟上升沿,此时VALID
和READY
都被置位,握手发生。
在图A3-3中,目的地在T1之后,地址、数据或控制信息VALID
之前断言READY
。这个断言表明它可以接受这个信息。消息来源提供了该信息,并在T2之后断言VALID
,然后传输发生在T3,此时该断言被识别。在这种情况下,转移发生在单个循环中。
在断言相应的READY
之前,目的地被允许等待VALID
被断言。如果置位了READY
,则允许在VALID
置位之前取消置位READY
。
在图A3-4中,源和目的地碰巧都表示它们可以在T1之后传输地址、数据或控制信息。在这种情况下,传输发生在可以识别VALID
和READY
的断言的时钟上升沿。这些说法意味着转移发生在T2。
2. 通道信号要求
写地址通道:AWREADY
的默认状态可以是HIGH或LOW。本规范建议默认状态为HIGH。 当AWREADY
为HIGH时,下属必须能够接受提供给它的任何有效地址。本规范不建议默认AWREADY
状态为LOW,因为它强制传输至少需要两个周期,一个周期断言AWVALID
,另一个周期断言AWREADY
。
写数据通道:WREADY
的默认状态可以是HIGH,但前提是从属端始终可以在一个周期内接受写数据。管理器在驱动突发中的最终写传输时,必须断言WLAST
信号。本规范建议将非活动字节通道的WDATA
驱动为零。
写响应通道:BREADY
的默认状态可以是HIGH,但前提是管理器始终可以在单个周期内接受写响应。
读地址通道:ARREADY
的默认状态可以是HIGH或LOW。本规范建议默认状态为HIGH。 当ARREADY
为HIGH,下属必须能够接受任何提供给它的有效地址。本规范不推荐默认的ARREADY
值为低,因为它强制传输至少需要两个周期,一个周期断言ARVALID
,另一个周期断言ARREADY
。
读数据通道: RREADY
的默认状态可以是HIGH,但前提是管理器在启动读取事务时能够立即接受读取数据。当从属端驱动突发中的最终读传输时,它必须声明RLAST
信号。本规范建议将非活动字节通道的RDATA
驱动为零。
A3.3 通道之间的关系(握手依赖性)
1. 信道握手信号之间的依赖性
- 发送信息的AXI接口的
VALID
信号不得依赖于接收该信息的AXI接口的READY
信号。 - 正在接收信息的AXI接口可以等到检测到
VALID
信号后,再断言其相应的READY
信号。
在依赖性图中,单箭头指向可以在箭头开始处的信号之前或之后断言的信号。双向箭头指向只有在箭头开始处的信号有效后才能有效的信号。
读事务依赖性:
- 管理器不得在断言
ARVALID
之前等待下属断言ARREADY
。 - 下属可以在断言
ARREADY
之前等待ARVALID
被断言。 - 下属可以在
ARVALID
被断言之前断言ARREADY
。 - 下属必须等待
ARVALID
和ARREADY
均被置位,然后才能置位RVALID
以指示有效数据可用。 - 下属不得在断言
RVALID
之前等待管理器断言RREADY
。 - 管理器可以在断言
RREADY
之前等待RVALID
被断言。 - 管理器可以在
RREADY
被断言之前断言RVALID
。
写事务依赖性:
- 在断言
AWVALID
或WVALID
之前,管理者不得等待下属断言AWREADY
或WREADY
。 - 下属可以等待
AWVALID
或WVALID
,或者两者均断言,然后断言AWREADY
。 - 下属可以在
AWVALID
或WVALID
被断言之前断言AWREADY
。 - 下属可以等待
AWVALID
或WVALID
,或者两者均断言,然后断言WREADY
。 - 下属可以在
AWVALID
或WVALID
被断言之前断言WREADY
。 - 下属必须等待
WVALID
和WREADY
均被断言,然后才能断言BVALID
。 - 下属还必须等待
WLAST
被断言,然后才能断言BVALID
。需要等待,因为写响应BRESP
必须在写事务的最后一次数据传输后发出信号。 - 下属不得在断言
BVALID
之前等待管理者断言BREADY
。 - 管理者可以等待
BVALID
,然后再断言BREADY
。 - 管理者可以在
BVALID
被断言之前断言BREADY
。
A3.4 事务结构
A3.4.1 地址结构(突发长度,尺寸,类型定义及地址计算)
AXI协议是基于突发的。管理器通过将控制信息和事务中第一个字节的地址发送给下属来开始每个突发。随着突发的进行,下属必须计算突发中后续传输的地址。突发不能跨越4KB地址边界。
突发长度
突发长度由下式指定:
ARLEN[7:0]
用于读传输AWLEN[7:0]
用于写传输
对于所有突发类型,AXI3支持1-16个传输的突发长度。
AXI4将对INCR突发类型的突发长度支持扩展到1-256次传输。AXI4中对所有其他突发类型的支持保持在1-16次传输。对于包装突发,突发长度必须是2、4、8或16。
AXI3的突发长度定义为:Burst_Length = AxLEN[3:0] + 1
为了适应AXI4中INCR突发类型的扩展突发长度,AXI4的突发长度定义为:Burst_Length = AxLEN[7:0] + 1
在AXI4中,INCR突发类型和长度大于16的事务可以转换为多个更小的突发,即使事务属性指示该事务不可修改。
突发尺寸
突发中每次数据传输(或节拍)要传输的最大字节数由下式指定:
ARSIZE[2:0]
用于读传输AWSIZE[2:0]
用于写传输
如果AXI总线比突发大小宽,AXI接口必须根据传输地址确定每次传输使用数据总线的哪些字节通道。任何传输的大小不得超过事务中任一代理的数据总线宽度。
突发类型
AXI协议定义了三种突发类型:
- FIXED:突发中每次传输的地址都是相同的。 对于突发中的所有节拍,有效的字节通道是恒定的。然而,在这些字节通道中,对于突发中的每个节拍,
WSTRB
断言的实际字节可能不同。这种突发类型用于对同一位置的重复访问,例如加载或清空先进先出。 - INCR:递增。在递增突发中,突发中每次传输的地址是前一次传输地址的增量。 增量值取决于传输的大小。例如,对于对齐的起始地址,大小为4字节的突发中每次传输的地址是前一个地址加4。这种突发类型用于访问正常的顺序存储器。
- WRAP:一个换行突发类似于一个递增突发,不同的是,如果达到地址上限,地址会绕到一个较低的地址。 这种突发类型用于高速缓存行访问。
突发类型由下式指定:
ARBURST[1:0]
用于读传输AWBURST[1:0]
用于写传输
突发地址
本节提供了确定突发内传输的地址和字节通道的方法。这些方程使用以下变量:
Start_Address——由管理器发布的开始地址。
Number_Bytes——每次数据传输的最大字节数。
Data_Bus_Bytes——数据总线中的字节通道数。
Aligned_Address——开始地址的对齐版本。
Burst_Length——突发内数据传输的总数。
Address_N——突发中传输N的地址。对于突发中的第一次传输,N是1。
Wrap_Boundary——换行突发中的最低地址。
Lower_Byte_Lane——传输的最低地址字节的字节通道。
Upper_Byte_Lane——传输的最高地址字节的字节通道。
INT(x)——x的向下舍入整数值。
这些等式确定突发内的传输地址:
Start_Address = AxADDR
Number_Bytes = 2 ^ AxSIZE
Burst_Length = AxLEN + 1
Aligned_Address = (INT(Start_Address / Number_Bytes)) × Number_Bytes
该等式确定突发中第一次传输的地址:
Address_1 = Start_Address
对于INCR突发,以及对于地址未被换行的换行突发,该等式确定突发中第一次传输之后的任何传输的地址:
Address_N = Aligned_Address + (N – 1) × Number_Bytes
对于换行突发,换行边界变量定义换行边界:
Wrap_Boundary = (INT(Start_Address / (Number_Bytes × Burst_Length)))×
(Number_Bytes × Burst_Length)
对于换行突发,如果 Address_N = Wrap_Boundary + (Number_Bytes × Burst_Length),则:
使用以下公式计算当前传输:
Address_N = Wrap_Boundary
使用以下公式计算任何后续传输:
Address_N = Start_Address + ((N – 1) × Number_Bytes) –
(Number_Bytes × Burst_Length)
这些等式决定了突发中第一次传输使用的字节通道:
Lower_Byte_Lane = Start_Address – (INT(Start_Address / Data_Bus_Bytes)) ×
Data_Bus_Bytes
Upper_Byte_Lane = Aligned_Address + (Number_Bytes – 1) –
(INT(Start_Address / Data_Bus_Bytes)) × Data_Bus_Bytes
这些等式决定了突发中第一次传输后所有传输要使用的字节通道:
Lower_Byte_Lane = Address_N – (INT(Address_N / Data_Bus_Bytes)) ×
Data_Bus_Bytes
Upper_Byte_Lane = Lower_Byte_Lane + Number_Bytes – 1
数据在以下位置传输:
DATA((8 × Upper_Byte_Lane) + 7: (8 × Lower_Byte_Lane))
事务容器描述了如果地址对齐并且声明了选通脉冲,该事务中可以访问的所有字节:
Container_Size = Number_Bytes x Burst_Length
对于INCR突发:
Container_Lower = Aligned_Address
Container_Upper = Aligned_Address + Container_Size
对于WRAP突发:
Container_Lower = Wrap_Boundary
Container_Upper = Wrap_Boundary + Container_Size
A3.4.2 传输的伪代码描述
// DataTransfer()
// ==============
DataTransfer(Start_Address, Number_Bytes, Burst_Length, Data_Bus_Bytes,
Mode, IsWrite)
// Data_Bus_Bytes is the number of 8-bit byte lanes in the bus
// Mode is the AXI transfer mode
// IsWrite is TRUE for a write, and FALSE for a read
assert Mode IN {FIXED, WRAP, INCR};
// Variable for current address
addr = Start_Address;
Aligned_Address = (INT(addr/Number_Bytes) * Number_Bytes);
// Check whether addr is aligned to nbytes
aligned = (Aligned_Address == addr);
// Maximum total data transaction size
dtsize = Number_Bytes * Burst_Length;
if mode == WRAP then
Lower_Wrap_Boundary = (INT(addr/dtsize) * dtsize);
// addr must be aligned for a wrapping burst
Upper_Wrap_Boundary = Lower_Wrap_Boundary + dtsize;
for n = 1 to Burst_Length
Lower_Byte_Lane = addr-(INT(addr/Data_Bus_Bytes))*Data_Bus_Bytes;
if aligned then
Upper_Byte_Lane = Lower_Byte_Lane + Number_Bytes - 1
else
Upper_Byte_Lane = Aligned_Address + Number_Bytes - 1
- (INT(addr/Data_Bus_Bytes)) * Data_Bus_Bytes;
// Peform data transfer
if IsWrite then
dwrite(addr, low_byte, high_byte)
else
dread(addr, low_byte, high_byte);
// Increment address if necessary
if mode != FIXED then
if aligned then
addr = addr + Number_Bytes;
if mode == WRAP then
// WRAP mode is always aligned
if addr >= Upper_Wrap_Boundary then
addr = Lower_Wrap_Boundary;
else
addr = Aligned_Address + Number_Bytes;
// All transfers after the first are aligned
aligned = TRUE;
return;
A3.4.3 常规事务
一个事务有许多突发、大小和长度选项。然而,一些接口和事务类型可能只使用这些选项的一个子集。如果从属组件附加到仅使用事务选项子集的管理器,则可以使用简化的解码逻辑进行设计。
定义了常规属性,以标识符合以下标准的事务:
- AxLEN是1、2、4、8或16。
- 如果AxLEN大于1,AxSIZE与数据总线宽度相同。
- AxBURST是INCR或WRAP,而不是FIXED。
- AxADDR与INCR事务的事务容器对齐。
- 对于WRAP事务,AxADDR与AxSIZE对齐。
Regular_Transactions_Only属性用于定义管理器是否仅发布常规类型事务,以及下属是否仅支持常规事务,如果没有声明常规事务,则认为它是FALSE:
TRUE Only Regular transactions are supported.
FALSE All legal combinations of AxBURST, AxSIZE, and AxLEN are supported.
A3.4.4 数据读写结构(写选通,窄传输,大小端,非对齐)
1. 写选通
WSTRB[n:0]
信号为高电平时,指定包含有效信息的数据总线字节通道。对于写数据总线的每8位有一个写选通,因此WSTRB[n]
对应于WDATA[(8n)+7: (8n)]
。
管理器必须确保只对包含有效数据的字节通道的写选通为高。
当WVALID
为低电平时,写选通脉冲可以取任何值,尽管本规范建议将它们驱动为低电平或保持在以前的值。
2. 窄传输
当管理器生成的传输比其数据总线窄时,地址和控制信息决定传输使用的字节通道:
- 在递增或换行突发中,在突发的每个节拍上使用不同的字节通道。
- 在固定突发中,每个节拍使用相同的字节通道。
图A3-8和图A3-9给出了字节通道使用的两个例子。阴影单元格表示未传输的字节。
3. 字节不变性
为了在单个内存空间中访问混合端数据结构,AXI协议使用字节不变的端序方案。 字节不变的端序意味着,对于数据结构中的任何多字节元素:
- 元素使用相同的连续字节内存,而不考虑数据的字符顺序。
- 端序决定了内存中这些字节的顺序,这意味着它决定了内存中的第一个字节是元素的最高有效字节(MSB)还是最低有效字节(LSB)。
- 任何向一个地址的字节传输都会将同一条数据总线上的8位数据传递到同一地址位置,而不考虑它所属的任何较大数据元素的字符顺序。
只有一个传输宽度的组件必须将其字节通道连接到数据总线的相应字节通道。支持多种传输宽度的组件可能需要更复杂的接口来转换自然不是字节不变的接口。
大多数小端组件可以直接连接到字节不变的接口。只支持大端传输的组件需要一个用于字节不变操作的转换函数。
图A3-10和图A3-11显示了存储在寄存器和存储器中的32位数字0x0A0B0C0D。
图A3-10显示了大端字节不变的数据结构的一个例子。在这种结构中:
- 数据的最高有效字节(MSB)0x0A存储在寄存器的MSB位置。
- 数据的MSB存储在地址最低的存储位置。
- 其他数据字节按重要性降序排列。
图A3-11显示了小端字节不变的数据结构的一个例子。在这种结构中:
- 数据的最低有效字节(LSB)为0x0D,存储在寄存器的LSB位置。
- 数据的LSB存储在地址最低的存储位置。
- 其他数据字节按重要性增序排列。
图A3-10和图A3-11中的例子表明,字节不变性确保了大端和小端结构可以共存于单个内存空间中而不会损坏。 图A3-12显示了一个需要字节不变访问的数据结构的例子。在这个例子中,头字段使用小端顺序,有效载荷使用大端顺序。
例如,在这种结构中,数据项是一个两字节的小端元素,这意味着它的最低地址是它的最低有效位。字节不变性的使用确保了对有效载荷的大端访问不会破坏小端元素。
4. 非对齐的传输
AXI支持非对齐的传输。对于任何由大于1字节的数据传输组成的突发,访问的第一个字节可能与自然地址边界不对齐。例如,从字节地址0x1002开始的32位数据包与自然的32位地址边界不对齐。
管理器可以:
- 使用低位地址线发出未对齐起始地址的信号。
- 提供一个对齐的地址,并使用字节通道选通向未对齐的起始地址发送信号。
图A3-13显示了在32位总线上递增突发的示例,包括对齐和未对齐的32位传输。图中的每一行代表一次传输,阴影单元格表示未传输的字节。
图A3-14显示了在64位总线上递增突发的示例,包括对齐和未对齐的32位传输。图中的每一行代表一次传输,阴影单元格表示未传输的字节。
图A3-15显示了一个在64位总线上进行32位对齐传输的换行突发的示例。图中的每一行代表一次传输,阴影单元格表示未传输的字节
A3.4.5 读写响应结构
AXI协议为读和写事务提供响应信令:
- 对于读事务,来自下属的响应信息在读数据通道上发出信号。
- 对于写事务,响应信息在写响应通道上发出信号。
响应通过以下方式发出信号:
RRESP[1:0]
,用于读传输。BRESP[1:0]
,用于写传输。
响应如下:
OKAY——正常访问成功。表示正常访问已成功。也可以表示独占访问失败。
EXOKAY——独家访问成功。表示独占访问的读或写部分已经成功。
SLVERR——从属错误。当访问成功到达下属,但下属希望向发起管理器返回错误情况时使用。
DECERR——解码错误。通常由互连组件生成,用于指示事务地址没有下属。
表A3-5显示了RRESP
和BRESP
信号的编码。
对于写事务,会针对整个突发发出单个响应信号,而不是针对突发中的每个数据传输。
在读事务中,从属端可以用信号通知突发中不同传输的不同响应。例如,在16次读取传输的突发中,从属端可能会为其中15次传输返回一个ok响应,为其中一次传输返回一个SLVERR响应。
该协议规定,即使报告了错误,也必须执行所需数量的数据传输。例如,如果从下属请求读取八次传输,但下属有错误情况,则下属必须执行八次数据传输,每次都有错误响应。如果从属设备给出单个错误响应,突发的剩余部分不会被取消。
1. OKAY,正常访问成功
正常响应表示以下任一情况:
- 正常访问的成功。
- 独占访问失败。
- 对不支持独占访问的下属的独占访问。
OKAY是大多数事务的响应。
2. EXOKAY,独占访问成功
EXOKAY的响应表明独占访问成功。该响应只能作为对独占读或写的响应给出。
3. SLVERR,从属错误
SLVERR响应表明事务不成功。
为了简化系统监控和调试,本规范建议错误响应仅用于错误情况,而不用于发出正常预期事件的信号。从属错误条件的示例有:
- FIFO或buffer溢出或欠载运行条件
- 尝试不支持的传输大小
- 试图对只读位置进行写访问
- 下属中的超时条件
- 试图访问禁用或断电的功能
4. DECERR,解码错误
DECERR响应表示互连无法成功解码从属访问。
如果互连不能成功解码从属访问,它必须返回DECERR响应。本规范建议互连将访问路由到默认的从属,并且默认的从属返回DECERR响应。
AXI协议要求完成事务的所有数据传输,即使出现错误情况。给出DECERR响应的任何组件都必须满足这一要求。
A4: 事务属性
A4.1 事务类型和属性
下属分为以下两类:
内存从属
内存从属需要正确处理所有事务类型。
外设从属
外围设备下属有一个实现定义的访问方法。通常,访问方法在组件数据表中定义,该数据表描述了下属正确处理的事务类型。
任何对外围从属设备的访问,如果不是实现定义的访问方法的一部分,都必须按照协议完成。然而,当进行了这样的访问时,不要求外围从属设备继续正确操作。它只需要继续以符合协议的方式完成进一步的事务。
AXI协议定义了一组支持内存和外围从属设备的事务属性。ARCACHE
和AWCACHE
信号指定事务属性。他们控制:
- 事务如何在系统中进行。
- 任何系统级缓存如何处理事务。
A4.2 AXI3内存属性信号
在AXI3中,AxCACHE[3:0]
信号指定事务的Bufferable, Cacheable和Allocate属性。表A4-1显示了AxCACHE编码。
AxCACHE[0],Bufferable( B )位
当该位被置位时,互连或任何组件可以将事务延迟任意数量的周期到达其最终目的地。
AxCACHE[1],Cacheable( C )位
当该位被取消置位时,禁止分配事务。当该位被置位时:
- 允许分配事务。RA和WA给出了额外的提示信息。
- 最终目的地的事务特征不必与原始事务的特征相匹配。对于写操作,这意味着几个不同的写操作可以合并在一起。对于读取,这意味着可以预取一个位置的内容,或者单次读取的值可以用于多个读取事务。
AxCACHE[2],Read-Allocate( RA )位
当该位被置位时,建议对事务进行读分配,但不是强制性的。如果C位被取消置位,则RA位不得置位。
AxCACHE[3],Write-Allocate( WA )位
当该位被置位时,建议对事务进行写分配,但不是强制性的。如果C位被取消置位,则不得置位。
A4.3 AXI4更改内存属性信号
AXI4对AXI3内存属性信号进行了以下更改:
AxCACHE[1]
位被重命名为可修改位。- 为不可修改的事务定义了顺序要求。
- 更新了读分配和写分配的含义。
A4.3.1 AxCACHE[1],可修改
在AXI4中,AxCACHE[1]
位是可修改位。高电平时,可修改表示可以修改事务的特征。当可修改为低时,事务不可修改。
不可修改的事务
不可修改的事务通过将AxCACHE[1]
设置为低来指示。不可修改的事务不能拆分为多个事务或与其他事务合并。在不可修改的事务中,表A4-2中显示的参数不得更改。
AxCACHE
属性只能修改为将事务从Bufferable转换为Non-bufferable。不允许对AxCACHE
进行其他更改。可以修改事务ID和QoS。
突发长度大于16的不可修改事务可以拆分为多个事务。每个最终事务必须满足本小节中给出的要求,除了:
- 突发长度减少。
- 适当调整生成的突发的地址。
不可修改的事务是独占访问,如AxLOCK
断言所示,如果访问的字节总数保持不变,则允许修改事务大小AxSIZE
和事务长度AxLEN
。
可修改的事务
可修改的事务通过断言AxCACHE[1]
来指示。可以通过以下方式修改可修改的事务:
- 一个事务可以分解成多个事务。
- 多个事务可以合并成一个事务。
- 读事务可以获取比所需更多的数据。
- 写事务可以访问比要求更大的地址范围,使用
WSTRB
信号确保只更新适当的位置。 - 在每个生成的事务中,可以修改以下信号:
——传输地址AxADDR
——突发大小AxSIZE
——突发长度AxLEN
——突发类型AxBURST
- 以下内容不得更改:
——锁类型,AxLOCK
——保护类型,AxPROT
可以修改内存属性AxCACHE
,但任何修改都必须确保其他组件对事务的可见性不会降低,方法是阻止事务传播到所需点,或者更改在缓存中查找事务的需求。对于同一地址范围的所有事务,对内存属性的任何修改都必须一致。可以修改事务ID和QoS。
不允许对以下事务进行修改:
- 导致对不同于原始事务的4k字节地址空间的访问。
- 导致对单副本原子性大小区域的单次访问作为多次访问执行。
A4.3.2 Read-Allocate和Write-Allocate的更新含义
在AXI4中,Read-Allocate和Write-Allocate位的含义被更新,使得一个位指示为事务发生的分配,另一个位指示由于另一个事务可能已经进行了分配。
对于读事务,写分配位被重新定义,以指示:
- 由于写事务,该位置可能先前已在缓存中分配(如AXI3定义)。
- 由于另一个管理器的操作(额外的AXI4定义),该位置可能已在缓存中分配。
对于写事务,读分配位被重新定义,以指示:
- 由于读事务,该位置可能先前已在缓存中分配(如AXI3定义)。
- 由于另一个管理器的操作(额外的AXI4定义),该位置可能已在缓存中分配。
这些变化意味着:
- 如果
AxCACHE[3:2]
的值不是0b00
,则必须在缓存中查找事务。 - 如果
AxCACHE[3:2]
的值为0b00
,则不需要在缓存中查找事务。
A4.4 内存类型
AXI4协议为AxCACHE
编码所标识的内存类型引入了新的名称。表A4-5显示了AXI4 AxCACHE
编码和相关的内存类型。一些内存类型在AXI3中有不同的编码,这些编码显示在括号中。
同一存储器类型在读通道和写通道上可以有不同的编码。这些编码提供了与AXI3 AxCACHE
定义的向后兼容性。在AXI4中,对特定内存类型使用多个AxCACHE
值是合法的。表A4-5显示了首选的AXI4值,括号中是合法的AXI3值。
A4.4.1 内存类型要求
本节指定了每种内存类型所需的行为。
设备 Non-bufferable
设备不可缓冲内存所需的行为是:
- 必须从最终目的地获得写响应。
- 必须从最终目的地获取读数据。
- 事务不可修改。
- 不得预取读。不得合并写。
设备 Bufferable
设备可缓冲存储器类型所需的行为是:
- 写响应可以从中间点获得。
- 必须按照事务缓冲中的定义,及时使写入事务在最终目的地可见。
- 必须从最终目的地获取读数据。
- 事务不可修改。
- 不得预读取。不得合并写入。
对于读取事务,设备不可缓冲和设备可缓冲内存类型所需的行为没有区别。
正常 Non-cacheable Non-bufferable
正常不可缓存不可缓冲内存类型所需的行为是:
- 必须从最终目的地获得写响应。
- 必须从最终目的地获取读数据。
- 事务是可修改的。
- 可以合并写入。
正常 Non-cacheable Bufferable
正常不可缓存可缓冲内存类型所需的行为是:
- 写响应可以从中间点获得。
- 必须按照事务缓冲中的定义,及时使写入事务在最终目的地可见。没有机制来确定写事务何时在其最终目的地可见。
- 读取数据必须从以下任一来源获得:
——最终目的地。
——正在向最终目的地前进的写入事务。
如果读取数据是从写入事务获得的:
——必须从最新版本的写入中获得。
——不得缓存数据以供以后读取。 - 交易是可修改的。
- 可以合并写入。
对于正常的不可缓存的可缓冲读取,可以从仍在向最终目标前进的写事务中获取数据。这些数据与同时传播到最终目的地的读写事务是无法区分的。以这种方式返回的读数据并不表示写事务在最终目的地可见。
Write-Through No-Allocate
直写不分配内存类型所需的行为是:
- 写响应可以从中间点获得。
- 必须按照交易缓冲中的定义,及时使写入事务在最终目的地可见。没有机制来确定写事务何时在最终目的地可见。
- 读取数据可以从中间缓存副本中获得。
- 交易是可修改的。
- 读取可以被预取。
- 可以合并写入。
- 读写事务需要缓存查找。
- No-Allocate属性是一个分配提示,也就是说,它向内存系统建议,出于性能原因,不分配这些事务。但是,不禁止分配读写事务。
Write-Through Read-Allocate
直写读分配内存类型所需的行为与直写不分配内存相同。但是在这种情况下,出于性能原因,分配提示是:
- 建议分配读取事务。
- 不建议分配写事务。
Write-Through Write-Allocate
直写写分配内存类型所需的行为与直写不分配内存相同。但是在这种情况下,出于性能原因,分配提示是:
- 不建议分配读取事务。
- 建议分配写事务。
Write-Through Read 和 Write-Allocate
直写读取和写分配内存类型所需的行为与直写不分配内存相同。但是在这种情况下,出于性能原因,分配提示是:
- 建议分配读取事务。
- 建议分配写事务。
Write-Back No-Allocate
回写不分配内存类型所需的行为是:
- 写响应可以从中间点获得。
- 不要求写事务在最终目的地可见。
- 读取数据可以从中间缓存副本中获得。
- 交易是可修改的。
- 读取可以被预取。
- 可以合并写入。
- 读写事务需要缓存查找。
- No-Allocate属性是一个分配提示,也就是说,它向内存系统建议,出于性能原因,不分配这些事务。但是,不禁止分配读写事务。
Write-Back Read-Allocate
回写读取分配内存类型所需的行为与回写不分配内存相同。但是在这种情况下,出于性能原因,分配提示是:
- 建议分配读取事务。
- 不建议分配写事务。
Write-Back Write-Allocate
写回写分配内存类型所需的行为与写回不分配内存相同。但是在这种情况下,出于性能原因,分配提示是:
- 不建议分配读取事务。
- 建议分配写事务。
Write-Back Read 和 Write-Allocate
回写读和写分配内存类型所需的行为与回写不分配内存相同。但是在这种情况下,出于性能原因,分配提示是:
- 建议分配读取事务。
- 建议分配写事务。
A4.5 不匹配的内存属性
访问同一内存区域的多个代理可以使用不匹配的内存属性。 但是,为了功能的正确性,必须遵守以下规则:
- 访问同一内存区域的所有管理人员必须对该内存区域在任何层级的可缓存性有一致的看法。适用的规则是:
Address region not Cacheable 所有管理器必须在AxCACHE[3:2]
都被取消声明的情况下使用事务。
Address region Cacheable 所有管理器必须使用断言了AxCACHE[3:2]
的事务。 - 不同的管理器可以使用不同的分配提示。
- 如果寻址区域是正常的不可缓存区域,任何管理器都可以使用设备内存事务来访问它。
- 如果寻址区域具有可缓冲属性,任何管理器都可以使用不允许可缓冲行为的事务来访问它。
A4.5.1 更改内存属性
特定内存区域的属性可以从一种类型更改为另一种不兼容的类型。 例如,属性可以从直写可缓存更改为正常不可缓存。这种改变需要一个合适的过程来执行。通常,会执行以下过程:
- 所有管理器都停止访问该区域。
- 单个管理器执行任何必需的缓存维护操作。
- 所有管理器使用新属性重新开始访问内存区域。
A4.6 事务缓冲
对以下内存类型的写访问不需要最终目的地的事务响应,但要求写事务在最终目的地及时可见:
- 设备 Bufferable
- 正常 Non-cacheable Bufferable
- Write-Through
对于写事务,所有三种内存类型都需要相同的行为。对于读取事务,所需的行为如下:
- 对于设备Bufferable存储器,读取数据必须从最终目的地获得。
- 对于正常的Non-cacheable Bufferable存储器,读取数据必须从最终目的地或正在向最终目的地进行的写入事务中获取。
- 对于Write-Through存储器,可以从中间缓存副本中获取读取数据。
除了确保写事务及时向最终目的地发展之外,中间缓冲区还必须表现如下:
- 可以响应事务的中间缓冲区必须确保,随着时间的推移,任何对正常不可缓存缓冲区的读取事务都会向其目的地传播。这种传播意味着,在转发读事务时,尝试的转发不能无限期地继续,用于转发的任何数据也不能无限期地持续。该协议没有定义任何机制来确定用于转发读取事务的数据可以保留多长时间。然而,在这种机制中,读取数据的动作不能重置数据超时周期。(如果没有这个要求,继续轮询同一个位置可以防止缓冲区中的读取超时,从而防止读取向其目的地前进。)
- 可以保存和合并写事务的中间缓冲区必须确保事务不会无限期地保留在其缓冲区中。例如,合并写事务不能重置决定写何时被排向其最终目的地的机制。(如果没有此要求,对同一位置的连续写入可以防止缓冲区中保存的写入超时,从而防止写入向其目标前进。)
A4.7 访问权限
AXI提供访问许可信号,可用于防范非法事务:
ARPROT[2:0]
定义了读取访问的访问权限。AWPROT[2:0]
定义了写访问的访问权限。
表A4-6显示了AxPROT[2:0]
编码。
保护属性包括:
无特权的或有特权的:AXI管理器可能支持多种级别的操作权限,并将这种权限概念扩展到内存访问。AxPROT[0]
将访问标识为非特权或特权。
安全还是不安全:AXI管理器可能支持安全和非安全操作状态,并将这种安全概念扩展到内存访问。AxPROT[1]
将访问标识为安全或非安全。AxPROT[1]
可以被认为定义了两个地址空间,一个安全地址空间和一个非安全地址空间。该信号可以被视为一个附加的地址位。必须正确处理安全和非安全地址空间之间的任何混淆。
指令或数据:该位表示事务是指令访问还是数据访问。AXI协议将这一迹象定义为一种暗示。它不是在所有情况下都准确,例如,当事务包含指令和数据项的混合时。本规范建议管理器将AxPROT[2]
设置为低电平,以指示数据访问,除非已知该访问是指令访问。
A4.8 遗留问题
AXI4对处理AxCACHE
的一些内存属性提出了额外的要求。在AXI4中,对同一下属使用相同标识的所有设备事务必须相互排序。
A4.9 使用示例
本节给出了内存类型使用的示例。
A4.9.1 设备内存类型的使用
该规范支持结合使用设备Non-bufferable和设备Bufferable内存类型,以强制写入事务到达其最终目的地,并确保发出事务的管理器知道该事务何时对所有其他管理器可见。
标记为设备Bufferable的写事务需要及时到达其最终目的地。但是,事务的写响应可以由中间缓冲区发出信号。因此,发出请求的管理器无法知道该写入何时对所有其他管理器可见。
如果管理器发出设备Bufferable写事务或写事务流,然后是设备Non-bufferable写事务,并且所有事务都使用相同的AXI标识,则AXI排序要求会强制所有设备Bufferable写事务在对设备Non-bufferable事务给出响应之前到达最终目的地。因此,对设备Non-bufferable事务的响应表明所有事务对所有管理者都是可见的。
A5: 事务标识符
A5.1 AXI事务标识符
AXI协议包括AXI ID事务标识符。管理器可以使用这些信息来确定必须按顺序返回的单独事务。
具有给定AXI标识值的所有事务都必须保持有序,但是对具有不同标识值的事务的排序没有限制。单个物理端口可以通过充当多个逻辑端口来支持无序事务,每个逻辑端口都按顺序处理事务。
通过使用AXI标识,管理器可以发布事务,而无需等待较早的事务完成。这可以提高系统性能,因为它支持事务的并行处理。
(不要求下属或管理器使用AXI交易标识。管理器和下属可以一次处理一个事务。事务按照发出的顺序进行处理。要求下属响应从管理器处收到的AXI ID,反映相应BID
或RID
。)
A5.2 ID 信号
每个事务通道都有自己的事务标识。表A5-1显示了这些指定信号。
A5.2.1 读数据排序
下属必须确保任何返回数据的RID
值与它所响应的地址的ARID
值相匹配。
互连必须确保从一系列事务中读取的数据具有相同的ARID
值,目标是不同的下属,管理器按照其发布地址的顺序接收这些数据。
读取数据重新排序深度是从属设备中可以重新排序的未决地址的数量。按顺序处理所有事务的下属的读取数据重新排序深度为1。读取数据重新排序深度是一个静态值,必须由从属的设计者指定。管理器无法使用任何机制来确定下属的读取数据重新排序深度。
A5.2.2 写数据排序
管理器必须以发布事务地址的相同顺序发布写数据。
组合来自不同管理器的写事务的互连必须确保按地址顺序转发写数据。AXI3允许不同标识的写数据交错,但AXI4及更高版本不推荐使用。
A5.2.3 事务标识符的互连使用
当管理器连接到互连时,互连会向该管理器端口唯一的ARID
、AWID
和WID
标识符追加额外的位。这有两个效果:
- 管理人员不必知道其他管理人员使用什么标识值,因为互连通过将管理人员编号附加到原始标识符上,使每个管理人员使用的标识值都是唯一的。
- 下属界面的ID标识符比管理器界面的ID标识符更宽。
对于读数据,互连使用RID
标识符的附加位来确定读数据去往哪个管理器端口。在将RID
值传递到正确的管理器端口之前,互连会删除RID
标识符的这些位。
对于写响应,互连使用BID
标识符的附加位来确定写响应去往哪个管理器端口。互连在将BID
值传递到正确的管理器端口之前移除BID
标识符的这些位。
A6: AXI排序模型
A6.1 AXI排序模式概述
AXI排序模型基于事务标识符的使用,事务标识符在ARID
或AWID
上发出信号。
具有相同标识和目的地的同一通道上的事务请求保证保持有序。
具有相同标识的事务响应按照发出请求的相同顺序返回。
排序模型不提供以下两者之间的任何排序保证:
- 来自不同管理器的事务
- 读写事务
- 具有不同标识的事务
- 到不同外设区域的事务
- 到不同内存位置的事务
如果管理器要求在没有排序保证的事务之间排序,则管理器必须在发出第二个事务之前等待收到对第一个事务的响应。
A6.2 存储位置和外围区域
AMBA的地址映射由内存位置和外设区域组成。
内存位置具有以下所有属性:
- 从内存位置读取字节会返回写入该字节位置的最后一个值。
- 对内存位置字节的写入会将该位置的值更新为新值,该新值是通过后续读取该位置获得的。
- 读取或写入内存位置不会对任何其他内存位置产生副作用。
- 每个位置都有内存观察保证。
- 内存位置的大小等于该组件的单副本原子性大小。
外围区域具有以下所有属性:
- 从外围区域中的地址读取不一定返回写入该地址的最后一个值。
- 对外围区域字节地址的写入不一定会将该地址的值更新为后续读取获得的新值。
- 访问外围区域内的地址可能会对该区域内的其他地址产生副作用。
- 每个地区都有外设观察保证。
- 外围区域的大小由实现定义,但必须包含在单个从属组件中。
A6.3 事务和排序
事务是对一个或多个地址位置的读取或写入。这些位置由AxADDR
和任何相关限定符(如AxPROT
中的非安全位)决定。
- 排序保证仅在对同一存储器位置或外围区域的访问之间给出。
- 外围区域的事务必须完全包含在该区域内。
- 跨越多个内存位置的事务有多个排序保证。
事务可以是“设备”或“正常”类型:
Device:一种读或写操作,其中请求的AxCACHE[1]
被取消声明。设备事务可用于访问外围区域或内存位置。
Normal:一种读或写操作,其中请求断言了AxCACHE[1]
。正常事务用于访问内存位置,预计不会用于访问外围区域。对外围区域的正常访问必须以符合协议的方式完成,但结果是实现已定义。
写事务可以是不可缓冲的,也可以是可缓冲的。有可能对可缓冲的写入发送早期响应。
- 不可缓冲的写操作取消声明了
AWCACHE[0]
。 - 缓冲写入断言了
AWCACHE[0]
。
A6.4 观察和完成定义
对于对外围区域的访问,当设备读或写访问DRW1先于DRW2到达从属组件时,设备读或写访问DRW1被设备读或写访问DRW2观察到。
对于对内存位置的访问,以下所有条件都适用:
- 如果W2在W1之后生效,写W1由写W2观察。
- 当W2在W3之后时,如果R1从写W3返回数据,则写W2观察到读R1。
- 当W3在W1之后时,如果R2从W1或写W3返回数据,读R2会观察到写W1。
读R1或写W1可以是设备或正常类型。写和读完成的定义是:
写完成响应:给出相关的BRESP
握手的周期,此时BVALID
和BREADY
被断言。
读完成响应:给出最后一次相关RDATA
握手的周期,此时断言RVALID
、RLAST
和RREADY
。
A6.5 管理器排序保证
排序模型保证有三种类型:
- 在收到完成响应之前,可观察性保证。
- 完成响应的可观测性保证。
- 响应排序保证。
A6.5.1 收到完成响应前的保证
以下所有保证适用于来自同一管理器、使用相同标识的事务:
- 设备写入DW1保证在设备写入DW2之前到达目的地,其中DW2在DW1之后发出并到达相同的外围区域。
- 设备读取DR1保证在设备读取DR2之前到达目的地,其中DR2在DR1之后发出并到达同一外围区域。
- 写W1保证被写W2观察到,其中W2在W1之后发布到相同的存储器位置。
- 由读R2观察到的写W1保证由读R3观察到,其中R3在R2之后发布到相同的存储器位置。
这些保证意味着在对同一存储器位置的设备访问和正常访问之间存在顺序保证。
A6.5.2 完成响应的保证
完成响应保证了以下所有内容:
- 对读请求的完成响应保证了它对于来自任何管理器的后续读或写请求是可观察的。
- 对写请求的完成响应保证了它对于来自任何管理器的后续读或写请求是可观察的。这种可观测性是多副本原子系统的要求。
包含符合Arm架构的处理器的系统必须是多副本原子系统。也就是说,Multi_Copy_Atomicity属性必须为真。
对可缓冲写请求的响应可以从中间点发送。它不能保证写操作已经在端点完成,但是它对于未来的事务是可观察到的。
A6.5.3 响应排序保证
事务响应具有以下所有排序保证:
- 已读R1保证在对已读R2的响应之前收到响应,其中R2是由R1之后具有相同标识的同一经理发出的。
- 保证写W1在对写W2的响应之前收到响应,其中W2是由同一管理器在W1之后以相同的标识发出的。
A6.6 排序要求
为了满足管理器的排序保证,对从属和互连组件有一定的要求。
A6.6.1 从属排序要求
对于外围设备位置,事务到外围设备位置的执行顺序是实施定义的。该执行顺序通常与到达顺序相匹配,但这不是必需的。
对于内存位置:
- 写W1必须在具有相同标识的写W2之前被排序到相同的存储器位置,其中W2在W1被接收之后被接收。
- 写W1必须在写W2到同一存储器位置之前排序,其中W2是在给出W1的完成响应之后接收的。
- 在对同一存储器位置进行读R2之前,必须对写W1进行排序,在给出W1的完成响应之后,在该位置接收R2。
- 在将W2写入相同的存储器位置之前,必须对读R1进行排序,其中W2是在给出R1的完成响应之后接收的。
响应排序要求:
- 读R1的响应必须在读R2的响应之前返回,在读的响应中,R2在R1之后以相同的ID被接收。
- 写W1的响应必须在写W2的响应之前返回,其中W2在具有相同标识的W1之后接收。
A6.6.2 互连排序要求
互连组件具有以下属性:
- 一个请求在一个端口上接收,并在另一个端口上发出或响应。
- 在一个端口接收响应,并在另一个端口发出或使用。
当互连发出请求或响应时,它必须遵守以下要求:
- 读取R1请求必须在读取R2请求之前发出,其中R2是在R1之后接收的,具有相同的ID并且到达相同或重叠的位置。
- 写W1请求必须在写W2请求之前发出,其中W2在W1之后接收,具有相同的标识,指向相同或重叠的位置。
- 设备读取DR1请求必须在设备读取DR2请求之前发出,其中DR2是在DR1之后接收的,具有相同的标识,并且到达相同的外围区域。
- 设备写入DW1请求必须在设备写入DW2请求之前发出,其中DW2是在DW1之后接收的,具有相同的标识并发送到相同的外围区域。
- “已读R1”响应必须在“已读R2”响应之前发出,其中R2在R1之后接收,具有相同的ID。
- 写W1响应必须在写W2响应之前发出,其中W2在W1之后接收,具有相同的标识。
当互连充当从属组件时,它还必须遵守从属要求。对与交易相关的AXI标识值的任何操作都必须确保保持原始标识值的排序要求。
A6.7 终点前的响应
为了提高系统性能,中间组件可以对一些事务发出响应。这一行动被称为早期反应。发布早期响应的中间组件必须确保满足可见性和排序保证。
A6.7.1 早期读响应
对于正常的读事务,如果一个中间组件对同一或重叠地址的所有早期写操作都是最新的,那么它可以用来自本地存储器的读数据来响应。在这种情况下,请求不需要传播到中间组件之外。
中间组件必须遵守标识排序规则,这意味着只有在具有相同标识的所有早期读取都已经有响应的情况下,才能发送读取响应。
A6.7.2 早期写响应
对于可缓冲的写事务,中间组件可以为没有下游观察器的事务发送早期写响应。如果中间组件发送早期写响应,则中间组件可以存储数据的本地副本,但必须在丢弃该数据之前将事务传播到下游。
中间组件必须遵守标识排序规则,这意味着只有在具有相同标识的所有早期写入都已经有响应的情况下,才能发送写入响应。
发送早期写响应后,组件必须负责该事务的排序和可观察性,直到写被传播到下游并收到写响应。在发送早期写响应和从下游接收响应之间的期间,组件必须确保:
- 如果给定了正常事务的早期写响应,则对相同或重叠内存位置的所有后续事务都将在具有早期响应的写操作之后排序。
- 如果给定了设备事务的早期写响应,那么对同一外围区域的所有后续事务将在具有早期响应的写操作之后排序。
当对设备缓冲事务给出早期写响应时,中间组件应该传播写事务,而不依赖于其他事务。在传播之前的设备写入之前,中间组件不能等待另一个读取或写入到达。
A6.8 有序写观察
为了提高与支持不同排序模型的接口协议的兼容性,从属接口可以为写事务提供更强的排序保证。更强的排序保证称为有序写观察。有序写观察属性用于定义接口是否显示有序写观察,对于单个接口,它可以是真或假。
True:接口被定义为具有“有序写入观察”属性。
False:没有“有序写入观察”属性的接口。如果未声明Ordered_Write_Observation,则认为它为False。
呈现有序写入观察的接口为不依赖于目的地或地址的写入事务提供保证:
- 写W1保证被写W2观察到,其中W2在W1之后从相同的管理器发出,具有相同的标识。
使用Producer-Consumer排序模型的管理器连接到显示有序写观察的从属接口,在发出相关写入之前,不需要等待来自早期写入的完成响应。
A7: 原子访问
A7.1 单副本原子性大小
AXI4协议引入了单副本原子性大小的概念。这个术语定义了事务自动更新的最小字节数。AXI4协议要求大于单副本原子性大小的事务必须以至少为单副本原子性大小的块来更新内存。
(原子性没有定义数据更新的确切时刻。必须确保的是,没有一个管理者能够观察到原子数据的部分更新形式。例如,在许多系统中,数据结构(如链表)由32位原子元素组成。这些元素之一的原子更新需要同时更新整个32位值。任何管理器都不能一次只观察到16位的更新,然后再观察到其他16位的更新。)
更复杂的系统需要支持更大的原子元素,特别是64位原子元素,以便管理人员可以使用基于这些更大原子元素的数据结构进行通信。
系统中支持的单副本原子性大小很重要,因为给定通信中涉及的所有组件都必须支持所需的原子元素大小。如果两个经理通过一个互连和一个下属进行通信,那么所有涉及的组件都必须确保按原子方式处理所需大小的事务。
AXI4协议不需要特定的单副本原子性大小,系统可以设计为支持不同的单副本原子性大小。
不同的组件组可以具有不同的单副本原子性大小,以便在组内进行通信。在AXI4中,术语单副本原子组描述了一组可以在特定原子性下通信的组件。例如,图A7-1显示了一个系统,其中:
- 处理器、DSP、DRAM控制器、DMA控制器、外围设备、SRAM存储器和相关的互连都在32位单拷贝原子组中。
- 处理器、DSP、DRAM控制器和相关的互连也属于64位单拷贝原子组。
事务的原子性保证永远不会大于其起始地址的对齐。例如,64位单拷贝原子组中未与8字节边界对齐的突发没有任何64位单拷贝原子保证。与事务相关联的字节选通不影响单拷贝原子性大小。
A7.1.1 多副本写原子性
为了指定系统提供多副本原子性,定义了多副本原子性属性。
True:支持Multi_Copy_Atomicity。
False:不支持Multi_Copy_Atomicity。如果未声明Multi_Copy_Atomicity,则认为它为False。
在下列情况下,系统被定义为多副本原子系统:
- 所有代理都以相同的顺序观察对相同位置的写入。
- 对代理可观察到的位置的写入可被所有代理观察到。
多副本原子性可以通过以下方式来确保:
- 对于给定的地址,使用单个序列化点,以便对同一位置的所有访问都是有序的。
这必须确保在位置的新值对任何代理可见之前,位置的所有一致缓存副本都是无效的。 - 避免使用任何代理上游的转发缓冲区。这可防止缓冲写入的位置在所有代理可见之前对某些代理可见。
- 要求Multi_Copy_Atomicity属性在本规范的版本G和更高版本中为真。
A7.2 独占访问
独占访问机制可以提供信号量类型的操作,而不需要总线在操作期间保持专用于特定的管理器。这意味着信号量类型的操作既不影响总线访问延迟,也不影响最大可达到的带宽。
AxLOCK
信号选择独占访问,RRESP
和BRESP
信号分别指示独占访问读或写的成功或失败。
从属需要额外的逻辑来支持独占访问。AXI协议提供了一种机制来指示管理者何时尝试对不支持它的下属进行独占访问。本节的其余部分描述了AXI独占访问机制。
A7.2.1 独占访问流程
独占访问的基本机制是:
- 管理器执行对地址的独占读取。
- 稍后,管理器尝试通过对同一地址执行独占写入来完成独占操作,并使用与独占读取所用的
ARID
相匹配的AWID
。 - 这种独占写访问被信号通知为:如果自独占读取访问后没有其他管理器写入该位置,则成功。在这种情况下,独占写入会更新内存。失败,如果另一个管理器在独占读取访问后写入了该位置。在这种情况下,存储位置不会更新。管理器可能无法完成独占操作的写入部分。独占访问监控硬件只监控每个事务标识的一个地址。如果一个管理器没有完成独占操作的写部分,该管理器随后使用相同的事务标识进行的独占读取将改变被监视独占访问的地址。
A7.2.2 从管理器的角度看独占访问
管理器通过执行独占读取来启动独占操作。如果事务成功,从属端返回EXOKAY响应,表明从属端记录了要监控的地址,以便进行独占访问。
如果管理器试图从不支持独占访问的从属端进行独占读取,从属端将返回OKAY响应,而不是EXOKAY响应。
独占读取后的某个时间,管理器会尝试对同一位置进行独占写入。如果自独占读取后,寻址位置的内容尚未更新,则独占写入操作成功。下属返回EXOKAY响应,并更新内存位置。
如果寻址位置的内容在独占读取后已经更新,独占写入尝试将失败,从属设备将返回OKAY响应,而不是EXOKAY响应。独占写入尝试不会更新内存位置。
管理器可能无法完成独占操作的写入部分。如果发生这种情况,从属端将继续监控地址的独占访问,直到另一个独占读取开始新的独占访问序列。
在读部分完成之前,管理器不得启动独占访问序列的写部分。
A7.2.3 从下属的角度看独占访问
不支持独占访问的下属可以忽略AxLOCK
信号。它必须为正常和独占访问提供一个OKAY响应。
支持独占访问的下属必须有监视器硬件。本规范建议这样的下属为每个可以访问它的具有独占能力的管理器标识设置一个监控单元。Arm架构参考手册、Armv7-A和Armv7-R版定义了一个独占访问监视器,单端口下属可以在下属外部拥有这样一个独占访问监视器。多端口下属可能需要内部监控。
独占访问监视器记录任何独占读取操作的地址和ARID
值。然后,它监视该位置,直到对该位置进行写入,或者直到另一个具有相同ARID
值的独占读取将监视器重置为不同的地址。
当从属设备接收到具有给定AWID
值的独占写入时,监控器检查该地址是否正被监控以使用该AWID
进行独占访问。如果是,则这表明自独占读取访问以来该位置没有发生写入,并且独占写入继续进行,完成独占访问。下属向管理器返回EXOKAY响应,并更新寻址的内存位置。
如果在独占写入时,没有用相同的AWID
值监控地址,这表明存在以下情况之一:
- 自独占读取访问后,该位置已更新。
- 监视器已重置到另一个位置。
- 管理器没有发出与独占写入具有相同属性的独占读取。
在这两种情况下,独占写操作都不能更新寻址位置,从属写操作必须返回OKAY响应,而不是EXOKAY响应。
A7.2.4 独占访问限制
以下限制适用于独占访问:
- 独占访问的地址必须与事务中的字节总数一致,即突发大小和突发长度的乘积。
- 独占访问突发中要传输的字节数必须是2的幂,即1、2、4、8、16、32、64或128字节。
- 独占突发中可以传输的最大字节数是128。
- 独占访问的突发长度不得超过16次传输。
- AxCACHE信号的值必须保证事务到达监控独占访问的从属端。如果有一个缓冲区或高速缓存在到达监视器之前可能对独占访问做出响应,那么独占访问必须是不可缓冲的或不可缓存的。
- 该域必须是不可共享的或系统可共享的。
- 事务类型必须是ReadNoSnoop或WriteNoSnoop。
不遵守这些限制会导致不可预测的行为。要将独占读取和独占写入视为同一独占访问序列的一部分,两次传输的以下信号必须相同:
- AxID
- AxADDR
- AxREGION
- AxLEN
- AxSIZE
- AxBURST
- AxLOCK
- AxCACHE
- AxPROT
- AxDOMAIN
- AxSNOOP
- AxMMSECSID
- AxMMUSSID
- AxMMUSSIDV
- AxMMUSSID
- AxMMATST
独占操作期间要监控的最小字节数由事务的突发长度和突发大小定义。从属设备可以监控更大数量的字节,最多128个字节,这是独占访问的最大大小。然而,这可能导致成功的独占访问被指示为失败,因为相邻字节被更新。
A7.2.5 对独占访问的响应
响应信号RRESP
和BRESP
包括用于成功正常访问的OKAY响应和用于成功独占访问的EXOKAY响应。这意味着不支持独占访问的下属可以提供一个OKAY响应来指示独占访问的失败。
- 对不支持独占访问的从属的独占写入总是更新存储位置。
- 仅当独占写入成功时,对支持独占访问的下属的独占写入才会更新存储位置。
独占写入使用BRESP
一个响应,可以是OKAY、EXOKAY、SLVERR或DECERR。独占读取有一个或多个响应节拍。这些可以是EXOKAY、SLVERR和DECERR的混合物,也可以是OKAY、SLVERR和DECERR的混合物。不允许在同一事务中混合EXOKAY和OKAY响应。
A7.3 锁定访问
AXI4不支持锁定的事务。但是,AXI3实现必须支持锁定事务。
当管理器使用某个事务的AxLOCK
信号来表明它是锁定的事务时,则互连必须确保只有该管理器才能访问目标从属区域,直到来自同一管理器的未锁定事务完成。互连中的仲裁器必须实施这一限制。
在管理器启动读或写事务的锁定序列之前,它必须确保没有其他事务等待完成。
任何带有指示锁定事务的AxLOCK
的事务都会强制互连锁定下一个事务。因此,锁定序列必须始终以最终事务结束,而最终事务没有指示锁定事务的AxLOCK
。这个最终事务包含在锁定序列中,并有效地解除锁定。
完成锁定序列时,在发出最终解锁事务之前,经理必须确保所有先前锁定的事务都已完成。然后,它必须确保在开始任何进一步的交易之前,最终解锁交易已经完成。经理必须确保锁定序列中的所有事务都具有相同的AxID
值。
本规范建议以下限制,但这些限制不是强制性的:
- 将任何锁定的事务序列保留在单个4 KB地址区域内。
- 将任何锁定的交易顺序限制为两个交易。
A7.4 原子接入信令
在AXI3中,AxLOCK
信号指定正常、独占和锁定访问。表A7-1显示了AxLOCK
信号的AXI3编码。
AXI4取消了对锁定事务的支持,仅使用1位锁定信号。表A7-2显示了AxLOCK
信号的AXI4信号编码。
A7.4.1 遗留问题
在AXI4环境中,任何AXI3锁定的事务都将按如下方式转换:
AWLOCK[1:0]
= 0b10转换为正常写入事务,AWLOCK
= 0b0ARLOCK[1:0]
= 0b10转换为正常读取事务,ARLOCK
= 0b0
本规范建议执行这种转换的任何组件(通常是互连)都包括一个可选机制,以检测和标记这种转换已经发生。如果执行此转换,任何无法正常运行的组件都不能在AXI4环境中使用。
A8: AMBA 4 附加信号
A8.1 服务质量(QoS)信号
A8.1.1 QoS接口信号
AXI4信号集被扩展为支持两个4位服务质量标识符:
AWQOS
一个4位服务质量标识符,在每个写事务的写地址通道上发送。
ARQOS
一个4位服务质量标识符,在每个读事务的读地址通道上发送。
本规范建议将AxQOS用作相关写入或读取事务的优先级指示器。较高的值表示较高优先级的事务。默认值0b0000表示接口不参与任何服务质量方案。
A8.1.2 管理器考虑事项
管理器可以产生自己的QoS,如果它可以产生多个流量流,它可以为不同的流选择不同的服务质量值。
对服务质量的支持需要系统级对所使用的服务质量方案的理解,以及所有参与组件之间的协作。因此,本规范建议管理器组件包含一些可编程性,这些可编程性可用于控制用于任何给定场景的准确服务质量值。
如果管理器组件不支持可编程的服务质量方案,它可以使用代表其生成的事务的相对优先级的服务质量值。如果合适的话,这些值可以被映射到可选的系统级服务质量值。
无法生成自己的QoS的管理器必须使用默认值。
(本规范预期许多互连组件实现将支持可编程寄存器,这些寄存器可用于为连接的管理器分配服务质量值。这些值取代了由管理者提供的服务质量值,无论是编程的还是默认的。)
A8.1.3 系统考虑
AXI4中定义的服务质量信令可以与任何兼容的系统级服务质量方法一起使用。
服务质量的默认系统级实现是,任何可以选择处理多个事务的组件都会选择服务质量值较高的事务先处理。只有当没有其他AXI约束要求按特定顺序处理事务时,才会进行此选择。(这意味着AXI排序规则优先于出于服务质量目的排序。)
A8.2 多区域信号
A8.2.1 附加接口信号
可选地,AXI4接口信号集可以扩展为支持两个4位区域标识符:
AWREGION
区域标识符,在每个写事务的写地址通道上发送。
ARREGION
区域标识符,在每个读事务的读地址通道上发送。
4位区域标识符可用于唯一识别多达16个不同的区域。区域标识符可以提供高阶地址位的解码。在任何4K字节地址空间中,区域标识符必须保持不变。
区域标识符的使用意味着从属设备上的单个物理接口可以提供多个逻辑接口,每个接口在系统地址映射中具有不同的位置。区域标识符的使用意味着从属设备不必支持不同逻辑接口之间的地址解码。
该协议期望在对具有多个逻辑接口的单个从属设备执行地址解码功能时,互连产生AxREGION
信号。如果下属在系统地址映射中只有一个物理接口,则互连必须使用默认的AxREGION
值。
区域标识符有多种使用模式,包括但不限于以下几种:
- 外设可以将其主数据路径和控制寄存器放在地址映射的不同位置,并且可以通过单个接口访问,而不需要从属设备执行地址解码。
- 下属可以在不同的内存区域表现出不同的行为。例如,下属可能在一个区域提供读写访问,但在另一个区域提供只读访问。
下属必须确保保持正确的协议信号和事务的正确顺序。下属必须确保以正确的顺序向具有相同AXI标识的不同地区提供两个事务的响应。
下属还必须确保AxREGION
的任何值都有正确的协议信号。如果下属实施的区域少于16个,则下属必须确保在尝试访问不受支持的区域时使用正确的协议信号。如何实现这一点由实现定义。例如,下属可以通过以下方式确保这一点:
- 为访问不受支持区域的任何事务提供错误响应。
- 在所有不受支持的区域中混叠受支持的区域,以确保对所有访问给出符合协议的响应。
AxREGION
信号仅提供现有地址空间的地址解码,可由下属使用,以消除对地址解码功能的需求。这些信号不会产生新的独立地址空间。AxREGION
必须只出现在地址解码功能下游的接口上。
A8.3 用户定义的信号
AMBA 4引入了用户定义信号。对于AMBA 5,这些信号的使用和配置在各种协议中进一步明确和统一。
AXI接口可以包括一组用户定义的信号,称为用户信号。当存在现有AMBA规范未涵盖的要求时,信号可用于增加事务信息。
信息可以添加到:
- 事务请求
- 事务响应
- 事务中的每一次读写数据
通常,本规范建议不要使用用户信号。AXI协议没有定义这些信号的功能,如果两个组件以不兼容的方式使用相同的用户信号,这可能会导致互操作性问题。
A8.3.1 用户定义的信号配置
用户信号的存在和宽度由表A8-1中的属性规定:
如果属性的值为零,则接口上不存在相关的信号。最大值仅供参考,以便为可配置接口设置合理的最大值。
以下接口类型可以包括用户信号:
- ACE5
- ACE5-Lite
- ACE5-LiteDVM
- ACE5-LiteACP
- AXI5
- AXI5-Lite
A8.3.2 信号
为每个通道定义的用户信号名称如表A8-2所示:
A8.3.3 使用注意事项
在实现用户信号的情况下,并不要求所有通道都支持用户信号。是否包含用户信号的设计决策是针对请求、数据和响应通道独立做出的。
为了帮助数据宽度和协议转换,本规范建议:
- USER_DATA_WIDTH是数据总线宽度的整数倍,以字节为单位。
- 用户响应位对于读或写响应的每一拍都是相同的值。
RUSER
的低位用于传输每笔事务的响应信息。RUSER
的高位用于传输每拍读取数据信息。
A9: 默认信号和互操作性
AXI协议不要求组件使用AXI接口上可用的全套信号。为了帮助连接不使用每个信号的组件,本章定义了接口的主要类别以及适用于每个类别的限制。
A9.1 互操作性原则
以下互操作性原则适用于AXI3和AXI4组件。
作为一般原则,组件必须支持所有输入组合,但不必生成所有输出组合。例如,下属必须支持所有可能的不同突发长度,而管理器只需生成其使用的突发类型。此策略确保所有组件与所有其他组件一起工作。
AXI接口可以省略信号的条件是:
可选输出
如果组件可能需要与默认值不匹配的值,则该组件必须有输出信号。
可选输入
如果管理器或下属不需要观察输入信号来进行正确的功能操作,则可以省略输入信号。
(适当时,互连组件也可以省略信号。例如,当一个信号只被驱动到其默认值时,不需要通过互连传输该信号。信号可以在目的地产生。同样,如果信号没有在任何目的地使用,则不需要通过互连传输。)
A9.2 主要接口类别
A9.2.1 读/写接口
读写接口包括以下AXI通道:
A9.2.2 只读接口
只读接口仅支持读事务,包括以下AXI通道:
(只读接口不支持独占访问。)
A9.2.3 只写接口
只写接口仅支持写事务,包括以下AXI通道:
(只写接口不支持独占访问。)
A9.2.4 内存从属和外设从属
AXI下属分为内存下属或外围下属。
内存从属必须正确处理所有事务类型。
外围设备下属应该有一个定义好的访问方法,确定可用于访问设备的事务类型,以及如何访问设备是否有任何限制。通常,定义的访问方法在组件的数据手册中描述。任何不是定义的访问方法的访问都可能导致外围设备从属设备失败,但应该以符合协议的故障安全方式完成,以防止系统死锁。不需要外围从属设备继续正确操作。
因为外围设备从属设备只需要为其定义的访问方法正确工作,所以外围设备从属设备可以具有显著减少的接口信号集。
(所有外围设备都应该支持一个事务子集,该子集允许使用可以在C代码中指定的访问来控制外围设备。例如,可能支持单个8位、单个16位或单个32位对齐的事务。不需要最小子集,因为支持的事务子集可能因外设而异。例如,一个外设可能只支持16位访问,而另一个外设可能只支持32位访问。)
A9.3 默认信号值
该规范建议,一般来说,为了最大限度地重用IP,AXI组件接口包括所有信号。所有信号的存在降低了设计流程的系统集成阶段出错的风险,并且还可以帮助支持一些不有效支持缺省信号默认值的设计流程。
A9.3.1 管理器地址
AxADDR
对管理器提供的地址位数没有最低要求。如果管理器连接的系统的地址总线宽度与管理器提供的不同:
- 如果系统地址比管理器提供的更宽,则必须为附加的高位地址位使用全零的默认值。
- 如果系统地址比管理器提供的地址窄,则管理器的高位地址位必须保持不连接。
(通常,管理器提供32位寻址,或者管理器最多支持64位寻址。)
A9.3.2 从属地址
AxADDR
对下属使用的地址位数没有最低要求。
下属不需要具有低阶地址位来支持系统数据总线宽度内的解码,并且可以假设这种低阶地址位具有全零的默认值。如果从属设备的地址位多于互连提供的地址位,则高阶地址位使用全零的默认值。
通常,内存从属设备至少有足够的地址位来完全解码4KB地址范围。
A9.3.3 内存从属
AxLOCK
内存从属不需要使用AxLOCK
输入。然而,支持独占访问的内存从属需要这些信号。
AxCACHE
不需要从属内存来使用AxCACHE
输入。在下列情况下,存储器从属设备不需要这些信号:
- 它没有缓存行为。
- 它以同样的方式缓存所有事务。
A9.3.4 写事务
WSTRB
如果管理器总是执行全数据总线宽度的写事务,则不需要使用写选通信号。写选通脉冲的默认值是所有信号有效。
WLAST
不要求下属使用WLAST
信号。由于定义了写突发的长度,从属端可以根据突发长度AWLEN[7:0]
信号计算最后一次写数据传输。
A9.3.5 读事务
RLAST
管理器不需要使用RLAST
信号。由于读取脉冲串的长度已定义,管理器可以根据脉冲串长度ARLEN[7:0]
信号计算最后一次读取数据传输。
A9.3.6 响应信号
RRESP, BRESP
管理器不需要RRESP
和BRESP
输入,如果它们都:
- 不执行独占访问
- 不要求通知事务错误
下属不需要RRESP
和BRESP
输出,如果它都:
- 不支持独占访问
- 不生成错误响应
A9.3.7 非安全和安全访问
AxPROT
AxPROT
不需要区分非安全访问和安全访问,也不需要任何额外保护支持的从属设备,不需要AxPROT
输入信号。
(注意AxPROT
信号。AxPROT[1]
信号指示事务的安全或非安全性质,这些位的不正确分配会导致不正确的系统行为。)