update system design report
This commit is contained in:
74
doc/reports/system/modules/10_software_runtime.md
Normal file
74
doc/reports/system/modules/10_software_runtime.md
Normal file
@@ -0,0 +1,74 @@
|
||||
# 软件运行时与测试程序技术说明
|
||||
|
||||
## 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 输出顺序时,必须同步更新驱动、测试判定和指标
|
||||
解析脚本。
|
||||
Reference in New Issue
Block a user