深入AXI4总线-[二]架构
知乎用户
ljgibbs
授权转发
本系列我想深入探寻 AXI4 总线。不过事情总是这样,不能我说想深入就深入。当前我对 AXI总线的理解尚谈不上深入。但我希望通过一系列文章,让读者能和我一起深入探寻 AXI4。
声明1:部分时序图以及部分语句来自 ARM AMBA 官方手册
(有的时候感觉手册写得太好了,忍不住就直接翻译了。。)
声明2:AXI 总线是 ARM 公司的知识产权
备注:
-
下载手册可以到ARM官网搜AMBA ,需要注册 ARM 账号。官方手册developer.arm.com
-
百度文库应该有中文翻译版本。
五个独立通道
AXI4 总线的一大特征是它有 5 个独立的传输通道,这些通道都只支持单向传输。
作为类比,SPI 总线有 2 条单向传输通道:MISO, MOSI。SPI 输入和输出的数据,大路朝天,各走一条。
而作为对比, IIC 协议则只有 SDA 一条双向通道,输入输出数据只能在这一条通道上分时双向传输。
单向传输的通道意味着两端的终端节点是有身份差距的,好比水只能从上游流到下流。在 AXI 总线传输中,通道两端分为 Master 主机与 Slave 从机,主机总是发起读写请求的一方。常见的主机有CPU、DMA,而存储介质控制器(比如 DDR 控制器)则是典型的从机。主机可能通过从机读取或者写入存储介质。而显然从机不可能主动向 CPU 写入数据。
通道的读/写定义都是根据主机来定义的,那么五个通道都有谁呢:
- 读地址 (AR) read address
- 读数据 (R) read data
- 写地址 (AW) write address
- 写数据 (W) write data
- 写回复 (R) write response
5个是不是很奇怪,你看读/写怎么也得是个2的倍数不是,那为什么不是6条,为什么没有读回复?其实,读回复借用了读数据通道。至于为什么有独立的写回复,而无读回复通道,我们之后再讲。
读写传输操作中的通道们
首先是写传输操作(Write transcation):
如下图所示,主机首先在写地址通道(AWC)上告知从机本次传输操作(transcaction,对应后文中的"传输操作")的特性,包括地址和控制信息。
然后,在写数据通道(WC)向从机写入数据,一次传输操作中可能包括多个数据传输(data transfer)。
最后,从机在接收到写数据后,通过写回复通道(RC)将本次传输操作的响应告知主机。主机以收到从机的响应信号,作为本次传输操作结束的标志。手册中强调,写回复是针对整个传输操作(transcaction)的,而不是针对每个写入数据(data transfer)。
所有传输操作中,RC 与 WC 的关系都如上图所示,写回复必然是在收到传输操作中最后一个写数据之后触发。
但是,AWC 与 WC 的关系并不局限于一种情况。一般来说,写数据都发生在写地址操作之后,但也不是绝对的,在有些情况下,可以先写数据,或者在同一周期写入数据与地址,都是允许的。这也表现了 AXI 通道之间的独立性。(例外:RC 和 WDC 间的独立性较弱)
接下来看读操作(Read transcation):
读操作只涉及两个通道,首先主机在读地址通道(ARC)上写入本次传输操作(Transcation)待读取数据的地址以及控制信息。
从机在接收到地址后,将该地址上的数据通过读数据通道(RC)传输给主机。
值得注意的是, AR 虽然名字为读地址通道,但实际上仍由主机写入地址,只不过是写入要读取数据的地址。读地址通道,这个名字确实有点歧义,主机读操作地址通道表达得更贴切一些。
读操作时通道间(ARC&RC)完全独立,当然从机发出读数据一定发生在主机写入读地址后,从机不能未卜先知,是吧。
无论是读写操作,AXI 总线支持,或者说基于突发传输(Burst Transaction)。简单来说,主机可以写入起始地址以及突发传输的长度等信息,从机将起始地址开始,依次接收主机传输的写数据,或者读取连续地址上的数据,作为读数据传输给主机。所以上面两张图中,一次传输操作中(Transcation) 中包括了一次地址与控制信息(Address & Control)、多个数据(data transfer)。
突发传输又称猝发传输,详情可见后续更新的文章
通道定义
五个通道有一些共同的定义:
每个通道都使用 VALID/READY 握手机制,详情可见第一章
在读写数据(WC&RC)两条数据通道中,传输突发传输(Burst Transaction)中的最后一个数据,必须要给出 LAST 信号,来标识这是此次突发传输中的最后一个数据(data transfer)。
在共同的定义之外,各个通道有自己的定义。
读&写地址通道(ARC&AWC):
写入本次传输操作所需的地址和控制信息,读写操作都拥有各自的地址通道。
读数据通道(RC):
读数据通道上包括从机发送给主机的读数据,以及从机对于本次读传输操作的回复,具体的读操作状态回复情况会在之后讨论。总线数据位宽可以是 8,16,64,128,256,512 或者是 1024 比特。
写数据通道(WC):
写数据通道用于将主机的写数据传输至从机,位宽和RC的数据位宽相同。WC 有一点 RC 所不具有的特性是拥有 STROBE 信号,用于标识写数据中有效的传输字节。即有些无效的数据,出于减少主机工作量的目的,或者在读写宽度不对称时,被放到写数据通道上和有效数据一起发送。而 STROBE 的信号的作用就是标识出这些无用的数据,告知从机不需要接收无用数据。(Master:我太懒,以至于把所有信号都送过来了)
写数据通道设计有缓存,可超前于从机响应本次传输操作,发起下一次写传输操作。
写回复通道(RC):
用于从机将写操作响应回复给主机。所有写传输操作都需要以写回复通道上接收写响应作为完成信号。再次强调,写回复是针对一次传输操作(transcation)的,而不是针对每一次写数据(data transfer)。
那么问题来了,为什么只有写回复通道而没有读回复通道呢?
这个问题可以从数据流向看出来,主机在读取数据时,数据在读通道上传输,流向为从机到主机。而读回复由从机向主机报告读操作的情况,信号的数据流向也是从机到主机,所以读回复可以合并在读数据通道中,搭个顺风车。
但写回复通道的数据流向就和写数据相反。写数据是从主机到从机,而写回复为从机报告写操作的完成情况,流向为从机到主机,无法合并到写数据通道中,另一方面,写回复又是不可或缺的,所以就有了一条独立的写回复通道。
通道上的信号们
全局信号
AXI 总线中有两个全局信号:ACLK,全局的时钟信号,所有的传输操作都发生在 ACLK 的上升沿。ARESETn,全局复位信号,低电平有效。在复位问题上,AXI 规定了一些细节,会在后续的文章中讨论。
注意:AResetn 一般是一个同步复位信号,A 代表 AXI,而不是 Async。
写地址通道
写地址通道的信号可以分为 3 部分:经常用到的基础信号、突发传输的控制信号、内存访问相关以及其他的在基础阶段不是很常用的信号。
基础信号即 AWADDR:传输操作的起始地址,AWVALID 以及 AWREADY:所有通道都使用的握手信号。
突发传输指的是传输一次起始地址后,进行多次地址上连续的读写操作。突发传输有关的操作包括:AWLEN:突发传输的长度,即在一次突发传输中数据传输的个数。AWSIZE:每次突发传输中的数据传输的位宽。AWBURST:突发传输的类型。
其他信号包括和内存原子操作有关的 AWLOCK,AWCACHE,AWPROT 以及用于用户自定义的 AWUSER 信号,都将在以后的文章涉及。(等我自己先用到再说)
读地址通道
读地址通道和写地址通道的信号十分类似,就不再从 specification 中截图以及介绍了。
写数据通道
值得注意的是 AXI4 不再支持 WID 信号,这和 AXI4 的乱序机制有关,AXI4 规定所有数据通道的数据必须顺序发送。
WDATA 与常见的握手信号不再赘述,WDATA 的可使用位宽可以见上文。WSTRB 信号用于标记传输数据中有效的字节,每个 WSTRB 位对应一个字节的位宽,比如数据位宽为 64 位,那么 WSTRB 信号的位宽就是 1 个字节,共 8 位。
WLAST 标识一次突发传输中最后一次数据传输,如果没有正确的 WLAST 的信号,就会造成写入地址的混乱,导致从机无法正确接收写数据,从而造成从机不再拉高 READY 信号的现象。
写回复通道
与写数据通道不同,写回复通道支持 BID,即支持乱序的写回复,关于乱序的问题,我们稍后再谈。BRESP 回复上一次的写状态。
读数据通道
读数据通道与写数据通道类似,区别有两点:一,支持 RID 信号。二,因为读回复信息在读数据通道上传递,所以集成了 RRESP 信号,用于返回读状态,值得注意的是读回复信号和读数据一样,发送方(source)为从机(slave)。
通道间的关系
首先,再次声明一般情况下 AXI 的五个通道之间是独立的。但凡事都免不了例外,是吧。AXI 的通道间需要保证以下三种联系(relationship):
- 写回复必须在其所属传输的最后一个写数据完成后(write response must follow the last write transfer in the transaction)
- 读数据必须在接收到读地址信号后产生
- 通道间的握手需要满足通道间的握手依赖性(handshake dependencies)
除了这三种联系外,通道之间保持独立关系。前两种联系已在上文中讨论,接下来我们讨论第三种情况:通道间的握手信号依赖
握手依赖关系
协议规定握手依赖的目的是为了防止死锁(deadlock),手册定义于章节 A3.3 ,主要的原则还是第一章中说过的两条:
- 发送方 VALID 一定不能依赖接收方 READY 信号
- 接收方 READY 信号可以检测到 VALID 置起后再置起有效,换句话说,可以依赖 VALID 信号
下述内容就是对上述原则在不同情况下的具体表述,为选读内容,无需实现协议的读者可以略过。
我们首先来看读传输的情况,读地址通道中主机为发送方、从机为接收方;读数据通道中主机为接收方、从机为发送方。其中,
图中的单头箭头表示:其指向的信号可以在箭头起始信号置起之前或之后置起(无依赖)
图中的双头箭头表示:其指向的信号必须在箭头起始信号置起之后置起(指向信号依赖起始信号)
具体的依赖可以表述为:
- 主机的 ARVALID 信号不能等待从机的 ARREADY 信号置起后才置起,反之可以
- 从机的 ARREADY 信号可以先于主机的 ARVALID 信号置起(如单头箭头所示)
- 从机的 RVALID 信号必须等待 ARVALID 和 ARREADY 信号均置起后置起(如两个双头箭头所示)
- 从机的 RVALID 信号不能等待主机的 RREADY 信号置起后才置起,反之可以
- 主机的 RREADY 信号可以在 RVALID 置起前置起,换句话说:无依赖关系(如单头箭头所示)
接下来是写传输的情况,在写数据以及写地址通道中,主机作为发送方;写回复通道中从机作为发送方
从图中看到,只有 2 组代表着依赖关系的双头箭头指向了 BVALID,这代表从机首先等待 WVALID 以及 WREADY 置高,此时写传输启动。再等待 WLAST 置起,此时传输完成。只有在传输完成后才能根据情况生成写回复信号中的 BRESP 信号。此时置高 BVALID 信号表示从机的写回复已经就绪。
此外另外三组单头箭头表示 AWREADY 、WREADY 信号可以根据 AWVALID、WVALID 信号生成,但不存在依赖。同样的关系还存在于 BREADY 与 BVALID 信号之间。本文此处不再展开具体依赖,可以参阅官方手册的 A3-43 页获得详细的表述。
(手册中图 A3-6 即上图中的注释部分似乎将 BVALID 误写为 WVALID,因为主机置起 WVALID 似乎与本次传输的 WLAST 无关,而且文本中也提到 BVALID 依赖于 WLAST)
在 AXI4 中,写传输相较此前增加了从机置起 BVALID 信号所需的依赖。
从上图中增加的依赖可以看出,从机 BVALID 信号有效需要等待 AWVALID 以及 AWREADY 信号置起,完成地址传输作为前提条件之一。这在某种程度上是自然的,肯定需要等待从机获取本次操作的地址以及数据之后才能回复写入情况。一般而言地址会在数据之前传输完毕,不过协议并没有要求这点,所以从机需要等待地址写入后再产生写回复,作为本次传输完成的标志。
拓扑连接
从上述信号我们可以发现,原生的 AXI 总线为单对单的拓扑结构,主机与从机间对应信号直接相连,比如下图中的 VALID / READY 信号。
在一个系统中,显然不可能只有单个主机和从机。AXI 总线需要借助总线互联IP( Interconnect )来实现多对的的拓扑,结构如下图。Interconnect 拥有多个 Master/Slave 接口,并在内部基于轮询或者优先级策略对多路数据进行路由转发,我们将在后续的文章中详细讨论。
实现细节
本文的最后讨论一个协议的实现细节。如果读者仅仅想了解 AXI 协议的使用,那么每篇文章的实现细节章节可以跳过。这个章节面向有实现 AXI 协议需求的读者。
AXI 协议并没有对写数据以及写地址通道中的握手信号先后顺序做出规定。因此,实现中数据可以先于地址完成握手。这适用于一些情况,手册中举了个例子,比如写地址通道为了满足时序,触发器的级数与写数据通道不同,这样一来两通道握手的先后顺序可能不同。
这反映了 AXI 通道间的独立性,利用该特性可调整路径中的触发器,满足时序约束。
结语
本文中我们了解了 AXI 总线的架构,它的五大通道以及各自的信号,最简单的读写操作流程以及AXI 总线的拓扑连接。在接下来的文章中,我们会更加深入到:各通道的握手机制以及传输细则,突发传输以及乱序传输的规则与实例中。
读者可能需要区分三个中文中的传输概念,本文许多地方重复地标记出了对应的英文,也是为了帮助大家区分。
- 传输 v. 指数据在主机和从机之间的流动的动作
- 传输操作 n. Transcation
- 数据传输 n. (data) transfer
其中地址与控制信号写入、读写恢复以及 last 信号相关概念均为 transcation 相关。一个 transcation 包括一至多个 data transfer。