我们团队对信息安全感兴趣,想参加集创赛。后量子密码是热点,但算法计算量大。我们计划用FPGA实现加速。对于Kyber这种基于格的后量子密码算法,核心是多项式乘法和数论变换(NTT)。在FPGA上如何设计高效的NTT模块?怎么平衡使用DSP硬核和BRAM来达到最优性能和面积?有没有开源的硬件实现可以参考?这个选题的难点和创新点在哪里?
2026年全国大学生集成电路创新创业大赛,如果选择‘基于FPGA的轻量级Post-Quantum Cryptography(后量子密码)算法加速’,在实现Kyber或Dilithium等算法的多项式运算时,如何利用FPGA的DSP和BRAM资源进行极致优化?
提问
回答 7

我们去年做过类似题目,分享点经验。NTT是核心,但别一上来就搞大点数NTT。Kyber-512的多项式阶数只有256,完全可以用基2或基4的NTT流水线。DSP主要用来做模乘模加,一个DSP48E1可以配成(AB+C)模式,正好对应NTT的蝶形运算。建议把模乘常数预存到BRAM里,减少计算路径延迟。BRAM的配置很关键:用真双口RAM,一个口读系数,一个口写回结果,同时操作。开源代码可以看pq-crystals的硬件实现(GitHub上有),但那是针对特定FPGA的,你得根据自己板子调整。难点在于模运算的优化和内存访问冲突的处理。创新点可以放在可配置的NTT架构上,支持不同参数集。

从资源平衡角度说,你得先算算账。假设用Xilinx Ultrascale+,一个DSP48E2能做27×18乘法,但Kyber的模数q=3329,13位就够了,所以一个DSP可以拆成两个并行乘法用(如果你敢玩DSP内部位分割的话)。BRAM用来存多项式系数,但注意访问模式:NTT是蝶形访问,地址不是顺序的,所以要么用多bank BRAM,要么用冲突避免的寻址方案。我们当时用了4个bank,每个bank存间隔4的系数,这样基4 NTT就能同时读四个数。优化性能的关键是让DSP一直忙起来,别等内存。可以设计深度流水线,甚至用多个NTT核心并行。开源参考不多,但可以看看Verilog实现的Kyber项目,比如OpenTitan里的那个模块。难点是时序收敛和资源利用率之间的权衡。创新点可以聚焦在低功耗设计,或者动态可重构架构上。

简单粗暴的思路:先搞定一个高度流水化的蝶形单元,用DSP实现模乘和模加,周围用状态机控制。BRAM作为系数存储器,因为NTT需要多轮迭代,所以中间结果也存回BRAM。为了极致优化,可以考虑将NTT和逆NTT合并设计,复用大部分硬件。平衡方面,如果DSP不够,可以用查找表+逻辑实现模乘,但速度会慢。反之,如果BRAM紧张,可以压缩系数位宽,或者用分布式RAM。开源实现确实有,比如GitHub上搜索“FPGA Kyber”能找到一些学术代码,但通常不够完整,需要自己整合。这个选题的难点在于算法和硬件的协同设计,你得懂密码学又懂硬件。创新点可以放在抗侧信道攻击的防护上,比如加入随机化操作,这在大赛里可能更吸引评委。

你们选这个方向挺有挑战性的,后量子密码确实是未来趋势,但硬件实现优化是难点。核心在于NTT,这是多项式乘法的关键。我建议先吃透算法,理解Kyber或Dilithium中NTT的具体参数(比如模数、根等)。在FPGA上,可以用DSP硬核来做模乘和模加运算,这是最耗资源的。为了极致优化,可以考虑设计一个高度并行的流水线结构,比如用多个DSP单元同时计算NTT的蝴蝶操作。BRAM则用来存储多项式系数,因为NTT需要频繁访问数据。你可以把系数分成几块,用双端口BRAM实现同时读写,减少访问冲突。平衡方面,如果追求高性能,就多用DSP和并行度,但面积会大;如果资源有限,可以复用DSP,但性能会下降。开源的实现可以看看Xilinx或Intel的HLS库,或者GitHub上一些学术项目,比如“pqc-hardware”仓库,但要注意版权和适配。这个选题的难点在于如何在有限资源下实现低延迟和高吞吐,创新点可以是在NTT的调度策略上做优化,或者结合新型内存架构(比如用URAM)来提升效率。建议你们先仿真再上板,避免后期调试困难。

