// ========== Copyright Header Begin ========================================== // // OpenSPARC T2 Processor File: axis_ecc_gen.v // Copyright (C) 1995-2007 Sun Microsystems, Inc. All Rights Reserved // 4150 Network Circle, Santa Clara, California 95054, U.S.A. // // * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; version 2 of the License. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // For the avoidance of doubt, and except that if any non-GPL license // choice is available it will apply instead, Sun elects to use only // the General Public License version 2 (GPLv2) at this time for any // software where a choice of GPL license versions is made // available with the language indicating that GPLv2 or any later version // may be used, or where a choice of which version of the GPL is applied is // otherwise unspecified. // // Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, // CA 95054 USA or visit www.sun.com if you need additional information or // have any questions. // // ========== Copyright Header End ============================================ module dram_ecc_gen (/*AUTOARG*/ // Inputs data, // Outputs result, ecc ); // Input Declarations input [127:0] data; // Output Declarations output [111:0] result; output [15:0] ecc; // Wire Declarations wire [3:0] w0; wire [3:0] w1; wire [3:0] w2; wire [3:0] w3; wire [3:0] w4; wire [3:0] w5; wire [3:0] w6; wire [3:0] w7; wire [3:0] w8; wire [3:0] w9; wire [3:0] w10; wire [3:0] w11; wire [3:0] w12; wire [3:0] w13; wire [3:0] w14; wire [3:0] w15; wire [3:0] w16; wire [3:0] w17; wire [3:0] w18; wire [3:0] w19; wire [3:0] w20; wire [3:0] w21; wire [3:0] w22; wire [3:0] w23; wire [3:0] w24; wire [3:0] w25; wire [3:0] w26; wire [3:0] w27; wire [3:0] w28; wire [3:0] w29; wire [3:0] w30; wire [3:0] w31; //wire [3:0] pw0; wire [3:0] pw1; wire [3:0] pw2; wire [3:0] pw3; wire [3:0] pw4; wire [3:0] pw5; wire [3:0] pw6; wire [3:0] pw7; wire [3:0] pw8; wire [3:0] pw9; wire [3:0] pw10; wire [3:0] pw11; wire [3:0] pw12; wire [3:0] pw13; wire [3:0] pw14; //wire [3:0] pw15; wire [3:0] pw16; wire [3:0] pw17; wire [3:0] pw18; wire [3:0] pw19; wire [3:0] pw20; wire [3:0] pw21; wire [3:0] pw22; wire [3:0] pw23; wire [3:0] pw24; wire [3:0] pw25; wire [3:0] pw26; wire [3:0] pw27; wire [3:0] pw28; wire [3:0] pw29; //wire [3:0] pw30; //wire [3:0] pw31; wire [3:0] pw_1; wire [3:0] pw_2; wire [3:0] pw_3; wire [3:0] pw_4; wire [3:0] pw_5; wire [3:0] pw_6; wire [3:0] pw_7; wire [3:0] pw_8; wire [3:0] pw_9; wire [3:0] pw_10; wire [3:0] pw_11; wire [3:0] pw_12; wire [3:0] pw_13; wire [3:0] pw_14; wire [3:0] pw_16; wire [3:0] pw_17; wire [3:0] pw_18; wire [3:0] pw_19; wire [3:0] pw_20; wire [3:0] pw_21; wire [3:0] pw_22; wire [3:0] pw_23; wire [3:0] pw_24; wire [3:0] pw_25; wire [3:0] pw_26; wire [3:0] pw_27; wire [3:0] pw_28; wire [3:0] pw_29; /////////////////////////////// ////// Code Begins Here /////// /////////////////////////////// assign w0[3:0] = data[3:0]; assign w1[3:0] = data[7:4]; assign w2[3:0] = data[11:8]; assign w3[3:0] = data[15:12]; assign w4[3:0] = data[19:16]; assign w5[3:0] = data[23:20]; assign w6[3:0] = data[27:24]; assign w7[3:0] = data[31:28]; assign w8[3:0] = data[35:32]; assign w9[3:0] = data[39:36]; assign w10[3:0] = data[43:40]; assign w11[3:0] = data[47:44]; assign w12[3:0] = data[51:48]; assign w13[3:0] = data[55:52]; assign w14[3:0] = data[59:56]; assign w15[3:0] = data[63:60]; assign w16[3:0] = data[67:64]; assign w17[3:0] = data[71:68]; assign w18[3:0] = data[75:72]; assign w19[3:0] = data[79:76]; assign w20[3:0] = data[83:80]; assign w21[3:0] = data[87:84]; assign w22[3:0] = data[91:88]; assign w23[3:0] = data[95:92]; assign w24[3:0] = data[99:96]; assign w25[3:0] = data[103:100]; assign w26[3:0] = data[107:104]; assign w27[3:0] = data[111:108]; assign w28[3:0] = data[115:112]; assign w29[3:0] = data[119:116]; assign w30[3:0] = data[123:120]; assign w31[3:0] = data[127:124]; ///////////////////////////// /// Galois Multiplication by 4 ///////////////////////////// // 2*w1 assign pw1[0] = w1[3]; assign pw1[1] = w1[0] ^ w1[3]; assign pw1[2] = w1[1]; assign pw1[3] = w1[2]; // 3*w2 assign pw2[0] = w2[0] ^ w2[3]; assign pw2[1] = w2[0] ^ w2[3] ^ w2[1]; assign pw2[2] = w2[1] ^ w2[2]; assign pw2[3] = w2[2] ^ w2[3]; // 4*w3 assign pw3[0] = w3[2]; assign pw3[1] = w3[3] ^ w3[2]; assign pw3[2] = w3[0] ^ w3[3]; assign pw3[3] = w3[1]; // 5*w4 assign pw4[0] = w4[2] ^ w4[0]; assign pw4[1] = w4[3] ^ w4[2] ^ w4[1]; assign pw4[2] = w4[0] ^ w4[3] ^ w4[2]; assign pw4[3] = w4[1] ^ w4[3]; // 6*w5 assign pw5[0] = w5[2] ^ w5[3]; assign pw5[1] = w5[2] ^ w5[0]; assign pw5[2] = w5[0] ^ w5[3] ^ w5[1]; assign pw5[3] = w5[1] ^ w5[2]; // 7*w6 assign pw6[0] = w6[2] ^ w6[3] ^ w6[0]; assign pw6[1] = w6[2] ^ w6[0] ^ w6[1]; assign pw6[2] = w6[0] ^ w6[3] ^ w6[1] ^ w6[2]; assign pw6[3] = w6[1] ^ w6[2] ^ w6[3]; // 8*w7 assign pw7[0] = w7[1]; assign pw7[1] = w7[2] ^ w7[1]; assign pw7[2] = w7[3] ^ w7[2]; assign pw7[3] = w7[0] ^ w7[3]; // 9*w8 assign pw8[0] = w8[1] ^ w8[0]; assign pw8[1] = w8[2]; assign pw8[2] = w8[3]; assign pw8[3] = w8[0]; // a*w9 assign pw9[0] = w9[1] ^ w9[3]; assign pw9[1] = w9[2] ^ w9[1] ^ w9[0] ^ w9[3]; assign pw9[2] = w9[3] ^ w9[2] ^ w9[1]; assign pw9[3] = w9[0] ^ w9[3] ^ w9[2]; // b*w10 assign pw10[0] = w10[1] ^ w10[0] ^ w10[3]; assign pw10[1] = w10[2] ^ w10[0] ^ w10[3]; assign pw10[2] = w10[3] ^ w10[1]; assign pw10[3] = w10[0] ^ w10[2]; // c*w11 assign pw11[0] = w11[1] ^ w11[2]; assign pw11[1] = w11[3] ^ w11[1]; assign pw11[2] = w11[0] ^ w11[2]; assign pw11[3] = w11[0] ^ w11[3] ^ w11[1]; // d*w12 assign pw12[0] = w12[1] ^ w12[2] ^ w12[0]; assign pw12[1] = w12[3]; assign pw12[2] = w12[0]; assign pw12[3] = w12[0] ^ w12[1]; // e*w13 assign pw13[0] = w13[1] ^ w13[2] ^ w13[3]; assign pw13[1] = w13[1] ^ w13[0]; assign pw13[2] = w13[0] ^ w13[2] ^ w13[1]; assign pw13[3] = w13[0] ^ w13[3] ^ w13[1] ^ w13[2]; // f*w14 assign pw14[0] = w14[1] ^ w14[2] ^ w14[3] ^ w14[0]; assign pw14[1] = w14[0]; assign pw14[2] = w14[0] ^ w14[1]; assign pw14[3] = w14[0] ^ w14[1] ^ w14[2]; // 1*w15 //assign pw15[3:0] = w15[3:0]; // 2*w16 assign pw16[0] = w16[3]; assign pw16[1] = w16[0] ^ w16[3]; assign pw16[2] = w16[1]; assign pw16[3] = w16[2]; // 3*w17 assign pw17[0] = w17[0] ^ w17[3]; assign pw17[1] = w17[0] ^ w17[3] ^ w17[1]; assign pw17[2] = w17[1] ^ w17[2]; assign pw17[3] = w17[2] ^ w17[3]; // 4*w18 assign pw18[0] = w18[2]; assign pw18[1] = w18[3] ^ w18[2]; assign pw18[2] = w18[0] ^ w18[3]; assign pw18[3] = w18[1]; // 5*w19 assign pw19[0] = w19[2] ^ w19[0]; assign pw19[1] = w19[3] ^ w19[2] ^ w19[1]; assign pw19[2] = w19[0] ^ w19[3] ^ w19[2]; assign pw19[3] = w19[1] ^ w19[3]; // 6*w20 assign pw20[0] = w20[2] ^ w20[3]; assign pw20[1] = w20[2] ^ w20[0]; assign pw20[2] = w20[0] ^ w20[3] ^ w20[1]; assign pw20[3] = w20[1] ^ w20[2]; // 7*w21 assign pw21[0] = w21[2] ^ w21[3] ^ w21[0]; assign pw21[1] = w21[2] ^ w21[0] ^ w21[1]; assign pw21[2] = w21[0] ^ w21[3] ^ w21[1] ^ w21[2]; assign pw21[3] = w21[1] ^ w21[2] ^ w21[3]; // 8*w22 assign pw22[0] = w22[1]; assign pw22[1] = w22[2] ^ w22[1]; assign pw22[2] = w22[3] ^ w22[2]; assign pw22[3] = w22[0] ^ w22[3]; // 9*w23 assign pw23[0] = w23[1] ^ w23[0]; assign pw23[1] = w23[2]; assign pw23[2] = w23[3]; assign pw23[3] = w23[0]; // a*w24 assign pw24[0] = w24[1] ^ w24[3]; assign pw24[1] = w24[2] ^ w24[1] ^ w24[0] ^ w24[3]; assign pw24[2] = w24[3] ^ w24[2] ^ w24[1]; assign pw24[3] = w24[0] ^ w24[3] ^ w24[2]; // b*w25 assign pw25[0] = w25[1] ^ w25[0] ^ w25[3]; assign pw25[1] = w25[2] ^ w25[0] ^ w25[3]; assign pw25[2] = w25[3] ^ w25[1]; assign pw25[3] = w25[0] ^ w25[2]; // c*w26 assign pw26[0] = w26[1] ^ w26[2]; assign pw26[1] = w26[3] ^ w26[1]; assign pw26[2] = w26[0] ^ w26[2]; assign pw26[3] = w26[0] ^ w26[3] ^ w26[1]; // d*w27 assign pw27[0] = w27[1] ^ w27[2] ^ w27[0]; assign pw27[1] = w27[3]; assign pw27[2] = w27[0]; assign pw27[3] = w27[0] ^ w27[1]; // e*w28 assign pw28[0] = w28[1] ^ w28[2] ^ w28[3]; assign pw28[1] = w28[1] ^ w28[0]; assign pw28[2] = w28[0] ^ w28[2] ^ w28[1]; assign pw28[3] = w28[0] ^ w28[3] ^ w28[1] ^ w28[2]; // f*w29 assign pw29[0] = w29[1] ^ w29[2] ^ w29[3] ^ w29[0]; assign pw29[1] = w29[0]; assign pw29[2] = w29[0] ^ w29[1]; assign pw29[3] = w29[0] ^ w29[1] ^ w29[2]; // 1*w30 //assign pw30[3:0] = w30[3:0]; // 1*w31 //assign pw31[3:0] = w31[3:0]; ////////////// // Parity 4 calculations ////////////// // 2*w8 assign pw_8[0] = w8[3]; assign pw_8[1] = w8[0] ^ w8[3]; assign pw_8[2] = w8[1]; assign pw_8[3] = w8[2]; // 3*w13 assign pw_13[0] = w13[0] ^ w13[3]; assign pw_13[1] = w13[0] ^ w13[3] ^ w13[1]; assign pw_13[2] = w13[1] ^ w13[2]; assign pw_13[3] = w13[2] ^ w13[3]; // 4*w12 assign pw_12[0] = w12[2]; assign pw_12[1] = w12[3] ^ w12[2]; assign pw_12[2] = w12[0] ^ w12[3]; assign pw_12[3] = w12[1]; // 5*w10 assign pw_10[0] = w10[2] ^ w10[0]; assign pw_10[1] = w10[3] ^ w10[2] ^ w10[1]; assign pw_10[2] = w10[0] ^ w10[3] ^ w10[2]; assign pw_10[3] = w10[1] ^ w10[3]; // 6*w6 assign pw_6[0] = w6[2] ^ w6[3]; assign pw_6[1] = w6[2] ^ w6[0]; assign pw_6[2] = w6[0] ^ w6[3] ^ w6[1]; assign pw_6[3] = w6[1] ^ w6[2]; // 7*w5 assign pw_5[0] = w5[2] ^ w5[3] ^ w5[0]; assign pw_5[1] = w5[2] ^ w5[0] ^ w5[1]; assign pw_5[2] = w5[0] ^ w5[3] ^ w5[1] ^ w5[2]; assign pw_5[3] = w5[1] ^ w5[2] ^ w5[3]; // 8*w14 assign pw_14[0] = w14[1]; assign pw_14[1] = w14[2] ^ w14[1]; assign pw_14[2] = w14[3] ^ w14[2]; assign pw_14[3] = w14[0] ^ w14[3]; // 9*w1 assign pw_1[0] = w1[1] ^ w1[0]; assign pw_1[1] = w1[2]; assign pw_1[2] = w1[3]; assign pw_1[3] = w1[0]; // a*w11 assign pw_11[0] = w11[1] ^ w11[3]; assign pw_11[1] = w11[2] ^ w11[1] ^ w11[0] ^ w11[3]; assign pw_11[2] = w11[3] ^ w11[2] ^ w11[1]; assign pw_11[3] = w11[0] ^ w11[3] ^ w11[2]; // b*w4 assign pw_4[0] = w4[1] ^ w4[0] ^ w4[3]; assign pw_4[1] = w4[2] ^ w4[0] ^ w4[3]; assign pw_4[2] = w4[3] ^ w4[1]; assign pw_4[3] = w4[0] ^ w4[2]; // c*w9 assign pw_9[0] = w9[1] ^ w9[2]; assign pw_9[1] = w9[3] ^ w9[1]; assign pw_9[2] = w9[0] ^ w9[2]; assign pw_9[3] = w9[0] ^ w9[3] ^ w9[1]; // d*w3 assign pw_3[0] = w3[1] ^ w3[2] ^ w3[0]; assign pw_3[1] = w3[3]; assign pw_3[2] = w3[0]; assign pw_3[3] = w3[0] ^ w3[1]; // e*w2 assign pw_2[0] = w2[1] ^ w2[2] ^ w2[3]; assign pw_2[1] = w2[1] ^ w2[0]; assign pw_2[2] = w2[0] ^ w2[2] ^ w2[1]; assign pw_2[3] = w2[0] ^ w2[3] ^ w2[1] ^ w2[2]; // f*w7 assign pw_7[0] = w7[1] ^ w7[2] ^ w7[3] ^ w7[0]; assign pw_7[1] = w7[0]; assign pw_7[2] = w7[0] ^ w7[1]; assign pw_7[3] = w7[0] ^ w7[1] ^ w7[2]; // 2*w23 assign pw_23[0] = w23[3]; assign pw_23[1] = w23[0] ^ w23[3]; assign pw_23[2] = w23[1]; assign pw_23[3] = w23[2]; // 3*w28 assign pw_28[0] = w28[0] ^ w28[3]; assign pw_28[1] = w28[0] ^ w28[3] ^ w28[1]; assign pw_28[2] = w28[1] ^ w28[2]; assign pw_28[3] = w28[2] ^ w28[3]; // 4*w27 assign pw_27[0] = w27[2]; assign pw_27[1] = w27[3] ^ w27[2]; assign pw_27[2] = w27[0] ^ w27[3]; assign pw_27[3] = w27[1]; // 5*w25 assign pw_25[0] = w25[2] ^ w25[0]; assign pw_25[1] = w25[3] ^ w25[2] ^ w25[1]; assign pw_25[2] = w25[0] ^ w25[3] ^ w25[2]; assign pw_25[3] = w25[1] ^ w25[3]; // 6*w21 assign pw_21[0] = w21[2] ^ w21[3]; assign pw_21[1] = w21[2] ^ w21[0]; assign pw_21[2] = w21[0] ^ w21[3] ^ w21[1]; assign pw_21[3] = w21[1] ^ w21[2]; // 7*w20 assign pw_20[0] = w20[2] ^ w20[3] ^ w20[0]; assign pw_20[1] = w20[2] ^ w20[0] ^ w20[1]; assign pw_20[2] = w20[0] ^ w20[3] ^ w20[1] ^ w20[2]; assign pw_20[3] = w20[1] ^ w20[2] ^ w20[3]; // 8*w29 assign pw_29[0] = w29[1]; assign pw_29[1] = w29[2] ^ w29[1]; assign pw_29[2] = w29[3] ^ w29[2]; assign pw_29[3] = w29[0] ^ w29[3]; // 9*w16 assign pw_16[0] = w16[1] ^ w16[0]; assign pw_16[1] = w16[2]; assign pw_16[2] = w16[3]; assign pw_16[3] = w16[0]; // a*w26 assign pw_26[0] = w26[1] ^ w26[3]; assign pw_26[1] = w26[2] ^ w26[1] ^ w26[0] ^ w26[3]; assign pw_26[2] = w26[3] ^ w26[2] ^ w26[1]; assign pw_26[3] = w26[0] ^ w26[3] ^ w26[2]; // b*w19 assign pw_19[0] = w19[1] ^ w19[0] ^ w19[3]; assign pw_19[1] = w19[2] ^ w19[0] ^ w19[3]; assign pw_19[2] = w19[3] ^ w19[1]; assign pw_19[3] = w19[0] ^ w19[2]; // c*w24 assign pw_24[0] = w24[1] ^ w24[2]; assign pw_24[1] = w24[3] ^ w24[1]; assign pw_24[2] = w24[0] ^ w24[2]; assign pw_24[3] = w24[0] ^ w24[3] ^ w24[1]; // d*w18 assign pw_18[0] = w18[1] ^ w18[2] ^ w18[0]; assign pw_18[1] = w18[3]; assign pw_18[2] = w18[0]; assign pw_18[3] = w18[0] ^ w18[1]; // e*w17 assign pw_17[0] = w17[1] ^ w17[2] ^ w17[3]; assign pw_17[1] = w17[1] ^ w17[0]; assign pw_17[2] = w17[0] ^ w17[2] ^ w17[1]; assign pw_17[3] = w17[0] ^ w17[3] ^ w17[1] ^ w17[2]; // f*w22 assign pw_22[0] = w22[1] ^ w22[2] ^ w22[3] ^ w22[0]; assign pw_22[1] = w22[0]; assign pw_22[2] = w22[0] ^ w22[1]; assign pw_22[3] = w22[0] ^ w22[1] ^ w22[2]; ///////////////////////////////////////////////////////////////////////// // Final ECC Calculation // ECC generation logic for the incomming data ///////////////////////////////////////////////////////////////////////// wire [3:0] partialsum; wire [3:0] p3_partialsum; wire [3:0] syndrom0; wire [3:0] syndrom1; wire [3:0] syndrom2; wire [3:0] syndrom3; // partial sum assign partialsum[3:0] = pw1 ^ pw2 ^ pw3 ^ pw4 ^ pw5 ^ pw6 ^ pw7 ^ pw8 ^ pw9 ^ pw10 ^ pw11 ^ pw12 ^ pw13 ^ pw14 ^ pw16 ^ pw17 ^ pw18 ^ pw19 ^ pw20 ^ pw21 ^ pw22 ^ pw23 ^ pw24 ^ pw25 ^ pw26 ^ pw27 ^ pw28 ^ pw29; assign p3_partialsum = pw_1 ^ pw_2 ^ pw_3 ^ pw_4 ^ pw_5 ^ pw_6 ^ pw_7 ^ pw_8 ^ pw_9 ^ pw_10 ^ pw_11 ^ pw_12 ^ pw_13 ^ pw_14 ^ pw_16 ^ pw_17 ^ pw_18 ^ pw_19 ^ pw_20 ^ pw_21 ^ pw_22 ^ pw_23 ^ pw_24 ^ pw_25 ^ pw_26 ^ pw_27 ^ pw_28 ^ pw_29; assign syndrom0[3:0] = w0 ^ w15 ^ w31 ^ partialsum; assign syndrom1[3:0] = w0 ^ w1 ^ w2 ^ w3 ^ w4 ^ w5 ^ w6 ^ w7 ^ w8 ^ w9 ^ w10 ^ w11 ^ w12 ^ w13 ^ w14 ^ w30 ^ w31; assign syndrom2[3:0] = w15 ^ w16 ^ w17 ^ w18 ^ w19 ^ w20 ^ w21 ^ w22 ^ w23 ^ w24 ^ w25 ^ w26 ^ w27 ^ w28 ^ w29 ^ w30 ^ w31; assign syndrom3[3:0] = w0 ^ w15 ^ w30 ^ p3_partialsum; assign ecc = {syndrom0, syndrom1, syndrom2, syndrom3}; assign result = { pw29, pw28, pw27, pw26, pw25, pw24, pw23, pw22, pw21, pw20, pw19, pw18, pw17, pw16, pw14, pw13, pw12, pw11, pw10, pw9, pw8, pw7, pw6, pw5, pw4, pw3, pw2, pw1}; endmodule