目录
1. AXI 写通道信号
1.1. 写地址通道信号
1.2. 写数据通道信号
1.3. 写response通道信号
1.5. 握手规则
1.4. AXI 写通道之间关系
2. AXI 读通道信号
2.1. 读地址通道信号
2.2. 读数据通道信号
2.3. AXI 读通道之间关系
3. AXI传输
3.1. AXI突发读传输
3.2. Overlapping 突发读传输
3.3. AXI突发写传输
3.4. 非对齐传输
4. AXI outstanding
5. AXI 乱序传输(Out of order)
6. 原子操作(Atomic Access)
6.1. Locked access
6.2. Exclusive access
1. AXI 写通道信号
AXI总共有五个数据传输channel,其中两个channel用来读,三个channel用来写。每个channel都有流控信号(valid-ready),发送数据端就给valid,接收数据端给ready,读数据和写数据通道都包括一个 LAST 信号,用来指明一个事务传输的最后一个数据。AXI 写通道有两个,传输写地址的通道、传输写数据的通道、传输response的通道。
1.1. 写地址通道信号
所有的信号开头都是AW,代表Write的Address channel,传输地址信息和数据都是在 VALID 和 READY 同时为高时有效。
AWSIZE表示数据传输位宽,AWLEN用来burst写传输的长度,AWBURST表示burst传输类型,AWLOCK信号在最后一章原子操作详细介绍。
AWCACHE指示Cache是bufferable、cacheable、write-through或者write-back类型的。bit[0] Bufferable (B) bit、bit[1] Cacheable (C) bit、bit[2] Read Allocate (RA) bit、bit[3] Write Allocate (WA) bit。
bufferable:只针对写操作,可以提升传输效率。即使slave没准备好接收数据,总线也可以返回OKAY给master,把master传给slave的数据存入buffer,待slave准备好了再将buffer的数据传给slave。Write through:CPU写Cache时,若命中,则把数据同时写入Cache和内存中;Write Back:CPU写Cache时,若命中, 先把数据写到Cache中,再通过flush方式写入内存。
AWPROT是一个info类型的信号,用来指示当前传输的属性是一个数据传输还是指令传输、是普通模式还是特权模式。
1.2. 写数据通道信号
WSTRB信号用于写地址非对齐传输,例如传输地址非32位对齐,可以利用WSTRB信号来对不想修改的byte进行mask操作。
WID表示burst的编号,总共4位有16个取值,用于AXI的乱序传输(Out Of Order),在AXI4协议中发现写乱序提升性能效果不大,因此去除了WID,即去除了写乱序的操作,但保留了读乱序操作。
WLAST信号标志着数据传输的结束,在传输一笔burst数据的最后一个数据时,把WLAST拉高,表示该次burst数据传输完毕,譬如一个burst 8,在传输第8个数据的时候,把TLAST拉高代表该笔burst传输结束。
1.3. 写response通道信号
写response通道信号,BID是和AWID匹配的ID。BRESP用来回slave的传输情况,回OKAY就是传输正确,回EXOKAY是Lock transfer传输正确,回SLVERR代表slave error传输出错,回DECERR代表decode 出错,发生在传输地址在slave中未定义的情况,即地址译码出错时就会回DECERR。官方文档对BRESP描述如下图所示:
1.5. 握手规则
AXI 共有 5 个通道,5个通道使用相同的 VALID/READY 握手机制传输数据及控制信息。master 产生 VLAID 信号来指明何时数据或控制信息有效。而 slave 产生 READY 信号来指明已经准备好接受数据或控制信息。传输发生在 VALID 和 READY 信号同时为高的时候。VALID 和 READY 信号的出现有三种关系。
(1) VALID 先变高 READY 后变高。时序图如下:
(2) READY 先变高 VALID 后变高。时序图如下:
(3) VALID 和 READY 信号同时变高。时序图如下:
1.4. AXI 写通道之间关系
AXI写具有三个通道,三个通道之间虽然独立,但不是完全没关系的,它们的具体关系如下图所示:
(1)主机必须不能够等待设备先给出 AWREADY 或 WREADY 信号信号后再给出信号 AWVALID 或 WVLAID。
(2)设备可以等待信号 AWVALID 或 WVALID 信号有效或者两个都有效之后再给出 AWREADY 信号。
(3)设备可以等待 AWVALID 或 WVALID 信号有效或者两个信号都有效之后再给出 WREADY 信号。
(4)设备必须等待 WVALID 和 WREADY 信号同时有效了,才能给出 BVALID 信号有效。
2. AXI 读通道信号
AXI总共有五个数据传输channel,其中两个channel用来读,三个channel用来写。每个channel都有流控信号(valid-ready),发送数据端就给valid,接收数据端给ready。AXI 读通道有两个,一个用来传输读地址与控制信号,另一个用来传输读的数据和response信号。
2.1. 读地址通道信号
AXI读地址通道信息和AXI写地址通道信息类似。
2.2. 读数据通道信号
AXI 读之所以没有像AXI写一样有response channel就是因为读的response信号已经通过Read data channel 传输回read master了。
2.3. AXI 读通道之间关系
AXI读具有两个通道,两个通道之间也不是完全没关系的,它们的具体关系如下图所示:
(1)设备可以在 ARVALID 出现的时候在给出 ARREADY 信号,也可以先给出 ARREADY 信号,再等待 ARVALID 信号。
(2)但是设备必须等待 ARVALID 和 ARREADY 信号都有效才能给出 RVALID 信号,开始数据传输。
3. AXI传输
AXI 协议定义了三种burst读写类型:FIXED式的突发读写、INCR式的突发读写、WRAP式的突发读写。在AXI接口中,用 ARBURST 或 AWBURST 来选择突发式读写的类型,如下图所示:
(1)FIXED突发读写是指地址是固定的,每一次传输的地址都不变。这样的突发式读写会重复的对一个相同的位置进行存取。例如 FIFO。
(2)INCR突发读写是指每一次读写的地址都比上一次的地址增加一个固定的值。
(3)WRAP突发读写跟INCR突发读写类似。WRAP突发读写的地址是包数据的低地址当到达一个包边界时再进行一个回环,和AHB总线的WRAP传输一致。WRAP传输有两个限制:① 起始地址必须以传输的 size 对齐;②突发式读写的长度必须是 2、4、8 或者 16。
3.1. AXI突发读传输
AXI数据通道就是通过valid&ready的handshake来控制数据传输。上图为一次读突发传输,当地址出现在地址总线后,传输的数据出现在读数据通道上,一次突发传输只发送一个地址,后面数据的地址在发送地址的基础上进行自增。设备保持 VALID 为低直到读数据有效。为了表明一次突发式读写的完成,设备用 RLAST 信号来表示最后一个被传输的数据。
3.2. Overlapping 突发读传输
slave在第一次突发读传输完成后处理第二次突发读传输。也就意味着,主机一开始传送了两个地址给设备。设备在完全处理完第一个地址的数据之后,才开始处理第二个地址的数据
3.3. AXI突发写传输
AXI突发写传输,主机发送地址和控制信息到写地址通道中,然后主机发送每一个写数据到写数据通道中。当主机发送最后一个数据时,WLAST 信号就变为 高。当设备接收完所有数据之后他将一个写响应发送回主机来表明写事务完成。
对于burst传输,AXI不能跨越4KB的边界,和AHB不能跨越1KB边界是一样的,都是为了防止出现一次burst传输跨越多个slave的情况,协议中关于此定义如上图所示。
3.4. 非对齐传输
非对齐传输也是AXI总线和AHB总线不同的地方,在AHB总线里面,数据的传输必须是对齐的,譬如将AHB中的HSIZE信号设置为32bit,即4Byte,那么数据传输的地址必须是对齐的,从0,4,8开始传输。
AXI的传输可以非对齐,假设数据传输位宽为32bit,即4Byte,AXI传输的起始地址可以是1,也可以是3,但是后面的传输必须地址对齐。即AXI传输只允许一个burst的第一笔传输首地址不对齐,如下图所示:
要使用AXI的非对齐传输,需要配合wstrb来将不需要传输的数据地址位mask掉。
4. AXI outstanding
outstanding是指主机在没有收到response时可以发起多个读写transaction的能力。
简单讲,如果没有outstanding,则总线Master的行为如下(AHB就不支持outstanding):
1)读操作:读地址命令 -> 等待读数据返回 -> 读地址命令 -> 等待读数据返回 -> ..
2)写操作:写地址命令->写数据->等待写响应返回->写地址命令->写数据->等待写响应返回..
如果支持outstanding,那么总线就可以在没等到response时,连续发多个读或写的命令,然后再逐个等待命令的返回:
1)读操作:读地址命令 -> 读地址命令 -> 读地址命令 -> 等待读数据返回 ->等待读数据返回 ->等待读数据返回..
2)写操作:写地址命令->写地址命令->写地址命令->写数据->写数据->等待写响应返回->写数据->等待写响应返回->等待写响应返回..
5. AXI 乱序传输(Out of order)
乱序传输实在指令outstanding的基础上进行的,在读乱序的实现中,master可以发多个相同ARID的读cmd,相同ARID的读数据必须按顺序回来,对于不同ARID的读cmd数据可以穿插传回master,如下图所示:
上图为三个outstanding的cmd配合Out of order的读数据传输,对于同一个ARID的数据,必须按顺序回来,譬如上图data_10、data_11、data_12、data_13按顺序传回来,对于不同ARID的数据可以随意穿插,譬如上图data_11和data_12之间穿插了其他ARID的数据。
即AXI协议规定:相同 ID tag 的事务必须有序完成,而不同 ID tag 可以乱序完成。
对于写乱序,AXI4 中已经取消了WID信号的使用,不再支持写乱序。
6. 原子操作(Atomic Access)
当对同一个地址进行读写操作时,在BUS上会看到在读写通道里面分别有对XX地址的读写操作,但读到和写入的数据是不同的。BUS上有很多master,都有可能对同一个地址进行类似操作,比如 master1 和 master2 都要对地址A数据进行读后写修改,原本计划的顺序是master1读后写,接着master2读后写。结果因为传输问题,master1读了地址A数据没写回,此时master2读了地址A数据后再进行修改写入,然后master1再写,这时候显然出现了读数据错误,master2应该读取的是master1修改的数据,但在这里却直接读取了。
ID扩展:一笔数据从master传输到slave再由slave返回的全过程可以如下描述:数据从master在发出的时候会给总线一个ID,当这笔数据传送到总线上后,总线会对ID进行扩展,扩展内容用来标志cmd由哪个master发出,接着再把扩展后的ID回给slave。送到slave之后,slave回response信号给总线时,总线也可以根据扩展的ID,将slave返回的response路由到正确的master上。
而针对多master访问总线问题,AXI 引入了一个原子操作,希望对地址A进行读后写的操作都是由同一个master操作的,中间不会由别的master介入,这样在多线程的时候就不会出现访存冲突的问题。AXI总线针对原子操作定义了两种Access。
6.1. Locked access
Locked access:在一对master和slave之间,当它们所有的transaction都得到response之后,master可以发若干lock_r或者lock_w来锁住总线,总线被lock住之后就不会去响应别的master的读写请求。如果要解锁,就必须等所有lock操作都完成之后,再发一次普通的读或写操作就能unlock总线,过程如下图所示:
这里涉及到的所有several locked_r/w以及one normal_r/w,其对应的AR_ID和AW_ID必须完全一致。locked access虽然解决的访存冲突问题,但带来了数据传输效率低下的问题:比如master1访问的地址是slave1的,此时master2要访问slave3,显然他们俩的访问是不冲突的,但Locked access会使得master1在访问slave1时锁死总线,不允许master2控制总线,导致访存效率低下。对于Lock访问是否成功,AXI使用ARLOCK和AWLOCK来表示访问是否成功,如下图所示:
6.2. Exclusive access
Exclusive access:为了解决lock锁死总线效率低下的问题,exclusive access把这个避免访存冲突的任务交给slave做,此时所有master访问总线都是灵活的。
对于Exclusive access访问方式,若访问成功,slave返回master一个EXOKAY。若访问失败,slave回OKAY,正如下图slave信号RESP协议所写:“OKAY can also indicate an exclsive access failure”。
如果slave支持exclusive 访问,数据收完回复exokay,传输成功;如果不支持,就回okay,传输失败。exlcusive访问进行读后写时,读写的各种控制信号必须完全一致,譬如ARID和AWID,size信号,burst length等必须完全一致。slave回exokay标志exclusive传输成功必须同时满足一下两点要求:①在ex_read和ex_write期间,对ex_read所指示的地址没有别的write操作;②ARID在这段时间,没有发起新的ex_read操作。
对于第二点要求,发起ex_read时,总线会监测该ex_read操作的地址是否被别的AWID操作修改。这就会带来一个问题:如果连续发起两次ex_read操作,总线只会监测第二次ex_read的地址,而不会去监测第一次ex_read的地址,所以连续两次ex_read操作后,第一次的ex_write时的slave就不确定地址是否中途被修改过。因此总线规定,在ex_read和ex_write期间,ARID没有发起新的ex_read操作,slave才可以回exokay,否则回okay视为exclusive传输失败。
如果总线需要支持exclusive操作,那么有多少个master,总线就需要有几套监控逻辑对应ARID地址数据是否被修改。
exclusive access 对起始地址还有一个对齐要求:一次burst传输的起始地址需要跟整个burst的byte数对齐,例如总线位宽为32bit,即4byte;burst 16传输,即一次burst传输64byte数据,那么地址就需要和64byte地址对齐。且整个burst访问必须是2^N byte,最大128Byte。访问还需要能到达实际的终端存储地址,所以不能是cacheable的传输。