4.7 KiB
软件运行时与测试程序技术说明
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 输出顺序时,必须同步更新驱动、测试判定和指标 解析脚本。