AXI协议相较于UART,SPI,I2C来说,无论是内容还是难度都上了一个层级,放在一篇文章中进行解读未免篇幅过长,因此,有关AXI一些共性的、通用的问题,作者单独以前缀为【AXI】的标题进行小范围的串联,最终再汇总为深入浅出解读AXI协议,与从零开始的Verilog AXI协议设计,此为作者所思所考的推进顺序,单看【AXI】的每一篇,可能很多读者未免感到有些管中窥豹的疑惑,但若等作者更完此专栏再行观看,从头到尾进行阅读,应该就会有有茅塞顿开的收获与领悟。
AXI标准协议有五路独立的数据通道(分别为读数据通道,写数据通道,读地址通道,写地址通道,写回复通道),每一路数据通道都遵循双向握手机制,即使用VALID和READY信号作为控制信号来传输数据,只有VALID与READY同时为高的时候,才可以正常的发送数据,而通常情况下,VALID信号用来表示什么时候“地址、数据、和控制信号”是有效的,而READY信号则用来表示什么时候从设备准备好采集数据了。
AXI标准协议中,双向握手信号合计十个,无论是主设备还是从设备,这十个信号都对应于五个输入信号,五个输出信号。
数据通路 | 握手信号对 |
---|---|
写地址通路 | AWVALID,AWREADY |
写数据通路 | WVALID,WREADY |
写回复通路 | BVALID,BREADY |
读地址通路 | ARVALID,ARREADY |
读数据通路 | RVALID,RREADY |
握手:目的是控制数据在总线上的流动和采样
双向:目的是主设备和从设备都可以控制总线数据流动
AXI协议妙就妙在这里,我们在讨论SPI协议的时候,也有控制信号NSS,但是NSS这个信号只针对于主设备对于从设备的控制,从设备是没有办法控制数据通路的,但是对于AXI而言,无论是主设备还是从设备,都可以控制数据的传输。
顺着双向握手的目的,我们可以引申出三种情况,READY信号先于VALID信号改变,READY信号与VALID信号同时改变,READY信号晚于VALID信号改变。分别进行讨论
READY信号的拉高,代表从设备准备好采样了,但T2时刻,VALID未拉高,因此未进行采样,而T3时刻,VALID拉高了,完成握手,数据传输。
这种情况下,如果我们将目光对向主设备,会发现,从设备在主设备发送数据前就做好了接受的准备,当主设备VALID后,时钟上升沿就完成了接受。(即数据传输发生在一个时钟周期内)
VALID信号与READY信号同时拉高,表明数据有效的同时也可以进行采样,在T2时刻的上升沿,采样到正确数据,握手正确,再往后二者都拉低,数据进行了正确传输。
VALID信号先拉高,表明数据正确,再往后READY拉高,表明可以进行采样,T3时刻进行了采样,采样后,完成握手,再往后二者信号都拉低,这种条件下,数据也进行了正确的传输。
对于2.3的讨论,我们可以发现这三种情况,都可以顺利完成握手,同时,协议同样规定,“VALID信号一旦拉高,除非READY信号拉高接收数据完成,不会主动变低”,而双向握手信号的约束关系,远不仅限于此。
以下的叙述包含两个前提:
在一个burst读传输操作时,从设备在数据有效时置高RVALID,一旦置高,RVALID需要等待RREADY信号拉高,完成握手,进行数据传输
主设备,在地址信号和控制信号有效时置高ARVALID,一旦置高,需要等待从设备的ARREADY信号置高,完成握手,进行数据传输。
在burst写传输时,主设备在写数据有效时置高WVALID信号,拉高后WREADY等待WREADY信号拉高,完成握手。
主设备在地址信息与控制信息有效时,拉高AWVALID,拉高后AWVALID等待从设备拉高AWREADY,完成握手,进行数据传输
从设备在数据有效时,拉高BVALID,一旦拉高,BVALID需要等待BREADY信号拉高后完成握手,进行数据传输。
针对于数据通路的握手要求,首先需要强调的是:我们在这里默认READY信号和VALID信号为低电平,仅是为了方便表述。在实际工程项目中,也可以默认他们为高电平,拉低有效,完成握手,即READY与VALID信号的有效电平为高或低均能满足要求。
其次,对于不同的数据通路,有的时候是主设备操控READY信号,有的时候是从设备操控READY信号,需要根据数据通路进行区分。
在前文中,我们延伸出通道内的约束关系如下
VALID信号一旦拉高,除非READY信号拉高接收数据完成,不会主动变低
不同数据通路之间,同样的存在约束关系,这很好理解:写回复通路的信号传递一定晚于写数据通路,这就天然的构建起不同通路的先后顺序关系,假如不满足这种约束关系,AXI协议就可能会发生死锁,即deadlock没有办法正确工作。
同时一个AXI slave按功能进行区分的行为建模,无非是读与写两种操作,读操作与写操作的约束关系同样不同。
单向箭头指向的对象可以在起点对象之前/之后置高
(以2.5.1为例ARREADY可以在ARVALID之前或者之后置高)
双向箭头指向的对象只能在起点对象之后置高
(以2.5.1为例,RVALID无法在地址通路握手完成(已发送数据)的情况下改变)
首先我们讨论的是读操作约束关系:
RVALID和RREADY对应读数据通路的信号
ARVALID和ARREADY对应读地址通路的信号
读操作固定的约束关系为数据通道必须要等待地址通道的数据传输完成才可以尝试握手操作
其次我们讨论的是写操作的约束关系
这里涉及到了三个数据通路,来考虑约束关系,唯一的一个硬约束关系为,BVALID需要等到写数据通路完成握手后才能置高。
初学者在这里往往会感到迷惑
比如说BREADY跟WVALD与WREADY间有无关系?BVALID和AWVALID与AWREADY有无关系?实际上是,只要图中的线没有进行相连,就是没有关系,针对于AXI而言,甚至可以BREADY信号第一个拉高,再去考虑其他信号的关系,唯一需要满足的即为写回复通路与写数据通路之间的约束,剩下的信号都是自由的。
2.5.2讨论的是AXI3.0写操作的约束关系,这里直接放出AMBA4.0版的约束关系,很好理解,不再多做解释,不过需要强调的是,AMBA4在兼容AMBA3的基础上更为严格,目的是希望从设备不会在接收到数据信号后还需要等待地址信号。