AXI(Advanced eXtensible Interface)协议规范
Posted 夏风喃喃
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AXI(Advanced eXtensible Interface)协议规范相关的知识,希望对你有一定的参考价值。
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 写数据排序
管理器必须以发布事务地址的相同顺序发布写数据。
组合来自不同管理器的写事务的互连必须确保按地址顺序转发写数据。AX
以上是关于AXI(Advanced eXtensible Interface)协议规范的主要内容,如果未能解决你的问题,请参考以下文章
AVX指令集是什么?(Advanced Vector Extensions 高级向量扩展)
AVX指令集是什么?(Advanced Vector Extensions 高级向量扩展)
ZYNQ block design警告:[BD 41-968] AXI interface port /axi_lite4 is not associated to any clock port. I