哈,我们去年做过类似的项目,分享一下经验。NTT模块的设计是关键,你们可以用基2或基4的蝴蝶结构,基4能减少阶段数,但控制复杂。DSP资源很宝贵,一个技巧是使用DSP的预加器功能来做模运算,这样能节省逻辑资源。对于Kyber,模数是3329,可以用移位和加法来近似模约减,减少DSP使用。BRAM方面,建议用块状存储,比如把多项式分成多个bank,用交叉开关连接,这样能支持多个蝴蝶操作并行访问数据。平衡点取决于你们的目标板子资源:如果DSP多(比如UltraScale+),就尽量并行化;如果BRAM多,可以多存中间结果来减少计算重复。开源参考的话,Crypto4A的FPGA实现或者论文“Hardware Accelerators for Lattice-Based Cryptography”里有详细设计,但需要自己消化。难点是时序收敛和资源利用率,创新点可以放在抗侧信道攻击的防护上,比如加随机化,这在实际应用中很重要。另外,注意测试向量要齐全,确保功能正确再优化性能。

先抓核心:NTT是Kyber/Dilithium的性能瓶颈,FPGA上优化关键是减少蝶形运算的延迟和内存访问。你们得把多项式系数存在BRAM里,按位反转或迭代顺序排好,减少访问冲突。DSP用来做模乘加,一个蝶形通常用1-2个DSP实现。建议用流水线化架构,比如4级流水处理多个蝶形,同时计算。开源参考可以看PQClean项目里的硬件代码,或者搜论文“FPGA Acceleration of Kyber”。难点在于模运算的常数乘法优化,创新点可以放在混合基NTT或者用DSP做预计算旋转因子。
具体步骤:先写个C模型验证NTT正确性,然后设计蝶形单元,用DSP48E1实现模乘。BRAM分两块,双端口同时读写,实现乒乓操作。控制状态机要精简。面积和性能平衡的话,如果资源够,就多实例化几个蝶形单元并行算不同阶段;资源紧就复用单元,但时钟频率拉高。注意模数不是2的幂,乘法后需要约减,这个用DSP的预加模式能省逻辑。
常见坑:旋转因子存储占用BRAM多,可以压缩存储只存一部分,现场计算。还有时序问题,模运算路径长,建议寄存器打拍。选题创新点可以对比纯软件实现,展示加速比,或者做可重构架构支持多种参数。

从参赛经验看,这个选题挺有挑战性,但做出来容易出彩。我建议你们重点优化内存访问模式。NTT的多级迭代需要频繁读写系数,BRAM的带宽可能成为瓶颈。可以用多个BRAM bank存储系数,并行访问。比如把多项式分成几块,存在不同BRAM,这样每个周期能读出多个系数进行蝶形运算。DSP配置方面,Xilinx的DSP48E2支持27×18乘法,正好适合Kyber的模数范围,一个DSP就能处理一次模乘。你们可以尝试把蝶形运算拆解,让一个DSP在一个周期内完成乘加,减少DSP使用数量。
开源实现可以参考GitHub上的“kyber-fpga”或“dilithium-fpga”项目,但通常比较基础,你们需要自己优化。难点在于如何降低资源消耗的同时保持高吞吐量。创新点可以放在动态可配置的NTT架构上,比如同一套硬件支持不同安全级别的参数。另外,注意电源管理,高速运算下功耗可能很高,这在比赛中也是加分项。
步骤上,先仿真验证功能,再用HLS或Verilog实现模块,重点优化关键路径。最后用片上逻辑分析仪抓信号调试。平衡资源时,用DSP做计算,BRAM做存储,LUT和FF尽量节省。如果资源有剩余,可以增加并行度提升性能。
发表回答
登录后可在本页底部提交回答
