本系列我想深入探寻 AXI4 总线。不过事情总是这样,不能我说想深入就深入。当前我对 AXI总线的理解尚谈不上深入。但我希望通过一系列文章,让读者能和我一起深入探寻 AXI4。
本篇文章我们将讨论有关 AXI 总线的突发传输机制( burst ),在 AXI 总线中的突发传输是指,在地址总线上进行一次地址传输后,进行多次数据传输( transfer,这个有点搞,突发传输 and 传输?)。第一次地址传输中的地址作为起始地址,根据突发传输类型的不同,后续数据的存储地址在起始地址的基础上递增(INCR 模式);或者首先递增,到达上限地址后回到起始地址,继续递增(WRAP 模式);又或者后续数据都将不断写入起始地址,刷新起始地址上的数据。(FIXED 模式)
AXI4 突发传输控制信号
突发传输的控制信息在地址通道上,随着第一次地址传输时写入,控制信息包括:
突发传输类型,在前文中提及,共有 3 种,分别为 FIXED,INCR 以及 WRAP。使用 2 位二进制表示。
FIXED 类型适合对某个固定地址进行数据更新,比如向一个 almost full 的 fifo 更新数据。
INCR 类型最为常用,后续的数据的存储地址在初始地址的基础上,以突发传输宽度进行递增,适合对于 RAM 等 mapped memory 存储介质进行读写操作。
WRAP 模式比较特殊,除了初始地址外,还有最高地址的界限。在最大地址以下,WRAP 与 INCR 类型完全相同,地址递增,但达到最高地址后,地址直接回到起始地址,再进行递增,就这样循环往复。数据手册上表示,WRAP 适合对 cache 的访问,我这方面经验还不多,不是很能理解这种模式的精妙之处。
突发传输长度 (burst length),突发传输长度是指在一次突发传输中所进行的传输(transfer)次数,在传输完初始地址后,进行的数据传输次数就是突发传输长度,假设数据位宽是 32 位,即进行 32 * N bit 的数据传输。在 AXI4 中,INCR 类型最大支持长度为 256,其他类型最大长度为 16。当然你的突发长度最少为 1,不然也就没有传输发生了。协议中的 burst length 从零开始,实际的长度值为长度字段加1。传输长度使用 8 位二进制表示。
突发传输长度有一些限制,包括:
- 对于 WRAP 模式,突发传输长度仅能为2,4,8,16
- 在一次突发传输中,地址不能跨越一个 4KB 分区
- 一次突发传输不能在未达到传输长度的情况下提前结束。
突发传输宽度(burst size),突发传输宽度是每指一次传输(transfer)中的最大数据宽度,突发传输数据宽度不能超过数据线本身的宽度。当数据线本身宽度大于突发传输宽度时,将根据协议的相关规定制定数据在部分数据线上传输。突发传输宽度共 3 个二进制位,表示为:
实例
接下来分别举一个突发写操作和读操作的例子来更好地讲解 AXI4 突发传输机制。主机为 DataMover IP,从机为 AXI4 形式接口的 RAM,数据总线宽度为 32 位。
从图片中可以看到,(黄色为写地址通道,绿色为写通道,灰色为写回复通道)我们首先在写地址总线上传输了一个地址,地址为 0x4 ,并在传输地址的同时传输了此次突发传输的控制信息:突发传输长度数值为 7,即每次突发传输写入 8 次数据,可以从图中看到,确实进行了 8 次数据传输。突发传输类型为 2 ,类型为 INCR,地址在初始地址 0x4 的基础上递增,第一次数据写入 0x4 ,第二次地址写入 0x5,因为我们的传输宽度为 0,即每次传输一个字节,共 8 位。
细心的朋友可能会问,每次传输 8 位,但为什么每次写入数据的宽度实际为 32 位,比如其中一个数据:0x07070707。实际上这是 AXI 突发传输的一个特性:当传输数据的宽度小于数据总线的宽度时,AXI 总线将不会拼接数据,而是直接使用部分数据线传输数据,多余的数据线将会屏蔽。表现为 WSTRB 参数以 0x01,0x02,0x04,0x08 的规律变化,相当于在32位总线上有效的字节分别是低地址第1,2,3,4个字节。
手册关于 WSTRB 与 WDATA 总线上字节有效的对应关系描述为: WSTRB[n] 对应 WDATA[8n+7:8n],也就是:当 WSTRB[n] 为 1 时,WDATA[8n+7:8n]有效。所以当 WSTRB 为 0x01,WSTRB [0] 为 1,即 WDATA[7:0] ,低地址第一字节有效,其他数据无效。
这类突发传输宽度小于数据总线的宽度被称为 Narrow transfer ,wdata 总线上只有一部分数据是有效的,具体可以参考下面手册上的图片,是一个 8bit 宽度数据在更宽的总线上传输的例子:
在进行此次突发传输的最后一次传输有效期间,置起 WLAST 信号,表示此次突发传输结束。
读操作和写操作有一些不同,但注意到下图中读操作的突发传输宽度为 8位,突发传输长度为 8,共读取 64 bit,但实际上数据是以32位的位宽,传输了两次,分为为0x05040302与0x09080706。这两个 32 位字被分别传输了 4 次。我们借此可以分析一下当突发传输位宽小于数据线宽度时 AXI 总线的特性,这方面手册着墨不多。
从从机的角度考虑,从起始地址 0x4 开始读取,因为数据总线为 32 位,读取到数据的为 4 个字节,分别是0x4,0x5,0x6,0x7 四个地址上的字节。从机会读取并传输 4 次,因为突发传输的宽度为 8 位,可见在突发传输宽度小于数据线宽度时,AXI 协议的实现会使用读取 32 位数据,重复发送的机制进行,需要主机根据突发传输宽度,自行读取对应的字节。相对应的,从机则不需要拥有自行筛选数据字节的能力,因为主机在进行写操作的同时,会送出WSTROBE 信号告知从机有效的字节。
灰色为读地址通道,绿色为读数据通道
目前,我还没有试过其他突发传输宽度和不对齐地址的情况,这点将在之后的文章中持续关注。
结语
AXI 作为一种总线,本身会有比较多的规定,这些规定可能本身也不过是规定,这里就不仔细展开了。本文主要介绍了突发传输的概念以及 AXI4 总线中与突发传输有关的信号,并举了一个 DataMover 与 AXI4 接口的 RAM 的通信过程作为例子,希望能帮助大家更好地理解 AXI4 总线。
修订记录
19.2.2 修正补充 WSTRB 与 WDATA 总线上字节有效的对应关系
更多AMBA协议相关文章请关注极术专栏Arm AMBA 协议集