4.8 KiB
通用 DMA 子系统技术说明
1. 功能与组成
DMA 子系统位于 rtl/ip/cdma/,对软件提供四个逻辑通道,对系统提供一个 32 位 AXI4
主端,并对矩阵乘法器提供 32 位本地 endpoint。当前顶层实例参数为 PORTS=4、
DATA_WIDTH=32、FIFO_DEPTH=64。源码中的“8 通道”实例名和注释是历史名称,实际
综合配置应以参数值四通道为准。
子系统由三部分组成。snix_axil_cdma_mux 实现通道寄存器、轮询仲裁、传输模式选择和
AXI 主端复用;snix_axi_mm2mm 实现普通内存到内存的 burst 搬运;本地 endpoint 状态机
实现内存与矩阵双 Bank 之间的数据传递。同步 FIFO 和 AXIS FIFO 用于隔离 AXI 读、写
通道的反压。
2. 软件接口
每个通道占用 0x40 字节,通道 n 的偏移基址为 n*0x40。
| 偏移 | 名称 | 说明 |
|---|---|---|
0x00 |
SRC_ADDR | 源物理地址 |
0x04 |
DST_ADDR | 目的物理地址 |
0x08 |
LENGTH | 传输字节数 |
0x0c |
TAG | 软件标记,硬件不解释 |
0x10 |
CTRL | bit 0 启动,bits 5:3 为 AxSIZE,bits 13:6 为 AxLEN |
0x14 |
STATUS | bit 0 busy,bit 1 done;done 采用 W1C |
0x18 |
MODE | 0 为 mem2mem,1 为 mem2ep,2 为 ep2mem |
0x1c |
EP_CFG | bits 3:0 Bank,bits 15:8 word offset,bits 19:16 endpoint ID |
通道处于 busy 时,源地址、目的地址、长度、模式和 endpoint 配置不再接受修改。新启动 请求会清除旧 done,硬件完成与软件 W1C 同周期发生时以硬件置位优先,避免丢失完成事件。 所有地址均为物理地址,长度以字节计。
3. 通道仲裁
snix_axil_cdma_mux 为四个通道维护独立的请求位和完成位,但共享一个实际搬运引擎。
仲裁器从 rr_ptr 开始循环检查待处理通道,选中后锁存 cur_ch,在 START 状态发出单拍
engine_start,在 RUN 状态等待对应引擎完成。完成后设置该通道 done,并将轮询指针
移动到下一通道。该结构保证长期存在的请求不会固定占用最低编号优先级。
共享引擎意味着四个通道可以独立排队,但不能同时占用 AXI 主端。多通道的主要收益是 减少软件串行配置依赖并提供公平排队,而不是形成四路并行 AXI 数据流。
4. 内存到内存路径
snix_axi_mm2mm 的控制状态依次为 IDLE、PREP1、PREP2、AR、READ、AW、WRITE 和
WAIT_BRESP。引擎先计算本次 burst 的实际长度,发出 INCR 读请求,将 R 通道数据写入
FIFO,再发出对应写请求并从 FIFO 驱动 W 通道。最后一个写响应返回后,若仍有剩余字节,
引擎更新源地址和目的地址并处理下一 burst。
读数据只在 READ 状态接收,写数据只在 WRITE 状态发送。该门控防止非活动状态下的
AXI beat 被误计数。末尾不足一个数据宽度时由 WSTRB 屏蔽无效字节。当前 SoC 数据宽度
为 32 bit,常用配置为 AxSIZE=2,即每 beat 4 字节。
5. 本地 endpoint 路径
mem2ep 模式从 AXI 地址读取数据,并逐字送往 ep_wr_valid/ready;ep2mem 模式通过
ep_rd_valid/ready 读取本地结果,再发出 AXI 写事务。endpoint 接口附带 endpoint ID、
Bank 号和字地址,因此无需把矩阵双 Bank 映射回 Crossbar,也避免每个 32 位字再次经过
从端地址译码。
矩阵批处理序列器还可通过 ext_rd_req_* 和 ext_wr_req_* 直接提交一次外部请求。这组
请求优先占用 AXI 主端,并在通用通道引擎空闲时接收。读请求完成后产生单拍
ext_rd_req_done,写请求在 B 响应返回后产生 ext_wr_req_done。该接口用于流水调度,
减少序列器重复写入通道 CSR 的延迟。
6. 复位与反压
当前集成的 DMA 通道寄存器、仲裁器、mem2mem 引擎、endpoint 引擎和 AXI 主端均工作在
sys_clk,内部不存在活动的异步时钟边界。仓库保留的 snix_async_fifo 未被当前
soc_top 层次实例化;实际数据 FIFO 为同一 SYS 域内的同步 FIFO。
所有控制状态、通道请求和完成位在 rst_n=0 时清零。AXI 与 endpoint 均遵循
valid/ready 规则:发送端在握手前保持数据和控制字段,接收端可通过 ready 插入反压。
目前 endpoint 只按 32 位数据宽度实现,字节数不是 4 的整数倍时不应使用该路径。
7. 验证方法与限制
DMA 验证至少应覆盖不同 burst 长度、末尾非满 beat、四通道公平性、R/W 反压、 mem2mem、mem2ep、ep2mem 和 W1C 竞态。当前板级 FFT DMA 和 ML-KEM DMA 测试证明了 普通外设窗口搬运路径,矩阵评测证明了外部请求与本地 endpoint 路径。当前实现未设置 总线超时和错误恢复状态,若 AXI 从端永久不响应,通道会保持 busy;因此系统集成时必须 保证目标地址有效,或在后续版本增加 watchdog 和错误码。