blob: ad9302065334312815556bcbab3c57fe44e31fd7 [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
//
// SECDED package generated by
// util/design/secded_gen.py from util/design/data/secded_cfg.hjson
package prim_secded_pkg;
typedef struct packed {
logic [15:0] data;
logic [5:0] syndrome;
logic [1:0] err;
} secded_22_16_t;
typedef struct packed {
logic [21:0] data;
logic [5:0] syndrome;
logic [1:0] err;
} secded_28_22_t;
typedef struct packed {
logic [31:0] data;
logic [6:0] syndrome;
logic [1:0] err;
} secded_39_32_t;
typedef struct packed {
logic [56:0] data;
logic [6:0] syndrome;
logic [1:0] err;
} secded_64_57_t;
typedef struct packed {
logic [63:0] data;
logic [7:0] syndrome;
logic [1:0] err;
} secded_72_64_t;
typedef struct packed {
logic [15:0] data;
logic [5:0] syndrome;
logic [1:0] err;
} secded_hamming_22_16_t;
typedef struct packed {
logic [31:0] data;
logic [6:0] syndrome;
logic [1:0] err;
} secded_hamming_39_32_t;
typedef struct packed {
logic [63:0] data;
logic [7:0] syndrome;
logic [1:0] err;
} secded_hamming_72_64_t;
function automatic logic [21:0] prim_secded_22_16_enc (logic [15:0] in);
logic [21:0] out;
out = 22'(in);
out[16] = ^(out & 22'h00496E);
out[17] = ^(out & 22'h00F20B);
out[18] = ^(out & 22'h008ED8);
out[19] = ^(out & 22'h007714);
out[20] = ^(out & 22'h00ACA5);
out[21] = ^(out & 22'h0011F3);
return out;
endfunction
function automatic secded_22_16_t prim_secded_22_16_dec (logic [21:0] in);
logic [15:0] d_o;
logic [5:0] syndrome_o;
logic [1:0] err_o;
secded_22_16_t dec;
logic single_error;
// Syndrome calculation
syndrome_o[0] = ^(in & 22'h01496E);
syndrome_o[1] = ^(in & 22'h02F20B);
syndrome_o[2] = ^(in & 22'h048ED8);
syndrome_o[3] = ^(in & 22'h087714);
syndrome_o[4] = ^(in & 22'h10ACA5);
syndrome_o[5] = ^(in & 22'h2011F3);
// Corrected output calculation
d_o[0] = (syndrome_o == 6'h32) ^ in[0];
d_o[1] = (syndrome_o == 6'h23) ^ in[1];
d_o[2] = (syndrome_o == 6'h19) ^ in[2];
d_o[3] = (syndrome_o == 6'h7) ^ in[3];
d_o[4] = (syndrome_o == 6'h2c) ^ in[4];
d_o[5] = (syndrome_o == 6'h31) ^ in[5];
d_o[6] = (syndrome_o == 6'h25) ^ in[6];
d_o[7] = (syndrome_o == 6'h34) ^ in[7];
d_o[8] = (syndrome_o == 6'h29) ^ in[8];
d_o[9] = (syndrome_o == 6'he) ^ in[9];
d_o[10] = (syndrome_o == 6'h1c) ^ in[10];
d_o[11] = (syndrome_o == 6'h15) ^ in[11];
d_o[12] = (syndrome_o == 6'h2a) ^ in[12];
d_o[13] = (syndrome_o == 6'h1a) ^ in[13];
d_o[14] = (syndrome_o == 6'hb) ^ in[14];
d_o[15] = (syndrome_o == 6'h16) ^ in[15];
// err_o calc. bit0: single error, bit1: double error
single_error = ^syndrome_o;
err_o[0] = single_error;
err_o[1] = ~single_error & (|syndrome_o);
dec.data = d_o;
dec.syndrome = syndrome_o;
dec.err = err_o;
return dec;
endfunction
function automatic logic [27:0] prim_secded_28_22_enc (logic [21:0] in);
logic [27:0] out;
out = 28'(in);
out[22] = ^(out & 28'h03003FF);
out[23] = ^(out & 28'h010FC0F);
out[24] = ^(out & 28'h0271C71);
out[25] = ^(out & 28'h03B6592);
out[26] = ^(out & 28'h03DAAA4);
out[27] = ^(out & 28'h03ED348);
return out;
endfunction
function automatic secded_28_22_t prim_secded_28_22_dec (logic [27:0] in);
logic [21:0] d_o;
logic [5:0] syndrome_o;
logic [1:0] err_o;
secded_28_22_t dec;
logic single_error;
// Syndrome calculation
syndrome_o[0] = ^(in & 28'h07003FF);
syndrome_o[1] = ^(in & 28'h090FC0F);
syndrome_o[2] = ^(in & 28'h1271C71);
syndrome_o[3] = ^(in & 28'h23B6592);
syndrome_o[4] = ^(in & 28'h43DAAA4);
syndrome_o[5] = ^(in & 28'h83ED348);
// Corrected output calculation
d_o[0] = (syndrome_o == 6'h7) ^ in[0];
d_o[1] = (syndrome_o == 6'hb) ^ in[1];
d_o[2] = (syndrome_o == 6'h13) ^ in[2];
d_o[3] = (syndrome_o == 6'h23) ^ in[3];
d_o[4] = (syndrome_o == 6'hd) ^ in[4];
d_o[5] = (syndrome_o == 6'h15) ^ in[5];
d_o[6] = (syndrome_o == 6'h25) ^ in[6];
d_o[7] = (syndrome_o == 6'h19) ^ in[7];
d_o[8] = (syndrome_o == 6'h29) ^ in[8];
d_o[9] = (syndrome_o == 6'h31) ^ in[9];
d_o[10] = (syndrome_o == 6'he) ^ in[10];
d_o[11] = (syndrome_o == 6'h16) ^ in[11];
d_o[12] = (syndrome_o == 6'h26) ^ in[12];
d_o[13] = (syndrome_o == 6'h1a) ^ in[13];
d_o[14] = (syndrome_o == 6'h2a) ^ in[14];
d_o[15] = (syndrome_o == 6'h32) ^ in[15];
d_o[16] = (syndrome_o == 6'h1c) ^ in[16];
d_o[17] = (syndrome_o == 6'h2c) ^ in[17];
d_o[18] = (syndrome_o == 6'h34) ^ in[18];
d_o[19] = (syndrome_o == 6'h38) ^ in[19];
d_o[20] = (syndrome_o == 6'h3b) ^ in[20];
d_o[21] = (syndrome_o == 6'h3d) ^ in[21];
// err_o calc. bit0: single error, bit1: double error
single_error = ^syndrome_o;
err_o[0] = single_error;
err_o[1] = ~single_error & (|syndrome_o);
dec.data = d_o;
dec.syndrome = syndrome_o;
dec.err = err_o;
return dec;
endfunction
function automatic logic [38:0] prim_secded_39_32_enc (logic [31:0] in);
logic [38:0] out;
out = 39'(in);
out[32] = ^(out & 39'h002606BD25);
out[33] = ^(out & 39'h00DEBA8050);
out[34] = ^(out & 39'h00413D89AA);
out[35] = ^(out & 39'h0031234ED1);
out[36] = ^(out & 39'h00C2C1323B);
out[37] = ^(out & 39'h002DCC624C);
out[38] = ^(out & 39'h0098505586);
return out;
endfunction
function automatic secded_39_32_t prim_secded_39_32_dec (logic [38:0] in);
logic [31:0] d_o;
logic [6:0] syndrome_o;
logic [1:0] err_o;
secded_39_32_t dec;
logic single_error;
// Syndrome calculation
syndrome_o[0] = ^(in & 39'h012606BD25);
syndrome_o[1] = ^(in & 39'h02DEBA8050);
syndrome_o[2] = ^(in & 39'h04413D89AA);
syndrome_o[3] = ^(in & 39'h0831234ED1);
syndrome_o[4] = ^(in & 39'h10C2C1323B);
syndrome_o[5] = ^(in & 39'h202DCC624C);
syndrome_o[6] = ^(in & 39'h4098505586);
// Corrected output calculation
d_o[0] = (syndrome_o == 7'h19) ^ in[0];
d_o[1] = (syndrome_o == 7'h54) ^ in[1];
d_o[2] = (syndrome_o == 7'h61) ^ in[2];
d_o[3] = (syndrome_o == 7'h34) ^ in[3];
d_o[4] = (syndrome_o == 7'h1a) ^ in[4];
d_o[5] = (syndrome_o == 7'h15) ^ in[5];
d_o[6] = (syndrome_o == 7'h2a) ^ in[6];
d_o[7] = (syndrome_o == 7'h4c) ^ in[7];
d_o[8] = (syndrome_o == 7'h45) ^ in[8];
d_o[9] = (syndrome_o == 7'h38) ^ in[9];
d_o[10] = (syndrome_o == 7'h49) ^ in[10];
d_o[11] = (syndrome_o == 7'hd) ^ in[11];
d_o[12] = (syndrome_o == 7'h51) ^ in[12];
d_o[13] = (syndrome_o == 7'h31) ^ in[13];
d_o[14] = (syndrome_o == 7'h68) ^ in[14];
d_o[15] = (syndrome_o == 7'h7) ^ in[15];
d_o[16] = (syndrome_o == 7'h1c) ^ in[16];
d_o[17] = (syndrome_o == 7'hb) ^ in[17];
d_o[18] = (syndrome_o == 7'h25) ^ in[18];
d_o[19] = (syndrome_o == 7'h26) ^ in[19];
d_o[20] = (syndrome_o == 7'h46) ^ in[20];
d_o[21] = (syndrome_o == 7'he) ^ in[21];
d_o[22] = (syndrome_o == 7'h70) ^ in[22];
d_o[23] = (syndrome_o == 7'h32) ^ in[23];
d_o[24] = (syndrome_o == 7'h2c) ^ in[24];
d_o[25] = (syndrome_o == 7'h13) ^ in[25];
d_o[26] = (syndrome_o == 7'h23) ^ in[26];
d_o[27] = (syndrome_o == 7'h62) ^ in[27];
d_o[28] = (syndrome_o == 7'h4a) ^ in[28];
d_o[29] = (syndrome_o == 7'h29) ^ in[29];
d_o[30] = (syndrome_o == 7'h16) ^ in[30];
d_o[31] = (syndrome_o == 7'h52) ^ in[31];
// err_o calc. bit0: single error, bit1: double error
single_error = ^syndrome_o;
err_o[0] = single_error;
err_o[1] = ~single_error & (|syndrome_o);
dec.data = d_o;
dec.syndrome = syndrome_o;
dec.err = err_o;
return dec;
endfunction
function automatic logic [63:0] prim_secded_64_57_enc (logic [56:0] in);
logic [63:0] out;
out = 64'(in);
out[57] = ^(out & 64'h0103FFF800007FFF);
out[58] = ^(out & 64'h017C1FF801FF801F);
out[59] = ^(out & 64'h01BDE1F87E0781E1);
out[60] = ^(out & 64'h01DEEE3B8E388E22);
out[61] = ^(out & 64'h01EF76CDB2C93244);
out[62] = ^(out & 64'h01F7BB56D5525488);
out[63] = ^(out & 64'h01FBDDA769A46910);
return out;
endfunction
function automatic secded_64_57_t prim_secded_64_57_dec (logic [63:0] in);
logic [56:0] d_o;
logic [6:0] syndrome_o;
logic [1:0] err_o;
secded_64_57_t dec;
logic single_error;
// Syndrome calculation
syndrome_o[0] = ^(in & 64'h0303FFF800007FFF);
syndrome_o[1] = ^(in & 64'h057C1FF801FF801F);
syndrome_o[2] = ^(in & 64'h09BDE1F87E0781E1);
syndrome_o[3] = ^(in & 64'h11DEEE3B8E388E22);
syndrome_o[4] = ^(in & 64'h21EF76CDB2C93244);
syndrome_o[5] = ^(in & 64'h41F7BB56D5525488);
syndrome_o[6] = ^(in & 64'h81FBDDA769A46910);
// Corrected output calculation
d_o[0] = (syndrome_o == 7'h7) ^ in[0];
d_o[1] = (syndrome_o == 7'hb) ^ in[1];
d_o[2] = (syndrome_o == 7'h13) ^ in[2];
d_o[3] = (syndrome_o == 7'h23) ^ in[3];
d_o[4] = (syndrome_o == 7'h43) ^ in[4];
d_o[5] = (syndrome_o == 7'hd) ^ in[5];
d_o[6] = (syndrome_o == 7'h15) ^ in[6];
d_o[7] = (syndrome_o == 7'h25) ^ in[7];
d_o[8] = (syndrome_o == 7'h45) ^ in[8];
d_o[9] = (syndrome_o == 7'h19) ^ in[9];
d_o[10] = (syndrome_o == 7'h29) ^ in[10];
d_o[11] = (syndrome_o == 7'h49) ^ in[11];
d_o[12] = (syndrome_o == 7'h31) ^ in[12];
d_o[13] = (syndrome_o == 7'h51) ^ in[13];
d_o[14] = (syndrome_o == 7'h61) ^ in[14];
d_o[15] = (syndrome_o == 7'he) ^ in[15];
d_o[16] = (syndrome_o == 7'h16) ^ in[16];
d_o[17] = (syndrome_o == 7'h26) ^ in[17];
d_o[18] = (syndrome_o == 7'h46) ^ in[18];
d_o[19] = (syndrome_o == 7'h1a) ^ in[19];
d_o[20] = (syndrome_o == 7'h2a) ^ in[20];
d_o[21] = (syndrome_o == 7'h4a) ^ in[21];
d_o[22] = (syndrome_o == 7'h32) ^ in[22];
d_o[23] = (syndrome_o == 7'h52) ^ in[23];
d_o[24] = (syndrome_o == 7'h62) ^ in[24];
d_o[25] = (syndrome_o == 7'h1c) ^ in[25];
d_o[26] = (syndrome_o == 7'h2c) ^ in[26];
d_o[27] = (syndrome_o == 7'h4c) ^ in[27];
d_o[28] = (syndrome_o == 7'h34) ^ in[28];
d_o[29] = (syndrome_o == 7'h54) ^ in[29];
d_o[30] = (syndrome_o == 7'h64) ^ in[30];
d_o[31] = (syndrome_o == 7'h38) ^ in[31];
d_o[32] = (syndrome_o == 7'h58) ^ in[32];
d_o[33] = (syndrome_o == 7'h68) ^ in[33];
d_o[34] = (syndrome_o == 7'h70) ^ in[34];
d_o[35] = (syndrome_o == 7'h1f) ^ in[35];
d_o[36] = (syndrome_o == 7'h2f) ^ in[36];
d_o[37] = (syndrome_o == 7'h4f) ^ in[37];
d_o[38] = (syndrome_o == 7'h37) ^ in[38];
d_o[39] = (syndrome_o == 7'h57) ^ in[39];
d_o[40] = (syndrome_o == 7'h67) ^ in[40];
d_o[41] = (syndrome_o == 7'h3b) ^ in[41];
d_o[42] = (syndrome_o == 7'h5b) ^ in[42];
d_o[43] = (syndrome_o == 7'h6b) ^ in[43];
d_o[44] = (syndrome_o == 7'h73) ^ in[44];
d_o[45] = (syndrome_o == 7'h3d) ^ in[45];
d_o[46] = (syndrome_o == 7'h5d) ^ in[46];
d_o[47] = (syndrome_o == 7'h6d) ^ in[47];
d_o[48] = (syndrome_o == 7'h75) ^ in[48];
d_o[49] = (syndrome_o == 7'h79) ^ in[49];
d_o[50] = (syndrome_o == 7'h3e) ^ in[50];
d_o[51] = (syndrome_o == 7'h5e) ^ in[51];
d_o[52] = (syndrome_o == 7'h6e) ^ in[52];
d_o[53] = (syndrome_o == 7'h76) ^ in[53];
d_o[54] = (syndrome_o == 7'h7a) ^ in[54];
d_o[55] = (syndrome_o == 7'h7c) ^ in[55];
d_o[56] = (syndrome_o == 7'h7f) ^ in[56];
// err_o calc. bit0: single error, bit1: double error
single_error = ^syndrome_o;
err_o[0] = single_error;
err_o[1] = ~single_error & (|syndrome_o);
dec.data = d_o;
dec.syndrome = syndrome_o;
dec.err = err_o;
return dec;
endfunction
function automatic logic [71:0] prim_secded_72_64_enc (logic [63:0] in);
logic [71:0] out;
out = 72'(in);
out[64] = ^(out & 72'h00B9000000001FFFFF);
out[65] = ^(out & 72'h005E00000FFFE0003F);
out[66] = ^(out & 72'h0067003FF003E007C1);
out[67] = ^(out & 72'h00CD0FC0F03C207842);
out[68] = ^(out & 72'h00B671C711C4438884);
out[69] = ^(out & 72'h00B5B65926488C9108);
out[70] = ^(out & 72'h00CBDAAA4A91152210);
out[71] = ^(out & 72'h007AED348D221A4420);
return out;
endfunction
function automatic secded_72_64_t prim_secded_72_64_dec (logic [71:0] in);
logic [63:0] d_o;
logic [7:0] syndrome_o;
logic [1:0] err_o;
secded_72_64_t dec;
logic single_error;
// Syndrome calculation
syndrome_o[0] = ^(in & 72'h01B9000000001FFFFF);
syndrome_o[1] = ^(in & 72'h025E00000FFFE0003F);
syndrome_o[2] = ^(in & 72'h0467003FF003E007C1);
syndrome_o[3] = ^(in & 72'h08CD0FC0F03C207842);
syndrome_o[4] = ^(in & 72'h10B671C711C4438884);
syndrome_o[5] = ^(in & 72'h20B5B65926488C9108);
syndrome_o[6] = ^(in & 72'h40CBDAAA4A91152210);
syndrome_o[7] = ^(in & 72'h807AED348D221A4420);
// Corrected output calculation
d_o[0] = (syndrome_o == 8'h7) ^ in[0];
d_o[1] = (syndrome_o == 8'hb) ^ in[1];
d_o[2] = (syndrome_o == 8'h13) ^ in[2];
d_o[3] = (syndrome_o == 8'h23) ^ in[3];
d_o[4] = (syndrome_o == 8'h43) ^ in[4];
d_o[5] = (syndrome_o == 8'h83) ^ in[5];
d_o[6] = (syndrome_o == 8'hd) ^ in[6];
d_o[7] = (syndrome_o == 8'h15) ^ in[7];
d_o[8] = (syndrome_o == 8'h25) ^ in[8];
d_o[9] = (syndrome_o == 8'h45) ^ in[9];
d_o[10] = (syndrome_o == 8'h85) ^ in[10];
d_o[11] = (syndrome_o == 8'h19) ^ in[11];
d_o[12] = (syndrome_o == 8'h29) ^ in[12];
d_o[13] = (syndrome_o == 8'h49) ^ in[13];
d_o[14] = (syndrome_o == 8'h89) ^ in[14];
d_o[15] = (syndrome_o == 8'h31) ^ in[15];
d_o[16] = (syndrome_o == 8'h51) ^ in[16];
d_o[17] = (syndrome_o == 8'h91) ^ in[17];
d_o[18] = (syndrome_o == 8'h61) ^ in[18];
d_o[19] = (syndrome_o == 8'ha1) ^ in[19];
d_o[20] = (syndrome_o == 8'hc1) ^ in[20];
d_o[21] = (syndrome_o == 8'he) ^ in[21];
d_o[22] = (syndrome_o == 8'h16) ^ in[22];
d_o[23] = (syndrome_o == 8'h26) ^ in[23];
d_o[24] = (syndrome_o == 8'h46) ^ in[24];
d_o[25] = (syndrome_o == 8'h86) ^ in[25];
d_o[26] = (syndrome_o == 8'h1a) ^ in[26];
d_o[27] = (syndrome_o == 8'h2a) ^ in[27];
d_o[28] = (syndrome_o == 8'h4a) ^ in[28];
d_o[29] = (syndrome_o == 8'h8a) ^ in[29];
d_o[30] = (syndrome_o == 8'h32) ^ in[30];
d_o[31] = (syndrome_o == 8'h52) ^ in[31];
d_o[32] = (syndrome_o == 8'h92) ^ in[32];
d_o[33] = (syndrome_o == 8'h62) ^ in[33];
d_o[34] = (syndrome_o == 8'ha2) ^ in[34];
d_o[35] = (syndrome_o == 8'hc2) ^ in[35];
d_o[36] = (syndrome_o == 8'h1c) ^ in[36];
d_o[37] = (syndrome_o == 8'h2c) ^ in[37];
d_o[38] = (syndrome_o == 8'h4c) ^ in[38];
d_o[39] = (syndrome_o == 8'h8c) ^ in[39];
d_o[40] = (syndrome_o == 8'h34) ^ in[40];
d_o[41] = (syndrome_o == 8'h54) ^ in[41];
d_o[42] = (syndrome_o == 8'h94) ^ in[42];
d_o[43] = (syndrome_o == 8'h64) ^ in[43];
d_o[44] = (syndrome_o == 8'ha4) ^ in[44];
d_o[45] = (syndrome_o == 8'hc4) ^ in[45];
d_o[46] = (syndrome_o == 8'h38) ^ in[46];
d_o[47] = (syndrome_o == 8'h58) ^ in[47];
d_o[48] = (syndrome_o == 8'h98) ^ in[48];
d_o[49] = (syndrome_o == 8'h68) ^ in[49];
d_o[50] = (syndrome_o == 8'ha8) ^ in[50];
d_o[51] = (syndrome_o == 8'hc8) ^ in[51];
d_o[52] = (syndrome_o == 8'h70) ^ in[52];
d_o[53] = (syndrome_o == 8'hb0) ^ in[53];
d_o[54] = (syndrome_o == 8'hd0) ^ in[54];
d_o[55] = (syndrome_o == 8'he0) ^ in[55];
d_o[56] = (syndrome_o == 8'h6d) ^ in[56];
d_o[57] = (syndrome_o == 8'hd6) ^ in[57];
d_o[58] = (syndrome_o == 8'h3e) ^ in[58];
d_o[59] = (syndrome_o == 8'hcb) ^ in[59];
d_o[60] = (syndrome_o == 8'hb3) ^ in[60];
d_o[61] = (syndrome_o == 8'hb5) ^ in[61];
d_o[62] = (syndrome_o == 8'hce) ^ in[62];
d_o[63] = (syndrome_o == 8'h79) ^ in[63];
// err_o calc. bit0: single error, bit1: double error
single_error = ^syndrome_o;
err_o[0] = single_error;
err_o[1] = ~single_error & (|syndrome_o);
dec.data = d_o;
dec.syndrome = syndrome_o;
dec.err = err_o;
return dec;
endfunction
function automatic logic [21:0] prim_secded_hamming_22_16_enc (logic [15:0] in);
logic [21:0] out;
out = 22'(in);
out[16] = ^(out & 22'h00AD5B);
out[17] = ^(out & 22'h00366D);
out[18] = ^(out & 22'h00C78E);
out[19] = ^(out & 22'h0007F0);
out[20] = ^(out & 22'h00F800);
out[21] = ^(out & 22'h1FFFFF);
return out;
endfunction
function automatic secded_hamming_22_16_t prim_secded_hamming_22_16_dec (logic [21:0] in);
logic [15:0] d_o;
logic [5:0] syndrome_o;
logic [1:0] err_o;
secded_hamming_22_16_t dec;
// Syndrome calculation
syndrome_o[0] = ^(in & 22'h01AD5B);
syndrome_o[1] = ^(in & 22'h02366D);
syndrome_o[2] = ^(in & 22'h04C78E);
syndrome_o[3] = ^(in & 22'h0807F0);
syndrome_o[4] = ^(in & 22'h10F800);
syndrome_o[5] = ^(in & 22'h3FFFFF);
// Corrected output calculation
d_o[0] = (syndrome_o == 6'h23) ^ in[0];
d_o[1] = (syndrome_o == 6'h25) ^ in[1];
d_o[2] = (syndrome_o == 6'h26) ^ in[2];
d_o[3] = (syndrome_o == 6'h27) ^ in[3];
d_o[4] = (syndrome_o == 6'h29) ^ in[4];
d_o[5] = (syndrome_o == 6'h2a) ^ in[5];
d_o[6] = (syndrome_o == 6'h2b) ^ in[6];
d_o[7] = (syndrome_o == 6'h2c) ^ in[7];
d_o[8] = (syndrome_o == 6'h2d) ^ in[8];
d_o[9] = (syndrome_o == 6'h2e) ^ in[9];
d_o[10] = (syndrome_o == 6'h2f) ^ in[10];
d_o[11] = (syndrome_o == 6'h31) ^ in[11];
d_o[12] = (syndrome_o == 6'h32) ^ in[12];
d_o[13] = (syndrome_o == 6'h33) ^ in[13];
d_o[14] = (syndrome_o == 6'h34) ^ in[14];
d_o[15] = (syndrome_o == 6'h35) ^ in[15];
// err_o calc. bit0: single error, bit1: double error
err_o[0] = syndrome_o[5];
err_o[1] = |syndrome_o[4:0] & ~syndrome_o[5];
dec.data = d_o;
dec.syndrome = syndrome_o;
dec.err = err_o;
return dec;
endfunction
function automatic logic [38:0] prim_secded_hamming_39_32_enc (logic [31:0] in);
logic [38:0] out;
out = 39'(in);
out[32] = ^(out & 39'h0056AAAD5B);
out[33] = ^(out & 39'h009B33366D);
out[34] = ^(out & 39'h00E3C3C78E);
out[35] = ^(out & 39'h0003FC07F0);
out[36] = ^(out & 39'h0003FFF800);
out[37] = ^(out & 39'h00FC000000);
out[38] = ^(out & 39'h3FFFFFFFFF);
return out;
endfunction
function automatic secded_hamming_39_32_t prim_secded_hamming_39_32_dec (logic [38:0] in);
logic [31:0] d_o;
logic [6:0] syndrome_o;
logic [1:0] err_o;
secded_hamming_39_32_t dec;
// Syndrome calculation
syndrome_o[0] = ^(in & 39'h0156AAAD5B);
syndrome_o[1] = ^(in & 39'h029B33366D);
syndrome_o[2] = ^(in & 39'h04E3C3C78E);
syndrome_o[3] = ^(in & 39'h0803FC07F0);
syndrome_o[4] = ^(in & 39'h1003FFF800);
syndrome_o[5] = ^(in & 39'h20FC000000);
syndrome_o[6] = ^(in & 39'h7FFFFFFFFF);
// Corrected output calculation
d_o[0] = (syndrome_o == 7'h43) ^ in[0];
d_o[1] = (syndrome_o == 7'h45) ^ in[1];
d_o[2] = (syndrome_o == 7'h46) ^ in[2];
d_o[3] = (syndrome_o == 7'h47) ^ in[3];
d_o[4] = (syndrome_o == 7'h49) ^ in[4];
d_o[5] = (syndrome_o == 7'h4a) ^ in[5];
d_o[6] = (syndrome_o == 7'h4b) ^ in[6];
d_o[7] = (syndrome_o == 7'h4c) ^ in[7];
d_o[8] = (syndrome_o == 7'h4d) ^ in[8];
d_o[9] = (syndrome_o == 7'h4e) ^ in[9];
d_o[10] = (syndrome_o == 7'h4f) ^ in[10];
d_o[11] = (syndrome_o == 7'h51) ^ in[11];
d_o[12] = (syndrome_o == 7'h52) ^ in[12];
d_o[13] = (syndrome_o == 7'h53) ^ in[13];
d_o[14] = (syndrome_o == 7'h54) ^ in[14];
d_o[15] = (syndrome_o == 7'h55) ^ in[15];
d_o[16] = (syndrome_o == 7'h56) ^ in[16];
d_o[17] = (syndrome_o == 7'h57) ^ in[17];
d_o[18] = (syndrome_o == 7'h58) ^ in[18];
d_o[19] = (syndrome_o == 7'h59) ^ in[19];
d_o[20] = (syndrome_o == 7'h5a) ^ in[20];
d_o[21] = (syndrome_o == 7'h5b) ^ in[21];
d_o[22] = (syndrome_o == 7'h5c) ^ in[22];
d_o[23] = (syndrome_o == 7'h5d) ^ in[23];
d_o[24] = (syndrome_o == 7'h5e) ^ in[24];
d_o[25] = (syndrome_o == 7'h5f) ^ in[25];
d_o[26] = (syndrome_o == 7'h61) ^ in[26];
d_o[27] = (syndrome_o == 7'h62) ^ in[27];
d_o[28] = (syndrome_o == 7'h63) ^ in[28];
d_o[29] = (syndrome_o == 7'h64) ^ in[29];
d_o[30] = (syndrome_o == 7'h65) ^ in[30];
d_o[31] = (syndrome_o == 7'h66) ^ in[31];
// err_o calc. bit0: single error, bit1: double error
err_o[0] = syndrome_o[6];
err_o[1] = |syndrome_o[5:0] & ~syndrome_o[6];
dec.data = d_o;
dec.syndrome = syndrome_o;
dec.err = err_o;
return dec;
endfunction
function automatic logic [71:0] prim_secded_hamming_72_64_enc (logic [63:0] in);
logic [71:0] out;
out = 72'(in);
out[64] = ^(out & 72'h00AB55555556AAAD5B);
out[65] = ^(out & 72'h00CD9999999B33366D);
out[66] = ^(out & 72'h00F1E1E1E1E3C3C78E);
out[67] = ^(out & 72'h0001FE01FE03FC07F0);
out[68] = ^(out & 72'h0001FFFE0003FFF800);
out[69] = ^(out & 72'h0001FFFFFFFC000000);
out[70] = ^(out & 72'h00FE00000000000000);
out[71] = ^(out & 72'h7FFFFFFFFFFFFFFFFF);
return out;
endfunction
function automatic secded_hamming_72_64_t prim_secded_hamming_72_64_dec (logic [71:0] in);
logic [63:0] d_o;
logic [7:0] syndrome_o;
logic [1:0] err_o;
secded_hamming_72_64_t dec;
// Syndrome calculation
syndrome_o[0] = ^(in & 72'h01AB55555556AAAD5B);
syndrome_o[1] = ^(in & 72'h02CD9999999B33366D);
syndrome_o[2] = ^(in & 72'h04F1E1E1E1E3C3C78E);
syndrome_o[3] = ^(in & 72'h0801FE01FE03FC07F0);
syndrome_o[4] = ^(in & 72'h1001FFFE0003FFF800);
syndrome_o[5] = ^(in & 72'h2001FFFFFFFC000000);
syndrome_o[6] = ^(in & 72'h40FE00000000000000);
syndrome_o[7] = ^(in & 72'hFFFFFFFFFFFFFFFFFF);
// Corrected output calculation
d_o[0] = (syndrome_o == 8'h83) ^ in[0];
d_o[1] = (syndrome_o == 8'h85) ^ in[1];
d_o[2] = (syndrome_o == 8'h86) ^ in[2];
d_o[3] = (syndrome_o == 8'h87) ^ in[3];
d_o[4] = (syndrome_o == 8'h89) ^ in[4];
d_o[5] = (syndrome_o == 8'h8a) ^ in[5];
d_o[6] = (syndrome_o == 8'h8b) ^ in[6];
d_o[7] = (syndrome_o == 8'h8c) ^ in[7];
d_o[8] = (syndrome_o == 8'h8d) ^ in[8];
d_o[9] = (syndrome_o == 8'h8e) ^ in[9];
d_o[10] = (syndrome_o == 8'h8f) ^ in[10];
d_o[11] = (syndrome_o == 8'h91) ^ in[11];
d_o[12] = (syndrome_o == 8'h92) ^ in[12];
d_o[13] = (syndrome_o == 8'h93) ^ in[13];
d_o[14] = (syndrome_o == 8'h94) ^ in[14];
d_o[15] = (syndrome_o == 8'h95) ^ in[15];
d_o[16] = (syndrome_o == 8'h96) ^ in[16];
d_o[17] = (syndrome_o == 8'h97) ^ in[17];
d_o[18] = (syndrome_o == 8'h98) ^ in[18];
d_o[19] = (syndrome_o == 8'h99) ^ in[19];
d_o[20] = (syndrome_o == 8'h9a) ^ in[20];
d_o[21] = (syndrome_o == 8'h9b) ^ in[21];
d_o[22] = (syndrome_o == 8'h9c) ^ in[22];
d_o[23] = (syndrome_o == 8'h9d) ^ in[23];
d_o[24] = (syndrome_o == 8'h9e) ^ in[24];
d_o[25] = (syndrome_o == 8'h9f) ^ in[25];
d_o[26] = (syndrome_o == 8'ha1) ^ in[26];
d_o[27] = (syndrome_o == 8'ha2) ^ in[27];
d_o[28] = (syndrome_o == 8'ha3) ^ in[28];
d_o[29] = (syndrome_o == 8'ha4) ^ in[29];
d_o[30] = (syndrome_o == 8'ha5) ^ in[30];
d_o[31] = (syndrome_o == 8'ha6) ^ in[31];
d_o[32] = (syndrome_o == 8'ha7) ^ in[32];
d_o[33] = (syndrome_o == 8'ha8) ^ in[33];
d_o[34] = (syndrome_o == 8'ha9) ^ in[34];
d_o[35] = (syndrome_o == 8'haa) ^ in[35];
d_o[36] = (syndrome_o == 8'hab) ^ in[36];
d_o[37] = (syndrome_o == 8'hac) ^ in[37];
d_o[38] = (syndrome_o == 8'had) ^ in[38];
d_o[39] = (syndrome_o == 8'hae) ^ in[39];
d_o[40] = (syndrome_o == 8'haf) ^ in[40];
d_o[41] = (syndrome_o == 8'hb0) ^ in[41];
d_o[42] = (syndrome_o == 8'hb1) ^ in[42];
d_o[43] = (syndrome_o == 8'hb2) ^ in[43];
d_o[44] = (syndrome_o == 8'hb3) ^ in[44];
d_o[45] = (syndrome_o == 8'hb4) ^ in[45];
d_o[46] = (syndrome_o == 8'hb5) ^ in[46];
d_o[47] = (syndrome_o == 8'hb6) ^ in[47];
d_o[48] = (syndrome_o == 8'hb7) ^ in[48];
d_o[49] = (syndrome_o == 8'hb8) ^ in[49];
d_o[50] = (syndrome_o == 8'hb9) ^ in[50];
d_o[51] = (syndrome_o == 8'hba) ^ in[51];
d_o[52] = (syndrome_o == 8'hbb) ^ in[52];
d_o[53] = (syndrome_o == 8'hbc) ^ in[53];
d_o[54] = (syndrome_o == 8'hbd) ^ in[54];
d_o[55] = (syndrome_o == 8'hbe) ^ in[55];
d_o[56] = (syndrome_o == 8'hbf) ^ in[56];
d_o[57] = (syndrome_o == 8'hc1) ^ in[57];
d_o[58] = (syndrome_o == 8'hc2) ^ in[58];
d_o[59] = (syndrome_o == 8'hc3) ^ in[59];
d_o[60] = (syndrome_o == 8'hc4) ^ in[60];
d_o[61] = (syndrome_o == 8'hc5) ^ in[61];
d_o[62] = (syndrome_o == 8'hc6) ^ in[62];
d_o[63] = (syndrome_o == 8'hc7) ^ in[63];
// err_o calc. bit0: single error, bit1: double error
err_o[0] = syndrome_o[7];
err_o[1] = |syndrome_o[6:0] & ~syndrome_o[7];
dec.data = d_o;
dec.syndrome = syndrome_o;
dec.err = err_o;
return dec;
endfunction
endpackage