refactor(kg): make ML-KEM K a runtime input k_i instead of a parameter
mlkem_top now sizes storage for KMAX=4 (worst case) and selects the active ML-KEM parameter set at start_i via the k_i input. All K-derived quantities (eta1, slot bases, ek/dk byte counts, H(ek) block count, FSM bounds) are computed at runtime from the captured k_r. Verified byte-exact against NIST KAT for all three parameter sets: K=2 (512) cases 0-4, K=3 (768) cases 0-2, K=4 (1024) cases 0-2 -> 11/11 PASS (ek==pk, dk==sk).
This commit is contained in:
@@ -9,6 +9,7 @@ module tb_mlkem_kg_katK_xsim;
|
||||
localparam DKB = 768*KP + 96;
|
||||
|
||||
reg clk=0, rst_n=0, start_i=0;
|
||||
reg [2:0] k_i;
|
||||
reg [255:0] d_i, z_i;
|
||||
wire busy_o, done_o;
|
||||
reg [3:0] dbg_slot_i=0; reg [7:0] dbg_idx_i=0; wire [11:0] dbg_coeff_o;
|
||||
@@ -16,8 +17,9 @@ module tb_mlkem_kg_katK_xsim;
|
||||
reg [11:0] dbg_dk_idx_i=0; wire [7:0] dbg_dk_o;
|
||||
wire [255:0] dbg_rho_o, dbg_sigma_o;
|
||||
|
||||
mlkem_top #(.K(KP)) dut (
|
||||
.clk(clk), .rst_n(rst_n), .d_i(d_i), .z_i(z_i), .start_i(start_i),
|
||||
// KMAX defaults to 4 (worst-case sizing); KP selects the runtime k value.
|
||||
mlkem_top dut (
|
||||
.clk(clk), .rst_n(rst_n), .k_i(k_i), .d_i(d_i), .z_i(z_i), .start_i(start_i),
|
||||
.busy_o(busy_o), .done_o(done_o),
|
||||
.dbg_slot_i(dbg_slot_i), .dbg_idx_i(dbg_idx_i), .dbg_coeff_o(dbg_coeff_o),
|
||||
.dbg_byte_sel_i(dbg_byte_sel_i), .dbg_byte_idx_i(dbg_byte_idx_i), .dbg_byte_o(dbg_byte_o),
|
||||
@@ -45,6 +47,7 @@ module tb_mlkem_kg_katK_xsim;
|
||||
$readmemh(ekfile, ek_gold);
|
||||
$readmemh(dkfile, dk_gold);
|
||||
d_i = dmem[0]; z_i = zmem[0];
|
||||
k_i = KP[2:0];
|
||||
|
||||
rst_n=0; repeat(4) @(posedge clk); rst_n=1; @(posedge clk);
|
||||
start_i=1; @(posedge clk); start_i=0;
|
||||
|
||||
Reference in New Issue
Block a user