一、通道定义
在AXI架构里面一共有五个相互独立的通道,可以把他们分成两组:读地址通道AR、读数据通道R、写地址通道AW、 写数据通道W、写响应通道B。
说明:
1、写为什么有三个通道,读只有两个通道?
- VALID/READY握手机制只允许一个方向的数据流,所以对于读事务,数据(data和resp)从slave流向master,而对于写事务,数据从master流向slave,所以就需要单独的响应通道
5个独立通道中的每一个都由一组信息信号以及提供双向握手机制VALID和READY信号组成,
同一通道的握手满足发送方valid与接收方ready相互不影响的原则(有三种握手的方式),不同通道间的约束要满足:写回复必须在一次写事务的最后一个写数据之后;读数据必须在接收到读地址信号之后 ;通道间握手必须满足一定的依赖关系。
valid:表示发送方通过置位VALID信号,来告诉接收方,自己已经将数据等信息准备好
ready:表示接收方通过置位READY信号,来告诉发送方,自己准备好了接收数据
读和写的数据宽度可以是8, 16, 32, 64, 128, 256, 512, 1024 bits
二、信号定义
1、全局信号
信号 | 来源 | 描述 |
---|---|---|
ACLK | 时钟源 | 全局时钟信号。在全局时钟的上升沿采样同步信号。 |
ARESETn | 复位源 | 全局复位信号。这个信号是低有效。 |
所有信号都在全局时钟的上升沿采样。
2、写地址通道信号
信号 | 来源 | 描述 |
---|---|---|
AWID | Master | 写事务标识符。 |
AWADDR | Master | 在一次写事务中第一次传输的地址。 |
AWLEN | Master | 长度,在一次写事务中传输(burst)数据的确切数量。此信息决定与该地址相关联的数据传输的数量。这在AXI3和AXI4中不同。 |
AWSIZE | Master | 大小,在一次写事务中每一次数据传输(beat)的字节数量。 |
AWBURST | Master | 突发类型,表明在一次写事务中每一次传输的地址如何变化。 |
AWLOCK | Master | 提供有关写事务的原子特征的信息。这在AXI3和AXI4中不同。 |
AWCACHE | Master | 表明如何要求写事务在系统中进行。 |
AWPROT | Master | 写事务的保护属性:优先,安全等级,访问类型。 |
AWQOS | Master | 写事务的服务质量标识符。在AXI3中没有实现。 |
AWREGION | Master | 写事务的区域指示符。在AXI3中没有实现。 |
AWUSER | Master | 对写地址通道的用户定义扩展名。在AXI3中没有实现。 |
AWVALID | Master | 表明写地址通道信号有效。 |
AWREADY | Slave | 表明写地址通道上的传输可以被接受。 |
3、写数据通道信号
信号 | 来源 | 描述 |
---|---|---|
WID | Master | 写数据传输的ID标识。只有AXI3中有此信号。 |
WDATA | Master | 写数据。 |
WSTRB | Master | 写选通,表明哪一个字节通道携带有效数据。 |
WLAST | Master | 表明是否是一个事务(说burst更好)中的最后一个数据传输。 |
WUSER | Master | 写数据通道中用户定义的扩展名。在AIX3中没有此信号。 |
WVALID | Master | 表明写数据通道信号是有效的。 |
WREADY | Slave | 表明在写数据通道上的传输可以被接收。 |
4、写响应通道
信号 | 来源 | 描述 |
---|---|---|
BID | Slave | 写响应的标识符号。 |
BRESP | Slave | 写响应,表明写事务的状态。(4种状态) |
BUSER | Slave | 写响应通道的用户定义扩展名。在AXI3中没有此信号。 |
BVALID | Slave | 表明写响应通道信号是有效的。 |
BREADY | Master | 表明在写响应通道的传输可以被接收。 |
5、读地址通道信号
信号 | 来源 | 描述 |
---|---|---|
ARID | Master | 读事务的标识符号。 |
ARADDR | Master | 在一次读事务中第一次传输的地址。 |
ARLEN | Master | 长度,在一次读事务中数据传输(burst)的精确数量。在AXI3和AXI4中不同。 |
ARSIZE | Master | 大小,在一次读事务中每一个数据传输(beat)的字节数量。 |
ARBURST | Master | 突发类型,表明在一次读事务中地址如何变化。 |
ARLOCK | Master | 提供读事务的原子特征信息。这在AXI3和AIX4中不同。 |
ARCHCHE | Master | 表明读事务是如何在系统中进行的。 |
ARPROT | Master | 读事务的保护属性:优先,安全等级和访问类型。 |
ARQOS | Master | 读事务的服务质量标识符。 |
ARREGION | Master | 读事务的区域指示符。在AXI3中没有此信号。 |
ARUSER | Master | 读地址通道的用户定义的扩展名。 |
ARVALID | Master | 表明读地址通道信号是有效的。 |
ARREADY | Slave | 表明读地址通道上的传输可以被接收。 |
6、读数据通道信号
信号 | 来源 | 描述 |
---|---|---|
RID | Slave | 读数据和响应的识别符号。 |
RDATA | Slave | 读数据。 |
RDATA | Slave | 读数据。 |
RRESP | Slave | 读响应。表明读传输的状态。 |
RLAST | Slave | 表明在读事务(说burst更好)中是否是最后一个数据传输。 |
RUSER | Slave | 读数据通道用户定义的扩展名。在AXI3中没有此信号。 |
RVALID | Slave | 表明读数据通道信号是有效的。 |
RREADY | Master | 表明读数据通道上的传输可以被接收。 |
三、AXI传输
AXI协议以burst为基本传输单位!!!
1、专业术语(很重要!!!)
Transaction:两个 AXI 组件为了传输一组数据而进行的所有交互称为 AXI Transaction,AXI 传输事务,包括对应各个通道上的交互,AXI的一次操作(指令)或一次事务(包括写事务或读事务)称为一次Transaction,事务又分为读事务和写事务,一次事务包含一次或者多次burst。(但由于AXI协议以burst为基本传输单位,所以经常把两者混合,因为很多的数据分为多次burst,在传最大burst数量(256拍)后,只能分片给一个新地址,此时应称为一个新事务了,与xLAST信号对应,在每一个burst的最后一拍拉高last信号)
Burst:一次传输中的负载数据称为Burst,一次突发由一笔或多笔数据传输(beat or transfer )构成。
Beat:一笔传输称为Beat或transfer,这里可以理解为一拍。
时序图
1、突发式读时序图
说明:
- 读数据必须在接收到读地址信号之后,从机在ARVALID和ARREADY信号都有效才能给出RVALID信号,开始数据传输
2、重叠突发式读时序图
在第一次突发式读完成后处理第二次突发式读数据。主机一开始传送了两个地址给设备,设备在完全处理完第一个地址的数据之后才开始处理第二个地址的数据。(outstanding)
3、突发式写时序图
说明:
- 写传输中三个通道各自的vaild和ready信号没有先后关系,vaild可以先于或晚于或同时与ready信号拉高,但写响应必须在一次写burst(事务)的最后一个写数据之后。
2、传输方式
在AXI协议规范中,AxBURST表示ARBURST或AWBURST,:
AXI协议由三种突发传输方式,由地址通道信号AxBURST决定
FIXED 固定突发:
- 突发中每个传输的地址是相同的。
- 突发中所有拍的有效字节通道是相同的。然而,在这些字节通道中,WSTRB生效的实际的字节在突发中的每一拍可能不同。这种突发类型用于重复访问相同的位置,如加载或清FIFO。
INCR递增突发:
- 在一个递增突发中,一次指令只会给一个初始地址(只传递了第一个字节数据的地址,也就是起始地址,后续要读或者要写的地址根据控制信息改变),突发中每次传输的地址是之前传输地址的递增,每次递增的值是前一个地址加上实际有效数据字节数;长数据分片后地址是依靠AxLEN(需转换为字节数)和实际burst传输的数据的字节数,AXI中地址是按照字节数来增加的。
- AXI3支持1-16传输的突发长度,AXI4对INCR突发类型扩展了突发长度,支持1-256传输。
- 突发必须不能跨越4KB地址边界。
AxADDR:表示byte地址,地址+1,表示偏移8个bit
AxLEN:表示一次burst传输数据的时钟拍数减一
突发长度(burst length):
AXI3突发长度定义为:
Burst_Length = AxLEN[3:0] + 1
定义AXI4的突发长度为:
Burst_Length = AxLEN[7:0] + 1
突发大小(burst size):突发大小=2^AxSIZE
AxSIZE:表示在一次burst中,一拍数据传输(beat)的最大字节数
- AxSIZE[2:0], 对读或写传输
递增传输中又分为对齐传输、非对齐传输,窄带传输
beat_byte_num:表示一次beat传输数据的实际字节数,不是数据总线位宽
- 对齐传输与非对齐传输:指用起始地址start_addr/beat_byte_num余数为0,则表示地址是对齐传输的,也可以比如一次传输数据字节数为4,则起始地址最后两bit位应为0,如0x02就是不对齐的
- 对于非对齐传输,使用WSTRB信号:
1、地址给非对齐地址,数据给对齐的数据,在空余的地址补齐dummy的数据
2、用strb信号设置相应有效数据通道,地址就设置对齐的地址
实际应用中master采用第二种方式最好,可以简化slave的工作,避免slave既要判断地址offset又要判断strb
- 窄带传输:表示实际传输的数据位宽比数据总线位宽小的传输,需要用到AWSIZE和WSTRB信号
WSTRB:一个多bit信号,它的位宽与数据线宽有关,对应bit位为1表示这个字节数据通道有效,0表示这个字节数据通道无效
以下是对齐传输,非对齐传输,窄带传输的例子,阴影部分表示未传输的字节
对齐传输:
非对齐传输:
窄带传输:这也是一个非对齐传输,数据总线位宽是64,但实际数据位宽是32
wrap:回环传输
- 起始地址start address需按照beat的字节大小进行对齐。
- 突发长度只能从2,4,8,16中取值,突发必须不能跨越4KB地址边界。
- 地址递增达到地址上界时回环到地址下界。
地址下界:
地址上界:
举例:
AxADDR = 0x38, AxLEN = 3, AxSIZE = 2, AxBURST = 3(表示回环突发模式)。
Start_Address = 0x38
burst_Length = AxLEN + 1 = 4
beat_Number_Bytes = 2^2=4
1、地址对齐:
Start_Address/beat_Number_Bytes=0x38/4=14,整除,所以起始对齐
计算地址边界时注意:数字信号里没有小数,所以只取整;
2、地址下界
= (0x38/(4x4)) x (4x4)
= 0x30
地址上界
= 0x30 + (4 x 4)
= 0x40
总共有四次突发,所以四个地址依次是
Address_0 = 0x38
Address_1 = Address_0 + beat_Number_Bytes = 0x38 + 0x4 = 0x3C
Address_2 = Address_1 + beat_Number_Bytes = 0x3C + 0x4 = 0x40
因为Address_2 == 0x40, 达到上边界,因此Address_2 = 0x30
Address_3 = Address_2 + beat_Number_Bytes = 0x30 + 0x4 = 0x34
因此地址为 0x38, 0x3C, 0x30, 0x34。
回环传输例子:
- 起始地址为0x04,在64位数据总线上实际传输32bit数据,计算边界时仍只计算实际传输的字节数,但在回环时需注意AWSIZE和WSTRB信号的使用,阴影部分表示未传输的字节
四、AXI响应
AXI协议对读和写事务提供响应信号(RRESP[1:0]、BRESP[1:0]):
- 对读事务,来自slave的响应信息从读数据通道发出。
- 对写事务,写响应信息从写响应通道发出。
OKAY:表示常规访问成功
EXOKEY:表示原子访问成功
SLVERRR:表示slave接收到了访问,但没有正确处理数据,返回一个错误信息
DECERR:表示解码错误,没有找到对应地址的slave
- 写事务响应:写传输过程中只会在一个Burst完成的时候进行写回应。
- 读事务响应:读传输没有读响应信息,读响应信息指明读事务的完成。读取每个数据过后均会进行读回应。‘’
- 写应答与写数据流相反,读应答与读数据流相同。
- 对于写事务,一个burst操作完成wlast拉高时返回一个响应信号,不会对每一个transfer返回一个响应信号。对于读事务,常规操作也是一个burst操作完成rlast拉高时返回一个响应信号,这个RRESP信号表明的是这次burst所有数据信息是否正确;另一个不常用的用法就是从机可以针对一次突发中每一次transfer返回不同的响应信号,但这要与主机协商好每次transfer数据后面都有一个RRESP信号,这个RRESP信号只表明这一拍数据的正确与否。(响应信号指REESP信号),例如,在一连串的16个读传输中,slave可能会对其中15个传输各返回一个OKAY响应,对其中一个传输返回一个SLVERR响应。