module secded_ecc8_tb;
logic [7:0] data_in;logic [12:0] code_in;logic [12:0] code_out;logic [7:0] data_out;
logic single_error,double_error,corrected;logic [3:0] syndrome;
secded_ecc8 dut(.*);
logic [12:0] golden,injected;integer i,j,case_id,failures,single_ok,double_ok;
task run_case(input integer kind,input integer bit_a,input integer bit_b);
begin
 injected=golden;if(bit_a>=0)injected[bit_a]=~injected[bit_a];if(bit_b>=0)injected[bit_b]=~injected[bit_b];
 code_in=injected;#1;
 $display("TRACE,%0d,%0d,%0d,%0d,%02h,%04h,%04h,%0h,%0d,%0d,%0d,%02h",case_id,kind,bit_a,bit_b,data_in,golden,injected,syndrome,single_error,double_error,corrected,data_out);
 if(kind==0&&(single_error||double_error||data_out!==data_in))failures=failures+1;
 if(kind==1&&(!single_error||double_error||!corrected||data_out!==data_in))failures=failures+1;else if(kind==1)single_ok=single_ok+1;
 if(kind==2&&(single_error||!double_error||corrected))failures=failures+1;else if(kind==2)double_ok=double_ok+1;
 case_id=case_id+1;
end endtask
initial begin
 $dumpfile("secded_ecc8.vcd");$dumpvars(0,secded_ecc8_tb);
 data_in=8'hA6;code_in='0;case_id=0;failures=0;single_ok=0;double_ok=0;#1;golden=code_out;
 run_case(0,-1,-1);
 for(i=0;i<13;i=i+1)run_case(1,i,-1);
 for(i=0;i<13;i=i+1)for(j=i+1;j<13;j=j+1)run_case(2,i,j);
 $display("SUMMARY,%0d,%0d,%0d,%0d",case_id,single_ok,double_ok,failures);
 if(failures==0&&single_ok==13&&double_ok==78)$display("PASS,SECDED_ECC8,92,92");else $fatal(1,"ECC verification failed");
 $finish;
end
endmodule
