Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

added encoding cov #98

Merged
merged 4 commits into from
Feb 16, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflow_metadata/pr_hash
Original file line number Diff line number Diff line change
@@ -1 +1 @@
4db3fd3b22ece99cf58f6772a5f648a0a2148934194873fdcc376e07b0872c4402a3f1cff4b9ae944c177fae067563ff
833e03c22dc6e9fa24200862ed2d68424679855437fc9836af3bf5b0a17536f6d6a2e1de2d7eda0f5b375e13b931f1b6
2 changes: 1 addition & 1 deletion .github/workflow_metadata/pr_timestamp
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1739554821
1739598780
96 changes: 96 additions & 0 deletions src/mldsa_top/coverage/mldsa_top_cov_if.sv
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,102 @@ interface mldsa_top_cov_if

endgroup




// SIGN Z encoding
localparam int NUM_ENC = 4;
localparam int GAMMA1 = 19;
localparam int REG_SIZE = 23;
localparam int MLDSA_GAMMA1_RANGE = 2**GAMMA1;
localparam int MLDSA_Q = 8380417;

logic [(NUM_ENC*2)-1:0] eq_flags;
logic [(NUM_ENC*2)-1:0] less_flags;
logic [(NUM_ENC*2)-1:0] greater_flags;
logic enc_unit_equal;
logic enc_unit_less;
logic enc_unit_greater;

genvar sig_enc_i;
generate
for(sig_enc_i = 0; sig_enc_i < NUM_ENC; sig_enc_i++) begin : enc_loop
// For the upper instance
assign eq_flags[sig_enc_i*2] = (mldsa_top.sigencode_z_inst.enc_unit[sig_enc_i].upper_encode.data_i == MLDSA_GAMMA1_RANGE);
assign less_flags[sig_enc_i*2] = (mldsa_top.sigencode_z_inst.enc_unit[sig_enc_i].upper_encode.data_i < MLDSA_GAMMA1_RANGE);
assign greater_flags[sig_enc_i*2] = (mldsa_top.sigencode_z_inst.enc_unit[sig_enc_i].upper_encode.data_i > MLDSA_GAMMA1_RANGE);

// For the lower instance
assign eq_flags[sig_enc_i*2+1] = (mldsa_top.sigencode_z_inst.enc_unit[sig_enc_i].lower_encode.data_i == MLDSA_GAMMA1_RANGE);
assign less_flags[sig_enc_i*2+1] = (mldsa_top.sigencode_z_inst.enc_unit[sig_enc_i].lower_encode.data_i < MLDSA_GAMMA1_RANGE);
assign greater_flags[sig_enc_i*2+1] = (mldsa_top.sigencode_z_inst.enc_unit[sig_enc_i].lower_encode.data_i > MLDSA_GAMMA1_RANGE);
end
endgenerate

// OR-reduce the flags: if any instance meets the condition, the corresponding signal is 1.
assign enc_unit_equal = (|eq_flags) & (mldsa_top.sigencode_z_inst.state != mldsa_top.sigencode_z_inst.IDLE);
assign enc_unit_less = (|less_flags) & (mldsa_top.sigencode_z_inst.state != mldsa_top.sigencode_z_inst.IDLE);
assign enc_unit_greater = (|greater_flags) & (mldsa_top.sigencode_z_inst.state != mldsa_top.sigencode_z_inst.IDLE);
// Sign_z to cover the aggregated conditions
covergroup sign_z_enc_agg_cg @(posedge clk);
coverpoint enc_unit_equal {
bins hit = {1'b1};
}
coverpoint enc_unit_less {
bins hit = {1'b1};
}
coverpoint enc_unit_greater {
bins hit = {1'b1};
}
endgroup

// The FSM cases are: 'h0, 'h1, 'h2, MLDSA_Q-1, MLDSA_Q-2, and default.
logic [(NUM_ENC*2)-1:0] skenc_state0_flags;
logic [(NUM_ENC*2)-1:0] skenc_state1_flags;
logic [(NUM_ENC*2)-1:0] skenc_state2_flags;
logic [(NUM_ENC*2)-1:0] skenc_state_mq1_flags;
logic [(NUM_ENC*2)-1:0] skenc_state_mq2_flags;
logic skenc_state0_agg, skenc_state1_agg, skenc_state2_agg, skenc_state_mq1_agg, skenc_state_mq2_agg;

genvar sk_enc_i;
generate
for (sk_enc_i = 0; sk_enc_i < NUM_ENC; sk_enc_i++) begin : sk_enc_loop
// For mem_a_rd_data element
assign skenc_state0_flags[sk_enc_i*2] = (mldsa_top.skencode_inst.mem_a_rd_data[sk_enc_i] == 'h0);
assign skenc_state1_flags[sk_enc_i*2] = (mldsa_top.skencode_inst.mem_a_rd_data[sk_enc_i] == 'h1);
assign skenc_state2_flags[sk_enc_i*2] = (mldsa_top.skencode_inst.mem_a_rd_data[sk_enc_i] == 'h2);
assign skenc_state_mq1_flags[sk_enc_i*2] = (mldsa_top.skencode_inst.mem_a_rd_data[sk_enc_i] == MLDSA_Q - 1);
assign skenc_state_mq2_flags[sk_enc_i*2] = (mldsa_top.skencode_inst.mem_a_rd_data[sk_enc_i] == MLDSA_Q - 2);
// For mem_b_rd_data element
assign skenc_state0_flags[sk_enc_i*2+1] = (mldsa_top.skencode_inst.mem_b_rd_data[sk_enc_i] == 'h0);
assign skenc_state1_flags[sk_enc_i*2+1] = (mldsa_top.skencode_inst.mem_b_rd_data[sk_enc_i] == 'h1);
assign skenc_state2_flags[sk_enc_i*2+1] = (mldsa_top.skencode_inst.mem_b_rd_data[sk_enc_i] == 'h2);
assign skenc_state_mq1_flags[sk_enc_i*2+1] = (mldsa_top.skencode_inst.mem_b_rd_data[sk_enc_i] == MLDSA_Q - 1);
assign skenc_state_mq2_flags[sk_enc_i*2+1] = (mldsa_top.skencode_inst.mem_b_rd_data[sk_enc_i] == MLDSA_Q - 2);
end
endgenerate

// OR-reduce each set of flags and ensure the FSM is not in IDLE.
// (Assuming mldsa_top.skencode_inst.state and its IDLE constant are accessible.)
assign skenc_state0_agg = (|skenc_state0_flags) & (mldsa_top.skencode_inst.main_state != mldsa_top.skencode_inst.IDLE);
assign skenc_state1_agg = (|skenc_state1_flags) & (mldsa_top.skencode_inst.main_state != mldsa_top.skencode_inst.IDLE);
assign skenc_state2_agg = (|skenc_state2_flags) & (mldsa_top.skencode_inst.main_state != mldsa_top.skencode_inst.IDLE);
assign skenc_state_mq1_agg = (|skenc_state_mq1_flags) & (mldsa_top.skencode_inst.main_state != mldsa_top.skencode_inst.IDLE);
assign skenc_state_mq2_agg = (|skenc_state_mq2_flags) & (mldsa_top.skencode_inst.main_state != mldsa_top.skencode_inst.IDLE);

// Now create a covergroup that samples these aggregated flags.
covergroup skencode_agg_cg @(posedge clk);
coverpoint skenc_state0_agg { bins hit = {1'b1}; }
coverpoint skenc_state1_agg { bins hit = {1'b1}; }
coverpoint skenc_state2_agg { bins hit = {1'b1}; }
coverpoint skenc_state_mq1_agg { bins hit = {1'b1}; }
coverpoint skenc_state_mq2_agg { bins hit = {1'b1}; }
endgroup

// Instantiate the covergroup
skencode_agg_cg skencode_agg_cov = new();
sign_z_enc_agg_cg sign_z_enc_agg_cov_grp1 = new();

mldsa_top_cov_grp mldsa_top_cov_grp1 = new();

endinterface
Expand Down