AXI4 协议我的初识
具体看文档AMBA®AXI and ACE Protocol Specification AXI3, AXI4, AXI5, ACE and ACE5
文章目录
1 几个讲的很好的网站
- https://blog.csdn.net/lum250/article/details/120912567?spm=1001.2014.3001.5506
- https://zhuanlan.zhihu.com/p/641597910
- https://zhuanlan.zhihu.com/p/145936888
- https://mp.weixin.qq.com/s?__biz=MzUyNTc4NTk0OA==&mid=2247484738&idx=1&sn=7edadd74332455e596320f842c36c0a6&chksm=fa198b71cd6e0267c16c05ffe247f144471fba6c12053ee59cd82f3e12ff0930d92f7b27946f&scene=21#wechat_redirect
以下内容借鉴于这几个网站进行总结
2 axi的总类
AXI4 是 ARM 公司提出的是一种高性能、高带宽、低延迟的片内总线,主要描述了主设备和从设备之间的数据传输方式
axi分为stream,lite,full三种,
AXI4(AXI4-Full): 满足高性能内存映射(memory-mapped)需求。支持256长度突发(burst)传输。
AXI4-Lite: 对于简单的、低吞吐量的内存映射通信(例如,与控制寄存器和状态寄存器之间的通信)。不可突发传输。
AXI4-Stream: 用于高速流数据。不需要地址,允许无限的数据突发大小。
3 axi_full和axi_lite
3.1 axi_full和axi_lite的共同之处
AXI4-Lite 是 AXI4_full 协议的子集,旨在与组件中较小较简单的控制寄存器型接口实现通信。
AXI4-Lite和AXI4_full都有5个通道,每个通道都是单向的(主到从或者从到主)
写三个通道:写地址通道awaddr;写数据通道wdata;写响应通道bresp
读两个通道:读地址通道rwaddr;读数据通道rdata(读响应在这个通道里面,省去了单独的读响应通道)
每个通道都有valid和ready握手信号,写代码时,valid一定先拉高于ready
axi_full和axi_lite都有如下的信号
3.2 依赖关系
具体的依赖关系可以看手册AMBA®AXI and ACE Protocol Specification AXI3, AXI4, AXI5, ACE and ACE5的第三章,或者有篇csdn的文章也还行https://blog.csdn.net/weixin_42507186/article/details/118964583
这里我主要讨论axi4的依赖关系,
图中的单头箭头表示:其指向的信号可以在箭头起始信号置起之前或之后置起(无依赖)
图中的双头箭头表示:其指向的信号必须在箭头起始信号置起之后置起(指向信号依赖起始信号)
可以看到五个通道之间是独立的,但是有几点需要注意:
- 写通道和读通道没有任何关系,
- 写数据可以先于写地址(允许先发数据后发地址,但是一般都先发地址再发数据),AXI 协议并没有对写数据以及写地址通道中的握手信号先后顺序做出规定
- 从机 BVALID 信号有效需要等待 AWVALID、 AWREADY 、WVALID 、 WREADY、WLAST 信号置高
- 发送方 VALID 一定不能依赖接收方 READY 信号(VALID 的拉高与READY无关),接收方 READY 信号可以检测到 VALID 置起后再置起有效,换句话说,可以依赖 VALID 信号
- 读数据必须在接收到读地址信号后产生
3.3 axi_full和axi_lite的不同
3.3.1 突发不同
axi_full 可支持最大256突发(一次transaction可以有256个transfer(一次握手既是一次transfer))
axi_lite 只支持长度为1的突发(一次transaction仅能有1个transfer)
3.3.2 数据位宽不同
在使用AXI Interconnect互联结构下,axi_full的读写数据位宽可以为 32 / 64 / 128 / 256 / 512 / 1024 bits
对 AXI4-Lite,总线的数据位宽 32 bits。
对于传输的数据位宽不足总线位宽的,比如使用 32 bit 的总线传输 8 bit 的信息,则使用写通道的 WSTRB[3:0] 来表示有效的写字节,WSTRB[n] 对应 WDATA[8n+7 : 8n],当 WSTRB[3:0] = 4’b0001 时,表示 WDATA[7:0] 有效,属于窄传输的一种。
3.3.3 接口差异
axi_lite没有突发,所以它就只有一些基础的信号,如下图:
axi_full有突发,所以他有些和突发相关的控制信号,如下图
axi_lite有的信号,axi_full都有,所以我们直接来讲axi_full的信号
对读写通道里面某些信号的解释:
4 axi_full的非对齐访问
4.1讲的很好的文章
https://zhuanlan.zhihu.com/p/642565929
https://www.zhihu.com/column/c_1251094110297509888
4.2 非对齐访问
AXI(高级可扩展接口)是一种高性能、高带宽、低延迟的接口,广泛应用于SoC(系统芯片)内部的通信中。在AXI协议中,访问可以是对齐的(aligned)或非对齐的(unaligned)。非对齐访问是指访问的数据地址不是数据宽度的整数倍。
- 对齐访问(Aligned Access)
对齐访问指的是数据传输的起始地址是其数据宽度(如32位、64位等)的整数倍。例如,如果一次访问是32位宽(4字节),那么对齐的地址应该是4的倍数(如0x04、0x08、0x0C等)。
对齐访问可以简化硬件设计,因为数据自然地对齐于其宽度边界,不需要特殊处理即可直接在内部总线上传输。 - 非对齐访问(Unaligned Access)
非对齐访问则指起始地址不是数据宽度的整数倍。例如,对于32位(4字节)的访问,地址0x02、0x05等就是非对齐的,因为它们不是4的倍数。
非对齐访问处理起来比对齐访问复杂,因为它可能需要特殊的硬件逻辑来处理这些访问。例如,一个非对齐的读操作可能需要读取两个对齐的块,然后在硬件中组合和/或调整数据以生成正确的输出。
虽然非对齐访问提供了更大的灵活性,允许任意地址访问数据,但它可能会降低性能,并增加硬件实现的复杂性。
AXI协议支持非对齐访问,但实现这一特性需要额外的硬件支持和注意性能影响。在设计时,应根据实际需求权衡是否需要支持非对齐访问。在许多应用场景中,为了优化性能和减少实现复杂性,通常会尽量避免非对齐访问。
5 axi4的outstanding
5.1 讲的很好的文章
https://zhuanlan.zhihu.com/p/643863702
https://zhuanlan.zhihu.com/p/365573848
5.2 什么是outstanding
outstanding分为写outstanding和读outstanding,一般来说没有outstanding的正常情况下,我们写和读都是发起一次transaction,等到此次transaction完成响应握手之后(这个完成响应对于写操作来说是写响应通道的Bvalid和Bresp,对于读操作来说是读数据通道中的Rlast Rvalid Rresp),再发起下一次事务transaction,具体来说
一次写transaction:先发送一个写地址,等写地址握手之后,发送写数据,等所有的写transfer握手完后,等待写响应通道的Bvalid信号的握手,然后再发送下一次的写操作。xlinx提供的代码模板如下:
一次读transaction:先发送一个读地址,等读地址握手之后,从机返回读数据,等所有的读transfer握手完之后,即Rlast握手之后,在发送下一次读操作,xlinx提供的代码模板如下:
而outstanding能力就是,master的当前写或者读的transaction不等完成响应握手,就发起下一次的写或者读transaction的读写操作命令。其实就可以看成是允许连续发出去的地址数量(不需要等完成响应,甚至不需要握手)
更多的Outstanding意味着更多的硬件资源开销,比如就需要很多的Buffer去存储已经发送的CMD。但通过上面的例子我们可以看出,当Outstanding再增加,其性能也已经饱和了,不会再增加。因此选择一个合适的Outstanding数量,基于此进行设计很重要。
5.3 Outstanding是不是越大越好
更多的Outstanding意味着更多的硬件资源开销,比如就需要很多的Buffer去存储已经发送的CMD。当Outstanding增加到一定程度,其性能也会饱和了,不会再增加。因此选择一个合适的Outstanding数量,基于此进行设计很重要。
5.4 outstanding的计算
https://zhuanlan.zhihu.com/p/365573848
可以看到outstanding合理能力和数据的突发长度,数据的位宽,想要达到的理想带宽,以及发起一次操作命令到数据全部处理完成的访问延迟(round trip time)有关
6 AXI4 Ordering Model,out of order,交织
Outstanding是out of order和Interleave的基础,没有Outstanding,后面二者是无从谈起的。
6.1 讲的很好的文章
https://zhuanlan.zhihu.com/p/642565929
6.2 什么是out of order
首先在axi4中主机是不允许乱序和交织的,由于去除了WID,写地址通道如果outstanding连续发起多个写地址,那么给到写数据通道的数据必须是和写地址通道的写地址是顺序相同,并且每次transaction的数据必须全部给完,才能给下一次transaction的数据
从机是支持乱序和交织的(实现乱序和交织的前提是为每个transaction分配不同的ID,统一transaction的所有transfer的ID是相同的),对于写通道来说,如果主机发起outstanding的操作,从机通过写响应信道发出的写响应可以是乱序的(写回复的顺序 与写事务发出的顺序不一致),主机通过AWID和BID的关系来确定收到的是哪笔transaction的写响应,比如
对于读通道来说,如果主机发起outstanding的操作,从机返回的数据是可以乱序和交织的,从机的每一次transfer,都会返回相应的RID,主机通过ARID和RID来确定收到的是哪笔transaction的数据,注意同一ID内部的transfer必须是保序的。
6.3 什么是交织Interleave
在AXI中的Interleave,按照我的理解就是更加细粒度的乱序。
7 AXI的deadlock 死锁
7.1 写法的问题
- 写通道的里面写响应主机提供的bready信号如果偷懒一直拉高,xlinx里面的axi4不是严格的时序,其从机提供的bvalid信号会在写数据还没写完的时候拉高,这时候写响应信道提前握手,会造成死锁
- 写数据信道没有严格遵循axi4时序,比如last信号没有给对;
- 写地址信道outstanding传输的话,写数据信道发生了乱序或者交织
- VALID 信号不能根据 READY 信号来判断是否数据已准备好,valid的拉高条件不能依赖于ready
7.2 多事务outstanding传输的问题
- 单主机的outstanding传输,如果主机给outstanding传输的多个transaction相同的ID,由于从机具备乱序和交织的能力,导致返回的数据和响应顺序和主机不同,导致死锁
- 多主机的outstanding传输:
(1)统一主机发起的outstanding transaction的ID相同,从机乱序返回,导致死锁(和单主机的相同),所以尽量给每笔transaction不同的ID
(2)统一主机发起的outstanding transaction的ID不同,interconnect的设置不当形成蝴蝶结(后一笔AW通道的命令到达slave端口时,其前一笔W通道的信息还在interconnect中排队),所以interconnect要保证其slave端口当前transaction的所有写数据处理完成之后,才能下发下一次写操作命令,相当于将AW和W通道绑定传输,不要相互阻塞。(axi死锁.html)
8 AXI是如何提高性能的
https://zhuanlan.zhihu.com/p/643863702
AXI提高传输速度主要有三板斧,以下排名分先后顺序:
Outstanding
Out-of-orde(ooo)
Interleave
9 AXI的4k边界
9.1 什么是4k边界
在AXI4协议中,4K边界通常指的是地址边界,它是指地址空间被划分为4K(即4096)字节大小的块。4K边界定义了一种对齐方式,即内存访问操作应该在一个4K的边界上开始和结束。这意味着,如果一个内存地址是4K边界的对齐地址,那么它应该是4K(即2^12字节)的整数倍。
例如,如果一个内存起始地址是0x0000_0000,那么它是对齐的;但如果起始地址是0x0000_0FFF,则它不是4K边界对齐的。
在axi协议中,每个slave设备通常是4KB对齐的。操作axi时序的时候,要避免一次突发传输跨越4k边界,即避免一笔burst交易访问两个slave(每个slave都是4k对齐),如果一次burst传输访问大于4k,则可能会造成地址从slave1增加了slave2上,slave2又不响应,导致传输无法完成。
所以要保证每次突发的起始地址和结束地址要在一个4k空间内。
9.2 如何避免4k边界
-
突发长度固定的时候:
(1)首先保证访问的基地址是4k对齐的,也就是说能整除4096
(2)每次突发的地址偏移量可被 4096 整除,比如 AXI4 写数据位宽为 128bit,突发长度为 128,则地址偏移量为 128 * (128/8) =2048 -
突发长度不固定,可以给每一次突发分配 4k 地址区间。