本系列内容来自ARM官方spec
1、基本读写事务
握手处理:
五个事务通道使用相同的VALID/READY握手处理。两路流控机制意味着Manager和Sub都可以控制它们之间的信息流速。数据源产生VALID信号表明地址、数据、控制信息是可用的。终点产生READY信号来表明它可用接收信息。传输仅在VALID和READY信号均为高电平时出现。
在Manager和Subordinate接口中,在输入和输出信号之间不能存在其他组合逻辑。
如上图,数据源在T1后提供信息同时拉高VALID信号,终点在T2后拉高READY。数据源必须保持信号不变直到T3(也就是采样到READY前数据不能变)。
数据源不允许存在等采样到READY再拉高VALID的逻辑。(防死锁)
终点在T1后就拉高了READY,这发生在地址、数据、或是控制信号有效前。拉高READY表示终点可接收信息。因此一旦数据源提供数据并拉高VALID(图中T2后),数据传输就发生(图中T3)。
终点允许等待VALID拉高后再拉高READY。
如果READY已拉高,允许VALID拉高前拉低READY。
如上图,数据源和终点同时表明它们可在T1后传输数据。在这种情况下,数据传输发生在两信号同时拉高的上升沿,即图中T2后。
通道信号要求:
通道握手信号:
每个通道都有自己的一对VALID/READY握手信号。
写地址通道:
Manager可以仅在它驱动有效的地址控制信息时拉高AWVALID信号。当AWVALID拉高时,必须保持拉高状态直到在上升沿采样到Sub拉高AWREADY。
AWREADY默认状态既可以是高电平也可以是低电平。Spec建议默认状态是高电平。因为如果默认低电平,那就强制传输至少需要2个时钟周期,一个用于拉高AWVALID,一个用于拉高AWREADY。当AWREADY是高电平,Sub必须能接收任何有效地址。
写数据通道:
在一个写burst中,Manager可以仅在它驱动有效数据拉高WVALID信号。
Manager在它的burst的最后一次传输必须拉高WLAST。
本Spec建议WDATA在非有效字节通道填零。
写响应通道:
Sub可以仅在它驱动一个有效写响应时拉高BVALID。当BVALID拉高后,必须保持拉高直到采样在上升沿采样到Manager拉高BREADY。
建议Manager默认拉高BREADY。
读地址通道:
Manager可以仅在驱动有效地址和控制信息时拉高ARVALID。当拉高后,ARVALID必须保持拉高直到在上升沿采样到Sub拉高ARREADY信号。
读数据通道:
Sub可以仅在它驱动有效读数据拉高RVALID。当RVALID拉高后,必须保持拉高直到在上升沿采样到来自Manager的RREADY的拉高信号。即使Sub只有一个数据源,也必须拉高RVALID信号来作为读数据请求的响应。
Manager使用RREADY来表示它可以接收数据。
Sub在它驱动burst最后一次读传输时必须拉高RLAST信号。
Spec建议RDATA在非有效字节通道填零。
2、通道之间的关系
AXI协议要求遵守以下关系:
(1)一次写事务中,写响应必须紧跟最后一次写传输。
(2)读数据必须紧跟读地址。
(3)通道握手必须遵守相关依赖关系。
协议中没有定义通道之间任何其他关系。
缺少的关系意味着,比如,写数据可以出现在写地址之前。这种情况出现在写地址通道可能比写数据通道包含更多的寄存器打拍阶段,导致延迟大。相似的,写地址可能和地址出现在相同周期。
当interconnect要求决定目的地的地址空间时,它必须重新对齐地址和写数据。这种重新对齐是为了确保写数据仅对写地址路由的Sub有效。
当Manager发出读请求后,它必须能提供该事务所需的所有写数据,而不依赖Manager的其他事务。
当Manager发出一个读请求后,它必须能接收事务的所有读数据。
通道握手信号之间的依赖:
为了阻止死锁情况,在握手信号之间有些必须遵守的依赖规则
(1)VALID信号不能依赖READY信号
(2)拉高READY可以等采样到VALID信号
在依赖图中:
单头箭头指向的信号可以在箭头起点信号拉高前或者拉高后拉高。
双头箭头指向的信号必须在箭头起点信号拉高后才能拉高。
在一次读事务中:
(1)Manager不可以等ARREADY拉高再拉高ARVALID;
(2)Sub可以等ARVALID拉高后再拉高ARREADY;
(3)Sub可以在ARVALID拉高前拉高ARREADY;
(4)Sub必须等待ARVALID和ARREADY拉高后才能拉高RVALID;
(5)Sub不可以等RREADY再拉高RVALID;
(6)Manager可以等RVALID拉高后再拉高RREADY;
(7)Manager可以在RVALID拉高前拉高RREADY。
写事务依赖如上图。
3、事务结构
(1)地址结构
AXI协议是基于burst的,Manager通过驱动控制信号和事务的地址第一个字节并传给Sub来开始每次burst。在burst过程中,Sub必须计算burst中的后面的地址。
一次burst必须不能跨越4KB地址边界。
Burst长度:
burst长度被两个参数定义:
ARLEN[7:0],为读传输
AWLEN[7:0],为写传输
AXI3支持1-16的burst长度
AXI4为INCR类型的burst扩展成1-256的burst长度。
Burst_Length = AxLEN[3:0]+1
对于回环burst,burst长度必须是2,4,8,16
一次burst必须不能4KB地址边界
burst的提前结束是不被支持的,没有任何组件可以提前结束burst,Manager可以通过拉低写选通信号来不让数据写入,但也要完成burst剩余的传输。在一次读burst中,Manager可以丢弃读数据,但必须一次burst所有传输。
Burst大小:
每次传输的最大字节数,被以下两个参数定义:
ARSIZE[2:0],为读传输
AWSIZE[2:0],为写传输
Burst类型:
(1)FIXED:在一次固定的burst传输中,每次传输的地址都一样。在burst的所有拍中有效字节通道均不变,但在这些有效的通道内,WSTRB每拍均可变化。这种burst类型用于对一个相同的位置重复读写操作,如加载或清空fifo。
(2)INCR:递增的,在一次递增burst中,每次传输的地址是前一次传输的地址的递增值。这个递增值由传输的字节大小决定。比如,一个4字节的数据传输地址是前一次传输的地址加4。这种burst类型用于读写普通memory。
(3)WRAP:一次回环burst类似于INCRburst,当地址超过限制时将会回到起始地址。但有以下限制:起始地址必须和每次传输的数据字节大小对齐;burst长度必须是2,4,8,16。
(2)读和写响应结构
AXI协议为读和写事务均提供了响应信号:
对于读事务:来自Sub的响应信息在读数据通道传输
对于写事务:响应信息在写响应通道传输
响应信号:
RRESP[1:0],为读传输响应
BRESP[1:0],为写传输响应
响应信号是:
OKAY:普通存取成功,表示一次普通存取已成功。也可以表明一次专用存取失败。
EXOKAY:专用存取okay,表明专用存取的读部分或者写部分已成功。
SLVERR:Sub错误。用于当存取命令成功送达Sub,但Sub希望返回一个错误状态。
DECERR:译码错误,一般由互连组件生成,来表明没有找到事务地址中的Sub。
对于写事务,只有一次为整个burst产生的响应,而不是为burst中每次数据传输均产生响应。
在一次读事务中,Sub可以为一次burst的不同传输产生不同的响应信号。比如,在一次16拍的读传输的burst中Sub可能返回15次OKAY,1次SLVERR。
协议规定了所需要传输的次数必须达到,即使有error出现。比如,如果一次8拍的读事务,Sub有一个错误状态,Sub必须实现8次数据传输,每次传输都响应一次错误信号。而不会因为一次error信号而取消剩余传输。