1. APB协议
APB 协议是为了实现与外围低速、低功耗设备进行数据传输。在 APB 总线中,唯一的 master 是 APB Bridge,其他的外围设备均为 slave。
1.1 signal
1.2 transfer
2. AHB-Lite协议
2.1 signal
2.2 transfer
2.2.1 basic transfer
2.2.2 transfer type
2.2.3 transfer size
2.2.4 burst operation
1)master不能启动一个跨越1KB地址边界的burst传输。
2)burst中所有的传输必须对齐到size对应的地址。
3)在不定长的INCR传输中,master可以插入BUSY,然后决定是继续传输还是结束传输。插入NONSEQ或者IDLE都可以终止本次INCR传输。
4)INCR4、INCR8、INCR16,WRAP4、WRAP8、WRAP16只能用SEQ作为结束。
5)SINGLE传输后面不能紧跟BUSY,后面必须是IDLE或者NONSEQ。
6)当slave发出error响应,master可以提前结束burst传输,也可以继续完成。如果master选择结束,那它必须在error响应的两个周期内将HTRANS改为IDLE。
2.2.5 wait transfer
(1)IDLE transfer
在等待期间,允许master更改IDLE传输的地址,也允许master将传输类型从IDLE更改为NONSEQ。一旦HTRANS传输类型变为NONSEQ,master就必须保持HTRANS和HADDR不变,直到HREADY拉高。
(2)定长的burst传输
进入等待状态后,允许master将传输类型从BUSY改为SEQ。一旦做出这种改变,master必须保持HTRANS不变,直到HREADY拉高。这里地址是不能改变的,因为定长操作前后地址都是有关系的。
同时注意到,因为BUSY只能在连续的burst之间插入,所以这不适用于SINGLE。
(3)不定长burst
进入等待状态后,允许master从BUSY切换到任何其他传输类型。如果换到了SEQ传输,则当前的burst继续;如果换到了IDLE或NONSEQ传输,则当前的burst终止。切换后master必须保持HTRANS不变,直到HREADY拉高。
(4)After an ERROR response
在等待过程中,如果slave发出了ERROR响应,那么当HREADY为LOW时,允许master更改地址。
2.3 Slave Response Signaling
OKAY响应可以在一个周期内完成,ERROR响应需要两个周期。第一个周期拉高HRESP表示出错,拉低HREADY延长transfer,第二个周期继续保持HRESP为高,拉高HREADY结束transfer。
2.4 reset
During reset all masters must ensure the address and control signals are at valid levels and that HTRANS[1:0] indicates IDLE.
During reset all slaves must ensure that HREADYOUT is HIGH.
3. AXI协议
1)通道相互独立,都有valid和ready信号,双向握手机制;
2)读写数据通道有last信号,指明传输的末尾;
3.1 signal
3.2 Register Slice
处理器和高性能内存之间的直接、快速连接;使用简单的寄存器片来隔离通往性能不太关键的外设的长路径。
3.2 单主从信号接口要求
3.2.1 reset
复位只要求ARVALID、AWVALID、WVALID、RVALID和BVALID这五个信号拉低,其他的不管。
3.2.2 Handshake process
源端信息有效时拉高VALID信号,目的端拉高READY信号表示其可以接受该信息,transfer只发生在VALID和READY信号都是HIGH的时候。
AXI协议对VALID和READY信号拉高顺序不做要求,但是:
(1)如果VALID先拉高,那么VALID必须保持为高,直到握手完成;
(2)如果READY先拉高,那么在VALID拉高前,READY可以再次拉低;
(3)目的端可以等待源端valid拉高再ready,但不允许源端去等待目的端先拉高ready后再拉高valid。
3.2.3 Relationships between the channels
3.2.4 Transaction structure
(1)由slave计算burst传输中后续传输的地址。
(2)burst传输不可越过4KB地址边界。
(3)FIXED(每次传输的地址是相同的)和INCR都支持1-16个transfer,wrap操作只支持2、4、8、16个transfer。FIXED固定的是地址,用于重复访问相同的地址,例如清空或者载入FIFO。
(4)burst一旦开始就必须按照设定的要求完成,中途不得终止。
(5)Narrow transfers
INCR和WRAP在burst中的每一拍会轮流用地址总线,FIXED固定使用某些位。
(6)Unaligned transfers
起始地址是0x07并没有对齐32位地址边界,master填充3byte的数据,并通过strobe信号指示数据无效,实现了地址对齐,同时又不影响数据。
(7)Read and write response structure
OKAY 普通访问成功的指示。表明普通访问成功,也可用于表明独占访问失败。
EXOKAY 表明独占访问成功。
SLVERR 和AHB的相同。
DECERR 通常由互连组件生成,以指示地址解码错误。
写事务只需一次响应,而读事务的每一笔transfer都需要响应;
协议中会要求互连结构有一个默认的slave,当地址解码错误时,由默认slave发出DECERR信号,并且由它完成本次burst传输。
3.3 Transaction ordering
3.3.1 read ordering
只有同一对主从之间、同一种操作(读\写)、相同的ARID,才有顺序要求。master发出地址的顺序,就是它将来接收数据的顺序,也就是slave发出数据的顺序。
从master接口来说,如果transaction的ARID相同,那么读数据必须按照master在该transaction中发出的读地址的顺序到达;而如果ARID不同,那么读数据的顺序没有要求,不同ARID事务的读数据可以交错顺序到达。slave必须按照接收地址的顺序返回具有相同ARID的事务的读数据。对于不同ARID的读事务,slave可以以任何顺序返回读数据,而不管事务到达的顺序如何。
3.3.2 AXI3 write data interleaving
(1)master或其他AXI组件无法确定一个slave是否支持写数据交织,也无法确定交织深度;
(2)大多数slave不支持写数据交织;
(3)AXI4取消了write data interleaving。
3.3.3 Read and write interaction
AXI在读写事务之间没有顺序要求,如果需要指定顺序,那么master必须确保前一个transaction已经完成。
前一个transaction完成的标志:
1)读事务收到了最后的读数据;
2)写事务收到了写响应。
通常来说,对于外设的写操作,master必须等待前一个transaction的完成,而对于内存的读写,master可能会先检查操作地址是否有重叠,没有的话也可以不等前一个完成。
3.4 Atomic Accesses
原子化访问的名字,其实很形象的描述了它的意义,原子通常不可分割,反映在原子化访问上,也是体现其不可分割的特性,对于什么不可分割呢?
我们将一段32bit的地址,当成一个原子,那么就代表在执行原子化访问的这部分时间内,这部分地址对应的数据不能改变(比如跟着burst操作想单独改变它的高16位或者低16位,就相当于把原子拆开了),必须将它视为一个整体。
多大的地址,能在AXI协议中作为最小的原子单位呢?协议中用“single-copy atomicity size”来表示这个概念。由于外设的复杂程度不一样,因此针对于不同的外设“single-copy atomicity size”的大小不一致也是显而易见的,对于复杂一点的设备,通常情况下为64 bits,而对于简单一些的设备,32 bits即可。下图可以很好的说明64bits与32bits的划分原则。
3.4.1 Exclusive accesses
exclusive的应用场景主要是,当处理器需要对某个内存地址进行写操作时,假如写一个字节,而内存的数据位宽大于一个字节,比如32bit,这时处理器需要将内存地址对应的32bit数据先读出来,然后将要写入的一个字节数据进行更新后,再将更新后的32bit数据重新写入内存中去,该过程通常称为读改写操作(RMW)。如下图所示,CPU要将内存地址1的数据改为0x02,就需要先将地址0~3的数据都读回来,然后将更新后的数据0x03020200重新写入内存。
但在实际芯片中,在CPU将数据读回、更新数据再写回内存期间,可能会有其它的master也会访问内存,假如DSP将地址0的数据改成了0xff,那么内存中地址0应该保存的正确数据就应该是0xff,但是CPU由于操作延时,又将地址0的数据改成了0x00,这个时候DSP以为地址0里的数据是0xff,但实际上却是0x00,就无法保证数据的一致性。
于是就引入了exclusive操作。还是上边的例子,CPU要改写内存中数据,会先发一笔exclusive的读操作,此时内存作为slave。slave中会有一个monitor记录这笔exclusive读操作的地址和ID,如果slave支持exclusive操作,就返回EXOKAY,否则返回OK。
此处假如内存支持exclusive操作,则CPU收到EXOKAY后会继续发一笔exclusive写操作,将更新后的数据写回内存中。在此过程中,如果该地址没有被别的master写过,则此次exclusive操作成功,slave返回EXOKAY(一次exclusive操作包含exclusive读和exclusive写)。
如果在exclusive读和写之间,内存的这个地址被其它master写过,如DSP将内存地址0写成了0xff,则slave返回OK,且此笔exclusive写操作不会被执行。CPU收到OK的响应后就知道此次exclusive失败了,即写操作没写进去。此时内存中数据内容如下图:
此时CPU可以选择再次发起一次exclusive操作,继续对内存进行改写。如果exclusive操作成功,则内存中的数据应该为:
概括起来,独占访问的过程是:
- master对一个地址位置执行独占读操作,启动一次独占访问;
- 稍后,master尝试通过对同一地址执行独占写入来完成独占访问。
master的独占写访问信号如下:
如果在读取和写入访问之间没有其他master写入该位置,则成功。
如果另一个master在读写访问之间写入该位置,则失败。在这种情况下,地址位置不会更新。
注意: master可能无法完成独占访问的写入部分。 独占访问的monitor硬件必须仅监控每个transaction ID 的一个地址。 因此,如果master未完成独占访问的写入部分,则后续的独占读操作会更改正在监视的独占访问地址。
3.4.2 master 视角的独占访问
master通过独占读操作启动独占访问,如果slave支持独占访问则返回EXOKAY,否则返回OKAY。(如果slave不支持,AXI协议建议master不应该继续独占写操作。)
在独占读操作后,master尝试向相同地址执行独占写操作,如果在独占读和独占写操作之间,该地址没有进行过写操作,那么独占写入成功,地址数据更新,本次独占访问成功并结束,slave返回 EXOKAY 响应。
如果进行过写操作,那么独占写入失败,地址数据不会更新,本次独占访问失败并结束,slave返回 OKAY 响应。
如果master始终没有完成独占写操作,那么monitor会一直处于监控状态,知道下一个独占读操作到来(即新的独占访问)。
3.4.3 slave视角的独占访问
不支持独占访问的Slave可以忽略 ARLOCK[1:0] 和 AWLOCK[1:0] 信号,它会为正常和独占访问提供 OKAY 响应。
支持独占访问的Slave必须具有monitor硬件。建议这样的Slave为每个可以访问它的独占Master ID 设置一个监控单元。
独占访问monitor会记录独占读操作的地址和 ARID 值。然后它会监视该位置,直到对该位置进行写入,或者直到另一个具有相同 ARID 值的独占读操作将monitor重置为不同的地址。
当使用给定的 AWID 值执行独占写入时,monitor会检查该地址是否正在被监视。如果是,则这意味着该位置还没有发生写入,独占写入继续进行,完成独占访问。Slave向Master返回 EXOKAY 响应。
如果在独占写入时该地址已不再被监视,这意味着以下情况之一:
- 该地址在独占读操作后发生过写入操作;
- monitor已重置到另一个地址(有别的独占读操作)。
在这两种情况下,独占写入都不能更新地址位置,Slave必须返回 OKAY 响应。
3.4.4 独占访问的约束条件
对于独占访问还有如下的要求:
- ARID与AWID需要相同;
- 读和写的地址,burst size、burst length、其他控制信号需要保持相同;
- 独占访问的burst lentgh transfer不能超过16;
- 独占访问的地址需要与transaction的总字节数对齐;
- 在独占访问burst中传输的字节数必须是2 的幂,即1、2、4、8、16、32、64 或128 个字节,且最大字节数为 128;
- AxCACHE信号需要确保正处于监测状态的slave可以接收到transaction(换言之AxCACHE不能是Cacheable的)。
3.5 Locked accesses
当transaction的 ARLOCK[1:0] 或 AWLOCK[1:0] 信号表明它是锁定传输时,互连必须确保只有该Master被允许访问Slave区域,直到来自同一Master的解锁传输完成。互连内的仲裁器用于强制执行此限制。
当Master启动读或写事务的锁定序列时,它必须确保没有其他未完成的事务等待完成。
任何将 ARLOCK[1:0] 或 AWLOCK[1:0] 设置为指示锁定序列的事务都会强制互连锁定之后的事务。因此,锁定序列必须始终以未将 ARLOCK[1:0] 或 AWLOCK[1:0] 设置为指示锁定访问的最终事务完成。此最终事务包含在锁定序列中并有效地移除锁定。(锁定的事务会强制将它之后的事务也锁定,所以如果想要移除锁定,需要把最后一个事务的 ARLOCK[1:0] 或 AWLOCK[1:0] 设置为未锁定。)
当完成一个锁定序列时,Master必须确保在发出最终解锁事务之前所有先前的锁定事务都已完成。然后,它必须确保在开始任何进一步的事务之前,最终的解锁事务已经完全完成。
Master必须确保锁定序列中的所有事务都具有相同的 ARID 或 AWID 值。
以下限制是推荐的,但不是强制性的:
- 将所有锁定的事务序列保持在同一个 4KB 地址区域内;
- 将锁定的事务序列限制为两个事务。
AXI4不再支持锁定传输,原因很简单,一旦某个master锁定了一个slave,就会导致其他所有master到该slave的路径被阻塞,这对总线性能的影响非常大。