4K边界:
是指12bit全为0的地址,如32’h00001000,32‘h00002000,32’h00003000等这些特殊的地址,这些地址均为4K边界。
4K边界对齐的最大原因是系统中定义一个page大小为4K bytes,为了更好的设定每个slave的访问attribute,就给一个slave划分4K空间,AXI协议中一次突发不能越过4K边界是为了避免一笔burst访问两个slave(每个slave都是4K空间),如果一次burst传输访问大于4K,则可能会造成地址从slave1增加到了slave2上,但是slave2又不响应,导致传输无法完成。
以32bit地址为例,[31:12]相等的地址都是同一个page,没有跨越4K边界。
例如:0x1000和0x1FFF,0x2000和0x2FFF,0x3000和0x3FFF则是在同一个page(同一个4K内部)没有跨越4K边界;
例如:0x1000和0x2000就是在不同的page,跨越了4K边界;
但是例如0x1FFF和0x2000,0x2FFF和0x3000,虽然他们是相邻的地址,但是他们却跨越了4K边界。
在axi协议中,支持的burst lenth为1,2,4,8,16,32,64,128,256,其均为2的幂次,若突发长度始终为以上的一种,则不会出现跨越4K边界的情况,但是如果突发长度不定,则有可能出现跨越4K边界的情况,例如第一次突发长度为1,数据位宽为16byte,则突发后的地址为16,当第二次突发len=255时候,则地址需要在16的基础上加4096,则为4112,此时就涉及到了跨越32‘b00001000(4096)这个4K边界的情况。
所以一般csr中通过axi配置寄存器,都选用4K(或者4K的倍数)作为slave的地址空间,且数据位宽都是4byte,寄存器的地址分配步长都是4(1K=1024空间能开出256个寄存器),一个地址对应1byte数据。
顺便附一份地址空间与addr位宽的表格:
1K | addr[9:0]——10bit | 000-3FF |
4K | addr[11:0]——12bit | 000-FFF |
8K | addr[12:0]——13bit | 0000-1FFF |
16K | addr[13:0]——14bit | 0000-3FFF |
32K | addr[14:0]——15bit | 0000-7FFF |
64K | addr[15:0]——16bit | 0000-FFFF |
128K | addr[16:0]——17bit | 0_0000-1_FFFF |
1M | addr[19:0]——20bit | 0_0000-F_FFFF |