AXI学习记录(1)------AXI握手规则介绍
文章目录
前言
年后我就打算写点东西记录一下,然而由于各种原因导致今天才开始写(实际是因为拖延症。。。)。正好近期工作内容需要我学习一下AXI协议,那么就从现在开始吧。
1、AXI握手相关信号?
介绍AXI握手规则前,这里先介绍一下AXI握手相关信号(即VALID和READY)。在AXI写地址/数据/回复和读地址/数据这五个通道中,都有XXX_VALID和XXX_READY信号,如下图所示。
2、Spec中基本的握手规则
在AMBA AXI Protocol Specification中,说明了会有3种情况出现,即VALID before READY、READY before VALID、VALID和READY同时出现。
2.1 VALID before READY
上图表示Src的VALID信号早到了,但是在T2时刻没有见到Des的READY信号,只能在T3时刻才完成传输。
注意:VALID一旦拉高就不能随意拉低,必须等握手完成传输最少1 cycle数据之后才能拉低;发送方不能根据接收方的READY信号来产生VALID,通俗说就是发送方发数据根据自身需求发,接收方根据自身情况确认什么时候收。
2.2 READY before VALID
上图中表示Des的READY信号早到了,但是在T2时刻没有见到Src的VALID信号,只能在T3时刻才完成传输。
注意:Spec中明确说明:接收方如果READY拉高时,而发送方没有拉高VALID,接收方可以拉低READY。那么问题来了,如果发送方在刚好在READY信号下一个Cycle拉高,会出现什么情况?------我能想到的就是影响传输效率,本来下一个Cycle就能完成握手,现在将READY拉低后,那就不知道会再多等多少Cycle了。
所以,这里应该怎么处理?不要随意把READY信号弄低。
2.3 VALID with READY
这种情况就简单,T2时刻完成传输数据即可。
3、各通道握手规则
在第2节中只是简单描述了VALID和READY之间的关系,下面将详细描述5个通道中VALID和READY之间的关系。下面的描述中M表示Master,S表示Slave。
3.1 写地址通道
- AWVALID(M to S)信号默认为Low,即复位时为Low,只有在Master传输有效Address和控制信息时拉高(assert)。一旦拉高,该信号保持直到Slave assert AWREADY信号(拉低)。
- AWREADY(S to M)信号默认为High,当该信号为高时,Slave必须能够接收Master提供给他的任何Address。
3.2 写数据通道
- WVALID(M to S)默认复位时为Low,在Write Burst发起且Write Data有效时拉高(assert),直到Slave assert WREADY时拉低。
- WREADY(S to M)默认为High,什么时候拉低?完全由Slave确定吗?是不是当其Busy时拉低?
- 在Write Burst的Final Write时,需要assert WLAST信号(看起来像是指示突发写数据操作中写最后一个数据的标志位)。
3.3 写回复通道
- BVALID(S to M)默认复位为Low,Slave在Response有效时assert(拉高),直到Master assert BREADY时拉低。
- BREADY(M to S)默认为High,什么时候拉低?完全由Master确定吗?是不是当其Busy时拉低?
3.4 读地址通道
- ARVALID(M to S)默认复位为Low,只有在Master传输有效Address和控制信息时拉高(assert)。一旦拉高,该信号保持直到Slave assert ARREADY信号(应该是拉低)。
- ARREADY(S to M)信号默认为High,当该信号为高时,Slave必须能够接收Master提供给他的任何Address。
3.5 读数据通道
- RVALID(S to M)默认复位为Low,在Slave读Data有效时拉高assert,保持到Master assert RREADY才能拉低。
- RREADY(M to S)信号默认为High,当该信号为高时,Master必须能够接收Slave提供给他的任何Data。
- 在Read Burst的Final Read时,需要assert RLAST信号(看起来像是指示突发写数据操作中读最后一个数据的标志位)。
注意
- 发送方VALID信号的拉高不能通过接收方READY信号产生,很好理解,也就是我要向你发东西,我准备好了我就发,我不管你是否准备好了。
- 发送方VALID信号什么时候拉低?即发送方接收到接收方拉低READY信号之后拉低。
- 接收时,可以等检测到VALID信号再assert READY信号。这里解释了上面3.2和3.3中什么时候拉低READY信号。
4、通道间握手规则
通道间需要满足一定的约束关系:
- 写回复必须在一次写传输过程中最后一个写数据之后。
- 读数据必须在接收到读地址信号之后。
- 通道间握手必须遵守一定的规则(防止死锁,规则在下面有介绍)。
4.1 读事务
在读地址通道,Master发送读指令(发送方),从Slave中读取数据(接收方);而在读数据通道,Slave为发送方,Master为接收方。需要满足的关系如下:
- 上图中单箭头表示箭头指向信号可以在箭头起始信号前/后断言。双箭头表示箭头指向信号必须在箭头起始信号断言后才能断言。有指向关系的信号看图即可,无需多赘述。
- 对于ARVALID和ARREADY,Master禁止将Slave置起ARREADY作为置起ARVALID的条件(即 if ARREADY then ARVALID=1这种写法禁止出现);Slave可以在Master置起ARVALID之前/后再置起ARREADY。
- Slave必须等到Master置起ARVALID和Slave置起ARREADY之后,才能置起RVALID(数据VALID)。
- Slave不能将Master置起RREADY作为置起RVALID的条件;Master可以在Slave置起RVALID之前/后再置起RREADY。
- 写事务流程为:Address->Data。
4.2 写事务
在写地址/数据通道,Master发Slave收;在写回复通道,Slave发Master收。需要满足的关系如下,图中从AWVALID->>BVALID和AWREADY->>BVALID这两条路径是AXI4和AXI5新增的(为什么新增这两项?写事务默认是地址->数据->回复,写回复通道的VALID信号默认就应该在写地址通道信号之后才能产生。),去掉后就是AXI3。
- Master不能将Slave的AWREADY或WREADY拉高作为拉高AWVALID或WVALID的条件。
- Slave可以在Master拉高AWVALID或WVALID之前/后再拉高AWREADY。
- Slave可以在Master拉高AWVALID或WVALID之前/后再拉高WREADY。
- Master置起WVALID、WREADY、(AWVALID和AWREADY,AXI4,5新增)之后,Slave才能置起BVALID;且Slave置起WLAST之后,才能置起BVALID。
- Slave不能将Master置起BREADY作为置起BVALID的条件;但是Master可以在Slave置起BVALID之前/后再置起BREADY。
- 写事务流程为:Address->Data->Ack。
参考文档
总结
本文简单介绍了AXI握手规则,真的能只看本文就能写RTL吗?有点悬吧。
第1篇博客,惨不忍睹,而且看上面写的内容好像就是把Spec翻译了一下,没啥技术含量。。。希望自己能越写越好吧。