AXI笔记

https://zhuanlan.zhihu.com/p/186270857(知乎 AXI协议详解(二)YCHUGH)

在这里插入图片描述
在这里插入图片描述

一、握手机制

VALID/READY 握手机制

AXI 总线共有 5 个独立的通道,分别为写地址、写数据、写回应、读地址、读数据通道。5 条通道相互独立,有一些细小的差别,但共同使用一套握手机制:VALID/READY 机制,来实现信息的传递。作为一种双向流控机制,VALID/READY 机制可以使发送接收双方都有能力控制传输速率。

在握手机制中,通信双方分别扮演发送方(Source)和接收方(Destination),两者的操作(技能)并不相同。

发送方置高 VALID 信号表示发送方已经将数据,地址或者控制信息已经就绪,并保持于消息总线上。

接收方置高 READY 信号表示接收方已经做好接收的准备。

在这里插入图片描述
当双方的 VALID/READY 信号同时为高,在时钟 ACLK 上升沿,完成一次数据传输。所有数据传输完毕后,双方同时置低自己的信号。

所谓的双向流控机制,指的是发送方通过置起 VALID 信号控制发送的时机与速度,接收方也可以通过 READY 信号的置起与否控制接收速度。

发送方拥有传输的主动权,但接收方在不具备接收能力时,也能够置低信号停止传输,反压发送方。

VALID/READY 的三种情况
1)VALID 信号先到达
在这里插入图片描述
发送方 VALID 信号早早就到了,这时还不到 T2 时刻,并带来了新鲜的数据(数据通道),地址或者控制信息(地址通道),总之是信息(Information)。

但过了 T2 也没见到接收方的 READY 信号。原来是接收方还忙着,可能上一次的数据还没存完,还堵在数据通路上,忙过了 T2 才来。

好吧,那也行,T3 时刻传输完成。

在这种情况下,接收方通过 READY 信号控制了传输速度,反压了发送速度。

协议规定在这种情况下,VALID 信号一旦置起就不能置低,直到完成握手(handshake occurs),至少传输一周期数据。

在设计接收方逻辑时,检测到 VALID 信号置起,如果系统正忙,完全可以让发送方等待,发送方在完成传输之前都不会置低 VALID 信号,不需要考虑发送方撤销传输的可能。

协议另外规定:发送方不能通过等待接收方 READY 信号来确定置起 VALID 信号的时机:
A source is not permitted to wait until READY is asserted before asserting VALID.

READY 信号可能先到达,如下图的情况。但是设计发送方逻辑时,不能将 READY 信号作为置高 VALID 逻辑的条件,比如将 READY 信号通过组合逻辑生成 VALID 信号。

换句话说,发送方准备发送,置起 VALID 信号是完全主动与独立的过程。接收方 READY 信号按照协议可以依赖发送方 VALID 信号,但如果此时发送方也依赖接收方信号,就会造成死锁的情况,所以协议在这里强调了 VALID 信号的主动性。

module axi_src
...
//assign VALID = SRC_CONDITION && READY;//NOT permitted and may cause deadlock
assign VALID = SRC_CONDITION;//permitted 
...
endmodule

module axi_dst
...
assign READY = CONDITION && VALID;//permitted
...
endmodule

2)READY 信号先到达
在这里插入图片描述
READY 信号很自由,可以等待 VALID 信号到来再做响应,但也完全可以在 VALID 信号到来前就置高,表示接收端已经做好准备了。

而且,READY 信号与 VALID 不同,接收方可以置起 READY 之后发现:其实我好像还挺忙,然后置低 READY 信号。只要此时 VALID 信号没有置起,这种操作是完全可以。

3)同时到达
在这里插入图片描述
实现
READY 信号原则上由接收方自身的接收状况以及 VALID 信号控制。(或者仅由接收方自身的接收状况决定)协议中没有规定 READY 信号的默认状态,即未进行传输时的电平状态(default value)。

