Commit | Line | Data |
---|---|---|
86530b38 AT |
1 | // ========== Copyright Header Begin ========================================== |
2 | // | |
3 | // OpenSPARC T2 Processor File: ilupeuIngressRcvrErr.vr | |
4 | // Copyright (C) 1995-2007 Sun Microsystems, Inc. All Rights Reserved | |
5 | // 4150 Network Circle, Santa Clara, California 95054, U.S.A. | |
6 | // | |
7 | // * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
8 | // | |
9 | // This program is free software; you can redistribute it and/or modify | |
10 | // it under the terms of the GNU General Public License as published by | |
11 | // the Free Software Foundation; version 2 of the License. | |
12 | // | |
13 | // This program is distributed in the hope that it will be useful, | |
14 | // but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 | // GNU General Public License for more details. | |
17 | // | |
18 | // You should have received a copy of the GNU General Public License | |
19 | // along with this program; if not, write to the Free Software | |
20 | // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
21 | // | |
22 | // For the avoidance of doubt, and except that if any non-GPL license | |
23 | // choice is available it will apply instead, Sun elects to use only | |
24 | // the General Public License version 2 (GPLv2) at this time for any | |
25 | // software where a choice of GPL license versions is made | |
26 | // available with the language indicating that GPLv2 or any later version | |
27 | // may be used, or where a choice of which version of the GPL is applied is | |
28 | // otherwise unspecified. | |
29 | // | |
30 | // Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, | |
31 | // CA 95054 USA or visit www.sun.com if you need additional information or | |
32 | // have any questions. | |
33 | // | |
34 | // ========== Copyright Header End ============================================ | |
35 | class IngressRcvrErr extends PEUStrBase | |
36 | { | |
37 | integer f_errQueue; // A mailbox for bad pkt headers | |
38 | ||
39 | integer nmbrRcvrErrsToInject = 10; //Total number of packets that get error injected | |
40 | integer rcvrErrPct = 10; //% of packets that get an error | |
41 | //Set the percentage weight of each type of receiver error | |
42 | integer rcvrErr8b10bWeight = 10; | |
43 | integer rcvrErrFramingWeight = 10; | |
44 | integer rcvrErrDisparityWeight = 10; | |
45 | integer rcvrErrFlipBitWeight = 10; //This is sometimes a CRC error - If the STP gets flipped | |
46 | // into a data bit then a CRC error isn't hit | |
47 | integer rcvrErrLcrcWeight = 10; //This is a CRC error | |
48 | integer rcvrErrDupSeqNmbrWeight = 0; | |
49 | integer rcvrErrOutOfSeqNmbrWeight = 0; | |
50 | integer rcvrErrBadSeqNmbrWeight = 0; | |
51 | integer InvertLCRCErrWeight = 0; | |
52 | integer EDBErrWeight = 0; | |
53 | integer InvertLCRCAndEDBErrWeight = 0; | |
54 | ||
55 | // | |
56 | integer invertLCRC32ErrInjected = 0; | |
57 | integer EDBErrInjected = 0; | |
58 | integer InvertLCRCAndEDBErrInjected = 0; | |
59 | ||
60 | ||
61 | //Make the Bad TLP Packet error optional-directed cases | |
62 | //Only rcvrErrFlipBitWeight & rcvrErrLcrcWeight are certain BTP errors | |
63 | // and all others are due to sequence errors, So make the default optional | |
64 | // except for rcvrErrFlipBitWeight & rcvrErrLcrcWeight | |
65 | bit optional_CE_BTP = 1; | |
66 | ||
67 | //Only allow 1 of these strategies to be active at a time | |
68 | static integer rcvrErr_semaphore = alloc(SEMAPHORE, 0, 1, 1); | |
69 | ||
70 | task new( PEUTestEnv a_env ) | |
71 | { | |
72 | super.new( a_env ); | |
73 | f_errQueue = 0; | |
74 | } | |
75 | ||
76 | task SetErrQueue( integer a_queue ) | |
77 | { | |
78 | f_errQueue = a_queue; | |
79 | } /* end SetErrQueue */ | |
80 | ||
81 | task Execute() | |
82 | { | |
83 | integer nmbrErrs; | |
84 | integer other_nonInvertLCRCAndEDBErrInjected = 0 ; | |
85 | integer denaliReplayTimer; | |
86 | bit recoveryEntered = 0; | |
87 | //Get the semaphore when its your turn | |
88 | semaphore_get( WAIT, rcvrErr_semaphore, 1); | |
89 | ||
90 | // | |
91 | optional_CE_BTP = 1; | |
92 | ||
93 | //Change Denalis replay timer to take out rx_L0s_adj=250 | |
94 | denaliReplayTimer = f_env.Scenario.denaliReplayTimerThreshold - 250; | |
95 | f_env.Pod.FNXPCIEEnableTrans.WriteDenaliReg( PCIE_REG_DEN_REPLAY_TIMER, denaliReplayTimer ); | |
96 | //Make the replay buffer smaller so back-back replays don't last too long | |
97 | f_env.Pod.FNXPCIEEnableTrans.WriteDenaliReg( PCIE_REG_DEN_RETRY_SIZE, 32'h300 ); | |
98 | ||
99 | ||
100 | printf("IngressRcvrErr nmbrRcvrErrsToInject=%0d rcvrErrPct=%0d rcvrErr8b10bWeight=%0d rcvrErrFramingWeight=%0d rcvrErrDisparityWeight=%0d rcvrErrFlipBitWeight=%0d rcvrErrLcrcWeight=%0d rcvrErrDupSeqNmbrWeight=%0d rcvrErrOutOfSeqNmbrWeight=%0d rcvrErrBadSeqNmbrWeight=%0d InvertLCRCErrWeight=%0d EDBErrWeight=%0d InvertLCRCAndEDBErrWeight=%0d \n",nmbrRcvrErrsToInject,rcvrErrPct,rcvrErr8b10bWeight,rcvrErrFramingWeight,rcvrErrDisparityWeight,rcvrErrFlipBitWeight,rcvrErrLcrcWeight, rcvrErrDupSeqNmbrWeight, rcvrErrOutOfSeqNmbrWeight, rcvrErrBadSeqNmbrWeight, InvertLCRCErrWeight, EDBErrWeight, InvertLCRCAndEDBErrWeight ); | |
101 | //Set the number of packets to cause errors on | |
102 | f_env.nmbrRcvrErrsToInject = nmbrRcvrErrsToInject; | |
103 | f_env.nmbrRcvrErrsInjected = 0; | |
104 | f_env.nmbrRcvrErrsDriven = 0; | |
105 | f_env.rcvrErrPct = rcvrErrPct; | |
106 | //Set the percentage of each type of receiver error | |
107 | f_env.rcvrErr8b10bWeight = rcvrErr8b10bWeight; | |
108 | f_env.rcvrErrFramingWeight = rcvrErrFramingWeight; | |
109 | f_env.rcvrErrDisparityWeight = rcvrErrDisparityWeight; | |
110 | f_env.rcvrErrFlipBitWeight = rcvrErrFlipBitWeight; | |
111 | f_env.rcvrErrLcrcWeight = rcvrErrLcrcWeight; | |
112 | f_env.rcvrErrDupSeqNmbrWeight = rcvrErrDupSeqNmbrWeight; | |
113 | f_env.rcvrErrOutOfSeqNmbrWeight = rcvrErrOutOfSeqNmbrWeight; | |
114 | f_env.rcvrErrBadSeqNmbrWeight = rcvrErrBadSeqNmbrWeight; | |
115 | f_env.InvertLCRCErrWeight = InvertLCRCErrWeight; | |
116 | f_env.EDBErrWeight = EDBErrWeight; | |
117 | f_env.InvertLCRCAndEDBErrWeight = InvertLCRCAndEDBErrWeight; | |
118 | ||
119 | //Clear all the specific error trackers | |
120 | f_env.rcvrErr8b10bInjected = 0; | |
121 | f_env.rcvrErrFramingInjected = 0; | |
122 | f_env.rcvrErrDisparityInjected = 0; | |
123 | f_env.rcvrErrFlipBitInjected = 0; | |
124 | f_env.rcvrErrLcrcInjected = 0; | |
125 | f_env.rcvrErrDupSeqNmbrInjected = 0; | |
126 | f_env.rcvrErrOutOfSeqNmbrInjected = 0; | |
127 | f_env.rcvrErrBadSeqNmbrInjected = 0; | |
128 | ||
129 | f_env.invertLCRC32ErrInjected = 0; | |
130 | f_env.EDBErrInjected = 0; | |
131 | f_env.InvertLCRCAndEDBErrInjected = 0; | |
132 | ||
133 | //Wait until env has injected the right number of errors | |
134 | f_env.enableRcvrErrInjection = 1; | |
135 | ||
136 | //If the last Tlp before a retry packet has a framing type error then the | |
137 | // 1st retry packet could get a crc or other error causing the packet to be | |
138 | // dropped. This will cause a Denali replay timeout | |
139 | f_env.Pod.FNXPCIEEnableTrans.SuppressDenaliErr( PCIE_DL_COR_REPLAY_TIMEOUT ); | |
140 | ||
141 | //Framing error injection could insert a COM which causes peu to get a deskew error | |
142 | // and go into recovery - so disable hang detect for framing errors | |
143 | if( f_env.rcvrErrFramingWeight ){ | |
144 | fork | |
145 | { | |
146 | while( f_env.rcvrErrFramingWeight && !f_env.rcvrErrFramingInjected ){ | |
147 | repeat(10) @(posedge CLOCK); | |
148 | } | |
149 | //Check to see if recovery is ever entered | |
150 | while( f_env.getLtssmState() === ILUPEU_LTSSM_L0 && | |
151 | f_env.enableRcvrErrInjection ){ | |
152 | repeat(50) @(posedge CLOCK); | |
153 | ||
154 | if( f_env.getLtssmState() === ILUPEU_LTSSM_RCVRY_RCVRLOCK ){ | |
155 | recoveryEntered = 1; | |
156 | f_env.activityStalled += 1; | |
157 | //Stall the Denali expects until link comes back up | |
158 | f_env.Pod.FNXPCIEEnableTrans.DisableExpectsTimeout(); | |
159 | printf("IngressRcvrErr rcvrErrFramingInjected and ltssm entered Recovery f_env.activityStalled=%0d \n",f_env.activityStalled ); | |
160 | f_env.toLtssmState( ILUPEU_LTSSM_L0 ); | |
161 | printf("IngressRcvrErr rcvrErrFramingInjected and ltssm entered L0 from Recovery\n"); | |
162 | f_env.activityStalled -= 1; | |
163 | f_env.Pod.FNXPCIEEnableTrans.EnableExpectsTimeout(); | |
164 | } | |
165 | } | |
166 | ||
167 | } | |
168 | join none | |
169 | } | |
170 | ||
171 | //Wait until all the errors are driven | |
172 | sync( ANY, f_env.ev_rcvrErrsDriven ); | |
173 | //terminate the while loop if no framing errors got injected | |
174 | if( f_env.rcvrErrFramingWeight && !f_env.rcvrErrFramingInjected ){ | |
175 | terminate; | |
176 | }else if(f_env.rcvrErrFramingWeight && f_env.rcvrErrFramingInjected ){ | |
177 | //Last injected error may cause entry into Recovery so wait a while | |
178 | repeat( 50 ) @(posedge if_ILU_PEU_PCIE.refclk); | |
179 | if( f_env.getLtssmState() !== ILUPEU_LTSSM_L0 ){ | |
180 | printf("IngressRcvrErr waiting for LTSSM to reenter L0 from Recovery\n"); | |
181 | f_env.toLtssmState( ILUPEU_LTSSM_L0,*,OMNI ); | |
182 | } | |
183 | } | |
184 | ||
185 | printf("at time %d, IngressRcvrErr last error injected check error regs nmbrRcvrErrsToInject=%0d nmbrRcvrErrsInjected=%0d nmbrRcvrErrsDriven=%0d rcvrErr8b10bInjected=%0d rcvrErrFramingInjected=%0d rcvrErrDisparityInjected=%0d rcvrErrFlipBitInjected=%0d rcvrErrLcrcInjected=%0d rcvrErrDupSeqNmbrInjected=%0d rcvrErrOutOfSeqNmbrInjected=%0d rcvrErrBadSeqNmbrInjected=%0d invertLCRC32ErrInjected=%0d, EDBErrInjected=%0d InvertLCRCAndEDBErrInjected = %0d \n",get_time(LO), nmbrRcvrErrsToInject,f_env.nmbrRcvrErrsInjected,f_env.nmbrRcvrErrsDriven,f_env.rcvrErr8b10bInjected,f_env.rcvrErrFramingInjected,f_env.rcvrErrDisparityInjected,f_env.rcvrErrFlipBitInjected,f_env.rcvrErrLcrcInjected, f_env.rcvrErrDupSeqNmbrInjected, f_env.rcvrErrOutOfSeqNmbrInjected, f_env.rcvrErrBadSeqNmbrInjected, f_env.invertLCRC32ErrInjected, f_env.EDBErrInjected, f_env.InvertLCRCAndEDBErrInjected ); | |
186 | ||
187 | f_env.enableRcvrErrInjection = 0; | |
188 | ||
189 | //Delay long enough for a Denali replay timeout in case the NAKd transaction had | |
190 | // a framing type error causing the 1st replayd packet to be bad also | |
191 | repeat( denaliReplayTimer+25 ) @(posedge if_ILU_PEU_PCIE.refclk); | |
192 | //Re enable the hang detect | |
193 | // if( f_env.rcvrErrFramingWeight && f_env.rcvrErrFramingInjected ){ | |
194 | // f_env.activityStalled -= 1; | |
195 | // } | |
196 | ||
197 | //Track possible errors | |
198 | ||
199 | if ((f_env.nmbrRcvrErrsDriven - f_env.InvertLCRCAndEDBErrInjected ) > 0) | |
200 | { other_nonInvertLCRCAndEDBErrInjected = 1; } | |
201 | ||
202 | printf("AC: at time %d, other_nonInvertLCRCAndEDBErrInjected = %d", get_time(LO), other_nonInvertLCRCAndEDBErrInjected); | |
203 | ||
204 | if (other_nonInvertLCRCAndEDBErrInjected) { | |
205 | nmbrErrs = 2; | |
206 | } | |
207 | else { | |
208 | nmbrErrs = 0; | |
209 | } | |
210 | ||
211 | if (f_env.InvertLCRCAndEDBErrInjected == 1) { | |
212 | nmbrErrs += 1; | |
213 | } | |
214 | else if (f_env.InvertLCRCAndEDBErrInjected > 1) { | |
215 | nmbrErrs += 2; | |
216 | } | |
217 | ||
218 | ||
219 | //ErrLcrc & Err8b10b can possibly cause framing errors | |
220 | ||
221 | //Framing Errors will NOT cause a e_ERR_ce_re - Receiver Error | |
222 | // 6/20/05 | |
223 | //CRC Errors/framing errors | |
224 | if( f_env.rcvrErrFlipBitInjected || f_env.rcvrErrFramingInjected || | |
225 | f_env.rcvrErrDisparityInjected || f_env.rcvrErr8b10bInjected ){ | |
226 | nmbrErrs += 7; | |
227 | } | |
228 | ||
229 | if( f_env.rcvrErrDisparityInjected || f_env.rcvrErr8b10bInjected ){ //Receiver Error | |
230 | nmbrErrs += 2; | |
231 | } | |
232 | ||
233 | if( f_env.rcvrErrFramingInjected ){ // More framing errors | |
234 | nmbrErrs += 7; | |
235 | if( recoveryEntered ){ | |
236 | nmbrErrs += 2; | |
237 | } | |
238 | } | |
239 | printf("AC: nmbrErrs = %d\n", nmbrErrs); | |
240 | ||
241 | // Tell the error-checker about this | |
242 | // bad-boy. | |
243 | if( f_errQueue != 0 ){ | |
244 | ||
245 | mailbox_put( f_errQueue, e_ERR_none ); | |
246 | mailbox_put( f_errQueue, nmbrErrs ); | |
247 | //Bad TLPs caused by either CRC errors or sequence errors when a good TLP | |
248 | // follows a bad TLP - for some of the more directed cases make it optional | |
249 | // if (f_env.rcvrErrDupSeqNmbrInjected) { // no error for duplicate seq number | |
250 | //aC: } | |
251 | // else { | |
252 | ||
253 | if( f_env.rcvrErrLcrcInjected || | |
254 | f_env.rcvrErrDupSeqNmbrInjected || f_env.rcvrErrOutOfSeqNmbrInjected || | |
255 | f_env.rcvrErrBadSeqNmbrInjected || f_env.EDBErrInjected ){ | |
256 | ||
257 | optional_CE_BTP = 0; | |
258 | } | |
259 | ||
260 | if (other_nonInvertLCRCAndEDBErrInjected) { | |
261 | ||
262 | if (nmbrErrs > 0 ) { | |
263 | mailbox_put( f_errQueue, e_ERR_ce_btp ); | |
264 | if( optional_CE_BTP ){ | |
265 | mailbox_put( f_errQueue, 128'bx0 ); | |
266 | }else{ | |
267 | mailbox_put( f_errQueue, 128'bx ); | |
268 | } | |
269 | mailbox_put( f_errQueue, e_ERR_ce_btp ); | |
270 | mailbox_put( f_errQueue, 128'bx0 ); | |
271 | } | |
272 | } | |
273 | ||
274 | if ( f_env.InvertLCRCAndEDBErrInjected == 1) { | |
275 | mailbox_put( f_errQueue, e_ERR_ce_btp ); | |
276 | mailbox_put( f_errQueue, 128'bx0 ); | |
277 | } | |
278 | else if (f_env.InvertLCRCAndEDBErrInjected > 1) { | |
279 | mailbox_put( f_errQueue, e_ERR_ce_btp ); | |
280 | mailbox_put( f_errQueue, 128'bx0 ); | |
281 | } | |
282 | ||
283 | if( f_env.rcvrErrDisparityInjected || f_env.rcvrErr8b10bInjected ){ | |
284 | mailbox_put( f_errQueue, e_ERR_ce_re ); | |
285 | mailbox_put( f_errQueue, 128'bx ); | |
286 | mailbox_put( f_errQueue, e_ERR_ce_re ); | |
287 | mailbox_put( f_errQueue, 128'bx0 ); //A secondary error may also be logged | |
288 | } | |
289 | ||
290 | if( f_env.rcvrErrFramingInjected || f_env.rcvrErrFlipBitInjected || | |
291 | f_env.rcvrErrDisparityInjected || f_env.rcvrErr8b10bInjected ){ | |
292 | mailbox_put( f_errQueue, e_ERR_oe_lin ); | |
293 | mailbox_put( f_errQueue, 128'bx0 ); //Might fail | |
294 | /* | |
295 | if( f_env.rcvrErrFramingInjected > 2 ){ //If only 2 errors END->Data STP->data there will be no dlpl errors | |
296 | mailbox_put( f_errQueue, 128'bx ); | |
297 | }else{ | |
298 | mailbox_put( f_errQueue, 128'bx0 ); //Might fail | |
299 | } | |
300 | */ | |
301 | mailbox_put( f_errQueue, e_ERR_dlpl_stp_no_end_edb ); | |
302 | mailbox_put( f_errQueue, 128'bx0 ); //Optional error may not occur | |
303 | mailbox_put( f_errQueue, e_ERR_dlpl_kchar_dllp ); | |
304 | mailbox_put( f_errQueue, 128'bx0 ); | |
305 | mailbox_put( f_errQueue, e_ERR_dlpl_multi_stp ); | |
306 | mailbox_put( f_errQueue, 128'bx0 ); | |
307 | mailbox_put( f_errQueue, e_ERR_dlpl_end_no_stp_sdp ); | |
308 | mailbox_put( f_errQueue, 128'bx0 ); | |
309 | mailbox_put( f_errQueue, e_ERR_dlpl_ill_end_pos ); | |
310 | mailbox_put( f_errQueue, 128'bx0 ); | |
311 | mailbox_put( f_errQueue, e_ERR_dlpl_sdp_no_end ); | |
312 | mailbox_put( f_errQueue, 128'bx0 ); | |
313 | } | |
314 | ||
315 | if( f_env.rcvrErrFramingInjected ){ | |
316 | mailbox_put( f_errQueue, e_ERR_dlpl_ill_stp_pos ); | |
317 | mailbox_put( f_errQueue, 128'bx0 ); | |
318 | mailbox_put( f_errQueue, e_ERR_dlpl_ill_sdp_pos ); | |
319 | mailbox_put( f_errQueue, 128'bx0 ); | |
320 | mailbox_put( f_errQueue, e_ERR_dlpl_ill_pad_pos ); | |
321 | mailbox_put( f_errQueue, 128'bx0 ); | |
322 | mailbox_put( f_errQueue, e_ERR_dlpl_unsup_dllp ); | |
323 | mailbox_put( f_errQueue, 128'bx0 ); | |
324 | mailbox_put( f_errQueue, e_ERR_dlpl_multi_sdp ); | |
325 | mailbox_put( f_errQueue, 128'bx0 ); | |
326 | mailbox_put( f_errQueue, e_ERR_ce_bdp ); | |
327 | mailbox_put( f_errQueue, 128'bx0 ); | |
328 | mailbox_put( f_errQueue, e_ERR_ce_rto ); //If END changed to data before ACK | |
329 | mailbox_put( f_errQueue, 128'bx0 ); | |
330 | if( recoveryEntered ){ | |
331 | mailbox_put( f_errQueue, e_ERR_oe_nfp ); | |
332 | mailbox_put( f_errQueue, 128'bx0 ); | |
333 | mailbox_put( f_errQueue, e_ERR_dlpl_align ); | |
334 | mailbox_put( f_errQueue, 128'bx0 ); | |
335 | } | |
336 | } | |
337 | } | |
338 | ||
339 | //Unsuppress the Denali error TX checks that were Suppressed in the PEUTestEnv | |
340 | // This was moved out of TestEnv because packets following the one with the injected | |
341 | // could also get framing type errors in Denali | |
342 | ||
343 | ||
344 | if( f_env.rcvrErr8b10bInjected ){ | |
345 | f_env.Pod.FNXPCIEEnableTrans.unSuppressDenaliErr( PCIE_PL_NONFATAL_SYM_8B10B ); | |
346 | f_env.Pod.FNXPCIEEnableTrans.unSuppressDenaliErr( PCIE_PL_NONFATAL_FRAME_BAD_END ); | |
347 | f_env.Pod.FNXPCIEEnableTrans.unSuppressDenaliErr( PCIE_PL_NONFATAL_FRAME_BAD_DATA0 ); | |
348 | f_env.Pod.FNXPCIEEnableTrans.unSuppressDenaliErr( PCIE_PL_NONFATAL_SYM_RSV_KC ); | |
349 | f_env.Pod.FNXPCIEEnableTrans.unSuppressDenaliErr( PCIE_PL_NONFATAL_FRAME_TLP_END ); | |
350 | f_env.Pod.FNXPCIEEnableTrans.unSuppressDenaliErr( PCIE_PL_NONFATAL_FRAME_BAD_SDP1 ); | |
351 | f_env.Pod.FNXPCIEEnableTrans.unSuppressDenaliErr( PCIE_PL_NONFATAL_FRAME_DLLP_END ); | |
352 | f_env.Pod.FNXPCIEEnableTrans.unSuppressDenaliErr( PCIE_PL_NONFATAL_FRAME_PAD ); | |
353 | } | |
354 | if( f_env.rcvrErrFramingInjected ){ | |
355 | f_env.Pod.FNXPCIEEnableTrans.unSuppressDenaliErr( PCIE_PL_NONFATAL_FRAME_BAD_END ); | |
356 | f_env.Pod.FNXPCIEEnableTrans.unSuppressDenaliErr( PCIE_PL_NONFATAL_FRAME_BAD_DATA0 ); | |
357 | f_env.Pod.FNXPCIEEnableTrans.unSuppressDenaliErr( PCIE_PL_NONFATAL_SYM_RSV_KC ); | |
358 | f_env.Pod.FNXPCIEEnableTrans.unSuppressDenaliErr( PCIE_PL_NONFATAL_FRAME_TLP_END ); | |
359 | f_env.Pod.FNXPCIEEnableTrans.unSuppressDenaliErr( PCIE_PL_NONFATAL_FRAME_BAD_SDP1 ); | |
360 | f_env.Pod.FNXPCIEEnableTrans.unSuppressDenaliErr( PCIE_PL_NONFATAL_FRAME_DLLP_END ); | |
361 | f_env.Pod.FNXPCIEEnableTrans.unSuppressDenaliErr( PCIE_PL_NONFATAL_FRAME_PAD ); | |
362 | f_env.Pod.FNXPCIEEnableTrans.unSuppressDenaliErr( PCIE_PL_NONFATAL_MOS_FTS_NC ); | |
363 | } | |
364 | if( f_env.rcvrErrDisparityInjected ){ | |
365 | f_env.Pod.FNXPCIEEnableTrans.unSuppressDenaliErr( PCIE_PL_NONFATAL_FRAME_BAD_END ); | |
366 | f_env.Pod.FNXPCIEEnableTrans.unSuppressDenaliErr( PCIE_PL_NONFATAL_FRAME_BAD_DATA0 ); | |
367 | f_env.Pod.FNXPCIEEnableTrans.unSuppressDenaliErr( PCIE_PL_NONFATAL_FRAME_TLP_END ); | |
368 | f_env.Pod.FNXPCIEEnableTrans.unSuppressDenaliErr( PCIE_PL_NONFATAL_SYM_DISP ); | |
369 | f_env.Pod.FNXPCIEEnableTrans.unSuppressDenaliErr( PCIE_PL_NONFATAL_FRAME_PAD ); | |
370 | } | |
371 | if( f_env.rcvrErrFlipBitInjected ){ | |
372 | f_env.Pod.FNXPCIEEnableTrans.unSuppressDenaliErr( PCIE_PL_NONFATAL_SYM_8B10B ); | |
373 | f_env.Pod.FNXPCIEEnableTrans.unSuppressDenaliErr( PCIE_PL_NONFATAL_FRAME_BAD_END ); | |
374 | f_env.Pod.FNXPCIEEnableTrans.unSuppressDenaliErr( PCIE_PL_NONFATAL_FRAME_BAD_DATA0 ); | |
375 | f_env.Pod.FNXPCIEEnableTrans.unSuppressDenaliErr( PCIE_PL_NONFATAL_SYM_RSV_KC ); | |
376 | f_env.Pod.FNXPCIEEnableTrans.unSuppressDenaliErr( PCIE_PL_NONFATAL_FRAME_TLP_END ); | |
377 | f_env.Pod.FNXPCIEEnableTrans.unSuppressDenaliErr( PCIE_PL_NONFATAL_FRAME_BAD_SDP1 ); | |
378 | f_env.Pod.FNXPCIEEnableTrans.unSuppressDenaliErr( PCIE_PL_NONFATAL_FRAME_DLLP_END ); | |
379 | f_env.Pod.FNXPCIEEnableTrans.unSuppressDenaliErr( PCIE_PL_NONFATAL_FRAME_PAD ); | |
380 | f_env.Pod.FNXPCIEEnableTrans.unSuppressDenaliErr( PCIE_PL_NONFATAL_SYM_DISP ); | |
381 | } | |
382 | if( f_env.rcvrErrLcrcInjected ){ | |
383 | } | |
384 | if( f_env.rcvrErrDupSeqNmbrInjected ){ | |
385 | } | |
386 | if( f_env.rcvrErrOutOfSeqNmbrInjected ){ | |
387 | } | |
388 | if( f_env.rcvrErrBadSeqNmbrInjected ){ | |
389 | } | |
390 | if( f_env.invertLCRC32ErrInjected ){ | |
391 | } | |
392 | if( f_env.EDBErrInjected ){ | |
393 | f_env.Pod.FNXPCIEEnableTrans.unSuppressDenaliErr(PCIE_PL_NONFATAL_FRAME_NULL_TLP ); | |
394 | } | |
395 | ||
396 | // | |
397 | f_env.Pod.FNXPCIEEnableTrans.unSuppressDenaliErr( PCIE_DL_COR_REPLAY_TIMEOUT ); | |
398 | ||
399 | repeat( 10 ) @(posedge CLOCK); | |
400 | semaphore_put( rcvrErr_semaphore, 1 ); | |
401 | } /* end Execute */ | |
402 | } /* end IngressRcvrErr */ |