文章目录
- AXI传输层级概念
- AXLEN[7:0]定义突发传输长度
- AXSIZE[2:0]定义突发传输transfer的位宽
- AXBURST[1:0]定义突发传输类型
- 4K边界
AXI传输层级概念
在手册的术语表中,与 AXI 传输相关的有三个概念,分别是 transfer(beat)、burst、transaction。用一句话串联就是:
在 AXI 传输事务(Transaction)中,数据以突发传输(Burst)的形式组织。一次突发传输中可以包含一至多个数据(Transfer)。每个 transfer 因为使用一个周期,又被称为一拍数据(Beat)。
再展开一层,两个 AXI 组件为了传输一组数据而进行的所有交互称为 AXI Transaction,AXI 传输事务(所以会有写事务和读事务),包括所有 5 个通道上的交互。
- AXI传输事务Transaction
- AXI突发 Burst
- AXI传输 Transfer / Beat(使用一个周期)
- AXI突发 Burst
AXI 是一个 burst-based 协议,AXI 传输事务中的数据传输以 burst 形式组织,称为 AXI Burst。每个传输事务包括一至多个 Burst。每个 Burst 中传输一至多个数据,每个数据传输称为 AXI Transfer。双方握手信号就绪后,每个周期完成一次数据传输,因此 AXI Transfer 又被称为 AXI beat,一拍数据。不严谨地说
AXI Transaction =M*AXI Burst ,M >= 1
AXI Burst = N * AXI Transfer(AXI beat) ,N >= 1
和上述概念相关的信号是AXLEN、AXSIZE、AXBURST。这三个信号均由主设备发出。
AXLEN[7:0]定义突发传输长度
表示一次突发传输(Burst)中包含的数据传输(transfer)数量。
协议中的 AxLen 信号从零开始表示,实际的长度值为 AxLen + 1。
突发传输长度在不同的模式(burst type ,将在后文中讨论)下有一些限制,包括:
- 对于 WRAP 模式,突发传输长度仅能为2,4,8,16
- 在一次突发传输中,地址不能跨越一个 4KB 分区
- 一次突发传输不能在完成所有数据传输前提前结束(early termination)
协议中多次强调,通信双方都不能在传输事务的所有 Transfer 完成前提前结束。哪怕发生错误,也得含泪走完整个传输事务的流程。
但是主机也有办法减少传输的数据。在写传输事务中,发送方可以通过置低所有的写有效位,使写数据无效。在读传输事务中,主机可以直接丢弃读取到的数据。
AXSIZE[2:0]定义突发传输transfer的位宽
表示每个周期传输数据的字节数/每拍传的数据位宽
每拍传的数据位宽 = 2 AXSIZE
AXBURST[1:0]定义突发传输类型
FIXED 类型中, burst 中所有数据都使用起始地址。该模式适合对某个固定地址进行多次数据更新,比如读写一个 fifo 时,读写地址就是固定的。
INCR 类型最为常用,后续数据的地址在初始地址的基础上进行递增,递增幅度与传输宽度相同。适合对于 RAM 等通过地址映射(mapped memory)的存储介质进行读写操作。
WRAP 类型比较特殊,首先根据起始地址得到绕回边界地址(wrap boundary)与最高地址。当前地址小于最高地址时,WRAP 与 INCR 类型完全相同,地址递增。但到递增后的地址到达最高地址后,地址直接回到绕回边界地址,再进行递增,就这样循环往复(通常用在cache的访问中)。最高地址由绕回边界地址计算得到:wrap boundary + (N_bytes x burst_len)
Wrap突发传输不支持AXI非对齐传输。
Wrap的特点:
- 起始地址必须与数据总大小对齐
- 突发传输长度仅能为2,4,8,16
数据总大小:一次突发中传输的数据总量 = 传输次数(AXLEN) * 单次传输大小(AXSIZE)
对齐:起始地址是数据总大小的整数倍
4K边界
要求一次AXI突发(Burst)传输不能跨越4K字节的地址边界,“4K边界”对应的是 低12bit为0的地址,例如32’h00001000, 32’h00002000…
4K对齐最大原因是系统中定义一个标准页大小是4K字节。这是因为许多系统中,物理内存被划分为4K字节大小的页。
如果一个突发跨越了4K边界,即从一个4K页面的末尾跳转到另一个页面的开始,那么它可能会尝试同时访问两个不同的slave设备,这会导致协议冲突和数据不一致性。(假如一个burst交易访问了两个slave A 和B(A在前B在后),那么只有A收到了地址和控制信息,而B不会收到地址和控制信息,因此只有A响应B并无响应,这就会导致此笔burst交易无法完成(B无法返回最后一笔transfer)。)
以32位地址为例,[31:12]相等的地址都是同一个page,没有跨4K边界。 即[11:0] 可以为0~0xFFF. 例如0x1000和0x2000就是在不同的page,跨了4K边界。0x1000和0x1FFF则是在同一个page,没有跨4K边界。同理,0x1FFF和0x2000则跨了4K边界,虽然他们是相邻的byte。 再说到一次burst没有4K大小,但是如果起始地址是0x1FFC, INCR模式,也会出现跨边界的情况。
参考文章:
https://blog.csdn.net/hit_shaoqi/article/details/53245521
https://zhuanlan.zhihu.com/p/46538028