1 |
2 |
acastong |
//fc_packet_crc_l3.cpp
|
2 |
|
|
|
3 |
|
|
/* ***** BEGIN LICENSE BLOCK *****
|
4 |
|
|
* Version: MPL 1.1
|
5 |
|
|
*
|
6 |
|
|
* The contents of this file are subject to the Mozilla Public License Version
|
7 |
|
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
8 |
|
|
* the License. You may obtain a copy of the License at
|
9 |
|
|
* http://www.mozilla.org/MPL/
|
10 |
|
|
*
|
11 |
|
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
12 |
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
13 |
|
|
* for the specific language governing rights and limitations under the
|
14 |
|
|
* License.
|
15 |
|
|
*
|
16 |
|
|
* The Original Code is HyperTransport Tunnel IP Core.
|
17 |
|
|
*
|
18 |
|
|
* The Initial Developer of the Original Code is
|
19 |
|
|
* Ecole Polytechnique de Montreal.
|
20 |
|
|
* Portions created by the Initial Developer are Copyright (C) 2005
|
21 |
|
|
* the Initial Developer. All Rights Reserved.
|
22 |
|
|
*
|
23 |
|
|
* Contributor(s):
|
24 |
|
|
* Ami Castonguay <acastong@grm.polymtl.ca>
|
25 |
|
|
*
|
26 |
|
|
* Alternatively, the contents of this file may be used under the terms
|
27 |
|
|
* of the Polytechnique HyperTransport Tunnel IP Core Source Code License
|
28 |
|
|
* (the "PHTICSCL License", see the file PHTICSCL.txt), in which case the
|
29 |
|
|
* provisions of PHTICSCL License are applicable instead of those
|
30 |
|
|
* above. If you wish to allow use of your version of this file only
|
31 |
|
|
* under the terms of the PHTICSCL License and not to allow others to use
|
32 |
|
|
* your version of this file under the MPL, indicate your decision by
|
33 |
|
|
* deleting the provisions above and replace them with the notice and
|
34 |
|
|
* other provisions required by the PHTICSCL License. If you do not delete
|
35 |
|
|
* the provisions above, a recipient may use your version of this file
|
36 |
|
|
* under either the MPL or the PHTICSCL License."
|
37 |
|
|
*
|
38 |
|
|
* ***** END LICENSE BLOCK ***** */
|
39 |
|
|
|
40 |
|
|
#include "fc_packet_crc_l3.h"
|
41 |
|
|
|
42 |
|
|
fc_packet_crc_l3::fc_packet_crc_l3(sc_module_name name) : sc_module(name)
|
43 |
|
|
{
|
44 |
|
|
SC_METHOD(clocked_process);
|
45 |
|
|
sensitive_neg << resetx;
|
46 |
|
|
sensitive_pos << clk;
|
47 |
|
|
}
|
48 |
|
|
|
49 |
|
|
void fc_packet_crc_l3::clocked_process(){
|
50 |
|
|
//At reset, CRC's are set to 0
|
51 |
|
|
if(resetx.read() == false){
|
52 |
|
|
crc_value = 0xFFFFFFFF;
|
53 |
|
|
nop_crc_value = 0xFFFFFFFF;
|
54 |
|
|
crc_output = 0;
|
55 |
|
|
nop_crc_output = 0;
|
56 |
|
|
}
|
57 |
|
|
else{
|
58 |
|
|
//Bu default, the crc values stay the same
|
59 |
|
|
sc_uint<32> new_crc_value = crc_value.read();
|
60 |
|
|
sc_uint<32> new_nop_crc_value = nop_crc_value.read();
|
61 |
|
|
|
62 |
|
|
/**
|
63 |
|
|
Before synthesis, this was working with native C ints. Since on most
|
64 |
|
|
platforms, an int is 32 bits and that we have to treat 34 bits of data
|
65 |
|
|
(the dword + LCTL + HCTL), the data calculation were seperated in two
|
66 |
|
|
passes of 17 bits.
|
67 |
|
|
|
68 |
|
|
Now that uint are being used, it might be possible to do it in a single
|
69 |
|
|
pass. But the resulting logic and result is exactly the same.
|
70 |
|
|
*/
|
71 |
|
|
sc_uint<32> inputDword = sc_uint<32>(data_in.read());
|
72 |
|
|
//Generate first data set
|
73 |
|
|
sc_uint<34> d;
|
74 |
|
|
d.range(15,0) = inputDword.range(15,0);
|
75 |
|
|
d[16] = fc_lctl_lk.read();
|
76 |
|
|
|
77 |
|
|
//Generate second data set
|
78 |
|
|
d.range(32,17) = inputDword.range(31,16);
|
79 |
|
|
d[33] = fc_hctl_lk.read();
|
80 |
|
|
|
81 |
|
|
//Choose which register to use for the treatment
|
82 |
|
|
sc_uint<32> crc;
|
83 |
|
|
sc_uint<32> crc_in;
|
84 |
|
|
if(calculate_crc.read()) crc_in = crc_value.read();
|
85 |
|
|
else crc_in = nop_crc_value.read();
|
86 |
|
|
|
87 |
|
|
//Calculate the CRC
|
88 |
|
|
/*for (int i=0; i<34; ++i) {
|
89 |
|
|
// xor highest bit w/ message:
|
90 |
|
|
//bool tmp = ((crc >> 31) & 1)^((data1 >> i) & 1);
|
91 |
|
|
bool tmp = crc[31]^data[i];
|
92 |
|
|
|
93 |
|
|
// subtract poly if greater:
|
94 |
|
|
//
|
95 |
|
|
// This next code is equivalent to :
|
96 |
|
|
// crc = (tmp) ? (crc << 1) ^ poly : ((crc << 1)|tmp);
|
97 |
|
|
// but is nicer for the synthesis tool
|
98 |
|
|
|
99 |
|
|
crc[31] = crc[30];
|
100 |
|
|
crc[30] = crc[29];
|
101 |
|
|
crc[29] = crc[28];
|
102 |
|
|
crc[28] = crc[27];
|
103 |
|
|
crc[27] = crc[26];
|
104 |
|
|
crc[26] = crc[25]^tmp;
|
105 |
|
|
crc[25] = crc[24];
|
106 |
|
|
crc[24] = crc[23];
|
107 |
|
|
crc[23] = crc[22]^tmp;
|
108 |
|
|
crc[22] = crc[21]^tmp;
|
109 |
|
|
crc[21] = crc[20];
|
110 |
|
|
crc[20] = crc[19];
|
111 |
|
|
crc[19] = crc[18];
|
112 |
|
|
crc[18] = crc[17];
|
113 |
|
|
crc[17] = crc[16];
|
114 |
|
|
crc[16] = crc[15]^tmp;
|
115 |
|
|
crc[15] = crc[14];
|
116 |
|
|
crc[14] = crc[13];
|
117 |
|
|
crc[13] = crc[12];
|
118 |
|
|
crc[12] = crc[11]^tmp;
|
119 |
|
|
crc[11] = crc[10]^tmp;
|
120 |
|
|
crc[10] = crc[9]^tmp;
|
121 |
|
|
crc[9] = crc[8];
|
122 |
|
|
crc[8] = crc[7]^tmp;
|
123 |
|
|
crc[7] = crc[6]^tmp;
|
124 |
|
|
crc[6] = crc[5];
|
125 |
|
|
crc[5] = crc[4]^tmp;
|
126 |
|
|
crc[4] = crc[3]^tmp;
|
127 |
|
|
crc[3] = crc[2];
|
128 |
|
|
crc[2] = crc[1]^tmp;
|
129 |
|
|
crc[1] = crc[0]^tmp;
|
130 |
|
|
crc[0] = tmp;
|
131 |
|
|
|
132 |
|
|
}*/
|
133 |
|
|
//Created with Xilinx xapp209
|
134 |
|
|
crc[0] = (sc_bit)( d[24] ^ d[33] ^ crc_in[22] ^ d[17] ^ crc_in[7] ^ d[2] ^ crc_in[24] ^ d[4] ^ crc_in[26] ^ crc_in[28] ^ d[8] ^ d[21] ^ crc_in[10] ^ d[23] ^ crc_in[4] ^ crc_in[30] ^ d[1] ^ crc_in[14] ^ crc_in[23] ^ d[27] ^ d[3] ^ crc_in[8] ^ d[5] ^ crc_in[27] ^ d[7] ^ crc_in[29] ^ d[9]);
|
135 |
|
|
crc[1] = (sc_bit)( d[22] ^ crc_in[11] ^ d[24] ^ d[33] ^ crc_in[5] ^ d[0] ^ crc_in[22] ^ d[17] ^ crc_in[31] ^ d[26] ^ crc_in[7] ^ crc_in[15] ^ crc_in[9] ^ crc_in[26] ^ d[6] ^ d[21] ^ crc_in[10] ^ crc_in[4] ^ d[32] ^ d[16] ^ crc_in[14] ^ d[27] ^ crc_in[25] ^ d[5] ^ d[9] ^ d[20]);
|
136 |
|
|
crc[2] = (sc_bit)( crc_in[11] ^ d[31] ^ d[15] ^ d[24] ^ d[33] ^ crc_in[5] ^ crc_in[22] ^ d[17] ^ d[26] ^ crc_in[7] ^ crc_in[15] ^ d[2] ^ crc_in[24] ^ d[19] ^ crc_in[28] ^ crc_in[0] ^ crc_in[4] ^ d[32] ^ crc_in[12] ^ d[16] ^ crc_in[30] ^ d[25] ^ crc_in[14] ^ crc_in[6] ^ d[1] ^ d[27] ^ crc_in[16] ^ d[3] ^ d[7] ^ crc_in[29] ^ d[9] ^ d[20]);
|
137 |
|
|
crc[3] = (sc_bit)( d[31] ^ d[15] ^ d[24] ^ crc_in[5] ^ crc_in[13] ^ d[0] ^ crc_in[31] ^ d[26] ^ crc_in[15] ^ crc_in[7] ^ d[2] ^ d[19] ^ crc_in[17] ^ d[6] ^ d[8] ^ crc_in[0] ^ d[30] ^ d[14] ^ d[23] ^ d[32] ^ crc_in[12] ^ d[16] ^ crc_in[30] ^ d[25] ^ crc_in[6] ^ d[1] ^ crc_in[23] ^ d[18] ^ crc_in[8] ^ crc_in[16] ^ crc_in[25] ^ crc_in[29] ^ crc_in[1]);
|
138 |
|
|
crc[4] = (sc_bit)( d[13] ^ d[22] ^ d[31] ^ d[15] ^ d[33] ^ crc_in[13] ^ d[0] ^ crc_in[22] ^ crc_in[31] ^ d[2] ^ crc_in[9] ^ crc_in[17] ^ d[4] ^ crc_in[28] ^ d[8] ^ crc_in[0] ^ d[21] ^ d[30] ^ crc_in[2] ^ crc_in[10] ^ d[14] ^ crc_in[4] ^ d[25] ^ crc_in[6] ^ crc_in[23] ^ d[18] ^ d[27] ^ crc_in[16] ^ d[3] ^ d[29] ^ crc_in[18] ^ crc_in[27] ^ crc_in[29] ^ d[9] ^ crc_in[1]);
|
139 |
|
|
crc[5] = (sc_bit)( d[13] ^ crc_in[11] ^ crc_in[3] ^ d[33] ^ crc_in[5] ^ crc_in[22] ^ d[26] ^ d[28] ^ crc_in[17] ^ d[4] ^ crc_in[26] ^ crc_in[19] ^ d[12] ^ d[30] ^ crc_in[2] ^ d[14] ^ d[23] ^ crc_in[4] ^ d[32] ^ d[27] ^ crc_in[8] ^ d[29] ^ d[5] ^ crc_in[18] ^ crc_in[27] ^ d[9] ^ d[20] ^ crc_in[1]);
|
140 |
|
|
crc[6] = (sc_bit)( d[13] ^ d[22] ^ d[31] ^ crc_in[3] ^ crc_in[20] ^ crc_in[5] ^ d[26] ^ d[19] ^ d[28] ^ crc_in[9] ^ d[4] ^ crc_in[19] ^ crc_in[28] ^ d[8] ^ crc_in[0] ^ d[12] ^ crc_in[2] ^ d[32] ^ crc_in[12] ^ crc_in[4] ^ d[25] ^ crc_in[6] ^ crc_in[23] ^ d[27] ^ d[3] ^ d[29] ^ crc_in[18] ^ crc_in[27] ^ d[11]);
|
141 |
|
|
crc[7] = (sc_bit)( d[31] ^ crc_in[3] ^ crc_in[20] ^ d[33] ^ crc_in[13] ^ crc_in[5] ^ crc_in[22] ^ d[17] ^ d[26] ^ d[28] ^ d[4] ^ crc_in[26] ^ crc_in[19] ^ d[8] ^ d[10] ^ crc_in[0] ^ d[12] ^ d[30] ^ d[23] ^ crc_in[21] ^ crc_in[30] ^ d[25] ^ crc_in[6] ^ crc_in[14] ^ d[1] ^ crc_in[23] ^ d[18] ^ crc_in[8] ^ d[5] ^ crc_in[27] ^ d[9] ^ d[11] ^ crc_in[1]);
|
142 |
|
|
crc[8] = (sc_bit)( d[22] ^ crc_in[20] ^ d[33] ^ d[0] ^ crc_in[31] ^ d[2] ^ crc_in[15] ^ crc_in[9] ^ crc_in[26] ^ d[10] ^ d[21] ^ d[30] ^ crc_in[2] ^ crc_in[10] ^ d[23] ^ d[32] ^ crc_in[21] ^ d[16] ^ crc_in[30] ^ d[25] ^ d[1] ^ crc_in[6] ^ crc_in[8] ^ d[29] ^ d[5] ^ crc_in[29] ^ d[11] ^ crc_in[1]);
|
143 |
|
|
crc[9] = (sc_bit)( d[22] ^ d[31] ^ crc_in[3] ^ crc_in[11] ^ d[15] ^ d[24] ^ d[0] ^ crc_in[22] ^ crc_in[31] ^ crc_in[7] ^ d[28] ^ crc_in[9] ^ d[4] ^ d[10] ^ crc_in[0] ^ d[21] ^ crc_in[2] ^ crc_in[10] ^ d[32] ^ crc_in[21] ^ crc_in[30] ^ d[1] ^ crc_in[16] ^ d[29] ^ crc_in[27] ^ d[9] ^ d[20]);
|
144 |
|
|
crc[10] = (sc_bit)( d[31] ^ crc_in[11] ^ crc_in[3] ^ d[24] ^ d[33] ^ d[0] ^ crc_in[31] ^ d[17] ^ crc_in[7] ^ d[2] ^ crc_in[24] ^ d[19] ^ d[28] ^ crc_in[17] ^ d[4] ^ crc_in[26] ^ crc_in[0] ^ d[30] ^ d[14] ^ crc_in[12] ^ crc_in[30] ^ crc_in[14] ^ d[1] ^ d[5] ^ crc_in[27] ^ d[7] ^ crc_in[29] ^ d[20] ^ crc_in[1]);
|
145 |
|
|
crc[11] = (sc_bit)( d[13] ^ d[24] ^ d[33] ^ crc_in[13] ^ d[0] ^ crc_in[22] ^ d[17] ^ crc_in[31] ^ crc_in[7] ^ crc_in[15] ^ d[2] ^ crc_in[24] ^ d[19] ^ crc_in[26] ^ d[6] ^ d[8] ^ d[21] ^ d[30] ^ crc_in[2] ^ crc_in[10] ^ d[32] ^ crc_in[12] ^ d[16] ^ crc_in[14] ^ crc_in[23] ^ d[18] ^ crc_in[25] ^ d[29] ^ d[5] ^ crc_in[18] ^ d[7] ^ crc_in[29] ^ d[9] ^ crc_in[1]);
|
146 |
|
|
crc[12] = (sc_bit)( d[31] ^ crc_in[3] ^ crc_in[11] ^ d[15] ^ d[24] ^ d[33] ^ crc_in[13] ^ crc_in[22] ^ crc_in[7] ^ crc_in[15] ^ d[2] ^ d[28] ^ d[6] ^ crc_in[19] ^ crc_in[28] ^ crc_in[0] ^ d[12] ^ d[21] ^ crc_in[2] ^ crc_in[10] ^ crc_in[4] ^ d[32] ^ d[16] ^ d[18] ^ d[27] ^ crc_in[16] ^ d[3] ^ crc_in[25] ^ d[29] ^ crc_in[29] ^ d[9] ^ d[20]);
|
147 |
|
|
crc[13] = (sc_bit)( d[31] ^ crc_in[3] ^ crc_in[11] ^ crc_in[20] ^ d[15] ^ crc_in[5] ^ d[17] ^ d[26] ^ d[2] ^ d[19] ^ d[28] ^ crc_in[17] ^ crc_in[26] ^ d[8] ^ crc_in[0] ^ d[30] ^ d[14] ^ d[23] ^ d[32] ^ crc_in[4] ^ crc_in[12] ^ crc_in[30] ^ crc_in[14] ^ d[1] ^ crc_in[23] ^ d[27] ^ crc_in[8] ^ crc_in[16] ^ d[5] ^ crc_in[29] ^ d[11] ^ d[20] ^ crc_in[1]);
|
148 |
|
|
crc[14] = (sc_bit)( d[13] ^ d[22] ^ d[31] ^ crc_in[5] ^ crc_in[13] ^ d[0] ^ crc_in[31] ^ d[26] ^ crc_in[15] ^ crc_in[24] ^ d[19] ^ crc_in[9] ^ crc_in[17] ^ d[4] ^ d[10] ^ crc_in[0] ^ d[30] ^ crc_in[2] ^ d[14] ^ crc_in[4] ^ crc_in[12] ^ crc_in[21] ^ d[16] ^ crc_in[30] ^ d[25] ^ crc_in[6] ^ d[1] ^ d[18] ^ d[27] ^ d[29] ^ crc_in[18] ^ crc_in[27] ^ d[7] ^ crc_in[1]);
|
149 |
|
|
crc[15] = (sc_bit)( d[13] ^ crc_in[3] ^ d[15] ^ d[24] ^ crc_in[5] ^ d[0] ^ crc_in[13] ^ crc_in[22] ^ d[17] ^ crc_in[31] ^ d[26] ^ crc_in[7] ^ d[28] ^ d[6] ^ crc_in[19] ^ crc_in[28] ^ d[12] ^ d[21] ^ d[30] ^ crc_in[2] ^ crc_in[10] ^ d[25] ^ crc_in[6] ^ crc_in[14] ^ d[18] ^ crc_in[16] ^ d[3] ^ crc_in[25] ^ d[29] ^ crc_in[18] ^ d[9] ^ crc_in[1]);
|
150 |
|
|
crc[16] = (sc_bit)( crc_in[11] ^ crc_in[3] ^ crc_in[20] ^ d[33] ^ crc_in[22] ^ crc_in[15] ^ crc_in[24] ^ d[28] ^ crc_in[17] ^ d[4] ^ crc_in[19] ^ crc_in[28] ^ d[12] ^ d[21] ^ crc_in[2] ^ crc_in[10] ^ d[14] ^ d[16] ^ crc_in[30] ^ d[25] ^ crc_in[6] ^ d[1] ^ d[3] ^ d[29] ^ crc_in[27] ^ d[7] ^ d[9] ^ d[11] ^ d[20]);
|
151 |
|
|
crc[17] = (sc_bit)( d[13] ^ crc_in[3] ^ crc_in[11] ^ crc_in[20] ^ d[15] ^ d[24] ^ d[0] ^ crc_in[31] ^ crc_in[7] ^ d[2] ^ d[19] ^ d[28] ^ d[6] ^ crc_in[28] ^ d[8] ^ d[10] ^ d[32] ^ crc_in[12] ^ crc_in[4] ^ crc_in[21] ^ crc_in[23] ^ d[27] ^ crc_in[16] ^ d[3] ^ crc_in[25] ^ crc_in[18] ^ crc_in[29] ^ d[11] ^ d[20]);
|
152 |
|
|
crc[18] = (sc_bit)( d[31] ^ crc_in[13] ^ crc_in[5] ^ crc_in[22] ^ d[26] ^ d[2] ^ crc_in[24] ^ d[19] ^ crc_in[17] ^ crc_in[26] ^ crc_in[19] ^ d[10] ^ crc_in[0] ^ d[12] ^ d[14] ^ d[23] ^ crc_in[4] ^ crc_in[12] ^ crc_in[21] ^ crc_in[30] ^ d[1] ^ d[18] ^ d[27] ^ crc_in[8] ^ d[5] ^ d[7] ^ crc_in[29] ^ d[9]);
|
153 |
|
|
crc[19] = (sc_bit)( d[13] ^ d[22] ^ crc_in[20] ^ crc_in[5] ^ crc_in[13] ^ d[0] ^ crc_in[22] ^ d[17] ^ crc_in[31] ^ d[26] ^ crc_in[9] ^ d[4] ^ d[6] ^ d[8] ^ d[30] ^ crc_in[30] ^ d[25] ^ crc_in[14] ^ crc_in[6] ^ d[1] ^ crc_in[23] ^ d[18] ^ crc_in[25] ^ crc_in[18] ^ crc_in[27] ^ d[9] ^ d[11] ^ crc_in[1]);
|
154 |
|
|
crc[20] = (sc_bit)( d[24] ^ d[0] ^ d[17] ^ crc_in[31] ^ crc_in[15] ^ crc_in[7] ^ crc_in[24] ^ crc_in[26] ^ crc_in[19] ^ crc_in[28] ^ d[8] ^ d[10] ^ d[12] ^ d[21] ^ crc_in[2] ^ crc_in[10] ^ crc_in[21] ^ d[16] ^ d[25] ^ crc_in[6] ^ crc_in[14] ^ crc_in[23] ^ d[3] ^ d[29] ^ d[5] ^ d[7]);
|
155 |
|
|
crc[21] = (sc_bit)( crc_in[3] ^ crc_in[11] ^ crc_in[20] ^ d[15] ^ d[24] ^ crc_in[22] ^ crc_in[7] ^ crc_in[15] ^ d[2] ^ crc_in[24] ^ d[28] ^ d[4] ^ d[6] ^ d[23] ^ d[16] ^ crc_in[16] ^ crc_in[8] ^ crc_in[25] ^ crc_in[27] ^ d[7] ^ crc_in[29] ^ d[9] ^ d[11] ^ d[20]);
|
156 |
|
|
crc[22] = (sc_bit)( d[22] ^ d[15] ^ d[24] ^ d[33] ^ crc_in[22] ^ d[17] ^ crc_in[7] ^ d[2] ^ crc_in[24] ^ d[19] ^ crc_in[17] ^ crc_in[9] ^ d[4] ^ d[6] ^ d[10] ^ d[21] ^ crc_in[10] ^ d[14] ^ crc_in[12] ^ crc_in[21] ^ crc_in[14] ^ crc_in[16] ^ crc_in[25] ^ crc_in[27] ^ d[7] ^ crc_in[29] ^ d[9]);
|
157 |
|
|
crc[23] = (sc_bit)( d[13] ^ crc_in[11] ^ d[24] ^ d[33] ^ crc_in[13] ^ d[17] ^ crc_in[7] ^ crc_in[15] ^ d[2] ^ crc_in[24] ^ crc_in[17] ^ d[4] ^ d[6] ^ d[14] ^ crc_in[4] ^ d[32] ^ d[16] ^ crc_in[14] ^ d[18] ^ d[27] ^ crc_in[25] ^ crc_in[18] ^ crc_in[27] ^ d[7] ^ crc_in[29] ^ d[20]);
|
158 |
|
|
crc[24] = (sc_bit)( d[13] ^ d[31] ^ d[15] ^ crc_in[5] ^ d[17] ^ d[26] ^ crc_in[15] ^ d[19] ^ crc_in[26] ^ crc_in[19] ^ d[6] ^ crc_in[28] ^ crc_in[0] ^ d[12] ^ d[23] ^ d[32] ^ crc_in[12] ^ d[16] ^ crc_in[30] ^ crc_in[14] ^ d[1] ^ crc_in[8] ^ crc_in[16] ^ d[3] ^ crc_in[25] ^ crc_in[18] ^ d[5]);
|
159 |
|
|
crc[25] = (sc_bit)( d[22] ^ d[31] ^ crc_in[20] ^ d[15] ^ crc_in[13] ^ d[0] ^ crc_in[31] ^ crc_in[15] ^ d[2] ^ crc_in[9] ^ crc_in[17] ^ d[4] ^ crc_in[26] ^ crc_in[19] ^ crc_in[0] ^ d[12] ^ d[30] ^ d[14] ^ d[16] ^ d[25] ^ crc_in[6] ^ d[18] ^ crc_in[16] ^ d[5] ^ crc_in[27] ^ crc_in[29] ^ d[11] ^ crc_in[1]);
|
160 |
|
|
crc[26] = (sc_bit)( d[13] ^ crc_in[20] ^ d[15] ^ d[33] ^ crc_in[22] ^ d[2] ^ crc_in[24] ^ crc_in[17] ^ crc_in[26] ^ d[8] ^ d[10] ^ d[30] ^ crc_in[2] ^ d[14] ^ d[23] ^ crc_in[4] ^ crc_in[21] ^ crc_in[23] ^ d[27] ^ crc_in[8] ^ crc_in[16] ^ d[29] ^ crc_in[18] ^ d[5] ^ d[7] ^ crc_in[29] ^ d[9] ^ d[11] ^ crc_in[1]);
|
161 |
|
|
crc[27] = (sc_bit)( d[13] ^ d[22] ^ crc_in[3] ^ crc_in[5] ^ crc_in[22] ^ d[26] ^ crc_in[24] ^ d[28] ^ crc_in[9] ^ crc_in[17] ^ d[4] ^ crc_in[19] ^ d[6] ^ d[8] ^ d[10] ^ d[12] ^ crc_in[2] ^ d[14] ^ d[32] ^ crc_in[21] ^ crc_in[30] ^ d[1] ^ crc_in[23] ^ crc_in[25] ^ d[29] ^ crc_in[18] ^ crc_in[27] ^ d[7] ^ d[9]);
|
162 |
|
|
crc[28] = (sc_bit)( d[13] ^ d[31] ^ crc_in[3] ^ crc_in[20] ^ d[0] ^ crc_in[22] ^ crc_in[31] ^ crc_in[24] ^ d[28] ^ crc_in[26] ^ crc_in[19] ^ d[6] ^ crc_in[28] ^ d[8] ^ crc_in[0] ^ d[12] ^ d[21] ^ crc_in[10] ^ crc_in[4] ^ d[25] ^ crc_in[6] ^ crc_in[23] ^ d[27] ^ d[3] ^ crc_in[25] ^ crc_in[18] ^ d[5] ^ d[7] ^ d[9] ^ d[11]);
|
163 |
|
|
crc[29] = (sc_bit)( crc_in[11] ^ crc_in[20] ^ d[24] ^ crc_in[5] ^ d[26] ^ crc_in[7] ^ d[2] ^ crc_in[24] ^ d[4] ^ crc_in[26] ^ crc_in[19] ^ d[6] ^ d[8] ^ d[10] ^ d[12] ^ d[30] ^ crc_in[4] ^ crc_in[21] ^ crc_in[23] ^ d[27] ^ crc_in[25] ^ d[5] ^ crc_in[27] ^ d[7] ^ crc_in[29] ^ d[11] ^ d[20] ^ crc_in[1]);
|
164 |
|
|
crc[30] = (sc_bit)( crc_in[20] ^ crc_in[5] ^ crc_in[22] ^ d[26] ^ crc_in[24] ^ d[19] ^ d[4] ^ crc_in[26] ^ d[6] ^ crc_in[28] ^ d[10] ^ crc_in[2] ^ d[23] ^ crc_in[12] ^ crc_in[21] ^ crc_in[30] ^ d[25] ^ crc_in[6] ^ d[1] ^ crc_in[8] ^ d[3] ^ crc_in[25] ^ d[29] ^ d[5] ^ crc_in[27] ^ d[7] ^ d[9] ^ d[11]);
|
165 |
|
|
crc[31] = (sc_bit)( d[22] ^ crc_in[3] ^ d[24] ^ crc_in[13] ^ d[0] ^ crc_in[22] ^ crc_in[31] ^ crc_in[7] ^ d[2] ^ d[28] ^ crc_in[9] ^ d[4] ^ crc_in[26] ^ d[6] ^ crc_in[28] ^ d[8] ^ d[10] ^ crc_in[21] ^ d[25] ^ crc_in[6] ^ crc_in[23] ^ d[18] ^ d[3] ^ crc_in[25] ^ d[5] ^ crc_in[27] ^ crc_in[29] ^ d[9]);
|
166 |
|
|
|
167 |
|
|
if(clear_crc.read()){
|
168 |
|
|
new_crc_value = 0xFFFFFFFF;
|
169 |
|
|
}
|
170 |
|
|
else if(calculate_crc.read()){
|
171 |
|
|
new_crc_value = crc;
|
172 |
|
|
}
|
173 |
|
|
|
174 |
|
|
if(clear_nop_crc.read()){
|
175 |
|
|
new_nop_crc_value = 0xFFFFFFFF;
|
176 |
|
|
}
|
177 |
|
|
else if(calculate_nop_crc.read()){
|
178 |
|
|
new_nop_crc_value = crc;
|
179 |
|
|
}
|
180 |
|
|
//Assign the new CRC value
|
181 |
|
|
crc_value = new_crc_value;
|
182 |
|
|
nop_crc_value = new_nop_crc_value;
|
183 |
|
|
|
184 |
|
|
//Error mask for when forcing errors. Bits that are '1' will be inversed
|
185 |
|
|
sc_bv<32> error_mask_bv = "10101010101010101010101010101010";
|
186 |
|
|
sc_uint<32> error_mask = error_mask_bv;
|
187 |
|
|
|
188 |
|
|
//Output the result with the error mask if requested
|
189 |
|
|
if(csr_force_single_error_fc.read()){
|
190 |
|
|
crc_output = new_crc_value ^ error_mask;
|
191 |
|
|
nop_crc_output = new_nop_crc_value ^ error_mask;
|
192 |
|
|
}
|
193 |
|
|
//Output the CRC value directly. It is supposed to be inversed, so
|
194 |
|
|
//a non-inversed CRC represents a stomped packet
|
195 |
|
|
else if(csr_force_single_stomp_fc.read()){
|
196 |
|
|
crc_output = new_crc_value;
|
197 |
|
|
nop_crc_output = ~new_nop_crc_value;
|
198 |
|
|
}
|
199 |
|
|
//Output the inverse of the calculated CRC value (normal behaviour)
|
200 |
|
|
else{
|
201 |
|
|
crc_output = ~new_crc_value;
|
202 |
|
|
nop_crc_output = ~new_nop_crc_value;
|
203 |
|
|
}
|
204 |
|
|
}
|
205 |
|
|
}
|
206 |
|
|
|