在前面的一些博客主要是对数字电路的一些基本知识的总结以及FPGA的八股学习,通信接口与协议其实也是在工程中常用的部分,因此从这篇博客开始对AXI接口协议进行学习,这篇博客是系列的第一部分,主要对AXI进行介绍,并总结AXI4-Stream协议的特点,最终用几个具体的例子完成AXI4-Stream协议的Verilog代码设计
系列博客的参考资料如下:
- 《Introduction to AMBA AXI》
- 《AMBA 4 AXI4-Stream Protocol Specification》V1.0
- AMBA Specifications
- AMBA4 AXI and ACE Protocol Specification(这个可以看一下版本L,即Latest里面的Release Information,就可以知道每个版本修改了什么内容)
- PG227: 《AXI4-Stream Verification IP v1.1》
- PG104: 《Complex Multiplier v6.0》
- 大端小端、MSB和LSB、字节序和比特序
- 字节序探析:大端与小端的比较
AMBA AXI的基本介绍
本节主要参考ARM官方的资料《Introduction to AMBA AXI》,其中主要介绍了AMBA AXI的主要特征,具体内容如下,其中AMBA即Advanced Microcontroller Bus Architecture,高级微控制总线架构;AXI即Advanced eXtensible Interface,高级可扩展接口:
- 什么是AMBA
- 为什么AMBA在现代SoC设计中如此流行
transfers和transactions的概念,它们构成了AMBA操作的基础(在后续的内容中,我将transactions翻译为事务,将transfer翻译为传输)- 不同通道(channel)的信号以及它们提供的功能
- 独占访问(Exclusive access transfers),可以允许多个管理器(manager)同时访问同一个从属器(subordinate)
- AMBA协议规定的规则和条件
对混合字节存储顺序结构(mixed endian structures)等通用元素的关键属性与支持
- endian即字节序,分为大端字节序(Big-endian)以及小端字节序(Little-endian),大端字节序即指数据的高字节保存在内存的低地址中,小端字节序即指数据的高字节保存在内存的高地址中
- 还需要分辨字节序和比特序的概念,字节序指的是多字节数据在内存中的排列顺序,即上面提到的大端序和小端序;比特序指单个字节内比特的排列顺序,分为MSB先行(Most Significant Bit first)以及LSB先行(Least Significant Bit first),其中MSB先行指最高有效位存储在字节的最低位,LSB先行指最低有效位存储在字节的最低位
需要注意的是,这篇文档主要介绍的是AXI4中定义的AXI,不过在适合的地方会提出和AXI3之前的差异,AXI5对AXI4进行了扩展,并引入了一系列提升性能和支持ARM架构的特性,不过文档中介绍的一些核心概念仍然适用,但不涉及AXI5的附加功能
最后文档还提到了在ARM过去的一些技术文档采用的是master和slave,而在这篇文档中采用的是manager(对应master)和subordinate(对应slave),在后面统一翻译为主机和从机
什么是AMBA,为什么要使用AMBA
AMBA即Advanced Microcontroller Bus Architecture,高级微控制总线架构,是一个开放标准的片上互联(on-chip interconnect)规范,用于在SoC(system-on-a-chip)设计中连接和管理功能模块,本质上AMBA协议定义了功能模块如何互相通信
AMBA可以提供多种优势:
- 高效的IP复用:IP核复用是降低SoC开发成本与周期的关键要素,AMBA规范提供了实现IP复用的接口标准
- 灵活性:AMBA提供了可与一系列SoC协同工作的灵活性,IP复用需要一个通用的标准,同时还要支持在功耗、性能与面积(power, performance and area)要求上各不相同的各类SoC,ARM提供了一系列针对不同需求优化的接口规范
- 兼容性:像AMBA这样的标准接口规范,确保了来自不同设计团队或供应商的IP组件的兼容性
- 支持度:AMBA具有广泛的支持,它在整个半导体行业中得到了广泛的实现和支持,包括来自第三方IP产品和工作的支持
像AMBA这样的总线接口标准,其差异体现在它们所能实现的性能,总线接口性能的两个主要特征如下:
- 带宽(Bandwidth):数据通过接口传输的速率,在一个同步系统最大带宽受限于时钟频率与数据总线宽度的乘积(the product of the clock speed and the width of the data bus)
- 延迟(Latency):一次事务(transaction)从发起到完成的延时,在基于突发传输(burst-based)的系统中延迟数值(latency figure)通常指首个数据传输(transfer)完成的延时而非整个突发的完成时间
- 接口的效率取决于在0延迟的情况下所能达到的最大带宽的程度
AMBA多年来不断发展,以满足处理器和新技术的需求,如下图所示:
- AMBA:ARM于20世纪90年代末推出了AMBA,第一个AMBA总线是Advanced System Bus(ASB)和Advanced Peripheral Bus(APB),其中ASB已经被许多最近的协议取代,而APB现在仍被广泛使用,APB为低带宽的控制访问设计,比如系统外设的寄存器接口,APB总线具有简单的地址和数据阶段以及低复杂度的信号列表
- AMBA2:在1999,AMBA2加入了AMBA High-performance Bus(AHB),AHB是一个单时钟沿协议(single clock-edge protocol),AHB上的一个简单事务(transaction)由一个地址阶段(address phase)和随后的一个数据阶段(data phase)组成,并且通过一个多路选择器(MUX)来控制对目标设备的访问,一次只允许一个主机访问,为了性能AHB采用了流水线设计(pipeline),而为了设计简洁性APB则未采用流水线设计
AMBA3:在2003,ARM推出了AMBA3,包括Advanced Trace Bus (ATB)和AHB-Lite
- ATB是CoreSight片上调试与追踪(debug and trace)解决方案的组成部分
- AHB-Lite是AHB的子集,针对单个主机简化了总线的设计
- Advanced eXtensible Interface(AXI)是在AMBA3规格书中定义的第三代AMBA接口,目标是实现高性能以及高时钟频率的系统设计,AXI的特性使其适合用作高速亚微米互联(submicrometer interconnect)
AMBA4:在2010,AMBA4规范发布,首先是AMBA4 AXI4,随后在2011又推出了AMBA4 AXI Coherency Extensions(ACE)
- ACE通过增加额外的信号来扩展AXI,并引入了系统级一致性(system-wide coherency),这种系统级一致性允许多个处理器共享内存,并且使得诸如big.LITTLE处理等技术得以实现,同时ACE-Lite支持单向一致性(one-way coherency),单向一致性使得一个网络接口能够从具有完整一致性(fully coherent)的ACE处理器的cache中读取数据
- AXI4-Stream协议为从主机到从机的的单向数据传输而设计,其信号得以简化,使其适合在FPGA中进行实现
- AMBA5
AXI协议概述
AXI是一种接口规范,它定义的是IP模块之间的接口,而不是互联(interconnect)结构本身,下图展示了AXI如何被用于连接一个互联组件(interconnect component):
只有两种AXI接口类型:主机(manager)和从机(subordinate),这些接口类型是对称的,即所有的AXI连接均建立在主机接口与从机接口之间,AXI互联接口包括相同的信号,这使得集成不同的IP变得相对简单,上图中给出了AXI如何将主机和从机接口连接在一起,这种直连方式在主机和从机组件之间提供了最大带宽,且无需额外逻辑,此外由于都采用AXI,因此只需验证单一协议即可
多主机系统(multi-manager system)中的AXI
下图展示了一个SoC系统的简化示例,由多个主机、多个从机以及连接它们的互联,其中ARM处理器是主机的一个例子,存储控制器(memory controller)是从机的一个例子:
AXI协议定义了主机和从机之间点对点连接的信号与时序,需要注意AXI是一个点对点规范(point-to-point specification),而不是总线规范(bus specification),因此它只描述接口之间的信号和时序
在文档中给出了一个有多个处理器和功能模块的SoC示例,如下图所示,其中可以发现AXI3和AXI4在同一个SoC中都被用到了,这是常见的做法,在这种情况下互联会进行不同AXI接口之间的协议转换:
AXI通道
上面已经提到过,AXI规范描述了两个接口——一个主机(manager)和一个从机(subordinate)之间的点到点协议,下图给出了每一个AXI接口用于通信的5个主要通道:
写操作采用如下的通道:
- 主机在Write Address(AW)通道上发送地址,并在Write Data(W)通道上传输数据给从机
从机将接收数据写入到指定的地址上,一旦从机完成写操作,它会在Write Response(B)通道上向主机发送消息作为响应
- B代表buffered,因为从机的响应发生在所有写操作完成之后
读操作采用如下的通道:
- 主机在Read Address(AR)通道上发送它想要读取的地址
- 从机在Read Data(R)通道上将数据从请求的地址发送给主机
- 从机还可以在Read Data(R)通道上返回一个错误信息(error message),比如如果地址无效、数据损坏或访问没有正确的安全权限,则会发生错误
- 每一个通道都是单向(unidirectional)的,因此需要一个单独的Write Response通道来将响应传输给主机,然而Read Response通道是不需要的,因为读取响应会作为Read Data通道的一部分传输
- 读传输和写传输采用单独的地址和数据通道有助于最大化接口的带宽,读和写通道组之间没有时间关系,因此一个读序列(read sequence)可以和一个写序列(write sequence)同时发生
每一个通道包含多个信号(signal),这些信号在每个通道都有如下的前缀:
- AW:在Write Address通道上的信号
- AR:在Read Address通道上的信号
- W:在Write Data通道上的信号
- R:在Read Data通道上的信号
- B:在Write Response通道上的信号
主要AXI特征
AXI协议有多个用于提升数据传输和事务(data transfers and transactions)的带宽和延迟(bandwidth and latency)的关键特征,如下所示:
- 独立的读和写通道:AXI支持两个不同的通道集,一个用于写操作,一个用于读操作,有两个独立的通道集可以用于提升接口的带宽性能,这是因为读写操作可以同时发生
- 多个未完成的地址(multiple outstanding addresses):AXI支持多个未完成的地址,这意味着一个主机可以无需等待更早的事务完成就可以发起事务,这样可以提升系统性能因为它实现了事务的并行处理
- 地址和数据操作之间没有严格的时序关系:比如一个主机在AW通道上发出写地址,但是对于主机具体在何时必须向W通道提供相应的写入数据,则没有时间要求
支持非对齐(unaligned)数据传输:对于任意由宽于一个字节的数据传输组成的突发(burst),第一个访问的字节可以与自然地址边界(natural address boundary)非对齐,比如一个起始字节地址为0x1002的32bit的数据包,就没有对齐32比特的自然地址边界
- 若某地址能够被一整数除净,该地址就称为整数对应的地址边界
- 事务乱序完成(Out-of-order transaction completion):AXI协议包含了事务标识符(transaction identifiers),对于具有不同ID的事务,其完成顺序没有限制,也就是说单个物理端口(a single physical port)可以通过扮演多个逻辑端口(several logical ports)来支持乱序事务(out-of-order transactions),其中每一个逻辑端口各自按顺序处理其事务
- 基于起始地址的突发事务(burst transactions):AXI主机仅为首个数据传输发出起始地址,对于后续的任何传输,从机将根据突发类型来计算下一个传输地址
通道传输(transfer)和事务(transaction)
本节主要阐述AXI通道的握手原理并且展示握手如何构成所有读写事务的基础
通道握手
AXI4协议定义了5个不同的通道,所有通道共享一套相同的基于VALID和READY信号的握手机制,如下图所示,其中VALID信号从源端(source)传输到目的端(destination),READY信号从目的端传输到源端:
VALID和READY信号的方向是源端和目的端,但是源端和目的端是主机还是从机取决于使用的是哪一个通道,比如对于AR通道而言主机是源端,而对于R通道主机是目的端
- 源端使用VALID信号来指示有效信息何时可用,VALID信号必须保持置位(asserted)状态(即设置为高电平),直到目的端接收该信息,以这种方式保持置位的信号被称为粘滞信号(sticky signal)
- 目的端使用READY信号来指示其何时能够接收信息,READY信号从通道目的端发送到通道源端
- 这个机制不是一个异步的握手(asynchronous handshake),它需要时钟的上升沿来完成握手
传输和事务的区别
AXI对传输(transfer)和事务(transaction)进行了区分:
- 一个传输指通过一次VALID与READY握手完成的单次信息交换
- 一个事务指整个突发传输(entire burst of transfers),包含一次地址传输、一次或多次数据传输,对于写序列还包含一次响应传输
通道传输示例
本节将讨论源端和目的端之间几种可能的握手实例,它展示了几种符合AXI协议规范的VALID和READY信号序列组合(combinations of VALID and READY sequences)
例1:如下图所示,图中有一个时钟信号、信息总线(information bus)以及VALID和READY信号
上面的例子中展示了如下的事件序列:- 在时钟周期2,VALID信号置位,表示信息通道上数据是有效的
- 在时钟周期3,READY信号置位
- 握手在时钟周期4的上升沿完成,因为VALID和READY信号都发生了置位
例2:如下图所示:
上面的例子中展示了如下的事件序列:- 在时钟周期1,READY信号被置位
- VALID信号一直不置位直到时钟周期3
- 握手在时钟周期4的上升沿完成,因为VALID和READY信号都发生了置位
- 例3:如下图所示,这个例子展示了VALID信号和READY信号都在时钟周期3进行置位,同样握手在时钟周期4的上升沿完成,因为VALID和READY信号都发生了置位:
在上面的3个例子中,当VALID和READY信号在时钟信号的上升沿置位时信息才会通过通道传递,读握手和写握手必须遵守如下的规则:
- 一个源端不能在置位VALID信号之前等待READY信号被置位
- 一个目的端可以在置位READY信号之前等待VALID信号被置位
- 上述的规则意味着READY信号可以在VALID信号之前或之后置位,或者同时置位
写事务:单个数据(Write Transaction: single data item)
这一节主要描述了单个数据的写事务的处理以及用于完成事务的不同通道,写事务涉及如下通道:
- Write Address(AW)
- Write(W)
- Write Response(B)
首先AW通道上发生握手,如下图所示:
这次握手的目的是主机将写入操作的地址传递给从机,握手包含如下的事件序列:
- 主机在时钟周期2时将地址置于
AWADDR同时置位AWVALID - 从机在时钟周期3置位
AWREADY以表明其已准备好接收该地址值 - 握手在时钟周期4的上升沿完成
其次经过第一次握手后,主机在W通道上向从机传输数据,如下图所示:
数据传输包含如下的事件序列:
- 从机在时钟周期n将
WREADY拉高,等待数据 - 主机在时钟周期n+2时将数据置于
WDATA总线并置位WVALID - 握手在时钟周期n+3的上升沿完成
最后从机使用B通道来确认在所有的WDATA接收后写事务已经完成,如下图所示:
写响应(write response)包含如下的事件序列:
- 主机置位
BREADY - 从机驱动
BRESP来指示写事务是成功还是失败,并置位BVALID - 握手在时钟周期n+3的上升沿完成(
感觉按照上面的说法应该是时钟周期n+4的上升沿,不过原文就这么写的,理解意思就行)
写事务:多个数据(Write transaction: multiple data item)
AXI是一个基于突发的协议(burst-based protocol),这也意味着在单个事务中传输多个数据是可能的,可以在AW通道上传输单个地址并结合突发宽度(burst width)和长度信息(length information)来传输多个数据
下图展示了多个数据传输的一个例子:
- 在这种情况下,AW通道指示了一个包含三个传输的序列,同时在W通道也可以看到三个数据传输
- 主机将
WLAST拉高来表示最后一个WDATA,因此从机既可以对数据传输进行计数,也可以只是监控WLAST信号 - 一旦所有
WDATA传输都被接收,从机在B通道上给出一个BRESP值,一个BRESP就覆盖了整个突发,如果从机认为有哪个传输包含错误,它必须等待整个突发完成之后才通知主机发生了错误
读事务:单个数据(Read transaction: single data item)
这一节主要介绍单个数据的读事务的处理以及用于完成事务的不同通道,读事务涉及如下的通道:
- Read Address(AR)
- Read(R)
首先在AR通道上进行握手,如下图所示:
握手具有如下的事件序列:
- 在时钟周期2,主机在
ARADDR上将读取操作的地址传递给从机同时置位ARVALID - 在时钟周期3,从机置位
ARREADY来表示其已经准备好接收地址值 - 握手在时钟周期4的上升沿完成
其次在R通道,从机将数据传输给主机,如下图所示:
数据传输包含如下的事件序列:
- 在时钟周期n,主机置位
RREADY表示其已经准备好接收数据 - 从机在时钟周期n+2取出数据并置于
RDATA上,在这种情况下,因为是单个数据的事务,从机还需要将RLAST信号拉高,同时从机用RRESP来向主机表示读取事务的成功或失败,并置位RVALID - 由于
RREADY已经被主机置位,握手在时钟周期n+3的上升沿完成
读事务:多个数据(Read transaction: multiple data items)
AXI协议同样允许在相同事务中进行多个数据传输的读突发(read burst),这和上面的多个数据的写事务中的写突发(write burst)是类似的
下图展示了突发读传输的一个例子:
- 在上面的例子中,在AR通道上传输了单个地址并结合突发宽度(burst width)和长度信息(length information)来传输多个数据,这里AR通道指示了一个包含三个传输的序列,因此在R通道上可以看到从从机到主机的3个数据传输
- 在R通道上从机将数据传输给主机,在这里例子中主机将
RREADY拉高表示其正在等待数据,从机对每个传输驱动有效的RDATA并置位RVALID - 读事务和写事务的不同在于读事务中的每一次数据传输都会伴随一个
RRESP响应,这是因为在写事务中从机必须在B通道上进行一次独立的传输来发送响应,而在读事务中,从机可以采用相同的通道将数据返回给主机的同时指示读操作的状态 - 如果在事务中的任何一次传输中指示出了错误,仍然必须完成指定的事务完整长度,不存在提前终止突发传输(early burst termination)的情况
活动事务(Active transactions)
活动事务(Active transactions)也称为未完成的事务(outstanding transactions)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。