AXI的burst操作不能跨越4K边界
- 因为AXI系统中,slave地址空间一般为4KB的整数倍,一个page大小也是4K。
如:32'ha100_1000, 32'ha100_2000,32'ha100_3000
- AXI协议会在读/写地址通道的开头发出addr/len/size等信息,若一笔burst跨越了A和B两个slave,则会只有A收到开头的addr/len/size等信息,B则收不到上述信息,从而造成burst无法完成。
AHB的burst操作不能跨越1K边界
- 因为AHB系统中,slave的最小的地址空间为1KB,即slave至少地址空间是1K,或者2K等。
如:32'ha100_1000,32'ha100_1400,32'ha100_1800,32'ha100_1c00
- ABH协议addr/len等信息是随着data一起发给slave的,若一笔burst跨越了A和B两个slave,可能造成对B的误写入引发错误。
处理越界的RTL代码
总线的master(如:DMA、CPU等)需要支持4K越界处理,基本思路就是把越界的transfer拆分成两笔非越界transfer
实现逻辑很简单,一共两步:越界检测、拆分传输。下面代码仅用于描述基本实现思路,具体问题需要具体的设计修改。
这个模块位于DMA和总线之前,接管对总线的请求,并根据情况做传输拆分。
计算首、末地址,末地址=首地址+len*数据位宽。上图中数据位宽为64bit(8byte),因此对len左移3位,即乘8
仅需判断首、末地址的第12bit是否相等,即可判断当前传输是否越界。
非越界传输,状态机一直处于IDLE;
越界传输,则拆分成BURST_FIRST和BURST_LAST
注:图中的burst_running信号是处理异常中断的,一般DMA中没有此信号,不用考虑
当4K越界发生时,DMA侧不需要知道实际对总线发起了两笔传输,仅给DMA侧返回一笔传输accept即可
接管总线,发起两笔传输即可
对于写传输,还要额外对burst做计数,需要在发完第一个拆分的burst后,再发第二笔拆分的busrt,如下所示: