AXI4-Stream 与 DMA 数据流:TVALID/TREADY、TDATA 位宽与 TKEEP/TLAST
更新时间:2026-09-19。本文是流式总线专题。内存映射侧的五通道见 AXI4 完整协议,单拍流控基础见 valid/ready 握手;本篇讲无地址、连续传数据的 AXI4-Stream 及其与 DMA 的桥接。
本文要回答的问题
- Stream 和内存映射 AXI4 差在哪,为什么不要地址?
- TKEEP / TSTRB / TLAST / TID / TDEST 各管什么?
- 一个包(packet)的边界怎么表达,末拍不足整宽怎么办?
- Stream 数据怎么搬进内存?DMA 和 Scatter-Gather 在这里起什么作用?
一、只有数据,没有地址
AXI4-Stream(常简称 AXIS)定义一个单向数据流,核心信号:
| 信号 | 含义 |
|---|---|
| TVALID / TREADY | 源数据有效 / 目的能接收,同拍为 1 完成一次 transfer |
| TDATA | 数据净荷,位宽任意(8 的倍数,常见 8/32/64/128/512) |
| TKEEP | 哪些字节 lane 的内容有意义(拼包边界) |
| TSTRB | 哪些字节是「真实数据」vs「位置占位」(流式位置修饰) |
| TLAST | 标识一个包的最后一拍 |
| TID / TDEST / TUSER | 流标识 / 路由目的 / 用户侧带信息(如时间戳、SOF) |
因为数据流天然是「先进先出、单向有序」,不需要地址,所以协议比 AXI4 简单得多,面积和延迟都小。它的 transfer 规则就是标准 valid/ready:TVALID 举起自保持、数据不撤,TREADY 可随时反压。
二、包边界与部分拍:TLAST + TKEEP
数据常以「包」为单位(一个网络帧、一行视频、一个编码块)。TLAST 在该包最后一拍拉起,接收端据此分包。当包长不是 TDATA 位宽整数倍时,最后一拍只有部分字节有效,用 TKEEP 做字节掩码:例如 64 位(8 字节)接口末拍只有 3 字节有效,则 TKEEP=8'b0000_0111。
包长 19 字节、TDATA 64bit(8B/拍):
beat0: 8B keep=11111111
beat1: 8B keep=11111111
beat2: 3B keep=00000111, TLAST=1 ← 末拍部分有效并封包TSTRB 与 TKEEP 的细微区别:TSTRB=0 的字节是「该位置没有真实数据(插入的占位)」,TKEEP=0 的字节是「位置存在但内容无意义、接收端可丢弃」。多数纯数据通路只用 TKEEP。
三、TID/TDEST:在一条流上复用多路
一条 AXIS 物理链路可复用多条逻辑流:TDEST 表示路由目的(送往后级哪个处理单元),TID 区分同源不同会话。交换机/仲裁器依据它们做路由与保序——同 (TID,TDEST) 必须保序,不同流可仲裁交错,但单拍内不能混合两个流的字节。
四、Stream ↔ 内存映射:DMA 桥接
AXIS 只在模块间流动,数据最终要落内存或从内存取,这由 AXI DMA(或 AXI DataMover / 流桥) 完成:
内存 ──AXI4(MM2S, burst 读)──▶ DMA ──AXI4-Stream──▶ 处理流水线
内存 ◀─AXI4(S2MM, burst 写)── DMA ◀─AXI4-Stream── 处理流水线- MM2S(Memory-Mapped to Stream):DMA 用完整 AXI4 以 burst 从内存读数据(见 burst 类型),转成连续 AXIS 喂给加速器。
- S2MM(Stream to Memory-Mapped):把进来的 AXIS 打包成 burst 写回内存,依据 TLAST 关闭一个 buffer、推进描述符。
- 控制/状态寄存器走 AXI4-Lite(见 Lite 从机),软件下发 buffer 地址与长度。
Scatter-Gather(SG):当数据在物理内存不连续(多个分散 buffer)时,DMA 用一串「描述符」(每个含地址、长度、下一个指针、控制位)自动链式搬运,CPU 只需填好描述符环并启动,不必每包干预。描述符环设计见 DMA 描述符环,DMA 引擎微架构见 DMA 控制器。
五、位宽与时钟适配
- 上下游位宽不同时用 width converter:宽→窄拆拍、窄→宽拼包,结合 TKEEP 处理残拍,见 数据位宽适配器。
- 跨时钟用 AXIS 异步 FIFO,本质同 异步 FIFO 做 CDC。
- 时钟使能/降速用窄脉冲或 TKEEP 稀疏有效。
六、常见的坑
- 末拍不拉 TLAST:S2MM 无法封包,buffer 长度错乱、描述符不推进。
- TKEEP 与实际字节数不符:下游按全宽解析,读到垃圾字节或丢尾。
- TVALID 等 TREADY:违反「valid 不依赖 ready」铁律,反压时死锁。
- 位宽适配丢弃残拍:窄→宽拼包时没保留 TKEEP,包尾被填平或截断。
- DMA 描述符没按 cache 维护:CPU 写的描述符还留着 cache、DMA 读到旧值;描述符环应置 non-cacheable 或软件做 cache clean/invalidate。
- 反压无深度:源不能停却接了可反压输入,丢数据;源端要能停或中间加 FIFO。
相关与延伸
握手地基见 valid/ready 握手;内存侧见 AXI4 完整协议 与 burst 类型;DMA 细节见 DMA 控制器微架构 与 描述符环;拆包拼包见 位宽适配器。
总结
AXI4-Stream 砍掉地址只保留 TVALID/TREADY/TDATA,专做单向连续数据流:TLAST 划包边界、TKEEP 处理末拍残字节、TID/TDEST 复用多路;经 AXI DMA 在 Stream 与内存映射 burst 之间互转,物理不连续的数据靠 Scatter-Gather 描述符环自动搬运。