A1: Introduction | 介绍
A1.1 About the AXI protocol | 关于AXI协议
AMBA AXI支持用于 Master 和 Slave 组件之间通信的高性能、高频系统设计。
AXI协议:
- 适用于高带宽和低延迟设计。
- 提供高频操作,无需使用复杂的 bridge。
- 满足各种组件的接口要求。
- 适用于具有高初始访问延迟的内存控制器(memory controllers)。
- 提供互连(interconnect)架构实施的灵活性。
- 向后兼容AHB 和APB 接口。
AXI协议的关键特性是:
- 地址/控制和数据分离。
- 支持非对齐(unaligned)的数据传输(data transfer) -> (通过 byte 选通)。
- 基于突发(burst)的事务(transaction),仅需要首地址。
- 读/写数据通道分离,从而实现低消耗的直接内存访问(DMA)。
- 支持发送多个未完成(oustanding)的地址。
- 支持乱序(out-of-order)的事务(transaction)。
- 容易进行寄存器打拍去满足时序(timing)。
AXI协议有低功耗信号。
AXI协议还包括:
- AXI4-Lite,是 AXI4 的一个子集,具有更简单控制寄存器样式接口的 AXI4 功能。请参阅第 B1 章 AMBA AXI4-Lite。
- AXI5-Lite,是 AXI5 的一个子集,具有更简单控制寄存器样式接口的 AXI5 功能。请参阅第 C2 章 AMBA AXI5-Lite。
A1.2 AXI Architecture| AXI架构
AXI协议是基于burst的,并且有5条独立的通道:
通道名 | 信号名称以…开头 |
---|---|
读地址通道 | AR |
读数据通道 | R |
写地址通道 | AW |
写数据通道 | W |
写响应通道 | B |
AXI协议支持:
- 在数据传输之前发送地址。
- 多个未完成(outstanding)的事务。
- 乱序的事务。
A1.2.1 Channel definition | 通道定义
5条独立的通道都各自有一组信息信号
和握手信号
(VALID和READY)。
上游
使用VALID信号
表明地址/控制信息/数据有效,READY信号
表明下游
准备好接收了。
读/写数据通道还有LAST信号,表明一个transaction中最后一个transfer。
通道 | 携带信息的宏观描述 |
---|---|
读地址通道 | 携带:地址 + 控制信息 |
读数据通道 | 携带:从Slave到Master的(读数据 + 读响应),包括:
|
写地址通道 | 携带:地址 + 控制信息 |
写数据通道 | 携带:从Master到Slave的(写数据),包括:
|
写响应通道 |
|
A1.2.2 Interface and interconnect | 接口和互联
若图 A1-3 所示,一个典型的系统中由多个master和多个slave组成,master和slave之间通过某种形式的interconnect连接在一起。
AXI协议提供如下接口的接口定义:
- master <–> interconnect
- slave <–> interconnect
- master <–> slave
设备 (Devices,这里可以理解为master和slave的总称) 之间的互连相当于:另一台设备具有对称的master/slave端口,这意味着实际的master/slave可以互连。
典型系统拓扑:
- 共享地址总线,共享数据总线
- 共享地址总线,多条数据总线
- 多条地址总线,多条数据总线
对于大多数系统,地址通道的带宽需求是远小于数据通道的带宽需求的。这样的系统可以通过使用一条共享地址总线以及多条数据总线(实现并发多个 data transfer)
,从而实现系统性能和interconnect复杂性之间的平衡。
A1.2.3 Register slices | 寄存器切片
每条AXI通道都是单向的,并且通道间没有固定的关系。这意味着可以在任意通道内的任意位置插入寄存器,从而提高时钟频率
,但代价是引入延迟。
延迟和最高工作频率的权衡。
处理器和高性能内存(memory)间直接、快速的连接,而处理器到低性能外设的critical path用寄存器打断。
A1.3 Terminology | 术语
本节总结了本规范中使用的术语
,以及在词汇表
或其他地方定义
的术语。
A2: Signal Descriptions
A2.1 Global signals
Signal | Source | Description |
ACLK | Clock source | 全局时钟信号 |
ARESETn | Reset source | 全局复位信号,低有效 |
所有信号都在时钟上升沿采样。
A2.2 Write address channel signals
Signal | Source | Description |
AWID | Master | 一个写transaction的ID。 |
AWADDR | Master | 一个写burst transaction的起始地址,即第1个transfer的地址。 |
AWLEN | Master | burst length,即一个burst内有几个transfer。AXI3和AXI4有不同。 |
AWSIZE | Master | burst size,一个transfer的数据位宽 = (2^AWSIZE) ×8。 |
AWBURST | Master | burst的类型,即决定地址的递增方式(FIXED/INCR/WRAP),一个burst内的首个transfer外的其他transfer通过AWBURST计算地址。 |
AWLOCK | Master | lock type。与tranfer的原子特性有关。AXI3和AXI4有不同。 |
AWCACHE | Master | memory type。 |
AWPROT | Master | protection type。此信号指明该transaction的特权和安全级别,以及该transaction是数据访问还是指令访问。 |
AWQOS | Master | Quality of Service,QOS。AXI4独有。 |
AWREGION | Master | 允许slave上的单个物理接口用于多个逻辑接口。AXI4独有。 |
AWUSER | Master | 用户自定义信号。AXI4独有。 |
AWVALID | Master | |
AWREADY | Slave |
A2.3 Write data channel signals
Signal | Source | Description |
WID | Master | 写数据transfer的ID。AXI3独有。 |
WDATA | Master | 写数据。 |
WSTRB | Master | 写选通信号,表明写数据的哪些数据有效(byte为粒度)。 |
WLAST | Master | 表明一个写burst的最后一个transfer。 |
WUSER | Master | 用户自定义信号。AXI4独有。 |
WVALID | Master | |
WREADY | Slave |
A2.4 Write response channel signals
Signal | Source | Description |
BID | Slave | 写响应的ID,与AWID/WID对应。 |
BRESP | Slave | 写响应。表明这个写transaction结束。 |
BUSER | Slave | 用户自定义信号。AXI4独有。 |
BVALID | Slave | |
BREADY | Master |
A2.5 Read address channel signals
Signal | Source | Description |
ARID | Master | 一个读transaction的ID。 |
ARADDR | Master | 一个读burst transaction的起始地址,即第1个transfer的地址。 |
ARLEN | Master | burst length,即一个burst内有几个transfer。AXI3和AXI4有不同。 |
ARSIZE | Master | burst size,一个transfer的数据位宽 = (2^ARSIZE) ×8。 |
ARBURST | Master | burst的类型,即决定地址的递增方式(FIXED/INCR/RRAP),一个burst内的首个transfer外的其他transfer通过ARBURST计算地址。 |
ARLOCK | Master | lock type。与tranfer的原子特性有关。AXI3和AXI4有不同。 |
ARCACHE | Master | memory type。 |
ARPROT | Master | protection type。此信号指明该transaction的特权和安全级别,以及该transaction是数据访问还是指令访问。 |
ARQOS | Master | Quality of Service,QOS。AXI4独有。 |
ARREGION | Master | 允许slave上的单个物理接口用于多个逻辑接口。AXI4独有。 |
ARUSER | Master | 用户自定义信号。AXI4独有。 |
ARVALID | Master | |
ARREADY | Slave |
A2.6 Read data channel signals
Signal | Source | Description |
RID | Slave | 读数据transfer的ID。AXI3独有。 |
RDATA | Slave | 读数据。 |
RRESP | Slave | 读响应。表明这个读transfer结束。 |
RLAST | Slave | 表明一个读burst的最后一个transfer。 |
RUSER | Slave | 用户自定义信号。AXI4独有。 |
RVALID | Slave | |
RREADY | Master |
BRESP是表明写transaction的结束,因此虽然一个transaction内可能有有多个tansfer,但是只会有最后一个transfer发出后才回BRESP;
RRESP是表明读transfer的结束,因此如果一个transaction内有N个transfer,就会回N个RRESP。
A2.7 Low-power interface signals
Signal | Source | Description |
CSYSREQ | Clock controller | 系统进入低功耗状态的req。system clock controller --> peripheral。 |
CSYSACK | Peripheral device | 进入低功耗状态的ack。peripheral --> system。 |
CACTIVE | Peripheral device | clock active。表明外设需要时钟。 |
A3 Single Interface Requirements | 单接口要求
A3.1 Clock and reset | 时钟和复位
A3.1.1 Clock | 时钟
每个AXI组件都使用一个时钟信号:ACLK。
所有输入信号
都是在ACLK的上升沿触发
,所有输出信号
都是在ACLK的上升沿之后变化
。
在 master 和 slave 接口处,输入与输出信号之间不能有组合逻辑通路。
A3.1.2 Reset | 复位
AXI协议使用低电平有效的复位信号,ARESETn。
ARESETn可以异步复位,但是必须在ACLK的上升沿同步释放。
在复位期间:
- master接口必须将ARVALID、AWVALID、WAVLID拉低
- slave接口必须将RVALID、BVALID拉低
- 其他信号可以为任意值
即,将所有的 VALID 信号拉低
在ARESETn释放(拉高)后的下一个ACLK时钟上升沿,ARVALID,AWVALID和WAVLID就允许拉高。
A3.2 Basic read and write transactions | 基本读写事务
A3.2.1 Handshake process | 握手过程
5条通道都使用相同的VALID/READY握手机制来传递地址
、数据
或控制信息
。这个握手机制意味着,master和slave都可以控制这些信息
的移动速率。源
(source)在地址、数据或控制信息有效时将VALID拉高
,目的地
(destination)在准备好接收信息时将READY拉高
,在VALID和READY都拉高时,传输(transfer)才会发生。
在master和slave接口处,输入与输出信号之间不能有组合逻辑通路。
图A3-2到图A3-4展示了握手过程的示例波形:
注意点1:
在图A3-2
(valid等ready),源
(source)在T1后将地址、数据或控制信息放在总线上,同时拉高VALID。目的地
(destination)在T2后拉高READY。源
(source)必须在目的地
(destination)拿到信息(T3)前保持信息的稳定(即信息和VALID都要保持,直到READY拉高)。因为READY的反压,transfer花费2个时钟周期。
注意点2:
源
(source)的VALID使能条件不能与READY有关
(即不能将READY通过组合逻辑生成VALID),因为READY的使能可能与VALID有关(协议支持),若VALID又取决于READY,则会造成死锁
。
只要VALID拉高了,在握手之前都不能将VALID拉低
,在时钟上升沿抓到握手(VALID和READY都拉高)后才可以将VALID拉低。
在图A3-3
(ready等valid),目的地
(destination)在T1后将READY拉高,而源
(source)在T2后才将信息放到总线上,同时拉到VALID,在T3时寄存器抓到握手成功。这个例子中只用了1个时钟周期transfer就完成了,因为READY提前准备好,或者说READY没有反压上游。
注意点3:
目的地
(destination)允许将VALID作为READY拉高的条件(之一)。
如果READY拉高了,但是VALID尚未拉高,此时允许目的地
(destination)将READY拉低。
在图A3-4
(valid和ready同时),源
(source)和目的地
(destination)同时在T1后将VALID/READY拉高,在T2时钟上升沿抓到握手成功,transfer完成。
A3.2.2 Channel signaling requirements | 通道信令要求
Channel handshake signals | 通道握手信号
AXI有5条独立的通道,每条通道都有自己的VALID/READY握手信号。
Transaction 通道 | 握手信号对 |
---|---|
读地址 | ARVALID/ARREADY |
读数据 | RVALID/RREADY |
写地址 | AWVALID/AWREADY |
写数据 | WVALID/WREADY |
写响应 | BVALID/BREADY |
Write address channel | 写地址
只有当可以发送有效的地址和控制信息时master
才能将AWVALID
拉高,并且直到AWREADY
拉高的时钟上升沿后才能将AWVALID
拉低。(废话,同A3.2.1)
AWREADY的默认值可以为0(低电平)或1(高电平),Spec建议为1。只有slave可以接收有效地址时才可以将AWREADY拉高。
Spec不建议将 AWREADY的默认值设为0,因为这回导致transfer至少消耗2个时钟周期(valid等ready情况,因READY的反压),一个时钟周期用于拉高 AWVALID,另一个时钟周期用于拉高 AWREADY。
Write data channel | 写数据
在一个写burst期间,只有当可以发送有效的写数据时master
才能将WAVLID
拉高,并且直到WREADY
拉高的时钟上升沿后才能将WVALID
拉低。(废话,同A3.2.1)
WREADY
的默认值可以为1(高电平),但前提是在slave
在一个周期内可以接收有效写数据的情况下。
在一个写burst的最后一个transfer,master
必须将WLAST
拉高。
在最后一个transfer时, WVALID 拉高的同时就可拉高 WLAST,而不用等到 WREADY也拉高。
Write response channel | 写响应
只有当可以发送有效的写响应时slave
才能将BVALID
拉高,并且直到BREADY
拉高的时钟上升沿后才能将BVALID
拉低。(废话,同A3.2.1)
BREADY
的默认值可以为1(高电平),但前提是在master
在一个周期内可以接收写响应的情况下。
Read address channel | 读地址
只有当可以发送有效地址和控制信息时master
才能将ARVALID
拉高,并且直到ARREADY
拉高的时钟上升沿后才能将ARVALID
拉低。(废话,同A3.2.1)
ARREADY
的默认值可以为0(低电平)或1(高电平),Spec建议为1。只有slave
可以接收有效地址时才可以将ARREADY
拉高。
Spec不建议将 ARREADY的默认值设为0,因为这回导致transfer至少消耗2个时钟周期(valid等ready情况,因READY的反压),一个时钟周期用于拉高 ARVALID,另一个时钟周期用于拉高 ARREADY。
Read data channel | 读数据
只有当可以发送有效的读数据时slave
才能将RVALID
拉高,并且直到RREADY
拉高的时钟上升沿后才能将RVALID
拉低。(废话,同A3.2.1)
master
接口使用RREADY
去表明可以接收读数据。RREADY
的默认值可以为1,但只有master
可以马上接收读数据时(每当其开始一个读transaction)。
在一个读burst的最后一个transfer,slave
必须将RLAST
拉高。
A3.3 Relationships between the channels | 通道之间关系
AXI协议要求保持以下关系:
- 写响应必须始终跟在写transaction的最后一次写transfer后,master收到写响应意味着这个transaction就结束了。
- 读数据必须在相应的读地址之后(否则不知道应该读哪里的数据)。
- 通道握手必须满足A3.3.1(通道握手信号之间)定义的依赖关系。
除此以外,协议再无定义通道间的任何关系。
这意味着可能出现,例如:在一个transaction中写数据握手
出现在写地址握手
之前(在写地址通道
比写数据通道
打了更多拍的情况下出现)。同样的,写数据握手
也可能和写地址握手
同时发生。
当需要interconnect来确认目的地(destination)的地址空间或者slave空间时,必须对齐写地址和写数据。这是为了确保写数据只对其想写入的slave的有效。
A3.3.1 Dependencies between channel handshake signals | 通道握手信号之间的依赖关系
为了避死锁
,以下握手信号之间依赖关系必须遵从。
如A3.2.2所示,在任何transaction中:
- VALID不能取决于READY
- READY可以取决于VALID
READY可以等到 VALID拉高后再拉高,也可以在 VALID拉高前拉高。这将使得设计更为高效。
此外,不同通道间的握手信号也有依赖关系:
- 读transaction依赖
- 写transaction依赖
- 写响应依赖(AXI4新增,AXI5也支持)
单头箭头:其指向的信号可以在箭头起始信号拉高前/后拉高,即无依赖关系;
双头箭头:其指向的信号必须在箭头起始信号拉高后再拉高,即指向信号依赖起始信号。
Read transaction dependencies | 读事务依赖
在读transaction中:
ARVALID
不能依赖ARREADY
(废话,同A3.2.1)ARREADY
可以在ARVALID
拉高前/后拉高(可以无依赖关系)RVALID
必须等到ARVALID
和ARREADY
握手后拉高RVALID
不能依赖RREADY
(废话,同A3.2.1)RREADY
可以在RVALID
拉高前/后拉高(可以无依赖关系)
Write transaction dependencies | 写事务依赖
在写transaction中:
AWVALID / WVALID
不能依赖AWREADY / WREADY
(废话,同A3.2.1)AWREADY
可以在AWVALID / WVALID
拉高前/后拉高(可以无依赖关系)WREADY
可以在AWVALID / WVALID
拉高前/后拉高(可以无依赖关系)BVALID
必须等到最后一个transfer的WAVLID
和WREADY
握手后拉高(此时WLAST
也拉高)BVALID
不能依赖BREADY
(废话,同A3.2.1)BREADY
可以在BVALID
拉高前/后拉高(可以无依赖关系)
slave需要等到 WVALID和 WREADY都拉高后才能拉高 BAVALID;
slave需要等到 WLAST拉高后才能拉高 BVALID,因为写响应 BRESP必须在写transaction的最后一个transfer后发出;
依赖关系必须要满足,以防止死锁。比如: WVALID不能依赖 AWREADY; AWREADY不能等 WVALID
AXI4 write response dependency | 写响应依赖(AXI4新增,AXI5也支持)
AXI4定义了新的依赖关系:AXI4 slave写响应依赖。
这个新加的依赖关系反应了 AXI3中预期的使用方式,因为在地址被接收之前,所有组件都不会接收所有的写数据并回写响应;
通过发出写响应,slave负责对所有后续写transaction进行危险检查。
图A3-7展示了AXI4所有需要的slave写响应握手依赖关系:
AWVALID/WVALID
不能依赖AWREADY/WREADY
(废话,同A3.2.1)AWREADY
可以在AWVALID/WVALID
拉高前/后拉高(可以无依赖关系)WREADY
可以在AWVALID/WVALID
拉高前/后拉高(可以无依赖关系)BVALID
必须等到最后一个transfer的AWAVLID
和AWREADY
握手,以及WAVLID
和WREADY
握手后拉高(此时WLAST
也拉高)BVALID
不能依赖BREADY
(废话,同A3.2.1)BREADY
可以在BVALID
拉高前/后拉高(可以无依赖关系)
图3-7 Slave write response handshake dependencies
A3.3.2 Legacy considerations | 遗留问题
A3.3.1定义的AXI4写响应依赖意味着,一个可以在接收写地址前接收所有写数据和回写响应的AXI3 slave,与AXI4协议并不兼容。
将AXI3协议的slave转为AXI4时,需要一个额外的wrapper,以确保在slave接收相应的写地址前,不会返回写响应。
这个Spec强烈建议任何新的 AXI3 slave都添加这个新增的约束关系。
任何AXI3 master都符合AXI4写响应要求。
A3.4 Transaction structure | 事务结构
A3.4.1 Address structure | 地址结构
AXI协议是基于burst的。master发出控制信息以及首地址到slave,从而开启一个burst。在burst的过程中,slave需要计算后续transfer的地址。
burst的首地址即一个transaction中第1个byte的地址。
一个burst不能跨4KB地址边界
。
1K:1024,B:Byte,4KB:4096Bytes
4096,对应16进制=1000,对应2进制=0001 0000 0000 0000
1024,对应16进制=400,对应2进制=0100 0000 0000
所谓的4K边界是指:低12bit为0的地址,例如:32’h00001000,32’h00002000…
同理1k边界是指:低10bit为0的地址,例如:32’h00000400,32’h00000800…
操作系统以page为单位管理memory,因为历史原因通常默认1page大小为4KB,所以就给AXI slave划分4KB空间。
这是为了避免一个burst访问两个slave,可以看成是master对边界的主动保护。
比如两个slave地址是连序的,那么在第一个slave末尾附近地址发起一个长burst跨越边界,第二个slave实际上没有完成前面的AW或者AR通道的握手,这个会引起总线异常。
如果是大片地址的slave,并且本身没有4K边界的要求,双方约定好,master侧可以不进行4K边界检测。
它还限制了slave需要支持的地址递增的数量。
Burst length | 突发长度
burst长度由AxLEN确定,AxLEN代表ARLEN或AWLEN。
ARLEN[7:0] | 用于读transfer |
---|---|
AWLEN[7:0] | 用于写transfer |
AXI3 burst长度 | AXI4 burst长度 | burst类型 |
---|---|---|
1~16 | 1~16 | FIXED |
1~16 | 1~256 | INCR |
1~16 | 1~16 | WRAP |
对于AXI3,Burst_Length = AxLEN[3:0] + 1
对于AXI4,Burst_Length = AxLEN[7:0] + 1(因为INCR时最大burst长度是256,[7:0]位宽为8 bit)
burst使用的规则:
- 对于WRAP类型的burst,burst长度必须为2/4/8/16
- 一个burst不能跨4KB地址边界
- burst不能提前中止,即假如burst长度为4,必须发满4个transfer,burst才结束
没有组件可以提前将burst中止。但是,为了减少写burst中transfer的数量,master可以将不想要的写数据用写选通信号(WSTRB
)来进行mask,但master仍然需要完成burst中剩余的transfer;在一个读burst中,master可以丢掉读数据,但是仍然需要完成burst中剩余的transfer。
并不是可以随意丢掉读数据
,这可能导致数据丢失。比如在读取FIFO的数据的时候,当访问这样设备的时候,master必须使用与所需transfer的数量完全一致的burst长度。
例如:master需要读取5个transfer的数据,因此需要先发burst长度等于4的burst,再发一次burst长度等于1的burst,而不能发burst长度大于4的burst,再将大于4的transfer的数据丢掉。
在AXI4中,INCR类型的burst,若burst长度大于16,可以被拆分成多个小的burst,即使transaction的属性是Non-modifiable的(见A4.3)。此时拆分后的burst需要保持与原始burst相同的transaction特性,除了:
- burst长度的减少
- 适当调整生成的burst地址
将burst长度>16的burst拆分成多个≤16的burst,是为了兼容AXI3,或者是为了减少长burst对QoS guarantees的影响。
Burst size | 突发大小
burst size是burst中每个transfer中传输的最大字节数。AxSIZE代表ARSIZE或AWSIZE。
ARSIZE[2:0] | 用于读transfer |
---|---|
AWSIZE[2:0] | 用于写transfer |
下表是AxSIZE的编码方式:
AxSIZE[2:0] | Bytes in transfer |
---|---|
0b000 | 1 |
0b001 | 2 |
0b010 | 4 |
0b011 | 8 |
0b100 | 16 |
0b101 | 32 |
0b110 | 64 |
0b111 | 128 |
一个transfer的数据位宽 = (2^AxSIZE) ×8 bit。
如果AXI总线比burst size宽,AXI接口必须根据transfer的地址确定每个transfer使用数据总线的哪个byte通道,见A3.4.3。
任何一个transfer的大小不能超过transaction中任何一个agent的数据总线宽度。
Burst type | 突发类型
AXI协议定义了3中burst类型:
FIXED
(固定)
- 一个burst内的每个transfer的地址相同。
- 一个burst内所有打拍(beat)的有效byte通道是个常量。然而,在这些byte车道中,WSTRB 选通的实际byte可以因为burst中的每个打拍(beat)而有所不同。
FIXED 适合用于重复访问相同的位置,例如加载或清空 FIFO 时。
在AXI transaction中,数据是burst的,一次burst中包含1至多个transfer,每个transfer占1个周期(cycle),所以又称为打拍(beat)。
INCR
(递增,Incrementing)
在INCR burst中,每个transfer的地址是前一个transfer地址的递增。递增的值取决于transfer的大小(单位:bit)。例如,size为4byte的burst中每个transfer的地址是前一个transfer的地址+4。
AXI协议中, 地址是byte对齐的。
INCR 适合访问常规的顺序存储器(normal sequential memory)。
WRAP
(环绕,Wrapping)
WRAP 与INCR 类似,不同之处在于:如果达到了地址上限,则地址就会绕回到低地址。
WRAP burst的限制:
- 起始地址必须与每个transfer的大小对齐
- burst长度是2/4/8/16 (次transfer)
WRAP 的行为:
- burst中最低地址与要传输数据的总大小对齐,即 Burst_Length x Brust_Size。该
最低地址
被定义为 绕回边界(wrap boundary)。 最高地址
= (wrap boundary) + (Burst_Length x Brust_Size),当前地址小于最高地址时,地址递增方式与 INCR 相同。当递增后的地址到达最高地址时,地址绕回到边界地址。burst中的起始地址
可以用高于绕回边界(wrap boundary)的地址。但要遵守适用于 WRAP 突发的限制。当第一个地址高于绕回边界(wrap boundary)时,地址绕回到任何 WRAP 突发。
WRAP 用于缓存行(cache line)的访问:
- 和cache line相关,在读一个 cache line 时,cache line 的地址是0 4 8 c,可以用 INCR4 从0开始读,读到c,1个burst;也可以用single,读4下,4个burst;也可以用 WRAP4 从c开始读,绕回到0 4 8,1个burst。INCR 和 WRAP 在AHB上效率一样,对于CPU而言,取指令,WRAP 会把CPU急需的c地址数取回来,CPU就可以进行下一步操作了,0 4 8 补位就好;对 INCR 而言,要先取0 4 8,CPU就是在单纯的等待。
因此 WRAP 这种方式为 cache line 操作提供了便利和效率
。DDR也必须配合支持这种 WRAP 方式。
burst类型由 AxBURST 定义,AxBURST :代表 ARBURST 或 AWBURST 。
AxBURST[1:0] | Burst type |
---|---|
0b00 | FIXED |
0b01 | INCR |
0b10 | WRAP |
0b11 | Reserved |
Burst address | 突发地址
介绍如何 " 确定burst中transfer的地址和byte通道 " 的方法。方程式用到以下变量:
变量 | 变量含义 |
---|---|
Start_Address | master发出的起始地址 |
Number_Bytes | 每个transfer有多少个byte |
Data_Bus_Bytes | 数据总线有多少个byte |
Aligned_Address | 对齐后的起始地址 |
Burst_Length | 一个burst内transfer的个数 |
Address_N | burst内第N个transfer的地址(N = 1, 2, 3…) |
Wrap_Boundary | 环绕burst的最低地址 |
Lower_Byte_Lane | 一个transfer的最低寻址byte |
Upper_Byte_Lane | 一个transfer的最高寻址byte |
INT(x) | x向下取整 |
确定一个burst内transfer的地址
:
- Start_Address = AxADDR
- Number_Bytes = 2 ^ AxSIZE
- Burst_Length = AxLEN + 1
- Aligned_Address = ( INT(Start_Address / Number_Bytes) ) × Number_Bytes
确定一个burst的第1个transfer的地址
:
- Address_1 = Start_Address
对于INCR Brust和地址未绕回的WRAP Brust,确定除了第1个transfer外其余transfer的地址
:
- Address_N = Aligned_Address + (N-1) × Number_Bytes(N>1)
对于WRAP Brust,Wrap_Boundary变量定义了绕回边界
:
- Wrap_Boundary = ( INT( Start_Address / (Number_Bytes × Burst_Length) ) ) × (Number_Bytes × Burst_Length)
对于WRAP Brust,如果 Address_N = Wrap_Boundary + (Number_Bytes × Burst_Length)
,则
- 当前transfer的地址:Address_N = Wrap_Boundary
- 后续其余transfer的地址:Address_N = Start_Address + ((N-1) × Number_Bytes) - (Number_Bytes × Burst_Length)
确定burst的第1个transfer使用的byte车道
:
- 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
确定burst的第N个transfer使用的byte通道(N>1)
:
- 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))
A3.4.2 Pseudocode description of the transfers | 传输的伪代码描述
// 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};
addr = Start_Address; // Variable for current address
Aligned_Address = (INT(addr/Number_Bytes) * Number_Bytes);
aligned = (Aligned_Address == addr); // Check whether addr is aligned to nbytes
dtsize = Number_Bytes * Burst_Length; // Maximum total data transaction size
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;
aligned = TRUE; // All transfers after the first are aligned
return;
A3.4.3 Regular transactions | 常规事务
略
A3.4.4 Data read and write structue | 数据读写结构
Write strobes | 写选通
WSTRB[n:0]用于指示写数据总线哪些byte车道包含有效数据。写数据总线每8bit对应一个写选通信号,即WSTRB[n]对应 WDATA[(8n)+7:(8n)]。
master必须保证只有该byte车道的数据是有效的时候,才可以拉高对应的WSTRB。
当WVALID拉低时,WSTRB可以为0或1,Spec建议将WSTRB拉低,或者保持之前的值。
Narrow transfers | 窄传输
当master发出一个数据位宽比数据总线窄的transfer时,地址和控制信息决定哪些byte通道会被transfer使用:
- 在INCR或WRAP时,burst内的每一拍(beat)使用不同的byte通道。
- FIXED时,每一拍(beat)使用相同的byte通道。
图A3-8和图A3-9给出了使用两个byte通道的例子。阴影部分表示这个byte没有数据传输。
在图A3-8:
- burst有5个transfer(即Burst_Length == 5)
- 起始地址是0
- 每个transfer是8bit(1 byte)
- 数据总线位宽是32bit(4 byte)
- burst类型是INCR
在图A3-9:
- burst有3个transfer(即Burst_Length == 3)
- 起始地址是4
- 每个transfer是32bit(1 byte)
- 数据总线位宽是64bit(4 byte)
Byte invariance | 字节恒定性
内存(Memory)中的大小端模式:
大端(Big-Endian)
:数据的MSB
存在Memory的低地址
位置(MSB
:最高有效字节,most significant byte)小端(Little-Endian)
:数据的LSB
存在Memory的低地址
位置(LSB
:最低有效字节,less significant byte)
为了使大小端模式在memory中共存,AXI协议使用字节顺序恒定(byte-invariant endianness)的大小端传输方案。对于memory中包含多个字节的数据结构(单字节时自然不存在大小端问题):
- 不管数据是大端还是小端存储的,每个数据结构存储空间的分配方式是相同的。(原文档:无论数据的字节顺序如何,元素都使用相同的连续字节内存)。
- 大小端的区别:即memory的第一个byte是元素的MSB还是LSB。(原文档:字节顺序决定了这些字节在内存中的顺序,这意味着它决定了内存中的第一个字节是元素的最高有效字节(MSB)还是最低有效字节(LSB))。
- 在传输过程不考虑大小端,按照byte原先的存储顺序,原样传输并存放到对端。(原文档:对地址的任何字节传输都将相同数据总线上的8-bit数据传递到相同的地址位置,而不管它所构成的任何更大数据元素的字节顺序如何。)
该模式的意义在传输双方均不对数据结构的大小端进行解析转换,而严格按照字节的存储顺序进行传输并转存,防止大小端模式同时存在时导致数据被覆盖。
只有一个传输宽度的组件必须将其byte通道连接到数据总线合适的byte通道。支持多个传输宽度的组件可能需要一个更复杂的接口来转换一个不是byte-invariant的接口。
大多数小端组件可以直接连接到byte-invariant接口,只支持大端传输的组件需要一个转换函数实现byte-invariant。
AXI中的数据,是不区分大小端的
,直接将memory中低位数据放在数据总线的低位。byte-invariant实际数据的大小端,需要slave自己调整。
图A3-10和图A3-11展示了一个32bit数据:0x0A0B0C0D,在寄存器(register)和内存(memory)的例子。
图A3-10的数据结构是大端
、byte-invariant
的:
- 数据的
MSB
(0x0A)存储在register的MSB位置
,数据的LSB
(0x0D)存储在register的LSB位置
。 - 数据的
MSB
(0x0A)存储在memory的最低地址
,数据的LSB
(0x0D)存储在memory的最高地址
。
图A3-11的数据结构是小端
、byte-invariant
的:
- 数据的
MSB
(0x0A)存储在register的MSB位置
,数据的LSB
(0x0D)存储在register的LSB位置
。 - 数据的
MSB
(0x0A)存储在memory的最高地址
,数据的LSB
(0x0D)存储在memory的最低地址
。
图A3-12展示了一个需要byte-invariant访问的数据结构的例子。在这个例子中,Header使用小端排序,Payload使用大端排序。
在这个例子中,Data items是2个字节,小端排序的,即数据LSB存在memory的最低地址。使用byte invariance保证了对Payload的大端访问不会破坏小端排序的数据。
Unaligned transfers | 未对齐的传输
AXI协议支持非对齐传输。对于任何由大于1个字节的transfer组成的burst,被访问的第一个字节可能与地址边界不对齐。例如,起始地址为0x1002的32bit数据包,与32bit地址边界不对齐。
- 若总线位宽为32bit(4byte),与32bit总线对齐的地址需要能被4整除。
- AHB不支持非对齐传输。
对于非对齐传输,master会进行两项操作:
- 即使起始地址不对齐,也保证所有的transfer都是对齐的
- 在首个transfer前增加填充数据,将首个transfer填充至对齐,填充数据使用WSTRB信号标记为无效
slave不需要任何特殊操作。
图A3-13展示了在32bit总线上的一个对齐/非对齐32bit的transfer的INCR burst。图中每一行表示一个 transfer,阴影部分表示没有传输的字节。
图A3-13 Aligned and unaligned transfers on a 32-bit bus
图A3-14展示了在64bit总线上的一个对齐/非对齐32bit的transfer的INCR burst。图中每一行表示一个 transfer,阴影部分表示没有传输的字节。
图3-14 Aligned and unaligned transfers on a 64-bit bus
图A3-15展示了在64bit总线上的一个对齐/非对齐32bit的transfer的WRAP burst。图中每一行表示一个 transfer,阴影部分表示没有传输的字节。
图3-15 Aligned wrapping transfers on a 64-bit bus
A3.4.5 Read and write response structure
AXI协议为读/写transaction提供响应信号:
- 对于读transaction,读响应信号RRESP[1:0]在读数据通道由slave发向master
- 对于写transaction,写响应信号BRESP[1:0]在写响应通道由slave发向master
OKAY | 常规访问成功,或者独占访问失败。 |
EXOKAY | 独占访问(Exclusive access)完成,表明独占写或独占读访问成功。 |
SLVERR | Slave error。当访问已经成功到达slave,slave将错误条件返回给master。 |
DECERR | Decode error。通常由interconnect组件生成,表明AxADDR对应的地址上没有slave。 |
对于写transaction,slave在burst完成后发出单个写响应。
对于读burst,slave为burst的每个transfer发出不同的响应信号。例如,在16个读transfer的burst中,slave可能为15个transfer返回OKAY,为1个transfer返回SLVERR。
协议规定了,即使报告了错误,仍然必须执行相应次数的transfer。例如,如果slave发出8个读transfer,但是slave有一个错误条件,这个slave必须执行8个transfer,每一个都有一个SLVERR。即使在burst过程中slave发出了SLVERR,burst也不会中止。
OKAY, normal access success
OKAY响应表明:
- 常规访问成功
-
独占访问失败
-
对不支持独占访问的slave发起独占访问
OKAY是最常用的响应方式。
EXOKAY, exclusive access success
EXOKAY响应表明独占访问成功。
SLVERR, slave error
SLVERR表示transaction不成功。
为了简化系统监控和调试,此Spec建议错误相应只应用在错误条件,而不用于发送正常的、预期内的事件。slave错误条件举例:
- FIFO或buffer上溢或下溢
-
不支持的transfer大小
-
尝试写只读的位置
-
slave超时
-
试图访问禁用或断电的功能
DECERR, decode error
DECERR响应表明interconnect不能成功解码应该访问哪个slave。
如果interconnect无法成功解码应该访问哪个slave,则必须返回DECERR响应。此Spec建议interconnect将访问路由到DET(Defualt Error Target),并且DET返回DECERR响应。
AXI协议要求一个transaction的所有transfer都已完成,即使发生了错误条件。任何提供DECERR响应的组件都必须满足此要求。
A4: Transaction Attributes
A4.1 Transaction types and attributes
slave分为存储器slave和外设slave。
Memory Slave
存储器slave需要支持所有transaction类型。
Peripheral Slave
外设slave具有具体实现决定(IMPLEMENTATION DEFINED)的访问方法。这个通常在组件的data sheet中定义支持的transaction类型。
如果对外设slave发起了不属于IMPLEMENTATION DEFINED的访问(即外设不支持的访问),必须按照协议完成。但是,一旦进行了这样的访问,不要求外设slave继续正确操作,它只需要继续以符合协议的方式完成剩余的transaction。
为了防止系统死锁,必须按要求完成整个transaction(即使存在其不支持的transaction类型),但是并不要求外设slave继续正确操作。极端情况下,slave接收到一个不支持的访问方式,然后崩溃了,但是必须完成这次transaction再崩溃,以免整个系统死锁。
外设slave只需要支持自己的data sheet定义的访问方法,这样可以显著减少接口信号。
AXI协议定义了一组支持存储器slave和外设slave的transaction属性,用AxCACHE(即ARCACHE或AWCACHE)控制:
- 一个transaction如何在系统中运行
- 任何一个系统级的cache如何处理transaction
注意,AXI cache的相关机制是针对处理器的系统级cache的一种实现。系统级cache区别于处理器内部的cache,系统级cache提高整个系统访问片外存储器的速度。当使用系统级cache连接处理器核和片外存储器时,可以被看成处理器核外部的L2缓存(或者说是last level cache)。
处理器核(Processor)、系统级cache(system-level cache)以及外部存储控制器(memory controller)通过AXI总线接口互连。L1 cache位于处理器核内部。当处理器访问外部存储中的数据,在L1 cache中miss时,向外部缓存发起transaction。transaction在通过系统级cache时,如果该transaction命中cache,即可直接得到结果,而无需访问外部存储。
A4.2 AXI3 memory attribute signaling
在AXI3中,AxCACHE[3:0]指定了transaction是“Bufferable”、“Cacheable”还是“Allocate”。
AxCACHE[0], Bufferable (B) bit
当AxCACHE[0]为1时,interconnect或任何组件,都可以将发往最终目的地的transaction延迟多个周期。
Bufferable属性一般应用于 写transaction。
Cacheable的一定Bufferable。
AxCACHE[1], Cacheable (C) bit
当AxCACHE[1]为0时,将禁止对transaction的分配(allocation)。
当AxCACHE[1]为1时:
- 允许对transaction的分配。RA和WA提供更多信息;
- 在最终目的地的transaction的特性不需要与起点的transaction的特性匹配;
对于写操作,这意味着可以将许多不同的写操作合并在一起;
对于读操作,这意味着可以预期一个位置的内容,或者来自单个读的值可以用于多个读transaction。
AxCACHE[2], Read-allocate (RA) bit
当AxCACHE[2]为1时,建议对transaction进行读分配,但是并不是强制性的。
当C bit为0时,RA bit必须也为0。
AxCACHE[3], Write-allocate (WA) bit
当AxCACHE[3]为1时,建议对transaction进行写分配,但是并不是强制性的。
当C bit为0时,WA bit必须也为0。
A4.3 AXI4 changes to memory attribute signaling
AXI4对AXI3的存储器属性进行了以下修改:
- 将AxCACHE[1]重命名为Modifiable;
-
为Non-modifiable的transaction定义了顺序要求;
-
更新了Read-allocate和Write-allocate的意义。
A4.3.1 AxCACHE[1], Modifiable
在AXI4中,AxCACHE[1]表示是否Modifiable。当为1时,代表transaction的特性可以修改;当为0时,代表transaction的特性不可以修改。
将 AxCACHE[1]从 Cacheable重命名为 Modifiable,是为了更好描述相应功能,实际功能并没有改变。
Non-modifiable transaction
AxCACHE[1]为0时表示transaction是Non-modifiable的。这样的transaction是不能拆分成多个transaction,或者与其他transaction 合并在一起的。以下parameter不能够被更改:
Parameter | Signals |
transfer的地址 | AxADDR, AxREGION |
burst大小 | AxSIZE |
burst长度 | AxLEN |
burst类型 | AxBURST |
锁类型 | AxLOCK |
保护类型 | AxPROT |
只能将AxCACHE的属性从Bufferable改成Non-bufferable,其他更改都是不允许的。
可以修改transaction的ID和QoS的取值。
一个burst长度大于16的Non-modifiable的transaction可以拆分成多个transaction。每个拆分后的transaction必须与拆分前的transaction的属性保持一致,除了:
- burst长度
- 起始地址
当 AxBURST为 INCR时, AXI4允许burst长度大于16,但是 AXI3最大burst长度就是16。为了兼容 AXI3 ,允许将burst长度大于16的transaction进行拆分。
一个Non-modifiable的transaction是独占访问(AxLOCK == 1),如果访问的字节总数保持不变,则允许修改AxSIZE和AxLEN。
在一些情况下,无法满足 Non-modifiable的要求。例如,当将总线位宽缩短到比 AxSIZE更窄时,必须修改transaction的属性。
执行这样操作的组件可以(非必须地)使用IMPLEMENTATION DEFIEND机制,表示进行了修改。这可以帮助软件进行调试。
Modifiable transactions
AxCACHE[1]为1时表示transaction是Modifiable的。Modifiable的transaction可以通过以下方式修改:
- 一个transaction可以拆分成多个transaction
-
多个transaction可以合并成一个transaction
-
读transaction可以获得比所需更多的数据
-
写transaction可以访问比所需更大的地址范围,使用WSTRB信号来确保多余的位置的数据不会被更新
-
在每个拆分后的transaction,以下信号可以被修改:
-
transfer的地址,AxADDR
-
burst大小,AxSIZE
-
burst长度,AxLEN
-
burst类型,AxBURST
以下信号一定不能被修改:
- 锁类型,AxLOCK
- 保护类型,AxPROT
可以修改AxCACHE,但任何修改都要保证不会降低其他组件对transaction的可见性,可以通过阻止transaction传播到该点,或者不通过cache查找transaction。相同地址范围内的所有transaction的AxCACHE需要保持一致,即改了一个transaction,其他transaction也需要修改。
可以修改transaction的ID和QoS的取值。
以下情况不能修改transaction:
- 导致与原始transaction访问不同的4KByte地址空间;
- 导致对单次访问的单拷贝原子性大小区域(single-copy atomicity sized region)进行多次访问,见A7.1。
A4.3.2 Ordering requirements for Non-modifiable transactions
AXI4要求满足以下所有条件的transaction需要保序:
- Non-modifiable的transaction
-
使用相同AXI ID的transaction
-
访问相同slave的transaction
如果多个transaction访问同一个slave,不管transaction的地址,必须保序。
只有之前的某个方向的transaction收到响应后才发出另一个方向的transaction,两个独立的读/写通道的transaction的顺序才能保证;如果在之前的某个方向的transaction收到响应前就发出另一个方向的transaction,则说明这两个transaction没有顺序要求。
同方向指写通道间,或读通道间。
对于访问不同slave的transaction并没有顺序要求。
因为不同物理设备(slave)间的地址映射边界是IMPLEMENTATION DEFINED的,如果slave之间的地址边界是不知道的,那么对于同一条路径的相同AXI ID的所有Non-modifiable的transaction都要保序。
这个保序要求是适用于所有Non-modifiable的transaction,不论是Non-bufferable还是Bufferable。
当AXI路径上的中间组件发出transaction的响应时,该组件负责确保顺序正确。
更多关于ordering model的信息见A6。
A4.3.3 Updated meaning of Read-allocate and Write-allocate
在AXI4中,更新了Read-allocate和Write-allocate的含义,其中1bit用来表示是否将transaction的数据存入cache,另1bit用来表示是否数据已经由另一个transaction存入cache。
对于读transaction,Write-allocate含义如下:
- 由于写transaction,数据可能之前已经存入cache(同AXI3)
- 由于另一个master的操作,数据可能之前已经存入cache(AXI4新增)
对于写transaction,Read-allocate含义如下:
- 由于读transaction,数据可能之前已经存入cache(同AXI3)
- 由于另一个master的操作,数据可能之前已经存入cache(AXI4新增)
这些改变意味着:
- 如果AxCACHE[3:2]的值不是0b00,必须在cache中查找数据
- 如果AxCACHE[3:2]的值是0b00,则不需要在cache中查找数据
对 AxCACHE定义的更改意味着相同位置的 ARCACHE和 AWCACHE可以不同。
Signal | AXI4 definition | Description |
AWCACHE[3] | Allocate | 当AWCACHE[3]或AWCACHE[2]为1时,必须在cache中查找数据,因为可能已经将数据存在cache中; 当AWCACHE[3]和AWCACHE[2]为0时,则不需要在cache中查找数据,并且transaction必须传播到目的地。 当AWCACHE[3]为1,为了提高性能,建议将数据存入cache。 |
AWCACHE[2] | Other Allocate | 当AWCACHE[2]为1时,因为可能由于读transaction或者另一个master的transaction,数据已经存在cache中,必须在cache中查找数据; 当AWCACHE[2]和AWCACHE[3]为0时,则不需要在cache中查找数据,并且transaction必须传播到目的地。 |
AWCACHE[1] | Modifiable | 当AWCACHE[1]为1时,可以修改transaction的特性,并且可以合并写transaction; 当AWCACHE[1]为0时,不可以修改transaction的特性。 |
AWCACHE[0] | Bufferable | 当AWCACHE[0]为0时,如果AWCACHE[3:2]也为0,必须由最终目的地回写响应; 当AWCACHE[0]为1时,如果AWCACHE[3:2]都为0,可以由中间节点的组件回写响应,但是写transaction需要及时传播到最终目的地; 当AWCACHE[0]为0时,如果AWCACHE[3:2]不全为0,可以由中间节点的组件回写响应,但是写transaction需要及时传播到最终目的地; 当AWCACHE[0]为1时,如果AWCACHE[3:2]都为1,可以由中间节点的组件回写响应,写transaction不需要最终目的地可见。 |
Signal | AXI4 definition | Description |
ARCACHE[3] | Other Allocate | 当ARCACHE[3]为1时,因为可能由于写transaction或者另一个master的transaction,数据已经存在cache中,必须在cache中查找数据; 当ARCACHE[3]和ARCACHE[2]为0时,则不需要在cache中查找数据。 |
ARCACHE[2] | Allocate | 当ARCACHE[2]或ARCACHE[3]为1时,必须在cache中查找数据,因为可能已经将数据存在cache中; 当ARCACHE[2]和ARCACHE[3]为0时,则不需要在cache中查找数据。 当ARCACHE[2]为1,为了提高性能,建议将数据存入cache。 |
ARCACHE[1] | Modifiable | 当ARCACHE[1]为1时,可以修改transaction的特性,并且可以读取比所需更多的读数据; 当ARCACHE[1]为0时,不可以修改transaction的特性。 |
ARCACHE[0] | Bufferable | 当ARCACHE[3:1]全为0时,ARCACHE[0]没有作用; 当ARCACHE[3:2]全为0,ARCACHE[1]为1时:
当ARCACHE[3]或ARCACHE[2]为1时,ARCACHE[0]可以用来区分Write-through类型还是Write-back类型。 |
A4.4 Memory types
AXI4和AXI3的AxCACHE编码见下表,其中括号内表示AXI3中不同的编码。
AxCACHE可以在读/写通道有不同的编码,因此 AXI3可以向后兼容 AXI4。
在 AXI4中,对某个存储器类型使用多个 AxCACHE是合法的。
A4.4.1 Memory type requirements
本节描述每个存储器类型的行为。
Device Non-bufferable
- 写响应必须由最终目的地发出
-
读数据必须由最终目的地发出
-
transaction是Non-modifiable的,见A4.3.1 Non-modifiable transactions
-
读不能预取,写不能被合并
-
到同一个slave的同ID的所有Non-modifiable的读/写transaction(AxCACHE[1] = 0)必须保序
Device Bufferable
- 写响应可以由中间节点的组件发出
-
写transaction需要及时传播到最终目的地,见A4.6
-
读数据必须由最终目的地发出
-
transaction是Non-modifiable的,见A4.3.1 Non-modifiable transactions
-
读不能预取,写不能被合并
-
到同一个slave的同ID的所有Non-modifiable的读/写transaction(AxCACHE[1] = 0)必须保序
上面这两种存储器类型都是 Non-modifiable的。在本Spec中,术语Device momory和Non-modifiable memory是等价的。
读不能预取,写不能合并:在访问非存储外设时,读写的是寄存器值,预取数据是没有必要的。而将不同的写transaction合并则容易出现预期之外的问题,比如导致相邻寄存器操作的先后顺序无法满足。
对于读transaction,Device Non-bufferable和Device Bufferable的行为是一致的。
Normal Non-cacheable Non-bufferable
- 写响应必须由最终目的地发出
-
读数据必须由最终目的地发出
-
transaction是Modifiable的,见A4.3.1 Modifiable transactions
-
写可以被合并
-
到有重叠的地址的同ID的读/写transaction必须保序
Normal Non-cacheable Bufferable
- 写响应可以由中间节点的组件发出
-
写transaction需要及时传播到最终目的地,见A4.6。但是具体什么时候传播到最终目的地并没有定义
-
读数据必须来自
-
最终目的地
-
或者正在传播到最终目的地的写transaction
如果读数据来自写transaction:
- 必须从最新的写transaction获取
-
不能将数据存入cache以用于后续的读
-
transaction是Modifiable的,见A4.3.1 Modifiable transactions
-
写可以被合并
-
到有重叠的地址的同ID的读/写transaction必须保序
对于一个 Normal Non-cacheable Bufferable的读,可以从正在传播到最终目的地的写transaction获取数据。这与同时到达最终目的地的读/写transaction没有区别。以这种方式获取读数据时,并不表示写transaction需要在最终目的地可见。
Normal Non-cacheable指正常访问存储介质,而不会查找cache
Write-through No-allocate
- 写响应可以由中间节点的组件发出
-
写transaction需要及时传播到最终目的地,见A4.6。但是具体什么时候传播到最终目的地并没有定义
-
可以从中间节点的cache中获取读数据
-
transaction是Modifiable的,见A4.3.1 Modifiable transactions
-
读可以预取
-
写可以合并
-
读/写transaction需要从cache中查找数据
-
到有重叠的地址的同ID的读/写transaction必须保序
-
No-allocate只是建议存储器系统为了提高性能不建议分配这些transaction,但是非要分配也可以
Write-through Read-allocate
除了以下两点(为了提高性能),Write-through Read-allocate与Write-through No-allocate的行为相同:
- 建议将读transaction的数据存入cache
- 不建议将写transaction的数据存入cache
Write-through Write-allocate
除了以下两点(为了提高性能),Write-through Write-allocate与Write-through No-allocate的行为相同:
- 不建议将读transaction的数据存入cache
- 建议将写transaction的数据存入cache
Write-through Read and Write-allocate
除了以下两点(为了提高性能),Write-through Read and Write-allocate与Write-through No-allocate的行为相同:
- 建议将读transaction的数据存入cache
- 建议将写transaction的数据存入cache
Write-through指数据写入cache的同时,也写入主存
Write-back No-allocate
- 写响应可以由中间节点的组件发出
-
不要求写transaction在最终目的地可见
-
可以从中间节点的cache中获取读数据
-
transaction是Modifiable的,见A4.3.1 Modifiable transactions
-
读可以预取
-
写可以合并
-
读/写transaction需要从cache中查找数据
-
到有重叠的地址的同ID的读/写transaction必须保序
-
No-allocate只是建议存储器系统为了提高性能不建议分配这些transaction,但是非要分配也可以
Write-back Read-allocate
除了以下两点(为了提高性能),Write-back Read-allocate与Write-back No-allocate的行为相同:
- 建议将读transaction的数据存入cache
- 不建议将写transaction的数据存入cache
Write-back Write-allocate
除了以下两点(为了提高性能),Write-back Write-allocate与Write-back No-allocate的行为相同:
- 不建议将读transaction的数据存入cache
- 建议将写transaction的数据存入cache
Write-back Read and Write-allocate
除了以下两点(为了提高性能),Write-back Read and Write-allocate与Write-back No-allocate的行为相同:
- 建议将读transaction的数据存入cache
- 建议将写transaction的数据存入cache
Write-back指数据仅写入cache,cache中修改的数据只在被替换时写入主存
A4.5 Mismatched memory attributes
正在访问同一存储器区域的多个agent可以使用不匹配存储器属性。但是为了保证功能正确性,,必须遵守以下规则:
- 所有访问同一存储器区域的master必须在任何层次结构级上对该存储器区域有相同的视图。即:
- 地址区域不能Cacheable
所有的master的AxCACHE[3:2]为0
- 地址区域Cacheable
所有的master的AxCACHE[3]或[2]为1
- 不同的master的 AxCACHE[3:2]可以不同
-
如果一个地址区域是Normal Non-cacheable的,任何master可以用一个Device memory的transaction访问它
-
如果一个地址区域是Bufferable的,任何master可以用Non-bufferable的transaction访问它
例如,需要最终目的地回响应的transaction不允许 Bufferable。
A4.5.1 Changing memory attributes
可以将某个存储器区域的属性改为不兼容的类型。例如,可以将属性从Write-through Cacheable改为Normal Non-cacheable。这需要一适当的操作流程进行更改。典型的操作流程如下:
- 所有master停止访问该区域
-
某个master执行任何需要的cache保持(cache maintenance)操作
-
所有master使用新属性重新开始访问该存储器区域
A4.6 Transaction buffering
对于以下存储器类型不需要最终目的地回写响应,但是需要写transaction及时在最终目的地可见:
- Device Bufferable
-
Normal Non-cacheable Bufferable
-
Write-through
对于写transaction,以下三种存储器类型需要相同的行为。对于读transaction,需要的行为如下:
- 对于Device Bufferable,读数据必须来自最终目的地
-
对于Normal Non-cacheable Bufferable,读数据要么来自最终目的地,要来自正在传播到最终目的地的写transaction
-
对于Write-through,读数据可以来自中间节点的cache
中间节点的buffer除了确保写transaction及时到达最终目的地外,还必须:
- 一个可以回写响应的中间buffer必须确保,随着时间的推移,所有Normal Non-cacheable Bufferable的读transaction都会到达它的目的地。这意味着,在转发读transaction时,不能无限期继续下一个转发,用于转发的数据也不能无限期存在。该协议没有定义任何用于确定用于转发读transaction的数据可以存在多久的机制。但是在这种机制中,读取数据时不能将数据超时周期(data timeout period)复位。
如果没有这个要求,对相同位置的持续读取可以防止buffer中保存的读数据超时,从而读transaction不能向目的地前进。
一个可以保存和合并写transaction的中间buffer必须确保transaction不会无限期保留在buffer中。例如,合并的写transaction不能将确定写何时流向最终目的地的机制进行复位。
如果没有这个要求,对相同位置的持续写入可以防止buffer中保存的写数据超时,从而写transaction不能向目的地前进。
A4.7 Access permissions
AXI提供了访问权限信号AxPROT[2:0],用于防止非法transaction,AxPROT代表ARPROT或AWPROT。
Unprivileged or privileged
AXI master可能支持多个级别的操作权限,并将此权限拓展到存储器访问。AxPROT[0]表示该访问是非特权访问还是特权访问。
有些处理器支持多个特权级别,请参阅处理器的相关文档,以确定到AXI特权级别的映射。AXI只能区别特权访问和非特权访问。
Secure or Non-secure
AXI master可能支持安全或非安全,并将此权限拓展到存储器访问。AxPROT[1]表示该访问是安全访问还是非安全访问。
AxPROT[1]为1时表示非安全,这与ARM安全扩展(ARM Security Extensions)中实现的其他信号一致。
Instruction or data
AxPROT[2]表示该访问是指令访问还是数据访问。
AxPROT[2]并不保证准确性,仅是一种提示。例如,一个transaction包含指令和数据的混合。本Spec建议master将AxPROT[2]拉低,指示是数据访问,除非明确知道是指令访问。
A4.8 Legacy considerations
AXI4引入了处理一些AxCACHE存储器属性的额外需求。在AXI4中,所有访问同一个slave的使用相同ID的Device transaction必须保序。
这并非 AXI3的明确要求。任何依赖此行为的 AXI4组件不能连接到不支持该行为的AXI3 interconnect。
ARM认为,大多数 AXI3 interconnect都支持该行为。
该Spec强烈建议任何新的AXI3设计都能实现该需求。
AXI4中AxCACHE的bit名和存储器类型名称都使用了新的术语。AXI3组件可以使用AXI3或AXI4的名称。
A4.9 Usage examples
A4.9.1 Use of Device memory types
该Spec支持联合使用Device Non-bufferable和Device Bufferable的存储器类型,强制写transaction到达最终目的地,并确保发出transaction的master知道transaction何时对于所有其他master可见。
Device Non-bufferable的写transaction需要及时到达最终目的地。但是可以有中间buffer回写响应。因此,发出transaction的mater不知道写transaction何时对于所有其他master可见。
如果一个master发出了1到多个Device Bufferable的写transaction,最后面跟着Device Non-bufferable的写transaction,所有的transaction使用相同的AXI ID,需要确保所有Device Bufferable的写transaction在Device Non-bufferable的写transaction收到写响应前就已经到达目的地(AXI保序要求)。因此,当收到Device Non-bufferable的写响应,意味着所有的transaction对所有的master可见。
一个 Device Non-bufferable的transaction只能保证访问相同slave的同ID的 Device Bufferable的transaction的完成。
A5: Multiple Transactions
A5.1 AXI transaction identifiers
AXI协议支持为每个transaction分配一个AXI ID(不同transaction的ID可以相同)。
所有同ID的transaction都必须保序,但是不同ID的transaction之间不需要保序。这意味一个物理接口可以映射为多个逻辑接口,从而支持out-of-order的transaction,每个逻辑接口都按顺序处理它的transaction。
通过使用AXI ID,master可以不等上一个transaction完成(回RESP)就发送下一个transaction。这将提高系统的性能,因为可以将多个transaction并行处理。
并没有要求master和slave一定要使用AXI ID。master和slave可以 一次只处理一个transaction(outstanding == 1,见下文),这意味着transaction是按照他们发布的顺序进行处理的。
slave需要根据master发的AXI ID,回相应的 BID或 RID给master。
A5.2 Transaction ID
每个通道都有自己的ID。
WID在AXI4中删除了,见A5.4。
AXI4通过使用AXI ID来支持ordering model。见A6。
A5.3 Transaction ordering
master可以使用AWID和ARID来标识顺序要求。规则如下:
- 来自不同master的transaction间没有顺序要求;
-
来自相同master,但是ID不同的transaction没有顺序要求;
-
来自相同master,相同AWID/ARID的transaction,slave需要按照master发送地址的顺序回BRESP/RRESP;
-
AWID和ARID相同的读/写transaction没有顺序要求;
-
可以扩展master和slave发出的ID,从而转为unique ID。
本质原因就是对于同master和同ID的transaction,如果slave回RESP时是out-of-order的,无法通过master或者AXI ID去匹配AW/AR的transaction和B/R的transaction。
A5.3.1 Read ordering
在一个master接口,相同ARID的transaction回读数据时需要保序。不同ARID的transaction回读数据时可以out-of-order和interleaving。
对于相同ARID的transaction,slave必须按master发送地址的顺序回读数据。对于不同ARID的transaction,slave可以乱序回读数据,而不用管transaction到达master的顺序。
slave必须确保返回读数据的RID与它所响应的ARID相匹配。
interconnect必须确保master按照发送地址的顺序接收同ARID的transaction的读数据。
读数据重排序深度(read data reordering depth)是slave中可以重排序的地址数。按顺序处理transaction的slave的读数据重排序深度是1。读数据重排序深度是一个静态值,必须由slave的designer制定。
没有一种机制可以让master确定slave的读数据重排序深度。
A5.3.2 Normal write ordering
AXI3中,除非master知道slave支持写数据交织,否则必须按照发送地址的顺序发出写数据。
没有一种机制让master确定slave是否支持写数据交织。 在 AXI4 中,不支持写数据交织。
大多数slave不支持写数据交织,因此必须按照它们接收地址的顺序接收写数据。
如果interconnect将多个master的写transaction转发给slave,必须确保按照地址顺序转发写数据。
即使写transaction有不同的AWID,即使来自不同的master,这些限制也适用。
A5.3.3 AXI3 write data interleaving
AXI4中删除了对写数据交织的支持。在 AXI4中,一个transaction的所有写数据必须连续传输(即 写不支持outstanding)。
通过写数据交织,slave的接口可以接收具有不同AWID的交织的写数据。写数据交织深度(write data interleaving depth)是slave可以接收交织数据的地址数。
当访问支持写数据交织的slave时,不能对同AWID的不同transaction的写数据进行交织。
master或者任何其他AXI组件无法确定slave是否支持写数据交织。同样地,也没有一种机制来确定slave的写交织深度。
对于支持写数据交织的slave,它接收每个transaction的第一个写数据的顺序必须与接收transaction的地址的顺序相同。
如果两个具有不同 AWID的写transaction访问相同或者有重叠的地址,那么 AXI3并没有定义这些访问的处理顺序。一个更高级别的协议必须确保transaction的处理顺序正确。
使用同 AWID生成写数据的master接口按照发送地址的顺序发出写数据。但是,如果slave的写数据交织深度大于1,则master接口可以使用不同 WID交织写数据。
为了避免死锁,支持写数据交织的slave接口必须连续接收交织写数据。在试图更改写数据的顺序时,绝不能停止接收写数据。
Usage models for write data interleaving
当interconnect转发多个master的写数据流给slave时,写数据交织可以防止流的停止。例如,interconnect可以将来自slow source的写数据流与来自fast source的另一个写数据流交织起来。通过交织使用这两个写数据流,interconnect可以提高系统性能。
对于大多数可以控制写数据的发送的master来说,不需要写数据交织。这样的master可以按照其发送地址的顺序来发送写数据。但是,从具有不同速度的不同source传输写数据的master接口可能会交织这些source,以最大限度地利用interconnect。
A5.3.4 Read and write interaction
AXI在读transaction和写transaction之间没有顺序要求。
如果master需要读transaction和写transaction给定关系,那么他必须在发出后续transaction前确保之前的transaction已经完成。master通过以下两种情况判断transaction是否完成:
- 对于读transaction,收到最后一笔读数据
- 对于写transaction,收到写响应
发送写transaction的所有的写数据不能指示transaction的完成。
通常,当写入外设时,master必须等待之前的transaction已完成,然后切换保序的读transaction和写transaction。
对于memory的读/写,master可以对完成的transaction进行地址检查,以确定新transaction是不是与之前的transaction地址相同或者有重叠。如果读/写transaction的地址不重叠,则mater可以发出新的transaction,而不用等待之前的transaction的完成。
A5.3.5 Interconnect use of transaction identifiers
当master连接到interconnect时,interconnect会将ARID、AWID和WID的高位前添加1至多个bit(master ID),从而不同master间ID不同。这有两个影响:
- master不需要知道其他master使用什么ID,因为interconnect将master ID添加到ARID、AWID和WID的最高位前,从而不同master间ID不同;
- slave接口的ID位宽大于master接口ID位宽
对于读数据,interconnect使用master ID标识读数据指向哪个master端口。在interconnect将RID送给相应的master前会把master_id删掉。
对于写响应,interconnect使用master ID标识写响应指向哪个master端口。在interconnect将BID送给相应的master前会把master_id删掉。
即master:raw_ar/aw/wid --interconnect–> slave:{master_id, raw_ar/aw/wid}
slave:{master_id, raw_r/bid} --interconnect–> master:raw_r/bid
A5.3.6 Width of transaction ID fields
ID的位宽由IMPLEMENTATION DEFINED。但是Spec建议使用以下ID位宽:
- 对于master,ID位宽不大于4
-
对于interconnect中有多个master时,master ID位宽不大于4
-
对于slave,ID位宽不大于8
对于只支持一个保序接口的master(outstanding == 1),可以将ID设为常数,如0。
对于不使用排序信息,且按照顺序处理所有transaction的slave,可以添加ID功能,而不改变slave的基本功能。
A5.4 Removal of write interleaving support
AXI4删除了对写数据交织的支持。在AXI4中,一个transaction的所有写数据必须在写数据通道上连续传输。
这意味着AXI4中不支持WID。
A5.4.1 Removal of WID
因为不再支持写数据交织,每个写数据都与AWID相对应,WID没有用处,成为了冗余信号。
AXI4删除了WID信号,从而减少接口数量。
A5.4.2 Legacy considerations
大多数AXI3 master不支持写数据交织,因此天然满足AXI4对写数据不交织的要求。
任何支持写数据交织的AXI3 master,必须已经支持将写数据交织深度设置为1,以适配不支持写数据交织的slave。任何这样的AXI3 master必须将写数据交织深度设置为1,才能与AXI4兼容。
任何AXI3 slave都可以接收不交织的写数据,因此AXI3 slave没有遗留问题。
任何需要 WID的 AXI3组件都可以根据 AWID生成 WID。
A6: AXI4 Ordering Model
A6.1 Definition of the ordering model
AXI4协议使用基于AXI ID的排序模型(ordering model)。
对于同ID的transaction间:
- 发送到任何一个外设的transaction,不管transaction地址如何,必须按照他们发送时的顺序到达外设;
- 使用相同或者有重叠地址的memory transaction,必须按照他们发送时的顺序到达;
在一个有多个master的AXI系统中,用于排序模型的AXI IDs包含了用于标识每个master的infrastructure IDs(或者称为master ID)。这意味着排序模型将独立地应用于系统的每个master间(因为不同ID间不需要保序)。
AXI排序模型还要求所有同ID的同方向的transaction必须按照其发送地址的顺序收到响应。
同方向指写通道间,或者读通道间。
因为读/写地址通道独立,如果不同方向的同ID的两个transaction间需要排序,则master必须等待在发出第1个transaction之前接收第1个transaction的响应。
如果master在收到之前某个方向transaction的响应前,就发出了另一个方向的transaction,则说明这两个transaction没有保证顺序的正确性。
如果需要之前的transaction回响应以确保顺序的正确性,则master必须确保响应是来自系统中最终目的地。因为来自中间AXI组件的响应不能保证在之后的组件的排序。见A4.9.1。
A6.2 Master ordering
同ID的同方向的transaction,需要这些transaction有以下的顺序保证:
- master收到响应的顺序必须与发送地址时的顺序相同;
-
访问Device memory的transaction,到达的顺序必须与master发送时的顺序相同;
-
访问相同或者有重叠地址的Normal memory的transaction,必须与master发送时的顺序相同。这也适用于Cacheable memory。也就是说,它适用于所有AxCACHE[3:1]不是0b000的有效transaction。
同方向指写通道间,或者读通道间。
访问相同或者重叠地址的两个transaction的定义是,这两个transaction都可以访问同一个单拷贝原子地址范围(single-copy atomic address range)至少一个字节的数据。见A7.1。至少一个字节的原因是AXI协议中地址以字节对齐。
A6.3 Interconnect ordering
为了满足排序模型的要求,interconnect必须确保:
- 保存访问Device memory的同ID、同方向的transaction间的顺序;
-
保存访问相同或重叠地址的同ID、同方向的transaction间的顺序;
-
保留同ID的写响应的顺序;
-
保留同ID的读响应的顺序;
-
对于transaction的AXI ID的任何操作,都必须确保保持原始ID的排序要求;
-
对于在transaction到达最终目的地前就给出响应的中间组件,必须确保保持排序要求,直到transaction到达最终目的地,见A6.5;
同方向指写通道间,或者读通道间。
A6.4 Slave ordering
为了满足排序模型的要求,slave必须确保:
- 不论ID,任何后续的写/读transaction都必须遵守slave已回响应的写transaction;
-
访问Device memory的同ID的写transaction中,后续的transaction必须观测之前的transaction,即使之前的transaction还未回响应;
-
访问Normal memory的同ID的写transaction中,如果访问的地址是相同的或者有重叠的,后续的transaction必须观测之前的transaction,即使之前的transaction还未回响应。这也适用于Cacheable memory。也就是说,它适用于所有AxCACHE[3:1]不是0b000的有效写transaction;
-
同ID的多个写transaction的响应必须按照transaction到达slave的顺序发出;
-
不同ID的多个写transaction的响应可以按任何顺序发出;
-
不论ID,任何后续的写/读transaction都必须遵守slave已回响应的读transaction;
-
访问Device memory的同ID的读transaction中,后续的transaction必须观测之前的transaction,即使之前的transaction还未回响应;
-
同ID的多个读transaction的响应必须按照transaction到达slave的顺序发出;
-
不同ID的多个读transaction的响应可以按任何顺序发出;
A6.5 Response before final destination
在transaction到达最终目的地前,回响应给master的任何中间组件,都必须确保transaction对来自任何上游master的可见性:
- 不论访问什么存储器类型,访问相同或者有重叠地址transaction中,如果之前的transaction是由中间组件回响应,则后续的transaction必须观测;
- 访问Device memory时,对于访问同slave的同ID的transaction,中间组件必须维护由它回响应的transaction和后续transaction的顺序关系;
上游master(upstream master)是指通过该组件上的slave侧接口访问中间组件的任何设备。
只有当AxCACHE表明允许这样做时,才能从中间节点回transaction的响应。
AXI协议要求访问Device memory时的排序保证是访问Normal memory时的超集。这确保了任何标记为“Normal“的transaction,都可以在不删除任何原始排序保证的前提下转换为“Device”。为了满足此要求,访问相同或者有重叠的地址时,不管ID是否相同,访问Device memory的行为要与访问Normal memory的行为一致。
下表展示了存储器类型、transaction IDs和是否访问相同或有重叠的地址时,是否有排序要求。
上表中,适用于Normal memory的同样适用于Cacheable memory。也就说,它们适用于所有AxCACHE[3:1]不是0b000的有效transaction;
A6.6 Ordered write observation
为了提高与支持不同排序模型的接口协议的兼容性,定义了Ordered_Write_Observation属性,每个接口的Ordered_Write_Observation可以定义为True或False。
如果Ordered_Write_Observation被设为True,则接口被定义为具有此属性。
不支持Ordered_Write_Observation属性的接口默认将Ordered_Write_Observation设为False。
支持Ordered_Write_Observation属性的接口可以支持具有更好性能的生产/消费者排序模型(Producer/Consumer ordering model)。
如果系统中的所有其他agent按照发出transaction的相同顺序观测到两个同ID的写他那从,则可以将接口声明为提供Ordered_Write_Observation属性。
如果一个接口没有Ordered_Write_Observation属性,那么只保证访问同一个外设的同ID的一系列写transaction的观测顺序。要支持没有Ordered_Write_Observation的生产/消费者排序模型,在向另一个外设发出后续transaction前,之前的写transaction必须写入外设,并回BRESP。
A7: Atomic Accesses
A7.1 Single-copy atomicity size
AXI4协定义了单拷贝原子性大小(single-copy atomicity size)的概念,它定义了一个transaction原子更新的最小字节数。因为块的大小最小为单拷贝原子性大小,AXI4协议需要一个大于单拷贝原子性大小的transaction更新块中的内存。
原子性并不能定义数据更新时的确切时间。必须确保的是,没有一个master能够观测到原子数据的部分更新形式。例如,在许多系统中,诸如链表等数据结构是由32bit原子元素组成的。针对这些元素的原子更新操作必须同时更新整个32bit的值。没有master可以接收一次只观测16bit的更新,然后在以后再观测其他16bit的更新。
即:以32bit为最小粒度,假如想更新8bit的数据,也必须读出完整的32bit,更新8bit数据,再将32bit数据存回内存,这就是“ 读 --> 改 --> 写”的过程。需要保证“读改写“为同一个master操作,即后面提到的独占访问或锁访问。
更复杂的系统需要支持更大的原子元素,特别是64bit的原子元素,因此master可以使用基于这些较大的原子元素的数据结构进行通信。
系统中支持的单拷贝原子性大小很重要,因为给定通信中涉及的所有组件都必须支持所需原子元素大小。如果两个master通过一个interconnect和一个slave进行通信,那么所涉及的所有组件都必须确保所需大小的访问被原子处理。
AXI4协议不需要特定的单拷贝原子性大小,系统可以被设计为支持不同的单拷贝原子性大小。
不同的组件组(components groups)可以有不同的单拷贝原子性大小,用于组内的通信。在AXI4中,单拷贝原子组(single-copy atomic group)描述了一组可以在特定原子性下进行通信的组件。例如,图A7-1展示了一个系统,其中:
- 处理器、数字信号处理器(DSP)、DRAM控制器、DMA控制器、外设、SRAM和相关的interconnect,都在一个32bit的单拷贝原子组中
- 处理器、DSP、DRAM控制器和相关的interconnect也都在一个64bit的单拷贝原子组中
图A7-1 Example system with different single-copy atomic groups
transaction的原子性只有在它的起始地址正确对齐时才能得到保证。例如,64bit单拷贝原子组中,如果一个burst没有对齐到8byte边界,那么该transaction没有任何64bit单拷贝原子保证。
字节选通信号不会影响单拷贝原子性大小。
A7.1.1 Multi-copy write atomicity
要指定一个系统提供多拷贝原子性(multi-copy atomicity),必须定义Multi_Copy_Atomicity属性。
如果Multi_Copy_Atomicity属性被设置为True,则该系统拥有这个能力,否则该系统不拥有这个能力。
如果以下条件满足,则可以说明一个系统具有多拷贝原子性:
- 针对同一个位置的写操作可以被所有的agent以相同的顺序观测到;
- 其它agent可以观测到某个agent发出的写操作;
多拷贝原子性可以通过如下手段来保证:
- 对于一个给定的地址使用单点序列化(Point of Serialization,POS),这样针对相同位置的全部访问都可以顺序处理,必须确保在该位置的新值对任何agent都可见之前,一个位置的一致性cache拷贝都已无效;
- 避免在agent的上游使用向前buffer,这可以避免一个buffer写操作在对全部agent可见前就对某些agent可见;
注意:如果一个系统使用了ARM v8架构处理器,则该系统必须拥有Multi_Copy_Atomicity属性。该属性用来支持“加载与获取”和“存储与释放”指令,“存储与释放”指令要求存储操作是多拷贝原子性的。
A7.2 Exclusive accesses
独占访问机制可以提供信号量类型(semaphore-type)的操作,不需要在整个访问周期内让总线被一个master所独占。这意味着信号量类型的操作不会影响总线访问延迟或最大可实现的带宽。
AxLOCK信号选择独占访问,RRESP和BRESP信号分别表示独占读访问和独占写访问是否成功。
slave需要额外的逻辑来支持独占访问。当master访问一个不支持独占访问的slave时,AXI协议提供了种机制来通知该master其访问的slave不支持独占访问操作。
A7.2.1 Exclusive access process
独占访问的基本机制是:
- master在给定地址上执行独占读访问;
-
过一段时间后,master尝试在相同的地址上执行独占写访问,从而完成独占访问。访问相同地址的独占写访问的AWID与独占读访问的ARID必须相同。
-
此独占写访问表示为:
- 如果从执行独占读访问开始没有其它master写相同的位置,表明独占访问成功,独占写访问将会更新存储器,并返回成功信号(EXOKAY);
- 如果从执行独占读访问开始有其它master写相同的位置,表明独占访问失败,不会更新存储器,返回失败信号(OKAY);
master或许不会完成独占写访问,独占访问的监视硬件(monitor hardware)对于每一个ID只会监视一个地址。如果一个master没有完成独占写访问,接下来这个master又以相同的ID对另一个地址发起了独占读访问,则独占访问监视的地址就会被改变。
A7.2.2 Exclusive access from the perSpective of the master
一个master通过执行一个独占读访问的方式开始一个独占操作,如果访问成功,slave就会返回EXOKAY响应,表示slave已经记录了要监视的地址。
如果master尝试向不支持独占访问的slave发出独占读访问请求,slave会返回OKAY响应而不是EXOKAY响应。
master可以将 OKAY响应作为独占访问不支持的错误响应看待,Spec推荐master接下来不要执行独占写访问。
在独占读访问之后的一段时间后,master尝试对相同位置发起独占写访问,如果从独占读访问开始时到现在对应地址的内容始终没有发生改变,独占写访问就会成功,slave返回EXOKAY响应,并更新对应的存储器位置,否则,独占写访问就会失败,slave返回OKAY响应而不是EXOKAY响应,独占写访问不会更新对应的存储器位置。
master或许不会完成独占写访问,如果发生了这种情况,slave将会继续监视独占访问的地址,直到另一个独占读访问启动一个新的独占访问序列。
master在独占读访问完成后才会开始独占写访问。
A7.2.3 Exclusive access from the perSpective of the slave
不支持独占访问的slave可以忽略AxLOCK信号,这样的slave对于常规访问和独占访问都必须提供OKAY响应信号。
支持独占访问的slave必须拥有监视硬件(monitor hardware),Spec推荐对于每一个支持独占的ID都准备一个监视单元。ARM架构参考手册,ARMv7-A和ARMv7-R版本定义了一种独占访问监视器,一个单端口的slave可以使用一个外接的独占访问监视器,而一个多端口的slave则或许需要实现内部监视器。
独占访问监视器需要记录任何独占读访问的地址和ARID,然后需要监视该地址,直到该地址的独占写访问发生,或者使用相同ARID的另一个独占读访问更新需监视的地址。
当slave接收到一个独占写访问时,监视器就会根据给定的AWID检查指定的地址是否被监视,如果是,这表示从独占读访问访问开始以来没有发生写操作,然后就会处理写操作并完成整个独占访问过程,返回EXOKAY响应,并更新存储器。
如果在进行独占写访问时,AWID所对应的地址不是监视的地址,则表明发生了下列情况之一:
- 在独占读访问transaction发起之后,该地址对应的数据被其他master写过;
- 监视器的地址被另一个独占读访问修改;
在以上两种情况中,独占写访问都不会更新存储器对应地址的数据,slave必须返回OKAY而不是EXOKAY响应。
A7.2.4 Exclusive access restrictions
独占访问存在以下限制:
- 独占写访问的burst_size和burst_length必须与其对应的独占读访问一致;
-
独占访问的地址必须对齐到transaction的总字节数,也就是burst_size × burst_length;
-
独占读与独占写访问的地址必须一致;
-
独占读访问的ARID必须与独占写访问的AWID一致;
-
独占读和独占写访问的控制信号必须一致;
-
独占访问burst传输的字节数必须是2的n次幂,即1/2/4/8/16/32/64/128字节;
-
独占访问burst传输的最大字节数为128字节;
-
在AXI4中,独占访问的burst_length不能超过16;
-
AxCACHE必须保证监视独占访问的slave可以看到transaction。例如,独占访问一定不能有表示transaction是cacheable的AxCACHE;
不遵守这些限制的话,会导致不可预测(UNPREDICTABLE)的行为。
在独占操作过程中监视的最小字节数由transaction的burst_length和burst_size所定义,而slave可以选择监视更大的字节数(最大不超过128字节,即独占访问的最大大小),但当相邻的字节被更新时,这会导致本应成功的独占访问操作变为失败状态。
A7.2.5 Slaves that do not support exclusive access
RRESP与BRESP在表示常规访问成功时使用OKAY信号,而在表示独占访问成功时使用EXOKAY信号,这意味着不支持独占访问的slave会使用OKAY信号表示独占访问操作的失败。
对不支持独占访问slave的独占写访问总会更新存储器。
对支持独占访问slave的独占写访问只有在独占写操作成功时才会更新存储器。
A7.3 Locked accesses
AXI4不支持锁transaction。AXI3必须支持锁transaction。
AXI4由于以下原因移除了锁transaction的支持:
(1)大多数组件不需要锁transaction;
(2)锁transaction的实现会对interconnect的复杂度以及QoS保证能力造成显著的影响。
AxLOCK表示ARLOCK或AWLOCK。
当master使用AxLOCK信号表示当前transaction是一个锁transaction时,interconnect就必须确保只有当前master可以访问目标slave区域,直到该master发出解锁transaction为止,interconnect的仲裁器必须强制执行此限制。
在master开始读的锁transaction或写的锁transaction,该master必须确保之前的transaction都已经完成。
任何锁transaction会强制interconnect锁定接下来的所有transaction,因此,一个锁序列只有当master发出解锁transaction时才会终止,即在最后一个锁transaction进行解锁。
在即将完成锁序列时,必须首先确保所有的锁transaction都已经完成,然后才能发出最后一个transaction(用于解锁),并必须确保在最后一个锁transaction完成之前不能发起新的transaction。
master必须确保一个锁序列中的全部transaction都拥有相同的AxID值。
锁访问需要interconnect在锁序列进行中时避免任何其它的transaction发生,这会 对interconnect的效率产生影响,因此,Spec推荐锁访问只用于支持旧版本( AXI3)的设备。
Spec推荐以下限制(非强制):
- 一个锁序列的地址不跨4KB;
- 将任何序列限制为两个transaction;
A7.4 Atomic access signaling
在AXI3中,AxLOCK[1:0]用于表示:常规访问、独占访问、锁访问。
在AXI4中,移除了锁访问,使用1bit的AxLOCK表示常规访问还是独占访问。
A7.4.1 Legacy considerations
在AXI4中,任何AXI3锁transaction可以按照下列方式被转换:
- AWLOCK[1:0] = 0’b10被转换为常规写transaction,AWLOCK = 0’b0。
- ARLOCK[1:0] = 0’b10被转换为常规读transaction,ARLOCK = 0’b0。
Spec推荐任何组件执行这样的转换,通常是interconnect,可以包含一个可选的机制用于检测和标记发生了这样的转换。
如果某些组件执行了转换后不能正确工作,则这样的组件不能在AXI4中使用。
对于许多之前使用锁transaction的遗留情况,例如 SWP指令的执行,或许需要修改软件来避免使用强制使用锁transaction的指令。
A8: AXI4 Additional Signaling
A8.1 QoS signaling
QoS:Quality of Service
A8.1.1 QoS interface signals
Signal | Description |
AWQOS[3:0] | 每次写transaction中由写地址通道发送。 |
ARQOS[3:0] | 每次读transaction中由读地址通道发送。 |
AxQOS表示ARQOS或AWQOS。
协议并没有指定QoS标识符的确切使用方法,Spec推荐AxQOS的值用于指定读transaction或写transaction的优先级。值越大表示transaction优先级越高。
当使用默认值0’b0000时表示接口没有QoS方案。
QoS可以有其他解释。
A8.1.2 Master considerations
一个master可以产生自己的AxQOS,如果它可以产生多个传输流,则可以为这些流分配不同的QoS值。
为了支持QoS,需要对正在使用的QoS方案有系统级的理解,同时需要全部的组件之间互相配合,因此,Spec推荐master组件支持可编程性,可以用于控制用于任何给定的场景的精确QoS值。
如果master组件不支持任何可编程的QoS方案,则它可以使用QoS值代表transaction的相对优先级,然后可以将这些值映射到备用的系统级QoS值。
不能产生AxQOS值的master必须使用默认值。
Spec期望很多interconnect组件实现一些可编程寄存器,这些寄存器可以用于分配QoS值到与interconnect互连的master,覆盖掉master原先的QoS值。
A8.1.3 System considerations
AXI4中定义的QoS信号可以用于任何兼容的系统级方案。
QoS默认的系统级实现是,任何可以选择处理多个transaction的组件,都会选择QoS值较高的transaction优先处理。这个选择只有当没有要求按特定顺序处理transaction时才会发生。
这意味着AXI顺序规则优先于QoS。
可以实现兼容默认方案的更复杂的QoS方案。
A8.2 Multiple region signaling
AXI4支持多区域接口。
A8.2.1 Additional interface signals
Signal | Description |
AWREGION[3:0] | 每次写transaction中由写地址通道发送。 |
ARREGION[3:0] | 每次读transaction中由读地址通道发送。 |
AxREGION表示ARREGION或AWREGION。
4bit区域标识符可以用于唯一地标识最多16个不同的区域,区域标识符可以提供更高阶的地址位的译码,但在任何4KB地址空间内必须保持不变。
区域标识符的使用意味着slave的单个物理接口可以提供多个逻辑接口,每一个逻辑接口在系统地址映射中具有不同的位置,区域标识符的使用也意味着slave不需要支持不同逻辑接口间的地址译码。
这个协议期望interconnect在为拥有多个逻辑接口的单个slave执行地址译码功能时产生AxREGION信号,如果一个slave在系统地址映射中只有一个物理接口,则interconnect必须使用默认的AxREGION值,见A10。
区域标识符有许多使用模型,包括但不限于以下内容:
- 地址映射中外设的主数据通路和控制寄存器可以在不同位置,并且不需要slave执行地址解码就可以通过单个接口进行访问。
- 一个slave可以在不同的存储区域中表现出不同的行为。例如,slave可能在一个区域提供读写访问,但在另一个区域提供只读访问。
slave必须确保两个位于不同区域但拥有相同的AXI ID的transaction以正确的顺序响应。
如果slave实现的区域少于16个时,slave必须确保在任何master尝试访问不支持的区域时给出正确的协议信号,而这需要IMMPLEMENTATION DEFINED,例如,slave或许需要通过下列方式来确保上述事宜:
- 对于任何访问不支持区域的transaction提供一个错误响应;
- 为所有不支持的区域分配支持区域的别名,以确保所有访问的响应符合协议;
AxREGION信号仅提供了对slave可使用的现存地址空间的地址译码功能,以消除对地址译码功能的需求,这个信号并没有创建新的独立地址空间。
AxREGION只能出现在地址译码功能的下游接口上。
A8.3 User-defined signaling
在每个AXI4通道都可以定义用户定义信号。
一般情况下,Spec推荐用户不使用用户信号,因为AXI协议并没有定义这些信号的功能,贸然使用可能会导致两个组件之间出现互操作性的问题,因为两个组件可能以不兼容的方法使用了相同的用户信号。
A8.3.1 Signal naming
Signal | Description |
AWUSER | 写地址通道用户信号 |
ARUSER | 读地址通道用户信号 |
WUSER | 写数据通道用户信号 |
RUSER | 读数据通道用户信号 |
BUESR | 写响应通道用户信号 |
A8.3.2 Usage considerations
协议并不要求所有通道都支持用户信号。
Spec推荐interconnect包含用户信号,然而,并没有要求master和slave包含用户信号。
Spec推荐interconnect组件包含用户信号的支持,以便interconnect组件可以将用户信号在master和slave之间传送,用户定义信号的宽度是IMPLEMENTATION DEFINED的,对于每个通道都可以不同。
A9: Low-power Interface
A9.1 About the low-power interface
低功耗接口是AXI协议的可选扩展,适用于如下两类外设:
- 任何没有下电序列且可以指定其时钟何时被关闭的外设;
- 任何要求下电序列,且只有在进入低功耗状态后才能停止时钟的外设,这样的外设要求系统时钟控制器指定其何时开始下电序列,并且外设在进入低功耗状态后必须发出通知;
A9.2 Low-power clock control
低功耗时钟控制接口包含如下信号:
- 一个来自外设的信号,用于指定其时钟何时可以被开启/关闭;
- 两个系统时钟控制器的握手信号,用于请求进入或退出低功耗状态;
A9.2.1 Peripheral clock required
CACTIVE信号表示外设是否需要时钟信号。当外设需要使能时钟的时候就会拉高CACTIVE,此时系统时钟控制器就必须立即使能时钟。当外设不需要时钟的时候就会拉低CACTIVE,系统时钟控制器可以关闭该时钟(非强制)。
一个可以在任何时候启用或禁用其时钟的外设,则可以永久拉低CACTIVE;必须始终启用其时钟的外设,必须永久拉高CACTIVE。
CACTIVE是没有下电序列(power-down sequence)或上电序列(power-up sequence)的某些外设的唯一时钟控制信号。
A9.2.2 Power-down or power-up handshake
对于一个有下电序列或上电序列的外设而言,只有在系统时钟控制器发出请求之后外设才会进入低功耗状态,AXI协议提供了请求/应答(request/acknowledge)握手信号用于支持这个功能:
CSYSREQ 系统时钟控制器使用CSYSREQ去请求:
- 外设进入低功耗状态。系统时钟控制器拉低CSYSREQ;
- 外设退出低功耗状态。系统时钟控制器拉高CSYSREQ;
CSYSACK 外设使用CSYSACK去应答:
- 进入低功耗状态请求。外设在识别到CSYSREQ拉低后可以拉低CSYSACK;
- 退出低功耗状态请求。外设在识别到CSYSREQ拉高后可以拉高CSYSACK;
图A9-1展示了CSYSREQ和CSYSACK的关系。
图 A9-1 CSYSREQ and CSYSACK handshake
在序列开始时,CSYSREQ与CSYSACK都为高电平;在T1时刻,系统时钟控制器拉低CSYSREQ表示请求外设进入低功耗状态;外设在T2时刻拉低CSYSACK应答请求;在T3时刻,系统时钟控制器拉高CSYSREQ请求外设退出低功耗状态;在T4时刻,外设拉高CSYSACK应答请求。
外设可以接收或拒绝系统时钟控制器进入低功耗状态的请求,在外设应答请求的时候通过将CACTIVE拉低或拉高来表示接收或拒绝请求。
A9.2.3 Acceptance of low-power request
图A9-2展示了外设接收系统低功耗请求的波形。
图 A9-2 Acceptance of a low-power request
在T1时刻,系统时钟控制器拉低CSYSREQ以请求外设进入低功耗状态;在外设识别到这个请求后,执行了自己的下电序列,并在T2时刻拉低了CACTIVE用来表示时钟信号可以被移除;在T3时刻,外设拉低CSYSACK通知系统时钟控制器该外设已进入低功耗模式,
外设只有在拉低CACTIVE后至少一个时钟之后才能拉低CSYSACK。
A9.2.4 Denial of a low-power request
图A9-3展示了外设拒绝系统低功耗请求的波形。
图 A9-3 Denial of a low-power request
在T1时刻,系统时钟控制器拉低CSYSREQ以请求外设进入低功耗状态;在T2时刻外设拉低CSYSACK应答该请求,但通过保持CACTIVE为高拒绝低功耗请求,因此系统时钟控制器必须维持时钟,并且在执行了低功耗状态退出序列后才能发起另一个低功耗请求;在T3时刻,系统时钟控制器通过拉高CSYSREQ开始了低功耗状态退出序列;在T4时刻,外设拉高CSYSACK表示完成了低功耗状态退出序列。
A9.2.5 Exiting a low-power state
无论是系统时钟控制器还是外设都可以请求退出低功耗状态,外设要求CACTIVE与CSYSREQ在整个低功耗状态期间保持为低电平,这两个信号之一变为高电平都会触发低功耗状态退出序列的启动。
System clock controller initiated exit
图A9-4展示了系统时钟控制器开启退出低功耗状态。
图 A9-4 System clock controller initiated exit from low-power state
在T1时刻,系统时钟控制器拉高CSYSREQ以请求退出低功耗状态,然后使能时钟;外设识别到CSYSREQ为高电平后开始执行上电序列,并在T2时刻拉高CACTIVE表示它需要时钟信号;然后外设在T3时刻拉高CSYSACK完成退出序列。
Peripheral initiated exit
图A9-5展示了外设开启退出低功耗状态。
图A9-5 Peripheral initiated exit from low-power state
在T1时刻外设拉高CACTIVE表示需要时钟信号,然后系统时钟控制器必须恢复时钟;在T2时刻系统时钟控制器拉高CSYSREQ,外设接下来会拉高CSYSACK完成退出序列。
外设可以让 CSYSACK保持数个周期的低电平以完成退出序列。
A9.2.6 Clock control sequence summary
图A9-6展示了请求进入低功耗状态的典型流程。
图 A9-6 Requesting entry to low-power state
图A9-7展示了从低功耗状态退出的典型流程。
图 A9-7 Exit from low-power state
A9.2.7 Combining peripherals in a low-power domain
系统时钟控制器可以将一些不同的外设组合到一个相同的低功耗时钟域中,若符合下面的规则,可以将时钟域内的所有外设看作一个单独的外设:
- 时钟域的CACTIVE是时钟域中所有外设CACTIVE的逻辑或,这意味着系统时钟控制器只有当所有外设都表示其时钟可以被关闭时才可以关闭时钟;
-
系统控制器必须使用一个CSYSREQ,并路由到时钟域中的全部外设;
-
时钟域CSYSACK通过下述方法生成:
-
只有当时钟域中的最后一个外设拉低CSYSACK时才会拉低总的CSYSACK;
-
只有当时钟域中的最后一个外设拉高CSYSACK时才会拉高总的CSYSACK;