\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+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}