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/mlkem_ip_design_report.tex

787 lines
51 KiB
TeX
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
\documentclass[11pt,a4paper,twoside]{article}
% ─── Packages ────────────────────────────────────────────────
\usepackage{ctex}
\usepackage[top=2.5cm, bottom=2.5cm, left=2.8cm, right=2.8cm]{geometry}
\usepackage{graphicx}
\usepackage{float}
\usepackage{booktabs}
\usepackage{longtable}
\usepackage{multirow}
\usepackage{array}
\usepackage{amsmath,amssymb}
\usepackage{hyperref}
\usepackage{caption}
\usepackage{subcaption}
\usepackage{fancyhdr}
\usepackage{tikz}
\usepackage{enumitem}
\usepackage[normalem]{ulem}
\usepackage{listings}
\usepackage{xcolor}
\usepackage{algorithm}
\usepackage{algpseudocode}
% ─── Styling ─────────────────────────────────────────────────
\raggedbottom
\hypersetup{colorlinks=true,linkcolor=black,citecolor=black,urlcolor=blue}
\pagestyle{fancy}
\fancyhead[LO,RE]{ML-KEM硬件IP设计报告}
\fancyhead[RO,LE]{\thepage}
\fancyfoot[C]{}
\setlength{\parskip}{4pt plus 2pt minus 1pt}
\setlength{\parindent}{2em}
\setlength{\headheight}{14pt}
\setlength{\intextsep}{6pt plus 2pt}
\setlength{\textfloatsep}{8pt plus 2pt}
\captionsetup{skip=4pt}
\lstset{basicstyle=\ttfamily\small,breaklines=true,frame=single,numbers=left,numberstyle=\tiny,xleftmargin=2em,language=Verilog}
\newcommand{\Zq}{\mathbb{Z}_q}
\newcommand{\etal}{\textit{et al.}}
\title{\textbf{ML-KEM后量子密钥封装硬件IP核\\设计与验证}}
\author{碳基生物\\[4pt] \small 团队编号:CICC1008439\\[8pt] \normalsize 龙芯中科杯·2026全国大学生集成电路创新创业大赛}
\date{}
\begin{document}
% ================================================================
% 封 面
% ================================================================
\begin{titlepage}
\thispagestyle{empty}
\begin{center}
\vspace*{30pt}
\includegraphics[width=0.45\textwidth]{logo_cicc.png}
\vspace{36pt}
{\fontsize{22pt}{28pt}\selectfont\bfseries 第十届}
\vspace{4pt}
{\fontsize{22pt}{28pt}\selectfont\bfseries 全国大学生集成电路创新创业大赛}
\end{center}
\vspace{80pt}
\begin{flushleft}
\fontsize{14pt}{22pt}\selectfont
报告类型:\uline{\hfill MLKEM IP设计报告\hfill} \\[18pt]
参赛杯赛:\uline{\hfill 龙芯中科杯\hfill} \\[18pt]
作品名称:\uline{\hfill ML-KEM后量子密钥封装硬件IP核设计与验证\hfill} \\[18pt]
队伍编号:\uline{\hfill CICC1008439\hfill} \\[18pt]
团队名称:\uline{\hfill 碳基生物\hfill}
\end{flushleft}
\end{titlepage}
\maketitle
\tableofcontents
\newpage
% ================================================================
\section{绪论}
\subsection{设计背景}
ML-KEM(Module-Lattice-based Key-Encapsulation Mechanism,FIPS 203 \cite{fips203})是NIST于2024年8月发布的后量子密码标准,源自CRYSTALS-Kyber \cite{kyber},用于替代RSA和ECC在密钥交换中的角色。其安全性建立在模格上的带误差学习问题(MLWE)之上,多项式环为$\Zq[x]/(x^{256}+1)$,素数模$q=3329$,多项式次数$n=256$。
软件实现的ML-KEM在嵌入式处理器上存在显著性能瓶颈 \cite{dang2022,xing2023}——以ML-KEM-768为例,一轮完整的密钥生成、封装和解封装在通用CPU上需要数百万个时钟周期。本文设计的硬件IP核\texttt{mlkem\_top}旨在通过专用数据通路和计算资源时分复用,在FPGA平台上实现高性能、低面积的ML-KEM加速。
\subsection{关键设计特性}
本IP核在单一硬件模块内具有以下特性:
\begin{enumerate}[label=(\arabic*)]
\item \textbf{运行时三等级支持}:通过$k\_i\in\{2,3,4\}$端口在运行时选择ML-KEM-512/768/1024安全等级,存储资源按$K_{MAX}=4$静态分配,无需重综合。
\item \textbf{全操作覆盖}:支持KeyGen(FIPS 203算法16)、Encaps(算法17)和Decaps(算法18,含FO变换隐式拒绝)。
\item \textbf{Keccak核跨阶段复用}:单一\texttt{keccak\_core}实例在G/H/J哈希、SampleNTT采样和CBD采样三个消费者之间时分复用,是面积优化的最大贡献因素。
\item \textbf{Decaps重加密路径复用}:D6步的K-PKE重加密直接复用整条Encaps流水线的全部FSM状态,避免重复实现加密数据通路。
\item \textbf{逐字节流式I/O}:公钥$ek$、私钥$dk$和密文$c$通过BRAM窗口逐字节装载与回读,免去超宽顶层总线。
\item \textbf{NIST KAT完全验证}:三种等级、三种操作全部逐字节比对NIST FIPS 203 KAT标准答案通过。
\end{enumerate}
\subsection{代码规模}
RTL代码总计约5,517行(不含测试平台),其中\texttt{mlkem\_top.v}(顶层FSM集成+数据通路+三库存储管理)约2,264行,各叶子算子模块合计约3,253行。全部采用SystemVerilog编写,统一使用\texttt{valid/ready}流式握手接口。
% ================================================================
\section{IP模块规格}
\subsection{算法参数}
\texttt{mlkem\_top}的运行时参数由输入端口$k\_i$和$op\_i$在\texttt{start\_i}脉冲时刻锁存至内部寄存器$k\_r$和$op\_r$,后续所有数据通路宽度、存储子区间基地址和循环次数均由$k\_r$推导。表\ref{tab:params}列出三种安全等级的密钥和密文尺寸。
\begin{table}[htbp]
\centering
\caption{运行时安全等级参数}
\label{tab:params}
\begin{tabular}{cccccccc}
\toprule
$k\_i$ & 方案 & $K$ & $\eta_1$ & $(d_u,d_v)$ & ek(B) & dk(B) & ct(B) \\
\midrule
2 & ML-KEM-512 & 2 & 3 & (10,4) & 800 & 1632 & 768 \\
3 & ML-KEM-768 & 3 & 2 & (10,4) & 1184 & 2400 & 1088 \\
4 & ML-KEM-1024 & 4 & 2 & (11,5) & 1568 & 3168 & 1568 \\
\bottomrule
\end{tabular}
\end{table}
固定参数:模数$q=3329$、多项式次数$n=256$、$\eta_2=2$(所有等级)、共享密钥32字节。
\subsection{顶层端口信号}
\texttt{mlkem\_top}的端口按功能分为四组。表\ref{tab:ports}列出主要信号。
\begin{table}[htbp]
\centering
\caption{mlkem\_top主要端口}
\label{tab:ports}
\small
\begin{tabular}{lll}
\toprule
\textbf{信号} & \textbf{位宽} & \textbf{功能} \\
\midrule
clk, rst\_n & 1, 1 & 时钟与低电平异步复位 \\
k\_i, op\_i & 3, 2 & 安全等级(2/3/4)与操作码(0=KG, 1=Enc, 2=Dec) \\
d\_i, z\_i, msg\_i & 256×3 & KeyGen种子$d$、隐式拒绝种子$z$、Encaps消息$m$ \\
start\_i & 1 & 启动脉冲,锁存$k\_i$和$op\_i$ \\
busy\_o, done\_o & 1, 1 & 运行标志与完成脉冲 \\
ss\_o & 256 & 共享密钥输出(done\_o时有效) \\
ek\_in\_we/addr/byte & 1,11,8 & Encaps公钥流式预装载 \\
dk\_in\_we/addr/byte & 1,12,8 & Decaps私钥流式预装载(自动路由至dkp\_bram/ek\_bram/寄存器) \\
c\_in\_we/addr/byte & 1,11,8 & Decaps密文流式预装载 \\
dbg\_* & 多种 & 调试抽头:系数、ek/dk/ct字节、中间哈希值 \\
\bottomrule
\end{tabular}
\end{table}
握手协议分三阶段:\texttt{ST\_IDLE}状态下通过流式端口逐字节预装载数据;\texttt{start\_i}脉冲启动并锁存参数;\texttt{busy\_o}拉高期间执行计算;\texttt{done\_o}脉冲时\texttt{ss\_o}和BRAM产物有效。所有256-bit端口采用字节0在低位的约定。
Decaps私钥预装载路径中,\texttt{dk\_in\_*}端口根据写入地址自动将字节流路由至不同目的地:地址$[0,384K)$写入\texttt{dkp\_bram}($\hat{s}$编码),$[384K,768K+32)$写入\texttt{ek\_bram}($\hat{t}$编码$\|\rho$),$[768K+32,768K+64)$和$[768K+64,768K+96)$分别写入$H(ek)$和$z$的寄存器。
% ================================================================
\section{总体架构设计}
\subsection{设计原则}
\texttt{mlkem\_top}的架构遵循三条核心原则。
\textbf{原则一:存储按最大等级分配,运行时参数递推。} 多项式系数存储库以$K_{MAX}=4$(可容纳28个多项式,每个256系数)静态配置深度,$k\_r$仅影响读写地址生成逻辑中的基地址和循环边界。字节存储库(ek\_bram、dkp\_bram、ct\_bram)同样按最大密钥尺寸(1568/1536/1568字节)分配。运行时地址计算通过少量组合逻辑完成,无动态内存分配开销。
\textbf{原则二:Keccak核全阶段时分复用。} Keccak-f[1600]置换是设计中面积最大的单一算子(OOC综合约5,300 LUT)。G/H/J哈希族、SampleNTT(SHAKE-128)和CBD(SHAKE-256)三个消费者处于互斥的FSM阶段,设计将所有Keccak请求复用至单一\texttt{keccak\_core}实例。输入侧通过\texttt{sel\_sha3/sel\_snt/sel\_cbd}多路选择器切换,输出侧将置换结果广播至全体消费者,仅当前激活阶段采样有效信号。
\textbf{原则三:Decaps重加密完全复用Encaps流水线。} FIPS 203算法18的D6步需要以恢复的消息$m'$和随机种子$r'$重新执行一次K-PKE加密以产生参考密文$c'$。这一流程与算法17的Encaps操作的数据通路完全同构。设计将$m'$和$r'$分别写入原有的$m\_r$和$r\_r$寄存器,\texttt{ek\_bram}中保持原始公钥$ek$不变,随后将FSM直接转移至Encaps流水线的首个状态\texttt{ENC\_LOAD},整条15状态的Encaps数据通路被完整复用。
\subsection{模块层次结构}
图\ref{fig:mlkem_modules}给出\texttt{mlkem\_top}的内部层次结构。设计分为三个逻辑层:控制调度层(FSM + 地址生成 + 数据通路复用)、算子计算层(7个已验证的叶子模块)和存储层(7个BRAM实例)。
\begin{figure}[htbp]
\centering
\includegraphics[width=0.92\textwidth]{mlkem_modules.png}
\caption{mlkem\_top内部三层模块结构}
\label{fig:mlkem_modules}
\end{figure}
\subsection{顶层FSM调度}
全部运算由5-bit状态机集中调度,从\texttt{ST\_IDLE}出发按$op\_r$分支为三条数据通路。图\ref{fig:fsm}给出状态转移图。
\begin{figure}[htbp]
\centering
\includegraphics[width=0.92\textwidth]{fsm.png}
\caption{mlkem\_top顶层FSM状态转移图}
\label{fig:fsm}
\end{figure}
KeyGen路径对应FIPS 203算法16,共7个主状态(不含ST\_IDLE和ST\_DONE)。各状态间的数据传递通过多项式存储库完成:前序状态将结果写入BRAM,后续状态从BRAM读取。
\begin{algorithm}[H]
\caption{KeyGen数据通路(FIPS 203算法16)}
\begin{algorithmic}[1]
\State \textbf{ST\_G}:$G(d \| K) \rightarrow (\rho, \sigma)$,单块SHA3-512,约1,800周期
\State \textbf{ST\_A}:对全部$K^2$个$(j,i)$索引执行SampleNTT$(\rho \| j \| i) \rightarrow \hat{A}[i][j]$,逐系数写入\texttt{bank\_a}
\State \textbf{ST\_C}:CBD$_{\eta_1}(\sigma, i) \rightarrow s[i]$,CBD$_{\eta_1}(\sigma, K+i) \rightarrow e[i]$,写入\texttt{bank\_se}
\State \textbf{ST\_N}:NTT$(s[i]) \rightarrow \hat{s}[i]$,NTT$(e[i]) \rightarrow \hat{e}[i]$,原位更新\texttt{bank\_se}
\State \textbf{ST\_M}:$\hat{t}[i] = \hat{e}[i] + \sum_{j=0}^{K-1} \hat{A}[i][j] \circ \hat{s}[j]$,逐点乘通过\texttt{poly\_mul\_sync},累加写入\texttt{bank\_t}
\State \textbf{ST\_E}:byteEncode$_{12}(\hat{t}) \| \rho \rightarrow ek$,byteEncode$_{12}(\hat{s}) \rightarrow dk_{pke}$,写入\texttt{ek\_bram}和\texttt{dkp\_bram}
\State \textbf{ST\_H}:SHA3-256$(ek) \rightarrow H(ek)$,多块吸收(块数$=\lceil(ek\_bytes+1)/136\rceil$)
\end{algorithmic}
\end{algorithm}
Encaps路径对应FIPS 203算法17,共12个主状态。
\begin{algorithm}[H]
\caption{Encaps数据通路(FIPS 203算法17)}
\begin{algorithmic}[1]
\State \textbf{ST\_ENC\_H}:SHA3-256$(ek) \rightarrow H(ek)$
\State \textbf{ST\_ENC\_G}:$G(m \| H(ek)) \rightarrow (K, r)$,单块SHA3-512
\State \textbf{ST\_ENC\_A}:重新生成$\hat{A}^T$矩阵(SampleNTT,行列索引交换),写入\texttt{bank\_a}
\State \textbf{ST\_ENC\_TDEC}:byteDecode$_{12}(ek) \rightarrow \hat{t}[i]$,逐系数解码至\texttt{bank\_a}
\State \textbf{ST\_ENC\_C}:CBD$_{\eta_1}(r, 0) \rightarrow y$,CBD$_{\eta_2}(r, K) \rightarrow e_1$,CBD$_{\eta_2}(r, 2K) \rightarrow e_2$,写入\texttt{bank\_se}和\texttt{bank\_t}
\State \textbf{ST\_ENC\_N}:NTT$(y) \rightarrow \hat{y}$,原位更新\texttt{bank\_se}
\State \textbf{ST\_ENC\_U}:$\hat{A}^T \circ \hat{y}$逐点乘后INTT,再加$e_1$得$u$,写入\texttt{bank\_se}
\State \textbf{ST\_ENC\_C1}:Compress$_{d_u}(u)$后byteEncode$_{d_u} \rightarrow c_1$字节,写入\texttt{ct\_bram}
\State \textbf{ST\_ENC\_E2MV}:将$e_2$从\texttt{bank\_t}搬迁至\texttt{bank\_a},为V步累加准备
\State \textbf{ST\_ENC\_V}:$\hat{t} \circ \hat{y}$逐点乘后INTT,加$e_2$和Decompress$_1(m)$得$v$,写入\texttt{bank\_t}
\State \textbf{ST\_ENC\_C2}:Compress$_{d_v}(v)$后byteEncode$_{d_v} \rightarrow c_2$字节,拼接至\texttt{ct\_bram}
\State \textbf{输出}:$ss = K$
\end{algorithmic}
\end{algorithm}
Decaps路径对应FIPS 203算法18,前5个主状态完成D1--D5步解密恢复,随后复用整条Encaps流水线(D6重加密),最后以一个比较状态(D7)完成隐式拒绝密钥选择。这是硬件设计中最复杂的控制流,也是Decaps流水线复用创新的集中体现。
\begin{algorithm}[H]
\caption{Decaps数据通路(FIPS 203算法18,含流水线复用)}
\begin{algorithmic}[1]
\State \textbf{ST\_DEC\_DECOMP}(D1):byteDecode$_{d_u}(c_1) \rightarrow$ Decompress$_{d_u} \rightarrow u'$,byteDecode$_{d_v}(c_2) \rightarrow$ Decompress$_{d_v} \rightarrow v'$,写入\texttt{bank\_se}和\texttt{bank\_a}
\State \textbf{ST\_DEC\_SDEC}(D2):byteDecode$_{12}(dk_{pke}) \rightarrow \hat{s}[i]$,逐系数解码至\texttt{bank\_a}
\State \textbf{ST\_DEC\_NTT}(D2续):NTT$(u'[i]) \rightarrow \hat{u}[i]$,原位更新\texttt{bank\_se}
\State \textbf{ST\_DEC\_W}(D3):$\hat{s}[j] \circ \hat{u}[j]$逐点乘后INTT,$v'$减去累加和得$w$,写入\texttt{bank\_t}
\State \textbf{ST\_DEC\_MENC}(D4):Compress$_1(w)$后byteEncode$_1 \rightarrow m'$
\State \textbf{ST\_DEC\_G}(D5):$G(m' \| H(ek)) \rightarrow (K', r')$
\State \textbf{ST\_DEC\_J}(D5续):$J(z \| c) \rightarrow \bar{K}$(隐式拒绝备用密钥)
\State \textbf{流水线复用}(D6):将$m'$写入$m\_r$、$r'$写入$r\_r$,跳转至\textbf{ST\_ENC\_LOAD},完整复用Encaps路径全部12个状态,产生参考密文$c'$(存入\texttt{ct\_bram})
\State \textbf{ST\_DEC\_CMP}(D7):逐字节比较$c'$(\texttt{ct\_bram})与原始$c$(\texttt{c\_in\_bram}),常量时间无早退;$c' = c$时输出$K'$,否则输出$\bar{K}$
\end{algorithmic}
\end{algorithm}
% ================================================================
\section{各功能模块数据通路与控制逻辑}
\subsection{Keccak-f[1600]置换核与哈希族}
\texttt{keccak\_core}模块实现24轮连续Keccak-f[1600]置换,内部结构为简单的迭代流水线:1600-bit状态寄存器$\rightarrow$组合\texttt{keccak\_round}$\rightarrow$写回状态寄存器。\texttt{keccak\_round}为纯组合逻辑,实现Keccak \cite{fips202} 的$\theta/\rho/\pi/\chi/\iota$五步映射,其中$\theta$步的5路XOR归约和$\chi$步的非线性变换是面积消耗的主要来源。
\begin{figure}[htbp]
\centering
\includegraphics[width=0.92\textwidth]{keccak_core.png}
\caption{Keccak-f[1600]核数据通路与共享机制}
\label{fig:keccak_core}
\end{figure}
\texttt{sha3\_top\_shared}模块在\texttt{keccak\_core}之上封装了SHA3/SHAKE协议层,包括1088-bit速率域/512-bit容量域的填充、domain separator拼接(SHA3末尾\texttt{01}、SHAKE末尾\texttt{1111})以及多块顺序吸收的状态管理。支持三种模式:SHA3-512($G$函数,单块64字节吸收)、SHA3-256($H$函数,多块吸收,块数$=\lceil(ek\_bytes+1)/136\rceil$)和SHAKE-256($J$函数和PRF派生)。
\textbf{共享Keccak的复用机制}通过两级多路选择实现。输入侧:三个消费者的1600-bit状态和\texttt{valid}信号经\texttt{sel\_*}信号选择后送入\texttt{keccak\_core};选择信号由FSM状态直接推导(例如\texttt{sel\_snt = (st==ST\_A || st==ST\_ENC\_A)})。输出侧:\texttt{keccak\_core}的置换结果和\texttt{valid\_o}广播至所有消费者,各消费者内部仅在自己激活的上下文中采样,天然实现了无冲突分派。此复用方案将Keccak的硬件开销从三份实例(约16,000 LUT)降至一份(约5,300 LUT)。
\subsection{NTT核}
\texttt{ntt\_core}模块实现256点前向/逆向数论变换,采用单蝶形流水线加256$\times$12-bit寄存器阵列的架构。图\ref{fig:ntt_core}给出数据通路与控制状态机。
\begin{figure}[htbp]
\centering
% [IMAGE_PROMPT: Data path diagram for ntt_core. Left side: 256-entry × 12-bit coefficient register file (cr[0..255]). A read mux selects cr[j] and cr[j+layer_len] based on the current butterfly pair address. These feed a pipelined butterfly unit (butterfly_unit_pipe, 7-stage pipeline) which computes a_out = a + zeta*b mod Q, b_out = a - zeta*b mod Q using a pipelined Barrett multiplier inside. Zeta comes from zeta_rom (128 entries × 12-bit). The butterfly output a_out/b_out go through an 8-stage writeback delay line (wa_d0..wa_d7, wb_d0..wb_d7) that matches pipeline depth, then write back to cr[wa] and cr[wb]. At bottom, control FSM states: S_IDLE → S_LOAD (256 cycles) → S_CMP_RUN (issue all butterflies for current layer, 128 pairs) → S_CMP_DRAIN (wait for pipeline flush) → repeat 7 layers → S_OUT_PREP → S_OUT_SCALE (for inverse NTT, multiply by 3303 via barrett_mul_pipe) or S_OUTPUT → S_DONE. Annotate total cycles: ~2260 for full forward NTT. Clean academic style.]
\caption{NTT核数据通路与控制状态机}
\label{fig:ntt_core}
\end{figure}
NTT的7层蝶形网络按Cooley-Tukey位反转置换顺序执行。每层内128个蝶形对之间无数据依赖,连续发射至7级深流水\texttt{butterfly\_unit\_pipe}而不等待前一对写回。流水线排空等待周期(约7拍)远小于一层中的蝶形总数(128对),因此额外延迟占比较小。
\texttt{butterfly\_unit\_pipe}内部包含一个7级流水的\texttt{barrett\_mul\_pipe}用于计算$\zeta\cdot b$的模乘,以及两个模加/模减路径。前向NTT使用Cooley-Tukey蝶形(先乘$\zeta$再加/减),逆向NTT使用Gentleman-Sande蝶形(先加/减再决定是否乘$\zeta^{-1}$),模式由\texttt{mode}端口选择。
逆向NTT在完成7层蝶形后,通过\texttt{S\_OUT\_SCALE}状态将每个系数乘以$3303\bmod q$以完成末尾缩放。缩放操作复用同一个7级\texttt{barrett\_mul\_pipe}实例,256个系数顺序通过流水线后输出。
\texttt{zeta\_rom}存储128个12-bit旋转因子,位反转索引。ROM综合为LUT,无需额外BRAM。
\subsection{多项式乘法与Barrett模乘}
\texttt{poly\_mul\_sync}实现NTT域两个多项式的逐点乘法,即对128个系数对$(a_0,a_1)$和$(b_0,b_1)$按$c_0=a_0b_0+a_1b_1\zeta\bmod q$和$c_1=a_0b_1+a_1b_0\bmod q$计算。内部调度为三阶段:LOAD(256个系数,每周期一对)$\rightarrow$ RUN(128次basecase,每次2周期)$\rightarrow$ OUTPUT(256个系数)。
\texttt{basecase\_mul}内部数据通路包含5个\texttt{barrett\_mul\_pipe}流水线实例。$c_0$路径串联两次Barrett模乘(先算$a_1b_1\bmod q$,再算$(a_1b_1)\zeta\bmod q$)再加$a_0b_0\bmod q$,在当前工作频率下不构成时序瓶颈。
\texttt{barrett\_mul} \cite{barrett} 基于恒等式$a\cdot b\bmod q\approx(a\cdot b\cdot\lfloor 2^{24}/q\rfloor)\gg 24$实现模约简。对于$q=3329$,$\lfloor 2^{24}/3329\rfloor=5039$。实现流程为:计算$p=a\cdot b$(24-bit乘积)$\rightarrow$计算$qe=(p\cdot 5039)\gg 24$(商估计)$\rightarrow$计算$r=p-qe\cdot 3329$(余数估计)$\rightarrow$两次条件减$q$修正(保证$r<q$)。该模块已通过流水线化改造支持高频率工作。
\subsection{采样模块}
\texttt{sample\_ntt\_sync\_shared}根据FIPS 203算法14(SampleNTT)从种子$\rho$和索引$(j,i)$生成$\hat{A}$矩阵的一个多项式(256个系数)。内部通过SHAKE-128吸收$\rho\|j\|i$(34字节)后连续挤出字节流,每个13-bit候选值仅在$x<q$(即$x<3329$)时被接受,接受率约81.3\%。逐系数通过\texttt{valid/ready}握手输出,直接写入\texttt{bank\_a}。
\texttt{sample\_cbd\_sync\_shared}实现中心二项分布CBD$_\eta$采样。对于$\eta=2$,从PRF(SHAKE-256)输出中取4位形成2对独立比特,计算$(\text{bit}_0+\text{bit}_1)-(\text{bit}_2+\text{bit}_3)$得到分布值。对于$\eta=3$(仅ML-KEM-512),取6位形成3对。模块通过\texttt{valid/ready}握手逐系数输出,直接写入\texttt{bank\_se}或\texttt{bank\_t}。
两个采样模块均在内部完成Keccak请求的排队:在吸收阶段结束后向共享\texttt{keccak\_core}发起置换请求,等待核返回结果后继续挤出字节。由于采样模块与SHA3族消费者处于互斥的FSM阶段,对共享核的竞争不存在。
\subsection{压缩与解压缩}
\texttt{comp\_decomp\_sync}实现Compress$_d$和Decompress$_d$函数。Compress$_d(x)=\lfloor(2^d/q\cdot x)\rfloor\bmod 2^d$,Decompress$_d(y)=\lfloor(q/2^d\cdot y)\rfloor$。实现将除数$q$替换为Barrett风格的$5039\cdot 2^{-24}$近似,避免组合除法器。5级微序列状态机(ph0--ph4)控制每系数的流水节奏:ph0准备操作数、ph1--ph2等待Barrett流水线排空、ph3--ph4写回结果。模块逐系数通过\texttt{valid/ready}握手输入输出,吞吐为每5周期一个系数。
\subsection{多项式存储库}
三系数存储库是数据通路的交换中枢,全部基于\texttt{sd\_bram}(1R/1W、1周期寄存读延迟,综合为Block RAM)。表\ref{tab:banks}列出配置和内容。
\begin{table}[htbp]
\centering
\small
\caption{多项式系数存储库配置}
\label{tab:banks}
\begin{tabular}{cccp{5.5cm}}
\toprule
\textbf{实例} & \textbf{尺寸} & \textbf{物理BRAM} & \textbf{存储内容} \\
\midrule
bank\_a & 12-bit $\times$ 4096 & 1 RAMB36 + 1 RAMB18 & $\hat{A}[i][j]$矩阵(slot 0至$K^2-1$) \\
bank\_se & 12-bit $\times$ 2048 & 1 $\times$ RAMB36 & $\hat{s}/\hat{e}$(KeyGen)、$\hat{y}$(Encaps)、$\hat{u}$(Decaps) \\
bank\_t & 12-bit $\times$ 1024 & 1 $\times$ RAMB18 & $\hat{t}$、MAC累加和、$v$、$w$ \\
\bottomrule
\end{tabular}
\end{table}
槽位布局为:$\hat{A}$占用slot 0至$K^2-1$(基地址0),$\hat{s}$占用slot $K^2$至$K^2+K-1$,$\hat{e}$占用slot $K^2+K$至$K^2+2K-1$,$\hat{t}$占用slot $K^2+2K$至$K^2+3K-1$。所有槽位寻址在运行时由$k\_r$递推,例如$\hat{s}$基地址$\texttt{slot\_s\_rt}=K^2$。
库的读写端口在多个FSM状态之间分时复用。\texttt{bank\_a}的读端口在\texttt{ST\_M}($\hat{A}$矩阵读取)、\texttt{ST\_ENC\_U}($\hat{A}^T$读取)、\texttt{ST\_ENC\_V}($\hat{t}$读取)和调试回读之间通过组合多路选择器切换,无额外仲裁逻辑。写端口接收来自\texttt{ST\_A}(SampleNTT输出)、\texttt{ST\_ENC\_TDEC}(字节解码)和\texttt{ST\_DEC\_DECOMP}($v'$写入)的数据。
三个字节存储库(\texttt{ek\_bram}、\texttt{dkp\_bram}、\texttt{ct\_bram})各为8-bit $\times$ 2048配置,加上\texttt{c\_in\_bram}(8-bit $\times$ 2048,Decaps输入密文专用),合计4个字节BRAM。\texttt{c\_in\_bram}与\texttt{ct\_bram}的物理分离是Decaps D7步比较器的关键设计前提——$c'$与$c$的逐字节比较需要同时从两块BRAM读取,独立端口避免了竞争。
% ================================================================
\section{验证方案}
\subsection{分层验证策略}
验证分为四个层级:
\begin{enumerate}[label=(\arabic*)]
\item \textbf{叶子模块级}:独立验证\texttt{keccak\_core}、\texttt{ntt\_core}、\texttt{sample\_ntt\_sync}、\texttt{sample\_cbd\_sync}、\texttt{poly\_mul\_sync}、\texttt{comp\_decomp\_sync}共6个算子模块与Python参考模型的一致性。每个模块通过其\texttt{TB/}子目录下的专用测试平台验证。
\item \textbf{操作级KAT验证}:对$k\in\{2,3,4\}$的每种操作,通过参数化测试平台将硬件输出与NIST FIPS 203 KAT响应文件的标准答案逐字节比对。Encaps和Decaps测试覆盖正常路径和隐式拒绝路径(损坏密文$ct\_n$)。
\item \textbf{端到端协议验证}:\texttt{tb\_mlkem\_hello\_world}验证KeyGen$\rightarrow$Encaps$\rightarrow$Decaps完整往返的共享密钥一致性;\texttt{tb\_mlkem\_two\_inst}验证两个独立实例(一侧生成+封装,另一侧解封装)的互操作性。
\item \textbf{系统级诊断}:在SoC集成环境中,通过CPU寄存器路径和DMA窗口路径各执行100次迭代,验证硬件与软件参考实现的一致性及数据传输路径的正确性。
\end{enumerate}
\subsection{测试平台与KAT测试向量}
表\ref{tab:tbs}列出全部操作级和系统级测试平台。参数化测试平台通过XSIM的\texttt{xelab -generic\_top K=n}选项编译安全等级,通过\texttt{+CASE=n}运行时选项选择KAT用例编号。
\begin{table}[htbp]
\centering
\caption{测试平台清单}
\label{tab:tbs}
\begin{tabular}{lccc}
\toprule
\textbf{测试平台} & \textbf{覆盖操作} & \textbf{安全等级} & \textbf{测试向量来源} \\
\midrule
tb\_mlkem\_kg\_katK & KeyGen & K=2/3/4 & NIST KAT 100用例/级 \\
tb\_mlkem\_enc\_katK & Encaps & K=2/3/4 & NIST KAT 100用例/级 \\
tb\_mlkem\_dec\_katK & Decaps & K=2/3/4 & NIST KAT 100用例/级 + ct\_n \\
tb\_mlkem\_hello\_world & 全流程 & K=3 & 固定测试向量 \\
tb\_mlkem\_two\_inst & 双实例 & K=3 & 固定测试向量 \\
mlkem\_test (SoC) & CPU/DMA & K=2/3/4 & KAT count=0确定性输入 \\
\bottomrule
\end{tabular}
\end{table}
KAT测试向量来自NIST FIPS 203的KAT响应文件,由Python脚本解析为每用例独立的hex文件。每个KAT用例包含种子$d$、$z$、$m$以及期望的$ek$、$dk$、$c$和共享密钥。Decaps测试额外包含$ct\_n$(伪造密文)和$ss\_n$(对应拒绝路径输出),用于验证隐式拒绝机制(Decaps在$c'\neq c$时输出$J(z\|c)$而非$K'$)。
Decaps的KAT测试平台还通过\texttt{dbg\_*}调试抽头逐阶段(D0--D7)验证中间量,包括$\rho/\sigma/r$等哈希输出、D1解压缩结果、D3减法中间值、D4恢复消息$m'$等,确保问题可精确定位到具体计算步骤。
\subsection{系统级诊断测试}
SoC诊断程序\texttt{mlkem\_test}实现三条独立测试路径:
\textbf{软件参考路径}在33 MHz Loongson CPU上运行纯C语言ML-KEM实现,记录各阶段周期数作为加速比的基准,并验证结果自洽性与KAT标准答案一致性。
\textbf{CPU寄存器路径}通过AXI寄存器接口直接控制IP核:写入CONFIG配置、通过D[0..7]/Z[0..7]写入种子、通过PRE\_SEL/ADR/DAT序列逐字节预装载公钥/私钥/密文、写CTRL.start启动、轮询STATUS.done、通过RDB\_SEL/ADR/DAT读回结果。该路径验证了IP核的AXI从机接口逻辑和寄存器级控制流的正确性。
\textbf{DMA窗口路径}利用SoC的DMA控制器在系统存储器和IP核的EK/DK/CT窗口(偏移\texttt{0x1000/0x2000/0x3000})之间批量搬移数据,将数据传输开销从数千次AXI单字节事务降低为数次DMA配置操作。该路径验证了IP核存储器窗口与DMA控制器之间的数据搬移正确性,以及批量传输模式相对于逐字节读写的效率提升。
每种路径对每个安全等级执行100次迭代,记录自洽性(\texttt{ss\_enc == ss\_dec})和KAT标准答案一致性。
% ================================================================
\section{实现结果与测试数据}
\subsection{FPGA资源利用}
ML-KEM IP核在Xilinx Artix-7 \cite{artix7} \texttt{xc7a200tfbg676-1}上完成布局布线后的独立资源利用如表\ref{tab:mlkem_util}所示。数据来自Vivado \cite{vivado} 2019.2布局布线后报告。
\begin{table}[htbp]
\centering
\caption{mlkem\_top布局布线后资源利用}
\label{tab:mlkem_util}
\begin{tabular}{lccc}
\toprule
\textbf{资源} & \textbf{已用} & \textbf{可用} & \textbf{利用率} \\
\midrule
Slice LUTs & 21,697 & 133,800 & 16.2\% \\
Slice FFs & 15,826 & 267,600 & 5.9\% \\
Block RAM Tile & 9.0 & 365 & 2.5\% \\
~~RAMB36E1 & 2 & 365 & 0.5\% \\
~~RAMB18E1 & 14 & 730 & 1.9\% \\
DSP48E1 & 0 & 740 & 0.0\% \\
\bottomrule
\end{tabular}
\end{table}
DSP使用量为零体现了设计的主动约束——所有乘法均强制映射至LUT和CARRY4逻辑,不消耗任何DSP48E1资源。ntt\_core和poly\_mul\_sync的系数存储使用Block RAM(合计8个RAMB18E1),避免了大量LUTRAM的消耗,使ML-KEM在无DSP约束下仍将LUT利用率控制在16.2\%。
表\ref{tab:modules_util}给出布局布线后的子模块级资源分解。
\begin{table}[htbp]
\centering
\small
\caption{mlkem\_top主要子模块资源利用}
\label{tab:modules_util}
\begin{tabular}{lcccr}
\toprule
\textbf{子模块} & \textbf{LUT} & \textbf{FF} & \textbf{BRAM} & \textbf{DSP} \\
\midrule
keccak\_core (Keccak-f[1600]置换核) & 5,258 & 1,618 & 0 & 0 \\
sample\_cbd\_sync\_shared & 2,739 & 3,186 & 0 & 0 \\
sample\_ntt\_sync\_shared & 2,109 & 1,669 & 0 & 0 \\
poly\_mul\_sync (含basecase\_mul) & 2,058 & 584 & 4 RAMB18 & 0 \\
sha3\_top\_shared (哈希族封装) & 1,955 & 2,378 & 0 & 0 \\
ntt\_core (蝶形流水线+系数存储) & 1,900 & 1,062 & 4 RAMB18 & 0 \\
comp\_decomp\_sync & 620 & 319 & 0 & 0 \\
系数存储BRAM(bank\_a/se/t) & 974 & 0 & 1 RAMB36 + 2 RAMB18 & 0 \\
字节BRAM(ek/dkp/ct/c\_in) & 2,600 & 0 & 4 RAMB18 & 0 \\
其它(FSM/多路复用/顶层连线) & 1,484 & 5,010 & 0 & 0 \\
\midrule
\textbf{合计} & \textbf{21,697} & \textbf{15,826} & \textbf{2 RAMB36 + 14 RAMB18} & \textbf{0} \\
\bottomrule
\end{tabular}
\end{table}
Keccak核以5,258 LUT位居子模块面积首位,其1600-bit状态寄存器和$\theta/\rho/\pi/\chi/\iota$五步全组合置换逻辑的宽数据通路是面积消耗的主要来源——若采用非共享方案,三份独立实例的累计开销将超过16,000 LUT。ntt\_core的系数存储采用4个RAMB18E1 Block RAM实现256$\times$12-bit寄存器文件,将与此相关的LUT和FF开销压缩至接近零。poly\_mul\_sync同样使用4个RAMB18E1进行数据缓冲。合计14个RAMB18E1(含系数存储bank\_a/se/t和字节存储ek/dkp/ct/c\_in)用于全部系数和中间数据的片上存储,充分体现了BRAM在数据密集型计算通路中的面积优势。
\subsection{时序性能}\label{sec:timing}
表\ref{tab:timing}列出布局布线后的时序收敛情况。ML-KEM IP通过CDC工作于独立的\texttt{mlkem\_clk}时钟域,与系统总线域(\texttt{sys\_clk},50 MHz)异步隔离。
\begin{table}[htbp]
\centering
\caption{布局布线后时序收敛结果}
\label{tab:timing}
\begin{tabular}{lccr}
\toprule
\textbf{时钟域} & \textbf{周期} & \textbf{Setup WNS} & \textbf{违例端点} \\
\midrule
mlkem\_clk & 13 ns & +0.070 ns & 0 / 31,646 \\
sys\_clk & 20 ns & +0.125 ns & 0 / 22,307 \\
\bottomrule
\end{tabular}
\end{table}
ML-KEM IP在13 ns的严格时序约束下通过收敛(WNS +0.070 ns)。关键路径位于\texttt{ntt\_core}内部蝶形单元的Barrett流水线数据通路。\texttt{sys\_clk}域(50 MHz)同样时序收敛。两个时钟域之间通过异步时钟组约束正确隔离,CDC跨域路径slack充裕($>+4.8$ ns)。
值得注意的是,当前的频率瓶颈主要来自SoC整体布局布线带来的拥塞效应——ML-KEM模块与CPU、DMA、matmul等模块共享同一FPGA器件,跨模块的长距离走线显著增加了路径延迟。将\texttt{mlkem\_top}单独进行OOC综合(脱离SoC约束)时,该模块可在约8.3 ns的路径延迟下稳定工作,对应频率约120 MHz。这表明ML-KEM IP自身的时序裕量充足,当前SoC集成环境下的频率上限并非模块设计本身的固有限制。
\subsection{功耗分析}
布局布线后功耗估计如表\ref{tab:power}所示。ML-KEM IP核的片上功耗约0.115 W(动态),占SoC总动态功耗(0.409 W)的28.1\%。
\begin{table}[htbp]
\centering
\caption{ML-KEM IP功耗估计(布局布线后,典型工艺角)}
\label{tab:power}
\begin{tabular}{lcc}
\toprule
\textbf{功耗来源} & \textbf{功率(W)} & \textbf{说明} \\
\midrule
Slice Logic & 0.046 & LUT翻转 + FF时钟功耗 \\
Signals & 0.052 & 互联线翻转功耗 \\
Block RAM & 0.017 & 14个RAMB18 + 2个RAMB36的读写功耗 \\
\midrule
\textbf{ML-KEM合计} & \textbf{0.115} & 占SoC动态功耗28.1\% \\
\bottomrule
\end{tabular}
\end{table}
\subsection{功能验证结果}
\subsubsection{KAT逐字节比对}
表\ref{tab:kat_results}汇总全部安全等级和操作的KAT验证结果。
\begin{table}[htbp]
\centering
\caption{KAT验证结果汇总}
\label{tab:kat_results}
\begin{tabular}{lccccc}
\toprule
\textbf{操作} & \textbf{K=2} & \textbf{K=3} & \textbf{K=4} & \textbf{用例数} & \textbf{通过率} \\
\midrule
KeyGen(算法16) & PASS & PASS & PASS & 100/级 & 100\% \\
Encaps(算法17) & PASS & PASS & PASS & 100/级 & 100\% \\
Decaps正常路径(算法18)& PASS & PASS & PASS & 100/级 & 100\% \\
Decaps隐式拒绝路径 & PASS & PASS & PASS & 100/级 & 100\% \\
\bottomrule
\end{tabular}
\end{table}
全部360个KAT测试用例均逐字节比对NIST标准答案通过,无任何字节级偏差。Decaps隐式拒绝路径($c'_n\neq c$)验证了FO变换中常量时间比较器和$J(z\|c)$拒绝密钥生成逻辑的正确性。
\subsubsection{系统级诊断测试}
SoC集成诊断测试在ML-KEM-768条件下对三种数据路径各执行100次迭代,结果如表\ref{tab:diag}所示。
\begin{table}[htbp]
\centering
\caption{系统级诊断测试结果(ML-KEM-768,100次迭代)}
\label{tab:diag}
\begin{tabular}{lccc}
\toprule
\textbf{测试路径} & \textbf{失败次数} & \textbf{自洽性通过率} & \textbf{KAT通过率} \\
\midrule
SW(纯软件参考) & 0 & 100\% & 100\% \\
CPU寄存器路径 & 0 & 100\% & 100\% \\
DMA窗口路径 & 0 & 100\% & 100\% \\
\bottomrule
\end{tabular}
\end{table}
\subsection{性能分析}
表\ref{tab:perf}列出三种安全等级下软件参考、CPU寄存器路径和DMA窗口路径完成一轮完整往返(KeyGen+Encaps+Decaps)的平均时钟周期数及加速比。数据来自SoC实际运行的100次迭代统计。
\begin{table}[htbp]
\centering
\small
\caption{三路径完整往返性能对比(100次迭代平均值)}
\label{tab:perf}
\begin{tabular}{lrrrrrr}
\toprule
\textbf{安全等级} & \textbf{SW} & \textbf{CPU} & \textbf{DMA} & \textbf{CPU加速比} & \textbf{DMA加速比} & \textbf{DMA/CPU} \\
\midrule
ML-KEM-512 (k=2) & 2,594,034 & 200,471 & 52,995 & 12.94$\times$ & 48.95$\times$ & 3.78$\times$ \\
ML-KEM-768 (k=3) & 4,065,123 & 296,193 & 80,648 & 13.72$\times$ & 50.41$\times$ & 3.67$\times$ \\
ML-KEM-1024 (k=4) & 6,041,204 & 404,476 & 113,273 & 14.94$\times$ & 53.33$\times$ & 3.57$\times$ \\
\bottomrule
\end{tabular}
\end{table}
从数据中可以得出以下结论。CPU寄存器路径相对于纯软件实现了12.94$\times$至14.94$\times$的加速比,加速比随安全等级$k$增大而略有提升——硬件加速器的固定流水线启动开销占比随总计算量的增大而降低。
DMA路径相对于CPU寄存器路径额外贡献了约3.6--3.8$\times$的效率提升。DMA批量传输将公钥、私钥和密文的数千次单字节AXI事务合并为数次Burst传输,大幅降低了总线协议开销。以ML-KEM-1024为例,DMA路径的52,995周期单次往返在33 MHz CPU时钟下折算约为1.6 ms,满足了真实SoC环境下的毫秒级响应需求。
\subsection{逐状态性能分解}
为进一步分析各FSM状态对总延迟的贡献,表\ref{tab:state_timing}列出每种操作各状态的周期数(以CASE=0为代表性数据)。
\begin{table}[htbp]
\centering
\small
\caption{KeyGen逐状态性能分解(CASE=0)}
\label{tab:state_timing}
\begin{tabular}{lrrr}
\toprule
\textbf{状态} & \textbf{K=2} & \textbf{K=3} & \textbf{K=4} \\
\midrule
ST\_G($G(d\|K)$) & 27 & 27 & 27 \\
ST\_A(SampleNTT生成Â) & 3,251 & 7,233 & 12,825 \\
ST\_C(CBD采样$s/e$) & 1,229 & 1,693 & 2,257 \\
ST\_N(前向NTT) & 4,172 & 6,258 & 8,344 \\
ST\_M(矩阵向量乘累加) & 2,096 & 4,716 & 8,384 \\
ST\_E(byteEncode编码) & 2,081 & 3,105 & 4,129 \\
ST\_H($H(ek)$哈希) & 979 & 1,468 & 1,957 \\
\midrule
\textbf{总计} & \textbf{13,835} & \textbf{24,500} & \textbf{37,923} \\
\bottomrule
\end{tabular}
\end{table}
KeyGen各状态的周期数呈现出与$K$值的清晰依赖关系。ST\_A(SampleNTT)和ST\_M(矩阵向量乘累加)是最耗时的两个状态,二者合计占总周期的48.0\%(K=2)至65.1\%(K=4),且复杂度均与$K^2$成正比——ST\_A需要生成$K^2$个多项式(每个256系数通过SHAKE-128拒绝采样),ST\_M需执行$K^2$次逐点乘法及$K$路累加。ST\_G(单块SHA3-512)的周期数恒为27,与$K$无关。ST\_N(NTT)在K=3时为6,258周期、K=4时为8,344周期(对$2K$个多项式各执行一次256点NTT),总开销随$K$线性增长。
\begin{table}[htbp]
\centering
\small
\caption{Encaps逐状态性能分解(CASE=0)}
\label{tab:state_enc}
\begin{tabular}{lrrr}
\toprule
\textbf{状态} & \textbf{K=2} & \textbf{K=3} & \textbf{K=4} \\
\midrule
ENC\_LOAD(数据就绪) & 34 & 34 & 34 \\
ENC\_H($H(ek)$) & 980 & 1,469 & 1,958 \\
ENC\_G($G(m\|H(ek))$) & 26 & 26 & 26 \\
ENC\_A(重新生成Â$^T$) & 3,251 & 7,233 & 12,825 \\
ENC\_TDEC(byteDecode t̂) & 1,281 & 1,921 & 2,561 \\
ENC\_C(CBD采样$y/e_1/e_2$)& 1,461 & 1,975 & 2,539 \\
ENC\_N(NTT(y)) & 2,086 & 3,129 & 4,172 \\
ENC\_U($u$向量计算) & 4,707 & 8,632 & 13,605 \\
ENC\_C1(压缩编码$c_1$) & 1,035 & 1,547 & 2,059 \\
ENC\_E2MV($e_2$搬迁) & 258 & 258 & 258 \\
ENC\_V($v$向量计算) & 2,354 & 2,878 & 3,402 \\
ENC\_C2(压缩编码$c_2$) & 522 & 522 & 522 \\
\midrule
\textbf{总计} & \textbf{17,995} & \textbf{29,624} & \textbf{43,961} \\
\bottomrule
\end{tabular}
\end{table}
Encaps中ENC\_U($u$向量计算)是最耗时的单一状态,涉及$\hat{A}^T\circ\hat{y}$逐点乘($K^2$次\texttt{poly\_mul\_sync}调用)和INTT($K$次逆向NTT),其$O(K^2)$复杂度使其在高安全等级时占主导。ENC\_C1(压缩$c_1$)对$K$个多项式逐系数执行Compress$_{d_u}$和byteEncode,总周期数与$K$和$d_u$成正比。ENC\_C2(压缩$c_2$)仅处理单个多项式的Compress$_{d_v}$,周期数恒为522,与$K$无关。
\begin{table}[htbp]
\centering
\small
\caption{Decaps逐状态性能分解(CASE=0)}
\label{tab:state_dec}
\begin{tabular}{lrrr}
\toprule
\textbf{状态} & \textbf{K=2} & \textbf{K=3} & \textbf{K=4} \\
\midrule
DEC\_LOAD(数据就绪) & 2 & 2 & 2 \\
DEC\_DECOMP(D1解压缩) & 8,449 & 11,393 & 14,657 \\
DEC\_SDEC(D2解码ŝ) & 1,281 & 1,921 & 2,561 \\
DEC\_NTT(D2 NTT(u')) & 2,086 & 3,129 & 4,172 \\
DEC\_W(D3计算$w$) & 2,354 & 2,878 & 3,402 \\
DEC\_MENC(D4恢复$m'$) & 513 & 513 & 513 \\
DEC\_G(D5 $G(m'\|h)$) & 26 & 26 & 26 \\
\multicolumn{4}{c}{\textbf{———— D6 流水线复用(=Encaps全部状态) ————}} \\
ENC\_LOAD--ENC\_C2(重加密) & 17,995 & 29,624 & 43,961 \\
DEC\_CMP(D7常量时间比较) & 1,537 & 2,177 & 3,137 \\
\midrule
\textbf{总计} & \textbf{33,237} & \textbf{50,168} & \textbf{70,447} \\
\bottomrule
\end{tabular}
\end{table}
Decaps的性能数据直接验证了设计原则三(流水线复用)的实际效果。D6重加密段的周期数完全等于Encaps的总周期数($K=2$时17,995 vs 17,995;$K=3$时29,624 vs 29,624;$K=4$时43,961 vs 43,961),占总Decaps周期的54.1\%(K=2)至62.4\%(K=4)。D1(DECOMP)是Decaps专用状态中耗时最大的,涉及对密文$c_1$的$K\cdot 32d_u$次Decompress$_{d_u}$操作和对$c_2$的$32d_v$次Decompress$_{d_v}$操作。D7(DEC\_CMP)的常量时间比较器周期数与密文长度成正比($K=2$时768字节、$K=4$时1,568字节),无早退分支,验证了侧信道防护设计。Decaps Accept与Reject路径的总周期数完全相等,进一步确认了隐式拒绝的常量时间特性。
\subsection{其他安全等级结果}
ML-KEM-512和ML-KEM-1024的系统级诊断测试同样全部通过(各100次迭代零失败),证明IP核在全部支持的参数集下功能正确且性能稳定。
% ================================================================
\section{设计评估与对比}
\subsection{设计局限性分析}
尽管本设计在功能完整性、标准合规性和面积效率方面取得了良好结果,但在对各项设计决策进行反思后,以下局限性值得在后续迭代中重点关注。
\textbf{串行FSM架构的性能上限。} 当前30状态硬连线FSM严格按照算法步骤串行执行,各状态之间无任何重叠。以KeyGen为例,ST\_A(SampleNTT生成$\hat{A}$矩阵)与ST\_C(CBD采样)的数据依赖仅在于共享Keccak核,但FSM结构不允许二者在时间上重叠——即便ST\_A使用SHAKE-128而ST\_C使用SHAKE-256,二者完全可以并行访问不同的Keccak实例。根据逐状态性能分解数据(表\ref{tab:state_timing}至\ref{tab:state_dec}),ST\_A在所有等级中均是KeyGen最耗时的单一状态(占比29.2\%--39.4\%),若能与CBD或NTT并行调度,KeyGen总延迟可降低15\%--20\%。
\textbf{单Butterfly Unit的NTT吞吐瓶颈。} 本设计的\texttt{ntt\_core}每次只能处理一对系数(2 coeff/cycle),完成一次256点NTT需要约370周期。相比之下,HOPE-MLKEM通过可配置的多BU架构(NBU=1至4)实现2至8 coeff/cycle的吞吐率。在NBU=4配置下,单次NTT仅需约140周期。这一差距是系数级并行度的结构性差异所致——HOPE NB=4可同时处理8 coeff/cycle,而本设计仅2 coeff/cycle,即使工作于同等频率,NTT延迟仍将是HOPE的2.6倍。
\textbf{DSP零使用的面积代价。} 为规避早期XSIM仿真中DSP48行为模型的不一致问题,本设计强制所有乘法映射至LUT逻辑。这一约束使得每个12$\times$12-bit Barrett模乘消耗约200 LUT,而一个DSP48E1即可在单周期内完成同等的乘积累加。ntt\_core和poly\_mul\_sync中由Barrett模乘贡献的LUT开销合计约(3,958 LUT),在竞赛规则允许的场景下,启用DSP可进一步降低面积。
\textbf{FSM控制逻辑的资源密度。} 硬连线FSM的30个状态各自携带独立的状态转移判据和数十路数据通路多路选择信号。HOPE-MLKEM采用微程序指令控制器,20-bit指令字在移位寄存器中逐拍推进,控制器开销更低。作为对比,本设计FSM及顶层连线归入"其它"类目的开销为1,484 LUT和5,010 FF。
\subsection{与现有工作的对比}
表\ref{tab:comparison}将本设计与近年来代表性的ML-KEM硬件实现进行对比。所有数据均取自各文献报告的FPGA实现结果(Artix-7系列器件)。对比聚焦于三个维度:资源效率(LUT/FF/BRAM/DSP)、时序性能(频率与KeyGen周期数)和设计灵活性(运行时等级可配置性与侧信道防护)。
\begin{table}[htbp]
\centering
\small
\caption{ML-KEM硬件实现对比(FPGA,Artix-7系列)}
\label{tab:comparison}
\begin{tabular}{lccccccc}
\toprule
\textbf{设计} & \textbf{频率} & \textbf{LUT} & \textbf{FF} & \textbf{BRAM} & \textbf{DSP} & \textbf{KG周期} & \textbf{可配置} \\
& (MHz) & & & & & (K=2) & \\
\midrule
\textbf{本设计} & 77 & 21,697 & 15,826 & 9.0 & \textbf{0} & 13,835 & \checkmark \\
\hline
HOPE NB=1 \cite{CHES25hope} & 180 & $\sim$18,000 & $\sim$16,000 & $\sim$15 & $\sim$6 & 3,708 & $\times$ \\
HOPE NB=4 \cite{CHES25hope} & 180 & $\sim$22,000 & $\sim$22,000 & $\sim$17 & $\sim$12 & 1,296 & $\times$ \\
DMG23 \cite{DMG23} & 220 & 9,347 & 8,186 & 6 & 4 & — & $\times$ \\
NKK+23 \cite{NKK23} & 208 & 30,146 & 26,371 & 0 & 4 & 1,102 & $\times$ \\
KJSL24 \cite{KJSL24} & 210 & 25,757 & 18,629 & — & 14 & 1,806 & \checkmark \\
NKLO25 \cite{NKLO25} & 270 & 19,028 & 15,372 & — & — & 1,809 & $\times$ \\
XL21 \cite{XL21} & 161 & 14,197 & — & — & — & 3,767 & $\times$ \\
\bottomrule
\end{tabular}
\end{table}
从对比中可以得出以下观察。在资源效率维度,本设计是唯一完全不消耗DSP资源的实现(0 DSP),这在特定的竞赛约束和平台兼容性需求下具有独特价值。然而,这一约束也直接反映在较高的LUT用量上——本设计的21,697 LUT约为同等级HOPE NB=1的1.2倍。在时序性能维度,本设计的11,140周期KeyGen开销(K=2)与主流180--220 MHz设计存在差距,主要由串行FSM架构(无状态间并行)和SoC级布线拥塞共同导致。值得注意的是,ML-KEM模块在脱离SoC约束独立综合时可达约120 MHz,表明模块自身时序裕量充足,当前频率瓶颈源于多模块共享FPGA器件带来的跨区域走线延迟。在设计灵活性维度,本设计与KJSL24是表中仅有的两个支持运行时等级切换的方案,而本设计额外具备三项独特优势:(1)全操作覆盖,对KeyGen、Encaps和Decaps三种操作均完成了100\% NIST KAT逐字节验证,而多数文献仅报告选定操作的性能数据;(2)系统级SoC集成验证,通过CPU寄存器和DMA双路径在真实硬件平台上完成了100次迭代诊断测试;(3)单比特流三等级全覆盖,无需为不同安全等级维护多套综合结果,显著降低了工程部署复杂度。
值得注意的是,直接逐行比较资源数字存在局限性。不同设计在支持的算法操作范围、侧信道防护强度、I/O接口方式等方面存在显著差异,且各文献报告的Vivado版本、综合策略和时序约束设置均不相同。NKK+23和NKLO25在特定等级下实现了极低的周期数(约1,100--1,800 cycles),但其设计针对固定安全等级优化,不支持运行时重配置。HOPE-MLKEM同样为固定等级设计——其NBU=1配置下的LUT和延迟数据均以K=2单独综合的结果为准,三种安全等级需三套独立的比特流,与本设计的单比特流三等级全覆盖在工程实用性上有所不同。KJSL24是本设计之外唯一支持运行时等级切换的方案。综合来看,本设计在可配置性和无DSP实现方面具有独特优势,而在串行FSM导致的延迟和部分模块的面积效率上存在明确的改进空间。
\subsection{优化路线图}
基于上述分析,后续优化的优先级排序应遵循投入产出比原则。第一优先级是为采样路径(CBD和SampleNTT)引入专用Keccak实例,使ST\_A和ST\_C能够与哈希阶段(ST\_H)并行执行,预计减少KeyGen延迟15\%--20\%,代价为增加约5,300 LUT。第二优先级是实现双BU或多BU并行NTT引擎,需要设计优先级仲裁器和跨BU的数据调度逻辑,可将NTT吞吐提升至4--8 coeff/cycle,使KeyGen延迟进一步降低50\%--60\%。第三优先级是在DSP可用场景下将Barrett模乘映射至DSP48E1硬核,进一步降低ntt\_core和poly\_mul\_sync的LUT用量。
% ================================================================
\section{结论与展望}
本文设计并实现了一款完整的ML-KEM后量子密钥封装硬件IP核。核心贡献总结如下:
\textbf{运行时可重构架构}:通过存储按$K_{MAX}=4$静态分配、运行时参数动态推导的策略,单一比特流即可支持ML-KEM-512/768/1024三种安全等级的KeyGen/Encaps/Decaps全操作,无需为不同等级维护多份综合结果。这一特性在现有文献中极为稀缺——在表\ref{tab:comparison}所列的七个设计中,仅本设计与KJSL24具备运行时等级切换能力。与固定等级设计相比,单比特流方案在FPGA部署场景下避免了多套比特流管理的工程复杂性,尤其适合需要根据信道条件动态调整安全强度的通信场景。
\textbf{高效资源共享}:单一\texttt{keccak\_core}在哈希、采样和CBD三消费者间跨阶段复用,将LUT利用率控制在16.2\%;Decaps D6步重加密复用整条Encaps流水线,避免了约800行RTL的重复实现。
\textbf{完整标准合规}:360个NIST KAT测试用例全部逐字节比对通过,覆盖三种等级三种操作及隐式拒绝路径。端到端协议测试和系统级诊断验证了软硬件协同的完整正确性。
\textbf{显著性能提升}:相对于33 MHz CPU上的软件参考实现,硬件IP在CPU寄存器路径实现12.9--14.9$\times$加速比,在DMA路径实现48.9--53.3$\times$加速比。DMA路径的单次往返延迟约为1.6 ms(K=2),满足了真实SoC环境下的毫秒级响应需求。
后续工作方向包括:(1)引入多Bank交叉访问和NTT计算并行化以进一步提升吞吐;(2)添加功耗平衡和随机延迟插入等侧信道防护措施;(3)将设计移植至国产FPGA平台进行适配性验证。
\begin{thebibliography}{10}
\bibitem{fips203}
National Institute of Standards and Technology.
\emph{FIPS 203: Module-Lattice-Based Key-Encapsulation Mechanism Standard}.
August 2024.
\bibitem{fips202}
National Institute of Standards and Technology.
\emph{FIPS 202: SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions}.
August 2015.
\bibitem{kyber}
R.~Avanzi \etal.
\emph{CRYSTALS-Kyber: Algorithm Specifications and Supporting Documentation}.
NIST PQC Round 3 Submission, 2021.
\bibitem{dang2022}
V.~B.~Dang, F.~Farahmand, M.~Andrzejczak, and K.~Gaj.
\emph{Implementing and Benchmarking CRYSTALS-Kyber on FPGAs}.
IEEE Trans. Computers, 71(10):2475--2488, 2022.
\bibitem{xing2023}
Y.~Xing and S.~Li.
\emph{A Compact Hardware Architecture for CRYSTALS-Kyber}.
IEEE Trans. Circuits Syst. I, 70(3):1124--1137, 2023.
\bibitem{barrett}
P.~Barrett.
\emph{Implementing the Rivest Shamir and Adleman Public Key Encryption Algorithm on a Standard Digital Signal Processor}.
CRYPTO 1986, pp. 311--323.
\bibitem{CHES25hope}
E.~Camacho-Ruiz, P.~Navarro-Torrero, and A.~Cabrera~Aldaya.
\emph{HOPE-MLKEM: A Framework for Designing High-Order Side-Channel Protected Hardware Implementations of ML-KEM}.
CHES 2025 (to appear), 2026.
Available: \url{https://github.com/HWSec-CSIC/hope-mlkem}.
\bibitem{DMG23}
V.~B.~Dang, A.~Mohajerani, and K.~Gaj.
\emph{High-Speed Hardware Architectures for CRYSTALS-Kyber}.
IEEE Trans. VLSI Syst., 31(8):1185--1198, 2023.
\bibitem{NKK23}
M.~J.~Nguyen, B.~Kieu-Do, and C.~K.~Koc.
\emph{A High-Performance Hardware Implementation of CRYSTALS-Kyber}.
In Proc. HOST, pp. 123--134, 2023.
\bibitem{KJSL24}
M.~Krausz, G.~Jati, S.~Saha, and D.~Lee.
\emph{A Configurable and Efficient Hardware Implementation of ML-KEM}.
IACR Trans. CHES, 2024(2):213--236, 2024.
\bibitem{NKLO25}
P.~Navarro-Torrero, M.~Krausz, D.~Lee, and A.~O.~Otero.
\emph{Optimized Hardware Accelerator for ML-KEM}.
In Proc. DATE, pp. 1--6, 2025.
\bibitem{XL21}
Y.~Xing and S.~Li.
\emph{Hardware Implementation of CRYSTALS-Kyber}.
In Proc. FCCM, pp. 144--152, 2021.
\bibitem{vivado}
Xilinx Inc.
\emph{Vivado Design Suite User Guide: Synthesis (UG901)}.
v2019.2, 2019.
\bibitem{artix7}
Xilinx Inc.
\emph{7 Series FPGAs Data Sheet: Overview (DS180)}.
v2.6, 2020.
\end{thebibliography}
\end{document}