一、写在前面
AXI协议相较于UART,SPI,I2C来说,无论是内容还是难度都上了一个层级,放在一篇文章中进行解读未免篇幅过长,因此,有关AXI一些共性的、通用的问题,作者单独以前缀为【AXI】的标题进行小范围的串联,最终再汇总为深入浅出解读AXI协议,与从零开始的Verilog AXI协议设计,此为作者所思所考的推进顺序,单看【AXI】的每一篇,可能很多读者未免感到有些管中窥豹的疑惑,但若等作者更完此专栏再行观看,从头到尾进行阅读,应该就会有有茅塞顿开的收获与领悟。
二、解读AXI协议的原子化访问
本次讨论的内容,原子化访问,其实是数字IC芯片设计中软硬件结合的一个很好的范例,如果读者是软件背景,那么对于这个概念一定不陌生,无论是NV的CUDA还是Intel的CPU,包括各类高级编程语言,如C#和JAVA中很多都会出现这个概念。理解原子化访问的最重要的部分就是对于 AXI协议中AxLOCK这组信号的理解,当然,原子化访问这一部分AXI3.0和AXI4.0的差异也很大,后文讨论的内容更多的是从AXI4.0的角度来进行的。
原子化访问的名字,其实很形象的描述了它的意义,原子通常不可分割,反映在原子化访问上,也是体现其不可分割的特性,对于什么不可分割呢?
我们将一段32bit的地址,当成一个原子,那不就代表在执行原子化访问的这部分时间内,这部分的地址的对应的数据不能改变(比如跟着burst操作想单独改变它的高16位,或者单独改变它的低16位,不就相当于把原子拆开了),必须将它视为一个整体。
2.1 AXI协议中原子的大小
多大的地址,能在AXI协议中作为最小的原子单位呢?协议中用“single copy atomicity size”来表示这个概念,外设的复杂程度不一样,因此针对于不同的外设“single copy atomicity size”的大小不一致也是显而易见的,对于复杂一点的设备,通常情况下使用的“single copy atomicity size”为64 bits,而对于简单一些的设备,使用的“single copy atomicity size”为32 bits即可。以下的图片可以很好的说明64bits与32bits的划分原则。
2.2 信号列表
2.2.1 AXI3.0版AxLOCK信号列表
2.2.2 AXI4.0版AxLOCK信号列表
在AXI4.0中,ARM取消了对Locked access的支持,仅保留正常访问和排他性访问两种访问形式。因此后文中我们讨论的更多也是Normal access和Exclusive access这两种方式
2.2.3 反馈信号xRESP
这里出现的xRESP,实际上是指RRESP和BRESP这两个信号,RRESP[1:0]是对于AXI协议读操作的反馈信号(读数据通路),BRESP[1:0]是对于AXI协议写操作的反馈信号(写回复通路)。四种状态如下面的表格所示,不过在讨论原子化操作的过程中,其实仅需要理解OKAY和EXOKAY这两种状态即可。
2.2.3.1 解读OKAY信号
OKAY信号是对于绝大多数transaction操作的反馈信号,具体返回OKAY的可能有以下几种情况
normal access成功
exclusive access失败
针对于主设备向不支持排他性操作的从设备发送exclusive access访问的反馈
2.2.3.2 解读EXOKAY信号
若xRESP反馈EXOKAY这个信号,只存在一种可能,就是 排他性访问 (Exclusive access)成功。
2.3 排他性访问(Exclusive accesses)
2.3.1 排他性访问过程
主设备针对于某个地址,执行读取操作,其中AxLOCK设定为排他性访问,从设备在步骤一后就开始监测该地址信号了。
一段时间后,主设备针对于相同的地址,进行“写操作”,其中AxLOCK同样设定为排他性访问,步骤二的AWID需要和步骤一的ARID相匹配。
反馈信号:
成功(EXOKAY)!意味着在这段时间内,没有其它的主设备企图去改变步骤一读取操作中锁定的地址,那么步骤二的排他性写操作可以更新memory
失败(OKAY)!意味着在这段时间内,有其他的主设备改变了步骤一读操作中锁定的地址,那么memory不能更新
2.3.2 排他性访问要求
Exclusive accesses对于从设备的硬件提出了新的要求,一般情况下是新增加了一个monitor去监测来自主设备的transaction传输信号,假如在这段时间内其他主设备对地址没有操作,皆大欢喜,更新地址对应的数据即可,但是假如排他性访问失败,monitor会去阻挡主设备对这段地址的写入,并将反馈返回给主设备(比如CPU),这样,CPU根据自身的要求重新分配地址或者过一段时间再尝试,通过这种形式,我们保证了读写这一整个过程中,软件知道“是不是只有一个线程(Master)在写这段地址(其他线程在这个过程可以读)”,避免了线程之间的冲突。
当然对于排他性访问还有如下的要求
1 ARID与AWID需要相同
2 读和写的地址,burst size、burst length、其他控制信号需要保持相同
3 排他性访问的burst lentgh transfer不能超过16
4 排他性传输的地址需要对齐transaction的总字节数
5 AxCACHE信号需要确保正处于监测状态的从设备可以接收到transaction(换言之AxCACHE不能是Cacheable的)
2.3 正常访问 (Normal accesses)
在正常访问的状态下,没有monitor,也没有监测,按照burst突发传输的机制,也就是最简单的状况去,读写memory数据即可。
2.4 为什么从AXI3到AXI4取消了Locked Type?
我们之所以讨论原子化操作,其实是为了避免多线程的冲突,那么用更为简单的方式,直接将这段地址锁定上,只允许一个固定的主设备去操作它,任何其它的设备的访问都被拒绝,在硬件层面上用更简单粗暴的方式实现线程互锁,可不可行呢?
肯定是可行的,这也就是AXI3中Locked Type所想实现的功能,只有当解锁信号到的时候,其他设备才可以访问这段地址,但是这种方式对性能影响很大(特殊地址的长时间占用,完全完成才解锁,对比只有写的时候去判断一下更新可不可行再给主设备反馈),所以取消了Locked Type。
三、其他数字IC基础协议解读
3.1 UART协议
【数字IC】深入浅出理解UART
【数字IC】从零开始的Verilog UART设计
3.2 SPI协议
【数字IC】深入浅出理解SPI协议
【数字IC】从零开始的Verilog SPI设计
3.3 I2C协议
【数字IC】深入浅出理解I2C协议
3.4 AXI协议
【AXI】解读AXI协议双向握手机制的原理
【AXI】解读AXI协议中的burst突发传输机制
【AXI】解读AXI协议事务属性(Transaction Attributes)
【AXI】解读AXI协议乱序机制
【AXI】解读AXI协议原子化访问
【AXI】解读AXI协议的额外信号
【AXI】解读AXI协议的低功耗设计
【数字IC】深入浅出理解AXI协议
【数字IC】深入浅出理解AXI-lite协议