This repository has been archived on 2026-08-21. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
ciciec2026/doc/reports/system/modules/02_dma_subsystem.md

4.8 KiB
Raw Blame History

通用 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 和错误码。