A1: Introduction
A1.1 About the AXI protocol
AMBA AXI支持高性能、高速的系统设计。
AXI协议:
适合高带宽、低延迟的设计
不使用复杂bridge的情况下运行高工作频率
满足很多组件的接口要求
灵活实现interconnect架构
向后兼容AHB、APB接口
AXI协议的关键特性是:
地址/控制和数据分离
支持非对齐的data transfer(通过byte选通)
基于burst的transaction,仅需要首地址
读/写数据通道分离,从而实现低消耗的DMA
支持发送多个oustanding的地址
支持out-of-order的transaction
容易进行寄存器打拍去满足timing
AXI协议有低功耗信号。
A1.2 AXI revisions
A1.3 AXI Architecture
AXI协议是基于burst的,并且有5条独立的通道:
读地址通道(AR) |
master --> slave |
写地址通道(AW) |
master --> slave |
写数据通道(W) |
master --> slave |
写响应通道(B) |
slave --> master |
读数据通道(R) |
slave --> master |
AXI协议支持:
在发送数据前发送地址
多条outstanding的transaction
out-of-order的transaction
图 A1-1 Channel architecture of reads
图 A1-2 Channel architecture of writes
A1.3.1 Channel definition
5条独立的通道都有各自的握手信号(VALID和READY):source使用VALID信号表明地址/数据/控制信息有效;READY信号表明下游准备好了。读/写数据通道还有LAST信号,表明一个transaction中最后一个transfer。
读/写地址通道 |
携带地址和控制信息 |
读数据通道 |
携带读数据和读响应:
|
写数据通道 |
携带写数据:
写数据通道信息通常认为是buffer的,,因此master可以在slave没有确认之前的写transaction前发送新的写访问。 |
写响应通道 |
写响应表明写transaction完成 |
A1.3.2 Interface and interconnect
典型的系统中有多个master和多个slave,master和slave之间通过interconnect相连。
图 A1-3 Interface and interconnect
AXI协议提供如下接口的接口定义:
master <--> interconnect
slave <--> interconnect
master <--> slave
master/slave间的interconnect的接口,相当于与master/slave连接的slave/master的接口
典型系统拓扑:
共享地址和数据总线
共享地址总线,多条数据总线
多条地址总线,多条数据总线
对于多数系统,地址通道的带宽需求是远小于数据通道的带宽需求的。可以通过使用一条共享的地址总线以及多条数据总线(并发多个data transfer),实现系统性能和interconnect复杂性的平衡。
A1.3.3 Register slices
每条AXI通道都是单向的,并且通道间没有固定的关系。所以可以在通道内的任意位置插入寄存器,从而提高时钟频率,但代价是引入延迟。
延迟和最高工作频率的权衡。
处理器和高性能存储器间直接、快速的连接;而处理器到低性能外设的critical path用寄存器打断。
A1.4 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的上升沿触发。
master和slave接口处,输入/输出信号间不能有组合逻辑通路。
A3.1.2 Reset
AXI协议使用低有效的复位信号,ARESETn。ARESETn可以异步复位,但是必须在ACLK的上升沿同步释放。
在复位期间:
master接口必须将ARVALID,AWVALID和WAVLID拉低
slave接口必须将RVALID和BVALID拉低
其他信号可以为任意值
即,将所有的 VALID信号拉低
在ARESETn释放后的下一个ACLK时钟上升沿,ARVALID,AWVALID和WAVLID就允许拉高。
图 A3-1 Exit from reset
A3.2 Basic read and write transactions
A3.2.1 Handshake process
5条通道都使用相同的VALID/READY握手机制,传递地址、数据或控制信息。这个握手机制意味着,master和slave都可以控制信息的移动速率。source在地址、数据或控制信息有效时拉高VALID,目的地在准备好接收信息时将READY拉高。transfer在VALID和READY都拉高时发生。
master和slave接口处,输入/输出信号间不能有组合逻辑通路。
图A3-2到图A3-4展示了握手过程的示例波形。
在图3-2,source在T1后将地址、数据或控制信息放在总线上,同时拉高VALID。目的地在T2后拉高READY。source必须在目的地拿到信息(T3)前保持信息的稳定(即信息和VALID要保持,直到READY拉高)。因为READY的反压,transfer花费2个时钟周期。
图 A3-2 VALID before READY handshake
source的VALID使能条件不能与READY有关(即不能将READY通过组合逻辑生成VALID),因为READY的使能可能与VALID有关(协议支持),若VALID又取决于READY,则会造成死锁。
只要VALID拉高了,在握手之前都不能将VALID拉低,在时钟上升沿抓到握手后可以将VALID拉低。
在图A3-3,目的地在T1后将READY拉高,而source在T2后才将信息放到总线上,同时拉到VALID,在T3时寄存器抓到握手成功。这个例子中只用了1个时钟周期transfer就完成了(因为READY提前准备好,或者说READY没有反压上游)。
图A3-3 READY before VALID handshake
目的地允许将VALID作为READY拉高的条件(之一)。
如果READY拉高了,但是VALID尚未拉高,此时允许目的地将READY拉低。
在图A3-4,source和目的地同时在T1后将VALID/READY拉高,在T2时钟上升沿抓到握手成功,transfer完成。
图 A3-4 VALID with READY handshake
A3.2.2 Channel signaling requirements
Channel handshake signals
AXI有5条独立的通道,每条通道都有自己的VALID/READY握手信号。
Transaction |
Handshake pair |
写地址通道 |
AWVALID/AWREADY |
写数据通道 |
WVALID/WREADY |
写响应通道 |
BVALID/BREADY |
读地址通道 |
ARVALID/ARREADY |
读数据通道 |
RVALID/RREADY |
Write address channel
只有当可以发送有效地址和控制信息时master将AWVALID拉高,并且直到AWREADY拉高的时钟上升沿后才能将AWVALID拉低。(废话,同A3.2.1)
AWREADY的默认值可以为0或1,Spec建议为1。只有slave可以接收有效地址时才可以将AWREADY拉高。
Spec不建议将 AWREADY的默认值设为0,因为这回导致transfer至少消耗2个时钟周期,一个用于拉高 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个时钟周期,一个用于拉高 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协议要求保持以下关系:
写响应必须在最后一次写transfer后,master收到写响应意味着这个transaction结束
读数据必须在相应的读地址之后(否则不知道应该读哪里的数据)
通道握手必须满足A3.3.1定义的依赖关系
除此以外,协议再无定义通道间的任何关系。
这意味着可能出现:在一个transaction中W握手出现在AW握手前(在AW通道比W通道打了更多拍的情况下出现)。同样的,W握手可以和AW握手同时发生。
当需要interconnect来确认目的地的地址空间或者slave空间时,必须对齐写地址和写数据。这是为了确保写数据只对其想写入的slave的有效。
A3.3.1 Dependencies between channel handshake signals
为了避死锁,以下依赖关系必须遵从。
如A3.2.2所示,在任何transaction中:
VALID不能取决于READY
READY可以取决于VALID
READY可以等到 VALID拉高后再拉高,也可以在 VALID拉高前拉高。这将使得设计更为高效。
此外,不同通道间的握手信号也有依赖关系:
读transaction依赖
写transaction依赖
写响应依赖(AXI4新增)
单头箭头:其指向的信号可以在箭头起始信号拉高前/后拉高,即无依赖关系;
双头箭头:其指向的信号必须在箭头起始信号拉高后再拉高,即指向信号依赖起始信号。
Read transaction dependencies
在读transaction中:
ARVALID不能依赖ARREADY(废话,同A3.2.1)
ARREADY可以在ARVALID拉高前/后拉高(可以无依赖关系)
RVALID必须等到ARVALID和ARREADY握手后拉高
RVALID不能依赖RREADY(废话,同A3.2.1)
RREADY可以在RVALID拉高前/后拉高(可以无依赖关系)
图 A3-5 Read transaction handshake dependencies
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拉高前/后拉高(可以无依赖关系)
图 A3-6 Write transaction handshakedependencies
slave需要等到 WVALID和 WREADY都拉高后才能拉高 BAVALID;
slave需要等到 WLAST拉高后才能拉高 BVALID,因为写响应 BRESP必须在写transaction的最后一个transfer后发出;
依赖关系必须要满足,以防止死锁。比如: WVALID不能依赖 AWREADY; AWREADY不能等 WVALID
AXI4 write response dependency
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地址边界。
这是为了避免一个burst访问两个slave。它还限制了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)
burst使用规则:
对于WRAP,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长度大于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。
如果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个周期,所以又称为beat。
INCR
递增(Incrementing)。在INCR burst中,每个transfer的地址是前一个transfer地址的递增。递增的值取决于transfer的大小。例如,size为4byte的burst中每个transfer的地址是前一个transfer的地址+4。
AXI协议中, 地址是byte对齐的。
INCR适合访问常规的顺序存储器。
WRAP
WRAP与INCR类似,只是如果达到了地址上限,则地址就会绕回到低地址。
WRAP burst的限制:
起始地址必须与每个transfer的大小对齐
burst长度是2/4/8/16
WRAP的行为:
burst中最低地址与要传输数据的总大小对齐,即Transfer_Size × Burst_Length。这个最低地址被定义为绕回边界(wrap boundary)。
最高地址 = wrap boundary + (Transfer_Size × Burst_Length),当前地址小于最高地址时,地址递增方式与INCR相同。当递增后的地址到达最高地址时,地址绕回到边界地址。
burst中的起始地址可以用高于绕回边界的地址。
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,或者WRAP还没绕回时,确定除了第1个transfer外其余transfer的地址:
Address_N = Aligned_Address + (N-1) × Number_Bytes(N>1)
对于WRAP,Wrap_Boundary确定绕回边界:
Wrap_Boundary = ( INT( Start_Address / (Number_Bytes × Burst_Length) ) ) × (Number_Bytes × Burst_Length)
对于WRAP,如果 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 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
数据总线位宽是32bit
burst类型是INCR
图 A3-8 Narrow transfer example with 8-bit transfers
在图A3-9:
burst有3个transfer(即Burst_Length == 3)
起始地址是4
每个transfer是32bit
数据总线位宽是64bit
图 A3-9 Narrow transfer example with 32-bit transfers
Byte invariance
内存中的大小端模式
大端:MSB应该存在低地址
小端:LSB应该存在低地址
MSB:most significant byte;LSB:less significant byte
为了使大小端模式在memory中共存,AXI协议使用字节顺序恒定(byte-invariant endianness)的大小端传输方案。对于memory中包含多个字节的数据结构(单字节时自然不存在大小端问题):
不管数据是大端还是小端存储的,每个数据结构存储空间的分配方式是相同的
大小端的区别即:memory的第一个byte是元素的MSB还是LSB
在传输过程不考虑大小端,按照byte原先的存储顺序,原样传输并存放到对端
该模式的意义在传输双方均不对数据结构的大小端进行解析转换,而严格按照字节的存储顺序进行传输并转存,防止大小端模式同时存在时导致数据被覆盖。
只有一个传输宽度的组件必须将其byte车道连接到数据总线合适的byte车道。支持多个传输宽度的组件可能需要一个更复杂的接口来转换一个不是byte-invariant的接口。
大多数小段组件可以直接连接到byte-invariant接口,只支持大端传输的组件需要一个转换函数实现byte-invariant。
AXI中的数据,是不区分大小端的,直接将memory中地位数据放在数据总线的低位。byte-invariant实际数据的大小端,需要slave自己调整。
图A3-10和图A3-11展示了一个32bit数据:0x0A0B0C0D,在寄存器和memory存储的例子。
图A3-10的数据结构是大端、byte-invariant的:
数据的MSB(0x0A)存储在寄存器的MSB位置
数据的LSB(0x0D)存储在寄存器的LSB位置
数据的MSB(0x0A)存储在memory的最低地址
图A3-10 Example big-endian byte invariant data structure
图A3-11的数据结构是小端、byte-invariant的:
数据的MSB(0x0A)存储在寄存器的MSB位置
数据的LSB(0x0D)存储在寄存器的LSB位置
数据的LSB(0x0D)存储在memory的最低地址
图A3-11 Example little-endian byte invariant data structure
图A3-12展示了一个需要byte-invariant访问的数据结构的例子。在这个例子中,Header使用小端排序,Payload使用大端排序。
图A3-12 Example mixed-endian data structure
在这个例子中,Data items是2个字节,小端排序的,即最低地址是LSB。使用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.4 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;文章来源:https://www.toymoban.com/news/detail-672727.html
只有当时钟域中的最后一个外设拉高CSYSACK时才会拉高总的CSYSACK;文章来源地址https://www.toymoban.com/news/detail-672727.html
A10: Default Signaling and Interoperability
A10.1 Interoperability principles
A10.2 Major interface categories
A10.2.1 Read/write interface
A10.2.2 Read-only interface
A10.2.3 Write-only interface
A10.2.4 Memory slaves and peripheral slaves
A10.3 Default signal values
A10.3.1 Master addresses
A10.3.2 Slave addresses
A10.3.3 Memory slaves
A10.3.4 Write transactions
A10.3.5 Read transactions
A10.3.6 Response signaling
A10.3.7 Non-secure and Secure accesses
到了这里,关于AXI3/4协议的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!