赞
踩
ARM学习书籍或者思路总结,以XMIND 为形式,构建思维大厦,蛰伏与积累,下面补充对XMIND的描述
本文有参考 老秦谈芯 关于ARM系列 – AXI的系列分享和 AXI 的 spec 文档:《AMBA®
AXI™ and ACE™ Protocol Specification》
AXI的全称是Advanced eXtensible Interface
The AXI protocol provides a single interface definition, for the interfaces:
• between a master and the interconnect
• between a slave and the interconnect
• between a master and a slave.
用于高带宽和低延迟设计。
提供高频操作,无需使用复杂电桥。
协议满足各种组件的接口要求。
适用于具有高初始访问延迟的内存控制器。
提供了实现互连架构的灵活性。
与AHB和APB接口向后兼容
AXI有五个独立的事务通道,分别是:
AXI的五个通道是单方向的,这样做的好处是可以对每个通道单独优化,而且当经过复杂的片上网络时,能够优化时序减少延迟。AXI支持突发(burst)传输,乱序(out of order)传输,极大地提高了数据吞吐能力,在满足高性能要求的同时,又减少了功耗
1) 对于读操作,主机(master)通过AR通道发送读事务地址,从设备(slave)通过R通道返回给主机所需要的数据,如下图
2) 对于写操作,主机通过AW通道发送写事务地址,并通过W通道把数据发送给从设备,而从设备接收到数据后,需要通过B通道返回一个响应给主机,整个过程结束。
读和写的不同之处,一是数据方向不一样,还有就是读事务不需要从设备再发响应了,想想为啥涅。
读和写的数据宽度可以是8, 16, 32, 64, 128, 256, 512, 1024 bits中的一种。
这里不得不提一下AMBA中广泛采用的 VALID/READY 握手机制。正是因为有了这个机制,发送方(Source)和接收方(Destination)才都有能力控制传输。
发送方通过置位 VALID 信号,来告诉接收方,自己已经将数据等信息准备好;而接收方通过置位 READY 信号,来告诉发送方,自己准备好了接收数据。只要有任何一方没准备好,传输就不能进行。
这里不要混淆了,发送方不总是主机,比如读数据通道上,发送方就是从设备,主机是接收方。
发送方的 VALID 信号和接收方的 READY 信号并不需要同时置位,可以发送方先准备好,也可以接收方先准备好。也就是说 VALID 可以早于 READY,也可以晚于 READY,也可以同时置位。对应的就是下面三种情况。
但是,为了避免死锁等问题,对于VALID/READY信号还是有一定要求的。协议规定,发送方的VALID信号一旦置位就不能拉低,直到完成一次握手;而且,发送方不能根据接收方的READY信号来置位自己的VALID信号。简单说,就是发送方可以根据自己的需求随时发起传输,不能也不需要判断接收方是否空闲,同时发送方一旦发起传输,就不能随意中止。对于接收方,如果没有准备好接收就可以不置位READY,这样就可以反压发送方的传输了,而且接收方置位READY后,只要发送方没置位VALID,可以拉低READY。
A2.1 Global signals
A2.2 Write address channel signals
A2.3 Write data channel signals
A2.4 Write response channel signals
A2.5 Read address channel signals
A2.6 Read data channel signals
A2.7 Low-power interface signals
前面说到AXI的五个通道是独立的,但通道间必须保持一定的约定关系:
写回复必须在一次写事务的最后一个写数据之后
读数据必须在接收到读地址信号之后
通道间握手必须满足一定的依赖关系
前两条好理解,重点看一下第三条。之前讲过,为了避免死锁,协议规定发送方的VALID不能依赖接收方的READY;反过来,接收方的READY可以等待,也可以不等待发送方的VALID。当发生一次读传输时,读地址通道中,主机(master)是发送方,而从机(slave)是接收方;在读数据通道中,主机是接收方,从机是发送方,这时的依赖关系是:
主机不可以等待从机置起ARREADY以后,来决定是否置起主机的ARVALID
从机可以等待主机置起ARVALID之后置起ARREADY
从机可以在主机置起ARVALID之前置起ARREADY
从机必须等待主机置起ARVALID 和从机置起ARREADY 之后,才可以置起RVALID
从机不可以等待主机置起RREADY,来决定是否置起从机的RVALID
主机可以等待从机置起RVALID之后置起主机的RREADY
主机可以在从机置起 RVALID 之前置起主机的RREADY
上面听起来有点像绕口令,其实记住一个大原则就好:发起方不能挑事,接收方有自主权。
在AXI4和AXI5中,写传输增加了额外的从机置起 BVALID 信号所需的依赖,从机必须等待AWVALID,AWREADY,WVALID和WREADY。比起AXI3,BVALID还要依赖于AWVALID和AWREADY。从机要等写地址和写数据都完成以后才可以返回写响应,这在道理上是对的。但是,一般而言,写数据会在写地址前完成。
**ARLEN 用于读地址通道的突发长度,AWLEN 用于写地址通道的突发长度。**下文中AxLEN指ARLEN或AWLEN, x指代R或者W,对于其它信号也类似,以后不再赘述。在AXI3中,对于所有的突发类型,都支持1-16的突发传输。AXI4中,INCR类型支持1-256突发传输,其它类型依然是1-16。所以对于AXI3来说,AxLEN信号是4bit宽度;而在AXI4中,AxLEN是8bit宽度。一次突发传输的长度是AxLEN+1,因此,最小长度就是1了(毕竟0的话没有任何意义)。
**AxSIZE信号指示突发传输中的数据位宽。**数据位宽不能超过数据总线本身的位宽,而当数据总线位宽大于突发传输的位宽时,将根据协议的相关规定,将数据在部分数据线上传输。
了解完通道握手的依赖关系,我们再看看传输事务的结构。首先看传输的地址结构。AXI协议是基于突发(burst)传输的。所谓 burst 传输,就是在一次事务中,连续地传输多个地址相邻的数据。一次突发传输中可以包含一至多次数据(Transfer)。每个 transfer 因为使用一个周期,又被称为一拍数据(Beat)。每个数据可以是多个Byte构成。
协议规定,每次突发传输的累计地址不能跨4KB边界。至于为啥是4KB而不是别的数值,这是最初操作系统的问题,以4KB为一个页(page),对于某些设备而言,跨了4KB边界可能就是另外一个设备了。
Burst Length
Burst size
Burst Type
Burst Type 有以下几种类型:
FIXED,所有数据都使用起始地址。该模式适合对某个固定地址进行多次数据更新,比如读写一个 fifo 时,读写地址就是固定的。
INCR,后续数据的地址在初始地址的基础上进行递增,递增幅度与传输宽度相同。适合对于RAM 等通过地址映射(mapped memory)的存储介质进行读写操作。
WRAP,首先根据起始地址得到绕回边界地址与最高地址。当前地址小于最高地址时,WRAP 与 INCR 类型完全相同,地址递增。但到递增后的地址到达最高地址后,地址直接回到绕回边界地址,再进行递增,就这样循环往复。最高地址由绕回边界地址计算得到。这种传输类型适用于对缓存行(cache line)的操作。
突发传输类型是通过AxBURST信号来指示的,具体参考下图:
好了,到这里,我们知道了每次突发的起始地址是主机发出的。AxLEN用于指示要传输多少次数据(beat);AxSIZE用于指示每个数据有多少Byte;AxBURST用于指示突发类型,除去首次传输的地址,下次传输的地址可以根据AxBURST和首地址计算得出。
协议中规定,通信双方都不能在传输事务的所有 Transfer 完成前提前结束。哪怕发生错误,也要走完整个传输事务的流程。但是主机有办法减少传输的数据。在写传输事务中,发送方可以通过置低所有写有效位的方式,使得写数据无效。在读传输事务中,主机可以直接丢弃读取到的数据。
分析完传输的地址结构,再来看看读写数据的结构。主要是涉及窄传输(Narrow transfers),非对齐传输(unaligned transfer)和混合大小端(mixed-endian)传输等话题。
WSTRB信号用于指示WDATA中的哪些数据byte是有效的。
WSTRB[n] 对应的是WDATA[8n+7:8n],也就是:当 WSTRB[n] 为 1 时,WDATA[8n+7:8n]有效。
当主机发起的传输位宽小于总线宽度时,就是一次窄传输。如果是INCR或者WRAP类型,可以每拍(beat)使用不同的字节位置(byte lane),如果是FIXED类型就不可以了。协议中给出了两个例子,我们看一个就好了,如下图:
突发长度是5
起始地址0
每次传输8bit
数据总线宽度32bit
突发类型是INCR
上图中灰色表示该byte无效,我们可以看到,每次传输的有效字节位置是不同的。在窄传输中,主机可以调整有效数据的字节位置,以及给出字节有效信号 WSTRB,能够使从机无需进行数据重组等工作。
AXI中还有一个问题是大小端问题,之前的文章讲过什么是大端和小端。其根本不同就是高字节数据存在低地址位还是高地址位。AXI协议定义了一种字节顺序不变端序(byte-invariant endianness)方案。
无论大端或小端模式,每个数据结构存储空间的分配方式是相同的
该数据结构按照其大端或小端模式决定字节存储的地址顺序
在传输过程中不考虑数据结构的大小端,按照字节原先存储的顺序,原样传输并存放至对端
Unaligned transfers
AXI 协议支持地址非对齐的传输,允许突发传输的首字节地址,即起始地址与突发传输位宽不对齐。比如,总线位宽为 32bit,也就是4byte,这时要保证对齐,起始地址的最低两位必须是2‘b00。如果起始地址为 0x1002,则产生了非对齐现象。
主机可以使用低阶地址行表示未对齐的起始地址,然后提供一个对齐的地址,并使用字节通道选通信号通知未对齐的起始地址。下面是协议中给出的例子:
看完了数据结构。就剩下读写响应结构了。读写响应信号分别是RRESP/BRESP,各2bit,总共4种状态:
OKAY ,常规访问成功
EXOKAY,独占(exclusive)访问成功
SLVERR,从机错误,从机接收到了访问请求,但因为种种原因向主机返回了一个错误状态
DECERR,解码错误,一般由互连(interconnect)组件产生,表示主机发送的传输事务地址无效,无法将传输事务发送给某个从机。
来看看事务属性(Transaction Attributes),主要是对cache,buffer和memory controller的规定。按照协议,从机分为存储从机(memory slave)和外设从机(peripheral slave)。存储从机要能够正确执行所有的事务,外设从机处理事务的能力取决于具体实现。
AXI协议用AxCACHE来控制事务属性,在AXI3中,AxCACHE信号的含义如下图:
从上图可以看出,AxCACHE信号的4bit有各自的含义,比如AxCACHE[1]就是表示该事务是不是cacheable的。
在AXI4中,AxCACHE[1]指示是否 modifiable。Non-modifiable 的事务不可以拆分或合并。对于Non-modifiable 的事务,下列参数不可以改变。
对于Device Non-bufferable,协议规定:
写响应必须从最终目的地获得
读数据必须从最终目的地获取
事务可以改变
读操作不得预取。不能合并写操作
从同一ID到同一从机的所有不可修改读写事务(AxCACHE[1]=0)必须保持秩序(ordered)
对于Device Bufferable,协议规定:
写响应可从中间节点获得
写事务必须最终目的地及时可见
读数据必须从最终目的地获取
事务不可修改
读操作不得预取。不能合并写操作
从同一ID到同一从机的所有不可修改读写事务(AxCACHE[1]=0)必须保持秩序(ordered)
对于Normal Non-cacheable Non-bufferable,协议规定:
写响应必须从最终目的地获得
读数据必须从最终目的地获取
事务可以改变
写操作可以合并
同一ID到重叠地址的读写事务必须保持有序
对于Normal Non-cacheable Bufferable,协议规定:
写响应可从中间节点获得
写事务必须最终目的地及时可见
读数据必须从最终目的地或者正在进行到其最终目的地的写事务获得
事务可以改变
写操作可以合并
同一ID到重叠地址的读写事务必须保持有序
对于Write-Through No-Allocate,协议规定:
写响应可从中间点获得
写入事务必须最终目的地及时可见
读取数据可从中间缓存副本获取
事务可修改
读取可以预取
写入可以合并
读和写事务需要缓存查找
从同一ID到重叠地址的读写事务必须保持有序
出于性能原因,建议内存系统不要分配这些事务
对于Write-Through Read-Allocate,除了满足Write-Through No-Allocate的要求,协议规定:
推荐读事务分配
不推荐写事务分配
对于Write-Through Write-Allocate,除了满足Write-Through No-Allocate的要求,协议规定:
不推荐读事务分配
推荐写事务分配
对于Write-Through Read and Write-Allocate,除了满足Write-Through No-Allocate的要求,协议规定:
推荐读事务分配
推荐写事务分配
对于Write-Back No-Allocate,协议规定:
写响应可从中间点获得
写事务不需要在最终目的地可见
读取数据可从中间缓存副本获取
事务可修改
读取可以预取
写入可以合并
读和写事务需要缓存查找
从同一ID到重叠地址的读写事务必须保持有序
出于性能原因,建议内存系统不要分配这些事务
对于Write-Back Read-Allocate,除了满足Write-Back No-Allocate的要求,协议规定:
推荐读事务分配
不推荐写事务分配
对于Write-Back Write-Allocate,除了满足Write-Back No-Allocate的要求,协议规定:
不推荐读事务分配
推荐写事务分配
对于Write-Back Read and Write-Allocate,除了满足Write-Back No-Allocate的要求,协议规定:
推荐读事务分配
推荐写事务分配
为了阻止非法事务越权访问,AXI 协议设计了访问控制信号 AxPROT。读/写事务的 AxPROT 信号位宽均为3bit,其具体含义如下表:
何为“原子性”?在这里,“原子性”指的是内存访问的一个特征,也称为原子访问,该内存访问操作要么执行完,要么不被执行,不存在执行一半被打断的可能。也就是该内存访问操作像原子一样不可切割。
为此,ARMv8-A(注意,不是AXI)中定义了两种原子性:单拷贝原子性(single-copy atomicity)和多拷贝原子性(multi-copy atomicity),此处不展开太多了,以后有机会单独写一篇与大家讨论。
AXI4中引入了一个概念,单拷贝原子大小(single-copy atomicity size)。这个术语定义事务原子更新的最小字节数。AXI4协议要求大于单拷贝原子大小的事务必须更新至少为单拷贝原子大小的内存块。
更复杂的系统需要支持更大的原子元素,特别是64bit,这样主机就可以使用基于这些更大原子元素的数据结构进行通信。系统中支持的单拷贝原子性大小非常重要,因为给定通信中涉及的所有组件都必须支持所需的原子元素大小。AXI4协议本身不需要特定的单拷贝原子大小,系统可以设计为支持不同的单拷贝原子大小。
AXI的spec里面给了下图一个例子:图中的处理器,DSP,DRAM控制器,DMA,SRAM,互连和外设都是32bit的single-copy atomicity size;同时处理器,DSP,DRAM控制器和相关的互连部分也是64bit的single-copy atomicity size。
为了支持原子访问,AXI中定义了两种操作:排他访问(exclusive access),和锁定访问(locked access)。
排他访问机制可以提供信号量类型的操作,而不需要在操作期间保留总线给特定主机。也就是说信号量类型的操作不会影响总线访问延迟或最大可实现带宽。主机通过AxLOCK信号选择独占访问,RRESP和BRESP信号分别表示独占访问读写的成功或失败。从机需要额外的逻辑来支持独占访问。
主机对一个地址执行排他读取。在稍后的某个时间,主机试图通过执行排他写入来完成独占操作到相同的地址,并且具有与用于排他读取的地址匹配的AWID。
此排他写入访问被标记为:
Ø 如果在排他读访问之后没有其他主机写入该位置,则标记为成功。在这种情况下,排他写入更新内存。
Ø 如果另一个主机在排他读取访问后已写入该位置,则标记为失败。在这种情况下,内存位置不会更新。
主机通过执行排他读取来启动排他操作。如果事务成功,从机返回EXOKAY响应,指示从机记录了要监视的地址以进行排他访问。如果主设备尝试从不支持排他访问的从设备进行排他读取,则从机将返回OKAY,不是EXOKAY。
不支持独占访问的从机可以忽略AxLOCK信号。但是必须能够对正常访问和排他访问返回OKAY响应。
与排他访问相对的是锁定访问。当主机使用AxLOCK信号来指示事务是锁定的事务时,互连必须确保只有该主机可以访问目标从属区域,直到来自同一主机的未锁定事务完成。互连中的仲裁器必须执行此限制。在主机启动读或写事务的锁定序列之前,它必须确保没有其他事务等待完成。任何带有AxLOCK的表示已锁定事务的事务都会强制互连锁定后续的事务。因此,锁定的序列必须由一个没有AxLOCK指示锁定事务终结。这就要求最后一个事务包含在锁定的序列中,并有效地移除锁定。完成锁定序列时,在发出最终解锁事务之前,主机必须确保所有先前锁定的事务都已完成。然后,它必须确保最终解锁事务在开始任何进一步的事务之前已经完成。主机必须确保锁定序列中的所有事务都具有相同的AxID值。
可以看出,锁定访问需要在一段时刻内独占互连,因此会极大影响互连的性能。在AXI4中已经取消对锁定访问的支持。
AXI3支持locked access,AxLOCK信号为2bit。
AXI4中考虑到大多数组件并不需要锁定的事务,而且锁定事务对于互连设计和QoS带来挑战,因此取消了对locked access的支持,AxLOCK信号为1bit。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。