feat(ntt): implement synchronous NTT core with Barrett modular reduction

Phase 2.1: Merged Path00+Path01 NTT engine.
- barrett_mul.v: Barrett modular multiplication (a·b mod 3329)
- butterfly_unit.v: Cooley-Tukey/Gentleman-Sande butterfly
- zeta_rom.v: 128-entry ROM with bit-reversed roots of unity
- ntt_core.v: 7-layer NTT FSM, 256×12-bit register file
- ntt_sync.v: valid/ready streaming wrapper

Verified: 13/13 vectors bit-exact vs Python NTT/NTTInverse
This commit is contained in:
2026-06-24 22:51:14 +08:00
parent 5941fee980
commit c4cd10c2c1
8 changed files with 765 additions and 0 deletions

141
sync_rtl/ntt/zeta_rom.v Normal file
View File

@@ -0,0 +1,141 @@
// zeta_rom.v - Precomputed Zeta ROM for ML-KEM NTT
//
// Stores 128 bit-reversed roots of unity for Z_q (q=3329).
// Address 0..127, each entry is a 12-bit value.
// Pure combinational, single continuous assignment.
module zeta_rom (
input [6:0] addr, // 0..127
output [11:0] zeta
);
assign zeta =
(addr == 7'd0) ? 12'd1 :
(addr == 7'd1) ? 12'd1729 :
(addr == 7'd2) ? 12'd2580 :
(addr == 7'd3) ? 12'd3289 :
(addr == 7'd4) ? 12'd2642 :
(addr == 7'd5) ? 12'd630 :
(addr == 7'd6) ? 12'd1897 :
(addr == 7'd7) ? 12'd848 :
(addr == 7'd8) ? 12'd1062 :
(addr == 7'd9) ? 12'd1919 :
(addr == 7'd10) ? 12'd193 :
(addr == 7'd11) ? 12'd797 :
(addr == 7'd12) ? 12'd2786 :
(addr == 7'd13) ? 12'd3260 :
(addr == 7'd14) ? 12'd569 :
(addr == 7'd15) ? 12'd1746 :
(addr == 7'd16) ? 12'd296 :
(addr == 7'd17) ? 12'd2447 :
(addr == 7'd18) ? 12'd1339 :
(addr == 7'd19) ? 12'd1476 :
(addr == 7'd20) ? 12'd3046 :
(addr == 7'd21) ? 12'd56 :
(addr == 7'd22) ? 12'd2240 :
(addr == 7'd23) ? 12'd1333 :
(addr == 7'd24) ? 12'd1426 :
(addr == 7'd25) ? 12'd2094 :
(addr == 7'd26) ? 12'd535 :
(addr == 7'd27) ? 12'd2882 :
(addr == 7'd28) ? 12'd2393 :
(addr == 7'd29) ? 12'd2879 :
(addr == 7'd30) ? 12'd1974 :
(addr == 7'd31) ? 12'd821 :
(addr == 7'd32) ? 12'd289 :
(addr == 7'd33) ? 12'd331 :
(addr == 7'd34) ? 12'd3253 :
(addr == 7'd35) ? 12'd1756 :
(addr == 7'd36) ? 12'd1197 :
(addr == 7'd37) ? 12'd2304 :
(addr == 7'd38) ? 12'd2277 :
(addr == 7'd39) ? 12'd2055 :
(addr == 7'd40) ? 12'd650 :
(addr == 7'd41) ? 12'd1977 :
(addr == 7'd42) ? 12'd2513 :
(addr == 7'd43) ? 12'd632 :
(addr == 7'd44) ? 12'd2865 :
(addr == 7'd45) ? 12'd33 :
(addr == 7'd46) ? 12'd1320 :
(addr == 7'd47) ? 12'd1915 :
(addr == 7'd48) ? 12'd2319 :
(addr == 7'd49) ? 12'd1435 :
(addr == 7'd50) ? 12'd807 :
(addr == 7'd51) ? 12'd452 :
(addr == 7'd52) ? 12'd1438 :
(addr == 7'd53) ? 12'd2868 :
(addr == 7'd54) ? 12'd1534 :
(addr == 7'd55) ? 12'd2402 :
(addr == 7'd56) ? 12'd2647 :
(addr == 7'd57) ? 12'd2617 :
(addr == 7'd58) ? 12'd1481 :
(addr == 7'd59) ? 12'd648 :
(addr == 7'd60) ? 12'd2474 :
(addr == 7'd61) ? 12'd3110 :
(addr == 7'd62) ? 12'd1227 :
(addr == 7'd63) ? 12'd910 :
(addr == 7'd64) ? 12'd17 :
(addr == 7'd65) ? 12'd2761 :
(addr == 7'd66) ? 12'd583 :
(addr == 7'd67) ? 12'd2649 :
(addr == 7'd68) ? 12'd1637 :
(addr == 7'd69) ? 12'd723 :
(addr == 7'd70) ? 12'd2288 :
(addr == 7'd71) ? 12'd1100 :
(addr == 7'd72) ? 12'd1409 :
(addr == 7'd73) ? 12'd2662 :
(addr == 7'd74) ? 12'd3281 :
(addr == 7'd75) ? 12'd233 :
(addr == 7'd76) ? 12'd756 :
(addr == 7'd77) ? 12'd2156 :
(addr == 7'd78) ? 12'd3015 :
(addr == 7'd79) ? 12'd3050 :
(addr == 7'd80) ? 12'd1703 :
(addr == 7'd81) ? 12'd1651 :
(addr == 7'd82) ? 12'd2789 :
(addr == 7'd83) ? 12'd1789 :
(addr == 7'd84) ? 12'd1847 :
(addr == 7'd85) ? 12'd952 :
(addr == 7'd86) ? 12'd1461 :
(addr == 7'd87) ? 12'd2687 :
(addr == 7'd88) ? 12'd939 :
(addr == 7'd89) ? 12'd2308 :
(addr == 7'd90) ? 12'd2437 :
(addr == 7'd91) ? 12'd2388 :
(addr == 7'd92) ? 12'd733 :
(addr == 7'd93) ? 12'd2337 :
(addr == 7'd94) ? 12'd268 :
(addr == 7'd95) ? 12'd641 :
(addr == 7'd96) ? 12'd1584 :
(addr == 7'd97) ? 12'd2298 :
(addr == 7'd98) ? 12'd2037 :
(addr == 7'd99) ? 12'd3220 :
(addr == 7'd100) ? 12'd375 :
(addr == 7'd101) ? 12'd2549 :
(addr == 7'd102) ? 12'd2090 :
(addr == 7'd103) ? 12'd1645 :
(addr == 7'd104) ? 12'd1063 :
(addr == 7'd105) ? 12'd319 :
(addr == 7'd106) ? 12'd2773 :
(addr == 7'd107) ? 12'd757 :
(addr == 7'd108) ? 12'd2099 :
(addr == 7'd109) ? 12'd561 :
(addr == 7'd110) ? 12'd2466 :
(addr == 7'd111) ? 12'd2594 :
(addr == 7'd112) ? 12'd2804 :
(addr == 7'd113) ? 12'd1092 :
(addr == 7'd114) ? 12'd403 :
(addr == 7'd115) ? 12'd1026 :
(addr == 7'd116) ? 12'd1143 :
(addr == 7'd117) ? 12'd2150 :
(addr == 7'd118) ? 12'd2775 :
(addr == 7'd119) ? 12'd886 :
(addr == 7'd120) ? 12'd1722 :
(addr == 7'd121) ? 12'd1212 :
(addr == 7'd122) ? 12'd1874 :
(addr == 7'd123) ? 12'd1029 :
(addr == 7'd124) ? 12'd2110 :
(addr == 7'd125) ? 12'd2935 :
(addr == 7'd126) ? 12'd885 :
12'd2154;
endmodule