本文为转载内容,原文链接:深入 AXI4 总线(三)传输事务结构 - 知乎
读写数据结构
在 AXI 数据传输过程中,主要涉及到窄位宽数据传输(Narrow Transfer)、非对齐传输(Unaligned Transfer)以及混合大小端传输(mix-endianness)等问题。
(1)Narrow Transfer
当本次传输中数据位宽小于通道本身的数据位宽时,称为窄位宽数据传输,或者直接翻译成 窄传输。
在窄位宽写传输中,主机需要告知从机数据通道中哪些字节是有效的,需要使用到写数据通道中的 WSTRB 信号。WSTRB 信号中的单个 bit 置起,表示对应位置上的字节有效,对应关系为:
WSTRB[n] 对应 WDATA[8n+7:8n],也就是:当 WSTRB[n] 为 1 时,WDATA[8n+7:8n]有效。
WSTRB 信号比特位宽等于数据通道位宽的字节数量,比如 32bit 位宽的数据通道,对应 WSTRB 信号位宽为 4bit。
对应于下图的情况中,灰色的部分代表数据无效,第一次的传输中低地址第一字节有效,其他数据无效的 ,WSTRB 信号为 0x01,WSTRB [0] 为 1,即 WDATA[7:0] 有效。
图4
我们接着上图继续说,上图中的窄位宽传输有以下几个特点:
- burst 传输长度为 5
- burst 传输位宽为 8bit
- 起始地址为 0x0
- 数据总线位宽为 32bit
- 突发类型为 INCR
从图中我们发现,在每次数据传输中使用的数据总线字节位置(byte line)不同,尽管数据以字节为单位,分为多个周期传输,但是数据的位置仍与其地址对应。D[7:0]将写入起始地址 0x0,故位于最低字节。D[15:8] 将写入地址 0x1,故位于次低字节。
个人理解该设计的意义在于,当主机是因为从机或者其他客观条件限制,需要进行窄传输时,可以一次性将数据放置于数据总线上,只需在每次传输期间改变 WSTRB 信号即可。以上图为例,主机将 D[31:0] 防置于总线,在接下来的四个周期中,仅需对 WSTRB 进行移位,即可依次完成 4 个字节的传输。
该结构有利于 memory 类型的从机进行写入处理,这里设想一种实现方式,结合下图讲解,在 64bit 位宽的总线上进行 32bit 位宽传输,起始地址为 0x4 。此时假设存储介质位宽与总线位宽一致,为 64 bit。
在 transfer 1st 中,从机获取整个总线上的 64bit 数据存储至存储介质中,比如 DDR,并利用 wstrb 作为 mask 信号屏蔽无效的低 32 bit(比如 DDR 的 DQM 信号)。这时候存储介质的写入地址为 0x0,但实际只从地址 0x4 开始写入了 32bit 数据。在后续的 transfer 继续按以上模式工作。
窄传输中通过主机来调整有效数据的字节位置,以及给出字节有效信号 WSTRB,能够使从机无需进行数据重组等工作。
图5
注意:协议未规定窄传输中从机的具体实现,这里举了一个设想的例子,后续需要结合窄传输的用途再研究考证
在读传输中,从机的操作逻辑与写传输中的主机相同,但是从机没有类似 WSTRB 的信号。所以需要主机根据突发传输宽度与总线位宽,计算当前总线中有效数据所在字节位置,读取数据。
协议规定在 INCR 和 WRAP 模式中每次使用的 byte line 必须不同,即数据位置与地址对应。而在 FIXED 模式中,整个传输过程使用相同的 byte line(地址反正 FIXED 不会变)。
(2)Unaligned Transfer
AXI 协议支持地址非对齐的传输,允许突发传输的首字节地址,即起始地址与突发传输位宽不对齐。举个例子,总线位宽为 32bit 时,如果起始地址为 0x1002 ,则产生了非对齐现象。与 32bit 位宽总线对齐的地址需要能被 4 整除,即 ADDR[1:0] = 2'b0。
注意:此处对齐与否应该取决于突发传输的宽度,而不是总线位宽。
传输不对齐怎么办,在线等,挺急的。
对于非对齐传输,主机会进行两项操作:
- 即使起始地址非对齐,也保证所有传输是对齐的
- 在首个 transfer 中增加填充数据,将首次传输填充至对齐,填充数据使用 WSTRB 信号标记为无效
我们通过几个例子来说明主机具体的工作:
例子1,图6:
起始地址为 0x1,非对齐,但主机通过添加一字节的填充数据将 transfer 1st 的实际地址调整为对齐的 0x0,并用 WSTRB 信号为 4'b1110 标识出最低字节上无效的填充数据。
在读传输中,从机也按照同样的原则,在读数据中填充无效数据实现对齐,由主机自行分离。
再举一个例子,例子2,图7:
我们惊讶地发现这个例子是窄传输+非对齐传输,但问题不大,我们根据之前的经验来看下。首先起始地址为不对齐的 0x07 ,所以首先将首个传输填充至与突发传输位宽 32 bit 对齐:
0x07 mod 4(byte) = 3 byte
至此非对齐的问题就已经解决了。接下问题就简化为窄传输。图 7 中 32bit 数据在 64bit 总线上传输,根据我们上一节的分析(见图5),在 transfer 1st 中 再填充 4 个字节。后续的 transfer 中则遵从窄传输的原则即可。
(3)Byte Invarience
我们来讨论数据传输结构三个问题中的最后一个:混合的大小端模式。首先我们知道内存中有 2 种大小端模式,就像甜咸两党一样,争论的是宇宙的终极奥义问题:
数据的高字节是存在低地址中还是存在高地址中。
大端认为:高字节(MSB)应该存在低地址,而小端认为低字节(LSB)才应该存在低地址。
那么为了能够使大小端模式在存储中共存,AXI 协议设计了一种字节顺序恒定(Byte-invariant)的大小端传输方案。对于存储中包括多个字节的数据结构(单字节自然不存在大小端问题):
- 无论大小端模式,每个数据结构存储空间的分配方式是相同的
- 该数据结构按照其大小端模式决定字节存储的地址顺序
- 在传输过程中不考虑数据结构的大小端,按照字节原先存储的顺序,原样传输并存放至对端
该模式的意义在传输双方均不对数据结构的大小端进行解析转换,而严格按照字节的存储顺序进行传输并转存,防止大小端共存产生数据覆盖。