Pipeline ML-KEM datapath bottlenecks
This commit is contained in:
@@ -12,6 +12,8 @@ module tb_mlkem_enc_katK_xsim;
|
||||
localparam CTB = (KP==4) ? 1568 : (32*(10*KP+4)); // ct bytes: K2 768,K3 1088,K4 1568
|
||||
localparam DU = (KP==4) ? 11 : 10; // compression du
|
||||
localparam C1B = 32*DU*KP; // c1 byte count: K2 640,K3 960,K4 1408
|
||||
localparam integer CLK_PERIOD_NS = 100; // 10 MHz
|
||||
localparam integer CLK_HALF_NS = CLK_PERIOD_NS / 2;
|
||||
|
||||
reg clk=0, rst_n=0, start_i=0;
|
||||
reg [2:0] k_i;
|
||||
@@ -41,15 +43,79 @@ module tb_mlkem_enc_katK_xsim;
|
||||
.dbg_r_o(dbg_r_o), .dbg_hek_o(dbg_hek_o),
|
||||
.dbg_mprime_o(), .dbg_kbar_o(), .dbg_decz_o(), .dbg_dech_o()
|
||||
);
|
||||
always #5 clk = ~clk;
|
||||
always #(CLK_HALF_NS) clk = ~clk;
|
||||
|
||||
reg [7:0] ek_b [0:EKB-1];
|
||||
reg [7:0] m_b [0:31];
|
||||
reg [7:0] ss_b [0:31];
|
||||
reg [7:0] ct_b [0:CTB-1];
|
||||
integer c, i, errors, casenum, j;
|
||||
integer state_cyc [0:31];
|
||||
integer si;
|
||||
reg [8*80-1:0] tag, ekfile, mfile, ssfile, ctfile;
|
||||
|
||||
function [8*16-1:0] state_name;
|
||||
input [4:0] s;
|
||||
begin
|
||||
case (s)
|
||||
5'd0: state_name = "IDLE";
|
||||
5'd1: state_name = "G";
|
||||
5'd2: state_name = "A";
|
||||
5'd3: state_name = "C";
|
||||
5'd4: state_name = "N";
|
||||
5'd5: state_name = "M";
|
||||
5'd6: state_name = "E";
|
||||
5'd7: state_name = "H";
|
||||
5'd8: state_name = "ENC_LOAD";
|
||||
5'd9: state_name = "ENC_H";
|
||||
5'd10: state_name = "ENC_G";
|
||||
5'd11: state_name = "ENC_A";
|
||||
5'd12: state_name = "ENC_TDEC";
|
||||
5'd13: state_name = "ENC_C";
|
||||
5'd14: state_name = "ENC_N";
|
||||
5'd15: state_name = "ENC_U";
|
||||
5'd16: state_name = "ENC_C1";
|
||||
5'd17: state_name = "ENC_V";
|
||||
5'd18: state_name = "ENC_C2";
|
||||
5'd19: state_name = "ENC_E2MV";
|
||||
5'd20: state_name = "DEC_LOAD";
|
||||
5'd21: state_name = "DEC_DECOMP";
|
||||
5'd22: state_name = "DEC_SDEC";
|
||||
5'd23: state_name = "DEC_NTT";
|
||||
5'd24: state_name = "DEC_W";
|
||||
5'd25: state_name = "DEC_MENC";
|
||||
5'd26: state_name = "DEC_G";
|
||||
5'd27: state_name = "DEC_J";
|
||||
5'd28: state_name = "DEC_CMP";
|
||||
5'd31: state_name = "DONE";
|
||||
default: state_name = "UNKNOWN";
|
||||
endcase
|
||||
end
|
||||
endfunction
|
||||
|
||||
task reset_timing;
|
||||
begin
|
||||
for (si = 0; si < 32; si = si + 1) state_cyc[si] = 0;
|
||||
end
|
||||
endtask
|
||||
|
||||
task print_timing;
|
||||
input [8*16-1:0] op_name;
|
||||
input integer cycles;
|
||||
integer runtime_ns;
|
||||
begin
|
||||
runtime_ns = cycles * CLK_PERIOD_NS;
|
||||
$display("TIME K=%0d CASE=%0d OP=%0s cycles=%0d clk=10MHz period=%0dns runtime=%0d ns (%0d.%03d us, %0d.%03d ms)",
|
||||
KP, casenum, op_name, cycles, CLK_PERIOD_NS, runtime_ns,
|
||||
runtime_ns/1000, runtime_ns%1000,
|
||||
runtime_ns/1000000, (runtime_ns%1000000)/1000);
|
||||
$display("TIME_BREAKDOWN K=%0d CASE=%0d OP=%0s", KP, casenum, op_name);
|
||||
for (si = 0; si < 32; si = si + 1)
|
||||
if (state_cyc[si] != 0)
|
||||
$display(" STATE %-12s cycles=%0d time_ns=%0d", state_name(si[4:0]), state_cyc[si], state_cyc[si]*CLK_PERIOD_NS);
|
||||
end
|
||||
endtask
|
||||
|
||||
initial begin
|
||||
if (!$value$plusargs("CASE=%d", casenum)) casenum = 0;
|
||||
$sformat(tag, "k%0d", KP);
|
||||
@@ -81,9 +147,12 @@ module tb_mlkem_enc_katK_xsim;
|
||||
|
||||
// ---- run Encaps ----
|
||||
start_i=1; @(posedge clk); start_i=0;
|
||||
c=0; while(!done_o && c<2000000) begin @(posedge clk); c=c+1; end
|
||||
#1;
|
||||
reset_timing;
|
||||
c=0; while(!done_o && c<2000000) begin state_cyc[dut.st] = state_cyc[dut.st] + 1; @(posedge clk); c=c+1; end
|
||||
if(!done_o) begin $display("FAIL K=%0d case %0d: timeout", KP, casenum); $finish; end
|
||||
$display("=== Encaps E0 done in %0d cyc ===", c);
|
||||
print_timing("Encaps", c);
|
||||
|
||||
$write(" H(ek) = "); for (j=0;j<32;j=j+1) $write("%02x", dbg_hek_o[8*j +: 8]); $write("\n");
|
||||
$write(" r = "); for (j=0;j<32;j=j+1) $write("%02x", dbg_r_o[8*j +: 8]); $write("\n");
|
||||
|
||||
Reference in New Issue
Block a user