| // Copyright lowRISC contributors. |
| // Licensed under the Apache License, Version 2.0, see LICENSE for details. |
| // SPDX-License-Identifier: Apache-2.0 |
| // |
| // SECDED decoder generated by util/design/secded_gen.py |
| |
| module prim_secded_39_32_dec ( |
| input [38:0] data_i, |
| output logic [31:0] data_o, |
| output logic [6:0] syndrome_o, |
| output logic [1:0] err_o |
| ); |
| |
| always_comb begin : p_encode |
| // Syndrome calculation |
| syndrome_o[0] = ^(data_i & 39'h012606BD25); |
| syndrome_o[1] = ^(data_i & 39'h02DEBA8050); |
| syndrome_o[2] = ^(data_i & 39'h04413D89AA); |
| syndrome_o[3] = ^(data_i & 39'h0831234ED1); |
| syndrome_o[4] = ^(data_i & 39'h10C2C1323B); |
| syndrome_o[5] = ^(data_i & 39'h202DCC624C); |
| syndrome_o[6] = ^(data_i & 39'h4098505586); |
| |
| // Corrected output calculation |
| data_o[0] = (syndrome_o == 7'h19) ^ data_i[0]; |
| data_o[1] = (syndrome_o == 7'h54) ^ data_i[1]; |
| data_o[2] = (syndrome_o == 7'h61) ^ data_i[2]; |
| data_o[3] = (syndrome_o == 7'h34) ^ data_i[3]; |
| data_o[4] = (syndrome_o == 7'h1a) ^ data_i[4]; |
| data_o[5] = (syndrome_o == 7'h15) ^ data_i[5]; |
| data_o[6] = (syndrome_o == 7'h2a) ^ data_i[6]; |
| data_o[7] = (syndrome_o == 7'h4c) ^ data_i[7]; |
| data_o[8] = (syndrome_o == 7'h45) ^ data_i[8]; |
| data_o[9] = (syndrome_o == 7'h38) ^ data_i[9]; |
| data_o[10] = (syndrome_o == 7'h49) ^ data_i[10]; |
| data_o[11] = (syndrome_o == 7'hd) ^ data_i[11]; |
| data_o[12] = (syndrome_o == 7'h51) ^ data_i[12]; |
| data_o[13] = (syndrome_o == 7'h31) ^ data_i[13]; |
| data_o[14] = (syndrome_o == 7'h68) ^ data_i[14]; |
| data_o[15] = (syndrome_o == 7'h7) ^ data_i[15]; |
| data_o[16] = (syndrome_o == 7'h1c) ^ data_i[16]; |
| data_o[17] = (syndrome_o == 7'hb) ^ data_i[17]; |
| data_o[18] = (syndrome_o == 7'h25) ^ data_i[18]; |
| data_o[19] = (syndrome_o == 7'h26) ^ data_i[19]; |
| data_o[20] = (syndrome_o == 7'h46) ^ data_i[20]; |
| data_o[21] = (syndrome_o == 7'he) ^ data_i[21]; |
| data_o[22] = (syndrome_o == 7'h70) ^ data_i[22]; |
| data_o[23] = (syndrome_o == 7'h32) ^ data_i[23]; |
| data_o[24] = (syndrome_o == 7'h2c) ^ data_i[24]; |
| data_o[25] = (syndrome_o == 7'h13) ^ data_i[25]; |
| data_o[26] = (syndrome_o == 7'h23) ^ data_i[26]; |
| data_o[27] = (syndrome_o == 7'h62) ^ data_i[27]; |
| data_o[28] = (syndrome_o == 7'h4a) ^ data_i[28]; |
| data_o[29] = (syndrome_o == 7'h29) ^ data_i[29]; |
| data_o[30] = (syndrome_o == 7'h16) ^ data_i[30]; |
| data_o[31] = (syndrome_o == 7'h52) ^ data_i[31]; |
| |
| // err_o calc. bit0: single error, bit1: double error |
| err_o[0] = ^syndrome_o; |
| err_o[1] = ~err_o[0] & (|syndrome_o); |
| end |
| endmodule : prim_secded_39_32_dec |