赞
踩
在SOC各种总线中,AXI是最重要的总线,没有之一。不管是在工作中,还是在面试中,AXI协议是一个必须精通的知识点。ARM 从AMBA1到AMBA5一共五代的AMBA总线中,AXI有两代,分别是AMBA3 的AXI3和AMBA4的AXI4。可能很多刚入门的工程师即使把协议读了很多次,还是不能深入理解。这是因为,ARM 没有告诉你,需要你去了解CPU架构,了解cache,了解存储系统,了解系统架构等等知识。只有了解了这些知识才能理解USER/QOS/AxCACHE等信号的具体作用,因为AXI总线本来就是为了解决系统互联而产生的。
AXI4对burst length进行了扩展:
AXI3最大burst length是16;AxLEN位宽是4bit。AXI4支持最大到256,AxLEN位宽是8bit;但是这也是有限制的:
但是在实际使用中,很少使用支持超过Burst Length超过16的命令,这是因为Burst Length太长会一直占用总线,影响了系统性能;而且AXI总线的一个限制就是Burst一旦开始是不能取消的,如果Burst太长,一旦出错,影响比较大;比如在ARM的CPU中,就没有使用超过16 beats的Burst。
AXI4 增加了2个4-bit QoS 命令信号:
AWQOS 4-bit QoS identifier sent on the write address channel for each write transaction
ARQOS 4-bit QoS identifier sent on the read address channel for each read transaction.
但是AXI4协议并没有规定QoS的用法,也规定不了,因为这是一个系统全面考虑的特性。AXI4协议不可能规定某个master比如CPU必须是多少QoS,这和SoC的系统实现强相关,一般是架构师会定义。AXI4建议的QoS是AxQOS值越大,优先级约高;但是要注意的是,有些SoC恰恰相反,AxQOS值越大,优先级约低,所以要根据Spec来;
QoS信号的增加是随着越来越多的master对总线需求冲突越来越明显,系统带宽就那么多,那么如何给不同的IP分配不同的QoS就是一个架构师必备的功底,而且没有不变的规律可以遵守。
AXI4为了支持区域标识,增加了两个4-bits的区域标识符:
AWREGION region identifier sent on the write address channel for each write transaction
ARREGION region identifier sent on the read address channel for each read transaction.
区域标识符的使用意味着slave不必支持不同逻辑接口之间的地址解码。如果一个slave把内部可访问地址分为多个区域,那么一般情况下,只需要通过高位地址来区分不同的区域;如果采用了区域标识符,那么就不需要采用地址解码区分了。
另外,通过划分region,对某些physical allocation进行保护,例如某个region只能被non-secure write,某个region只能被secure write访问;这是一个可选的功能,一般用的比较少,而且ARM自己的CPU都很少支持。
AXI4协议去掉了WID信号,因此不再支持write interleaving。这是AXI4和AXI3的很重要和很大的一个改变。
Write interleaving的去除使得在WID信号上传递的信息是多余的。所有写入数据必须与相关的写入地址顺序相同,任何需要WID信息都可以从写入地址通道信号AWID中获得这些信息。
在AWID=0的数据还未发送完后,允许AWID=1的数据先发送;这样带来的代价是发送端必须要缓存多个ID的wdata,不管是maser还是总线interconnection都必须要增加大量的缓存,所以增加了面积;
另外,Write interleaving增加了系统总线设计的复杂度,而且很容易造成死锁,所以虽然AXI3支持Write interleaving,但是大家在设计的时候,master基本都没支持Write interleaving。所以AXI4就把Write interleaving的支持去掉了。
AXI4对Write response的产生做了更严格是限制。
AXI3必须等到了WVALID和WREADY后才能把BVALID置高来响应,也就是说只要收到了所有数据,SLAVE就可以发写响应。
AXI4规定,必须等到AWVALID,AWREADY,WVALID, WREADY, and WLAST 都为高(不是同一时刻都为高)后,SLAVE才能发BVALID进行写响应。也就是不仅仅要等数据通路,而且要等地址通路,并且明确了要等WLAST。这样能保证响应的时候Transaction是真正完成的。
AXI3对BVALID的规定其实是有漏洞的,可能Transaction还未真正完成就发送了写响应。AXI4的更新更加合理和严谨。
AXI4增加了user信号:
AWUSER Write address channel User signals.
ARUSER Read address channel User signals.
WUSER Write data channel User signals.
RUSER Read data channel User signals.
BUSER Write response channel User signals.
AMBA4中并未对USER信号做任何规定,只是建议不要使用这个信号,防止IP直接互联不兼容。但是实际soc中,这个信号使用的还是比较多的,用来传输sideband信号十分有用。AMBA5中进一步规定了USER信号的位宽:
所以说,这个信号在SOC内部使用比较多,但是如果要和外部互联,比如IP 厂商一般都不会使用,防止兼容性问题。
AXI4去掉了对locked transaction的支持,对信号的影响就是AxLOCK从AXI3的2-bits减少到了1bit:
如上图所示,AXI4去掉了Locked access。
为什么会去掉Locked access,这是因为Locked access不好用,当然这是废话。Locked access和Exclusive access的区别是作用的对象不同。
Locked access作用的对象是总线,一旦发生Locked access,那么其他的master都不能使用总线了,在一个复杂的SOC系统中,Locked access对系统的影响就太大了,万一发生Locked access的master出点啥问题,整个系统就挂死了。这种牺牲整个系统来成就某个master的机制当然就会被抵制,最后AXI4直接不再支持这种方式。
Exclusive access 作用的对象是对应的Slave,支持Exclusive access的Slave会在slave中实现一个Exclusive access monitor,如果monitor记录了能够访问的master,那么对应的master就能通过Exclusive access来访问,其他的未记录的Exclusive access就都不能访问。Exclusive access对总线系统是没有要求的,只是对slave做了特殊要求,即使出错也不会影响系统其他部分,最多访问失败而已。
现在一般的AXI master都不会支持Locked access,如果一个IP支持Locked access,大概率没人会买它了。对系统来说不仅实现麻烦,而且还存在挂死系统的风险。
AXI4的AWCACHE[3:0] 和ARCACHE[3:0]的含义较AXI3有很大的改变,如下图所示(括号内的是AXI3的编号):
AWCACHE[3:0] 和ARCACHE[3:0]的属性的改变主要是有用ARM CPU架构的演进,定义的memory属性越来约多,越来越复杂,所以对AWCACHE[3:0] 和ARCACHE[3:0]的解释就越来越多。这些和CPU的架构,还有CPU存储系统有很大的相关性,这里就不详细解释了,如果要深入理解,必须去学习ARM CPU V8架构才行。
AXI4相对于AXI3的另外一个改变就是定义了AXI-Lite协议。lite协议其实主要目的是简化protocol,用于系统上对register的访问,在实际工作中接触的比较少,这里就不详细解释了。
上面介绍了AXI3和AXI4的主要区别。实际SOC中,有些IP是AXI3接口的,有些IP是AXI4接口的,那么这些不同AXI版本之间的互联需要注意什么呢?可以分成下面两种情况:
AXI4 Master连接到AXI3 Slave要注意以下几点:
上面这些就是AXI3和AXI4互联的一些注意事项,在实际的工作中,很多IP都是AXI3兼容AXI4的,可以减少一些工作。否则就必须做AXI3和AXI4协议转换逻辑了。
1. 为什么有单独的写响应通道?
VALID/READY握手机制只允许一个方向的数据流,所以对于读事务,数据(data和resp)从slave流向master,而对于写事务,数据从master流向slave,所以就需要单独的响应通道。
同时,写回应信号的使用频率通常比写数据的使用频率要低,而读回应信号与读数据的使用频率是一样的。为什么呢?我们假设在写数据时,进行了一次突发式的传输,传输了16组数据,写回应只会在最后一个写数据时进行回应,前15组数据是不进行回应的。其原因是因为只有收到最后一组数据后,才能判断收到的写数据是完整的,写回应此时才有意义,写操作才有效。在这个例子中写回应的使用频率为1/16,如果突发传输的长度更大,使用频率将会更低。
而读传输在16组数据的读取过程中将会回应16次,读取每个数据过后均会进行读回应。其原因是读回应的目的是指示SLAVE的一些状态,SLAVE可能在前8个读取数据时状态为OKAY,而后8个数据状态为ERROR,且状态值为ERROR时并非是MASTER未访问到SLAVE,而是SLAVE由于自身的状态想要返回给MASTER一个ERROR的状态值。也就是说读回应本身也是SLAVE想要返回的一种状态量,回应是以突发包数据为单位的,而不是像写回应一样是以传输任务为单位的,因此使用频率为16/16,将读回应放在读数据通道是符合现实情况,且节省资源的。
2.为什么在burst 写中,不是每拍都有写响应。但是在burst 读中,每拍都有一个单独的读响应?
所有的AXI信道只在1个方向传递信息 ,所以才需要一个单独的写响应通道。在大多数应用中不管slave能不能接受完整的数据这个burst传输都会执行完成,slave无需在每一拍都返回ERROR响应
3. Exclusive 读写事务是什么?在哪里使用?
如果一个内存区域被多个master共享,某个master需要希望确保在没有其他master更改共享内存的情况下完成读然后写的序列,就可以使用Exclusive 传输
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。