diff --git a/docs/mlkem_top_rtl.svg b/docs/mlkem_top_rtl.svg new file mode 100644 index 0000000..a7057f5 --- /dev/null +++ b/docs/mlkem_top_rtl.svg @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + mlkem_top — ML-KEM KeyGen / Encaps / Decaps (op_i: 0/1/2, runtime k_i) + 实线=数据/系数通路 蓝=BRAM 端口 红=隐式拒绝 / 共享 keccak 仲裁 方框内为 RTL 实例名 / 信号名 + + + + 输入端口 + k_i[2:0] op_i[1:0] + start_i + d_i[255:0] + KeyGen 种子 d + z_i[255:0] + 隐式拒绝种子 z + msg_i[255:0] + Encaps 消息 m + + ek_in_* (Encaps) + 公钥 ek → u_ek_bram + dk_in_* (Decaps) + 私钥 dk → 各区路由 + c_in_* (Decaps) + 密文 c → u_c_in_bram + + + + 控制 FSM (st, st_next) + KeyGen: G→A→C→N→M→E→H + Encaps: ENC_H→G→LOAD→A→TDEC + →C→N→U→C1→E2MV→V→C2 + Decaps: DEC_LOAD→DECOMP→SDEC + →NTT→W→MENC→G→J→(重加密)→CMP + + 相位选择 sel_* + sel_sha3 / sel_snt / sel_cbd + op_r k_r (start 锁存) + busy_o = (st≠IDLE) + done_o = (st==DONE) + + + + 状态寄存器 (256b) + rho_r / sigma_r (ρ,σ=G) + m_r m / Decaps m' + r_r PRF 种子 r / r' + hek_r H(ek) z_r z + ss_r K / K' kbar_r K̄=J(z‖c) + dec_reject c'≠c 标志 + + + + 共享 Keccak (单核 + 相位 mux) + + u_keccak (keccak_core) + kc_state_i_mux / kc_valid_i_mux ◄ 3-way + kc_state_o / kc_valid_o ► 门控广播 + kc_valid_o_sha3 · _snt · _cbd + G/H/J、SampleNTT、CBD 分时复用 1 个核 + (相位互斥 → sel_sha3/snt/cbd 选通) + + + + u_sha3 (sha3_top_shared) + SHA3-512 G(·) → ρ‖σ / K‖r / K'‖r' + SHA3-256 H(ek) (多块吸收) + SHAKE-256 J(z‖c) → K̄ (多块) + mb_en / mb_block_i 多块;mode 选 G/H/J + + + + u_snt (sample_ntt_sync_shared) + Â[i][j] = SampleNTT(ρ‖j‖i) → bank_a + snt_coeff / snt_valid / snt_last + + + u_cbd (sample_cbd_sync_shared) + CBD_η: s/e (KeyGen), y/e1/e2 (Encaps) + cbd_coeff → cbd_modq → bank_se / bank_t + + + + u_ntt (ntt_core) + 前向 NTT(mode0) / INTT(mode1, ×3303) + ntt_in ◄ bank_se/bank_t;ntt_coeff ► 写回 + + + u_pmul (poly_mul_sync) + NTT 域逐点乘 Σ Â∘ŝ / Âᵀ∘ŷ / t̂∘ŷ / ŝ∘û + pm_a_in ◄ bank_a, pm_b_in ◄ bank_se → pm_coeff + + + u_comp (comp_decomp_sync) + Compress_d (mode0) / Decompress_d (mode1) + Encaps C1/C2 压缩;Decaps DECOMP 解压 + + + + 顶层内联运算 + modQ 累加 (ST_M / U / V / W) + m_accq · u_accq · u_uq · u_vq · u_wq + byteEncode12 (ST_E) e_wbyte + byteDecode12 (TDEC/SDEC) td_c0/td_c1 + bit-packer cp_* / 解包 dec_* / 比较 cmp_* + + + + 系数存储库 (sd_bram, 1R/1W, 1拍读) + + + u_bank_a 12×4096 (PA_AW=12) + Â[i][j] 矩阵;Decaps 中转 ŝ / e2 / v' + ba_rd_addr/ba_rd_data ba_we/ba_wa/ba_wd + slot: i*K+j + + + u_bank_se 12×2048 (PSE_AW=11) + ŝ/ê (KeyGen) · ŷ (Encaps) · û (Decaps) + bse_rd_addr/bse_rd_data bse_we/wa/wd + slot_s=K² slot_e=K²+K + + + u_bank_t 12×1024 (PT_AW=10) + t̂ · psum · Encaps v · Decaps w + bt_rd_addr/bt_rd_data bt_we/wa/wd + slot_t=K²+2K UPSUM=rel1 + + + u_ek_bram + 8×2048 + ek=Enc12(t̂)‖ρ + + + u_dkp_bram + 8×2048 + dk_pke=Enc12(ŝ) + + + u_ct_bram + 8×2048 c / c' + + + u_c_in_bram + 8×2048 输入 c + + + + 输出 / 回读 + ss_o = dec_reject ? kbar_r : ss_r + 共享密钥 K (Encaps/Decaps) + + dbg_ct_o ◄ u_ct_bram + 密文 c 逐字节 + dbg_byte_o ◄ ek / dk_pke + sel: 0=ek_bram 1=dkp_bram + dbg_dk_o ◄ dk_pke‖ek‖H(ek)‖z + 完整 dk 逐字节 (1632/2400/3168B) + dbg_coeff_o ◄ bank_a/se/t + 按 dbg_slot_i 选库, 系数回读 + + 调试抽头: dbg_rho_o dbg_sigma_o + dbg_r_o dbg_hek_o dbg_mprime_o + dbg_kbar_o dbg_decz_o dbg_dech_o + done_o / busy_o + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 注:同一套叶子算子 / 存储库被 KeyGen·Encaps·Decaps 三条数据通路按 FSM 相位分时复用;Decaps 重加密直接复用整条 Encaps 流水 (ENC_LOAD…ENC_C2)。 +