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/10_software_runtime.md

4.7 KiB
Raw Blame History

软件运行时与测试程序技术说明

1. 软件职责

软件位于 sdk/software/examples/,负责构造输入、配置物理地址和寄存器、启动硬件、等待 完成、读取结果并与参考值比较。算法的高开销数据通路由硬件完成;软件保留参考实现和 诊断输出,用于区分计算错误、数据搬运错误和接口错误。

CPU 访问外设时使用 0xbfxx_xxxx 未缓存映射,DMA 描述符使用 0x1xxx_xxxx 物理地址。 软件缓冲区通过未缓存别名读写,避免数据缓存中的旧副本与 DMA 结果不一致。该地址转换是 驱动正确性的一部分,而不是性能优化细节。

软件指令在 cpu_clk 域执行,外设寄存器和 DMA 数据面主要位于 sys_clk 域,ML-KEM 核心位于 mlkem_clk 域。软件不直接处理相位关系,而是通过 AXI valid/ready、状态保持 和 W1C 完成语义与异步硬件交互。CPU 周期计数包含跨域 FIFO 和外设响应延迟。

2. DMA 驱动

dma.c/dma.h 将通道寄存器映射为 C 结构体。驱动先检查 busy,再写源地址、目的地址、 字节数和 tag,配置 32 位 beat 与 burst 长度后置位 start。dma_wait_polling 轮询 done, 完成后通过 W1C 清除状态。

FFT 驱动使用 AxLEN=15,即 16 beat burst;矩阵快速路径使用 AxLEN=63,即 64 beat 配置。 实际末 burst 长度由硬件按剩余字节裁剪。当前驱动遇到通道 busy 时直接返回,没有错误码; 轮询也没有软件超时。因此调用方必须保证通道所有权,正式运行时应增加返回值和超时处理。

3. 矩阵乘法评测程序

asm/user-sample.c 面向官方 5000 组评测。程序配置矩阵批处理序列器的源地址、目的地址、 组数和 stride,发送 MATMUL_START,启动硬件并轮询序列器 done。完成后读取矩阵加速器 CRC32,并以紧凑 UART 写入输出 CRC 和 MATMUL_DONE。

快速启动配置使用 start_matmul_fast.S 缩短通用 C 运行时初始化。UART 输出避免 printf 格式化开销,并按 FIFO 可用状态分段写入。设置 MATMUL_WRITEBACK_RESULTS=0 时,序列器 跳过 5000 组结果写回,但矩阵核心仍对全部 66 位结果更新 CRC。

官方计时从接收到 START 到接收到 DONE,因此软件启动顺序、串口发送和完成尾部均会进入 端到端时间。当前 regional 证据包含三次运行,中位数为 6.944404 ms,CRC 均匹配。该数据 不包含 test_1 中的后续优化。

4. FFT 测试程序

fft/main.c 通过 CPU 逐字写入 1024 个实部和虚部,启动 FFT,读回全部输出,再执行浮点 radix-2 DIT 软件参考。fft_dma/main.c 使用两个 DMA 通道搬入输入,计算完成后搬回输出。 两者都对 1024 个 bin 计算最大实部和虚部绝对误差,并以阈值 8 判定。

软件参考结果除以 1024,与硬件每级缩放后的输出尺度一致。当前 CPU 和 DMA 路径各有三份 板级日志,结果完全一致。硬件时间为端到端测量,CPU 路径包含 4096 次窗口读写,DMA 路径包含四次搬运,因此两者反映接口方案而非单独的 FFT 流水线周期。

5. ML-KEM 测试程序

mlkem_test/main.c 为每个安全等级分别构建和运行。当前源码通过 LEVELS 数组选择本次 编译的 K,区域赛证据中的 512、768、1024 来自三个独立程序,不是一个程序内并行执行。 每个程序使用固定 KAT count 0 输入,分别运行软件参考、CPU 寄存器路径和 DMA 窗口路径。

CPU 路径通过 PRE/RDB 接口逐字节装载和读取密钥、密文;DMA 路径通过 EK、DK、CT 窗口批量搬运。两条硬件路径均执行 KeyGen、Encaps 和 Decaps,并检查封装/解封共享密钥 一致性以及固定黄金值。每条路径重复 100 次,记录失败次数和平均 CPU 周期。

现有测试的重复输入用于稳定性和性能统计,不代表不同随机 KAT。程序未篡改密文触发负向 隐式拒绝,因此报告只能说明正常输入路径通过,不能把 RTL 中存在的拒绝逻辑表述为已完成 板级负向测试。

6. 构建与证据输出

报告工作流只编译 asm、fft、fft_dma、mlkem_test 和 mlkem_hello。FFT 与 ML-KEM 的通用 SoC 软件仿真耗时较长,当前功能数据采用板级 UART 日志。日志使用固定 机器可读字段,例如 FFT_RESULT、MLKEM*_FAILS、平均周期和完成标志,指标脚本从这些 字段聚合报告数据。

软件测试的通过条件包括算法结果、DMA 完成和输出标记,不能只依据程序返回。后续改动 寄存器布局、缓存属性、时钟频率或 UART 输出顺序时,必须同步更新驱动、测试判定和指标 解析脚本。