协议建议 AW/AR READY 信号(这里 AW/AR 指的是读写地址通道的 READY 信号)的默认电平为高电平。若默认电平为低,则每次传输至少需要 2 个周期才能完成,第一个周期置高 VALID 信号,第二个周期从机才会置高 READY 信号。相当于每次传输增加 1 个周期时间开销,这在某些情况下会对传输效率有较大的影响。

二、架构

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

为什么没有读回复?其实,读回复借用了读数据通道。至于为什么有独立的写回复,而无读回复通道,我们之后再讲。

读写传输操作中的通道们

首先是写传输操作(Write transcation):

如下图所示,主机首先在写地址通道(AWC)上告知从机本次传输操作(transcaction,对应后文中的"传输操作")的特性,包括地址和控制信息。

然后,在写数据通道(WDC)向从机写入数据,一次传输操作中可能包括多个数据传输(data transfer)。

最后,从机在接收到写数据后,通过写回复通道(RC)将本次传输操作的响应告知主机。主机以收到从机的响应信号,作为本次传输操作结束的标志。手册中强调,写回复是针对整个传输操作(transcaction)的,而不是针对每个写入数据(data transfer)

在这里插入图片描述
所有传输操作中,RC 与 WDC 的关系都如上图所示,写回复必然是在收到传输操作中最后一个写数据之后触发。

但是,AWC 与 WC 的关系并不局限于一种情况。一般来说,写数据都发生在写地址操作之后,但也不是绝对的,在有些情况下,可以先写数据,或者在同一周期写入数据与地址,都是允许的。这也表现了 AXI 通道之间的独立性。(例外:RC 和 WDC 间的独立性较弱)

接下来看读操作(Read transcation):

读操作只涉及两个通道,首先主机在读地址通道(ARC)上写入本次传输操作(Transcation)待读取数据的地址以及控制信息。

从机在接收到地址后,将该地址上的数据通过读数据通道(RC)传输给主机。

在这里插入图片描述
值得注意的是, AR 虽然名字为读地址通道,但实际上仍由主机写入地址,只不过是写入要读取数据的地址。读地址通道,这个名字确实有点歧义,主机读操作地址通道表达得更贴切一些。

读操作时通道间(ARC&RC)完全独立,当然从机发出读数据一定发生在主机写入读地址后,从机不能未卜先知,是吧。

无论是读写操作,AXI 总线支持,或者说基于突发传输(Burst Transaction)。简单来说,主机可以写入起始地址以及突发传输的长度等信息,从机将起始地址开始,依次接收主机传输的写数据,或者读取连续地址上的数据,作为读数据传输给主机。所以上面两张图中,一次传输操作中(Transcation) 中包括了一次地址与控制信息(Address & Control)、多个数据(data transfer)。

在读写数据(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,全局复位信号,低电平有效。注意: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 协议并没有对写数据以及写地址通道中的握手信号先后顺序做出规定。因此,实现中数据可以先于地址完成握手。这适用于一些情况,手册中举了个例子,比如写地址通道为了满足时序,触发器的级数与写数据通道不同,这样一来两通道握手的先后顺序可能不同。

这反映了 AXI 通道间的独立性,利用该特性可调整路径中的触发器,满足时序约束。

结语
本文中我们了解了 AXI 总线的架构,它的五大通道以及各自的信号,最简单的读写操作流程以及AXI 总线的拓扑连接。在接下来的文章中,我们会更加深入到:各通道的握手机制以及传输细则,突发传输以及乱序传输的规则与实例中。

读者可能需要区分三个中文中的传输概念,本文许多地方重复地标记出了对应的英文,也是为了帮助大家区分。

传输 v. 指数据在主机和从机之间的流动的动作
传输操作 n. Transcation
数据传输 n. (data) transfer
其中地址与控制信号写入、读写恢复以及 last 信号相关概念均为 transcation 相关。一个 transcation 包括一至多个 data transfer。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值