——————————————————————————————
版权声明:
本文作者:烓围玮未。主要从事ISP/MIPI/SOC/车规芯片设计/SOC架构设计
首发于知乎专栏:芯片设计进阶之路
微信公众号:芯片设计进阶之路(x_chip)
转发必须授权,同时保留这段声明,盗版必究!
——————————————————————————————
Narrow Burst (AXI 协议称为Narrow Transfer)虽然在实际的设计中使用的比较少,但是它对系统总线的设计却有比较大的影响,对应支持Narrow Burst的Master IP,系统一定要妥善的支持,否则就会导致功能不正确。所以对这个概念还是必须有非常准确的理解。下面我们总结一下Narrow Transfer。
AXI Burst
虽然ARM 把AMBA协议写的很精简,能不多说一个字就不浪费任何的单词,而且能不画图说明的一定不给你画图解释,但是协议的定义还是比较严谨和准确的。我们在理解概念的时候,还是以协议的原文为准,不懂就多读几次。
AXI通过AxBurst信号来区分,定义了三种burst类型,从AXI3~AXI5这个类型一直没变过:
FIXED:这种突发类型用于对同一位置的重复访问,例如加载或清空FIFO时。
在整个突发传输中,每个传输的地址都相同。
同一个burst内的每一个beats的byte lanes数目保持一致,但可以通过WSTRB选择每个beat的哪些byteLane是有效bytes。
Burst长度最多可以等于16。
注意:Fixed类型的burst基本只有一个应用场景,那就是FIFO的读写。另外,虽然AXI4增加了burst length的最大值,但是Fiexed的最大burst length并没有增加,仍然是16.
INCR: 这种突发类型中,每个传输的地址都是前一个传输地址的增量。
增量值取决于事务的大小。例如,对于一个4字节大小的对齐起始地址,每次传输的地址是前一个地址加4。
这种突发类型用于访问DDR等。
INCR类型的burst是最常见的burst。由于现代大部分SOC都是以DDR为中心的,所以很多master主要支持INCR类型的burst,其他的两种可能都不支持。
这里重点强调一下:AXI的transcation之间是独立的!
比如下这个读传输,burst=4,INCR类型:
请问,第一个绿色的transcation和第二个蓝色的transcation之间是什么关系?答案是:没有关系!
AXI的一个transcation就是一个独立的,完整的传输。Slave在接受到命令的时候,是不用依赖前一个或者后一个transcation信息就能完整处理当前transcation的所有操作。比如,你只发一个transcation,难道slave就不能接受吗?
所以:burst类型以transcation为边界的,也就是定义的是transcation内部的规则。
那么这里为什么transcation1和transcation2看起来这么连续,非常符合INCR连续递增的特点呢?这是因为实际使用中,单个transcation并不能传输完Master需要的数据,而Master需要的数据往往是一大块连续的地址,所以几个连续的transcation看起来地址是连续的,这和协议没有任何关系。
比如下面这种传输是不是INCR? 仍然是的,只是实际使用这么发的比较少而已。
WRAP:这种突发类型与INCR类似,但如果达到了一个上限地址,地址会回绕到一个较低的地址。
最低地址是对齐到要传输数据的总大小的,即大小 * 长度。这个地址被称为Wrap Boundary。
每次传输后,地址的增量与INCR突发相同。然而,如果这个增量后的地址是(包装边界 + (大小*长度)),那么地址会回绕到Wrap Boundary。
事务中的第一个传输可以使用高于Wrap Boundary的地址,但受到WRAP事务限制条件的约束。当第一个地址高于Wrap Boundary时,地址会回绕。
起始地址必须与每个transfer的大小对齐。
Burst的长度必须是2、4、8或16个传输。
以下是一些限制条件:
WRAP事务的行为如下:
这种Burst类型用于缓存行访问。
WARP类型属于三种里面最难理解的,首先是限制:
起始地址必须与每个transfer的大小对齐。transfer大小就是数据位宽,比如32bit就是4byte,地址都是按照byte为最小单位的。所以WRAP类型的起始地址和AXI位宽的对应关系如下:
AXI 位宽32bit -------------------------WRAP 起始地址对齐到4:0x0,0x4,0x8,0xc, 不能出现0x2,0x6这些;
AXI 位宽64bit -------------------------WRAP 起始地址对齐到8:0x0,0x8 不能出现0x2,0x4,0x6这些;
AXI 位宽128bit -----------------------WRAP 起始地址对齐到16:0x00,0x10,最低位不能出现非0地址;
AXI 位宽256bit -----------------------WRAP 起始地址对齐到32:0x00,0x20,0x20的倍数;
Burst长度不能是1, 只能是2,4,8,16其中一个。
而WRAP burst的应用场景主要就是Cache line的访问,所以一般都是带cache的CPU和GPU等IP来使用,其他的IP很少用到。
当发生cache miss时,从memory读回来的是整个cache line。如果不支持WRAP Burst那么就必须从cache line的起始地址开始读数据:
如上图,CPU需要的数据是D06,但是CPU不支持WRAP Burst,所以必须从D00开始读,那么如果CPU不支持乱序执行,那么CPU就必须停止执行,等D00~D05读完,拿到D06后再继续执行。这样对CPU的性能影响是非常大的。
如果支持WRAP Burst,就可以第一个访问D06,CPU继续执行,不会影响CPU性能。
WRAP地址的上下界的计算大家可以去看一下协议,很多文章说明过,这里就不展开了。
Narrow Transfer
AXI 协议定义的Narrow Transfer如下:
也就是如果传输的transfer的实际有些的数据位宽小于实际的data channel的位宽,则为Narrow Transfer。在Narrow Transfer中,AXI总线的某些数据位宽不会被使用,因此需要通过写使能信号(WSTRB)来指示哪些字节通道是有效的。
注意,只有写通道有STRB信号,也就是Narrow Transfer只是会发生在写通道。这也很好理解,读数据是slave返回的, 使用STRB信号并不会带来任何收益,需要的带宽不会减少,而且还需要增加一个信号,更好的方式是把数据都读回来,master需要用哪些自己来决定。
注意:WSTRB并不是Narrow transfer的充分必要条件,也就是说出现了WSTRB并不代表这个tranfer就是Narrow Transfer. 在非对齐的传输中,也会用到WSTRB,而且协议并没有规定WSTRB是连续的。
协议规定的Narrow Tansfer分为两种不同情况:
1.如果是INCR 或者 WRAP Burst,那么每个transfer(beat)使用不同的byteLane;
2.如果是FIXED Burst,那么每个transfer(beat)使用相同的byteLane;
如下图中起始地址是0,INCR Burst Len=5, 总线宽度是32bit,transfer是8bit,传输情况如下:
那么这种情况下,AWSIZE是多少呢?
可以看到,SIZE表明的是每个传输中最大的byte数,这里需要注意是最大。所以这里AWSIZE=0b00;
那么对于下面的BURST=2, 数据位宽是32bit的传输属于Narrow transfer吗?
显然这里不符合每个transfer(beat)使用不同的byteLane的条件,所以不是Narrow Transfer。这种传输在实际的Master里面还是比较常见的。
另外这里的AWSIZE=0b010 (4byte per transfer)
所以协议虽然没有明确说明,但是从协议的规定可以看到:
1.如果burst length =1,有WSTB就可以认为是Narrow transfer,也可以认为是非Narrow tranfer,对传输无影响,slave通过WSTB来解析数据就可以。
2.如果burst length >1,那么Narrow Transfer的burst的AWSIZE必须小于数据位宽能传输的最大byte数,也就是每个tranfer的数据量都必须小于数据通道的位宽才行,而且必须满足每个transfer(beat)使用不同的byteLane。
后记
技术很重要,技术背后的思想更重要!
技术背后的某些思想就是你解决以后问题的钥匙。我的文章可能一篇中知识点不太多,但是力求让你能深入理解,为你进阶打下基础。如果有一点点收获,也算是我对中国芯片行业的一点点贡献吧。
赠人玫瑰,手有余香。如果你有所收获,麻烦花一秒时间帮我点个赞和在看吧,谢谢!
知乎专栏:芯片设计进阶之路
微信公众号:芯片设计进阶之路 x_chip
——————————————————————————————