由AXI_MASTER源码而来的AXI 4k边界学习。
- AXI中一次突发不能越过4k边界,4k = 2^12,以32位计算机系统为例,其以32位来表示内存地址,因此像32'h00001000,32'h00002000,32'h00003000这样的地址都称为4k边界,原因是计算机系统中定义一个page大小为4k Byte,为了更好地设定每个slave的访问属性,就给每个slave划分4k Byte空间,而计算机系统一个地址的容量为1 Byte,因此一个slave的地址总量为4k。如果一次burst传输访问两个slave,则可能会造成地址从slave1增加到了slave2上,而slave2不响应,导致传输无法完成。
- 在一次burst transaction中,有若干次burst传输,每次burst传输的地址逐渐累加。
- AXI的4K边界是指任意一次burst传输都不能跨过4K边界的地址;由此可得到任意一次burst传输的最大burst length = 4K / (2^AXSIZE);但是AXI4协议规定burst length最大只能为2^8,即若AXSIZE=2,其最大burst length不是2^10,而仍是2^8。
- 一次burst transaction的每个burst传输的burst length可以是固定的,也可以是不固定的。
一次burst transaction从地址0开始,那么4096*N这些地址便是4K边界地址,(4K=4*2^10=4096)
假设AXSIZE=4,那么每个transfer的宽度为2^4 Byte,
当burst length固定为100时:
第一次burst传输,地址从0 到1599;(0+100*2^4-1)
第二次burst传输,地址从1600 到3199;
第三次burst传输,地址从3200 到4799;
……
第三次burst传输跨过了4K边界。
- 如何避免出现4K边界问题:
- 当burst length固定,使每次burst传输的地址偏移量能被4096整除:即burst length * 2 ^ AXSIZE 能被4K整除
例如,AXSIZE仍为4,burst length固定为2^9,
第一次burst传输,地址从0 到2047;(0+2^9*4-1)
第二次burst传输,地址从2048到4095;
没有跨过4K边界。
- 当burst length不固定,可以给每一次burst传输分别不同的4k地址区间:
例如,AXSIZE仍为4,
第一次burst传输burst length为100,地址从0到1599;
第二次burst传输burst length为200,地址直接从4096开始,到4096+200*2^4-1;
第三次burst传输burst length为256,地址直接从8191开始,到8192+256*2^4-1;
没有跨过4K边界。
所以以下代码对应当burst length固定,使每次burst传输的地址偏移量能被4096整除的情况:
地址的偏移量即一次burst传输的最大BYTE数= 2^12/(burst length*2^AXSIZE),
对其求以2为底的对数即为每次偏移量的最大BYTE数计数信号位宽
= clogb2(2^12/(burst length*2^AXSIZE))
=12-clogb2(burst length*2^AXSIZE)。
// Burst length for transactions, in C_M_AXI_DATA_WIDTHs.
// Non-2^n lengths will eventually cause bursts across 4K address boundaries.
localparam integer C_MASTER_LENGTH = 12;
// total number of burst transfers is master length divided by burst length and burst size
localparam integer C_NO_BURSTS_REQ = C_MASTER_LENGTH-clogb2((C_M_AXI_BURST_LEN*C_M_AXI_DATA_WIDTH/8)-1);