Commit | Line | Data |
---|---|---|
86530b38 AT |
1 | // ========== Copyright Header Begin ========================================== |
2 | // | |
3 | // OpenSPARC T2 Processor File: niu_rdmc_pio_if.v | |
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 | module niu_rdmc_pio_if ( | |
36 | clk, | |
37 | reset, | |
38 | pio_rdmc_sel, | |
39 | pio_rdmc_rd, | |
40 | pio_rdmc_addr, | |
41 | pio_rdmc_wdata, | |
42 | pio_client_32b, | |
43 | stage1_en_r, | |
44 | port_gnt, | |
45 | port_err_event, | |
46 | ipp_dat_req0_data, | |
47 | ipp_dat_req1_data, | |
48 | ipp_dat_req2_data, | |
49 | ipp_dat_req3_data, | |
50 | wr_debug_data, | |
51 | wr_transfer_comp_int, | |
52 | pio_rd_gnt, | |
53 | chnl_pio_rd_data0, | |
54 | chnl_pio_rd_data1, | |
55 | chnl_pio_rd_data2, | |
56 | chnl_pio_rd_data3, | |
57 | chnl_pio_rd_data4, | |
58 | chnl_pio_rd_data5, | |
59 | chnl_pio_rd_data6, | |
60 | chnl_pio_rd_data7, | |
61 | chnl_pio_rd_data8, | |
62 | chnl_pio_rd_data9, | |
63 | chnl_pio_rd_data10, | |
64 | chnl_pio_rd_data11, | |
65 | chnl_pio_rd_data12, | |
66 | chnl_pio_rd_data13, | |
67 | chnl_pio_rd_data14, | |
68 | chnl_pio_rd_data15, | |
69 | cache_rd_strobe, | |
70 | cache_wr_strobe, | |
71 | cache_rd_addr, | |
72 | cache_wr_addr, | |
73 | cache_wr_data, | |
74 | cache_rd_data_reg, | |
75 | shadw_rd_strobe, | |
76 | shadw_wr_strobe, | |
77 | shadw_rd_addr, | |
78 | shadw_wr_addr, | |
79 | shadw_wr_data, | |
80 | shadw_rd_data_reg, //reged shadw_rd_data | |
81 | pkt_buf_gnt, | |
82 | ||
83 | pio_32b_mode, | |
84 | pio_wen, | |
85 | pio_addr, | |
86 | pio_wen_a, | |
87 | pio_addr_a, | |
88 | pio_wen_b, | |
89 | pio_addr_b, | |
90 | pio_wen_c, | |
91 | pio_addr_c, | |
92 | pio_wdata, | |
93 | rx_addr_32b_mode, | |
94 | wred_enable, | |
95 | random_num, | |
96 | clk_div_value, | |
97 | port_err_status, | |
98 | muxed_port_rdc_num, | |
99 | pt_drr_wt0_reg, | |
100 | pt_drr_wt1_reg, | |
101 | pt_drr_wt2_reg, | |
102 | pt_drr_wt3_reg, | |
103 | muxed_cache_rd_strobe, | |
104 | muxed_cache_wr_strobe, | |
105 | muxed_cache_rd_addr, | |
106 | muxed_cache_wr_addr, | |
107 | muxed_cache_wr_data, | |
108 | muxed_shadw_rd_strobe, | |
109 | muxed_shadw_wr_strobe, | |
110 | muxed_shadw_rd_addr, | |
111 | muxed_shadw_wr_addr, | |
112 | muxed_shadw_wr_data, | |
113 | muxed_cache_rd_strobe_r, | |
114 | muxed_shadw_rd_strobe_r, | |
115 | cache_parity_err, | |
116 | shadw_parity_err, | |
117 | rdmc_debug_port, | |
118 | rdmc_pio_port_int, | |
119 | rdmc_pio_ack, | |
120 | rdmc_pio_err, | |
121 | rdmc_pio_rdata | |
122 | ||
123 | ); | |
124 | ||
125 | input clk; | |
126 | input reset; | |
127 | input pio_rdmc_sel; | |
128 | input pio_rdmc_rd; | |
129 | input[19:0] pio_rdmc_addr; | |
130 | input[63:0] pio_rdmc_wdata; | |
131 | input pio_client_32b; | |
132 | input stage1_en_r; | |
133 | input[3:0] port_gnt; | |
134 | input[8:0] port_err_event; | |
135 | input ipp_dat_req0_data; | |
136 | input ipp_dat_req1_data; | |
137 | input ipp_dat_req2_data; | |
138 | input ipp_dat_req3_data; | |
139 | input wr_transfer_comp_int; | |
140 | input[31:0] wr_debug_data; | |
141 | input[15:0] pio_rd_gnt; | |
142 | input[63:0] chnl_pio_rd_data0; | |
143 | input[63:0] chnl_pio_rd_data1; | |
144 | input[63:0] chnl_pio_rd_data2; | |
145 | input[63:0] chnl_pio_rd_data3; | |
146 | input[63:0] chnl_pio_rd_data4; | |
147 | input[63:0] chnl_pio_rd_data5; | |
148 | input[63:0] chnl_pio_rd_data6; | |
149 | input[63:0] chnl_pio_rd_data7; | |
150 | input[63:0] chnl_pio_rd_data8; | |
151 | input[63:0] chnl_pio_rd_data9; | |
152 | input[63:0] chnl_pio_rd_data10; | |
153 | input[63:0] chnl_pio_rd_data11; | |
154 | input[63:0] chnl_pio_rd_data12; | |
155 | input[63:0] chnl_pio_rd_data13; | |
156 | input[63:0] chnl_pio_rd_data14; | |
157 | input[63:0] chnl_pio_rd_data15; | |
158 | input cache_rd_strobe; | |
159 | input cache_wr_strobe; | |
160 | input[7:0] cache_rd_addr; | |
161 | input[7:0] cache_wr_addr; | |
162 | input[147:0] cache_wr_data; | |
163 | input[147:0] cache_rd_data_reg; | |
164 | input shadw_rd_strobe; | |
165 | input shadw_wr_strobe; | |
166 | input[7:0] shadw_rd_addr; | |
167 | input[7:0] shadw_wr_addr; | |
168 | input[147:0] shadw_wr_data; | |
169 | input[147:0] shadw_rd_data_reg; | |
170 | input[15:0] pkt_buf_gnt; | |
171 | ||
172 | output pio_32b_mode; | |
173 | output pio_wen; | |
174 | output[19:0] pio_addr; | |
175 | output pio_wen_a; | |
176 | output[19:0] pio_addr_a; | |
177 | output pio_wen_b; | |
178 | output[19:0] pio_addr_b; | |
179 | output pio_wen_c; | |
180 | output[19:0] pio_addr_c; | |
181 | output[63:0] pio_wdata; | |
182 | output rx_addr_32b_mode; | |
183 | output wred_enable; | |
184 | output[15:0] random_num; | |
185 | output[3:0] port_err_status; | |
186 | output[15:0] clk_div_value; | |
187 | output[4:0] muxed_port_rdc_num; | |
188 | output[15:0] pt_drr_wt0_reg; | |
189 | output[15:0] pt_drr_wt1_reg; | |
190 | output[15:0] pt_drr_wt2_reg; | |
191 | output[15:0] pt_drr_wt3_reg; | |
192 | output muxed_cache_rd_strobe; | |
193 | output muxed_cache_wr_strobe; | |
194 | output[7:0] muxed_cache_rd_addr; | |
195 | output[7:0] muxed_cache_wr_addr; | |
196 | output[147:0] muxed_cache_wr_data; | |
197 | output muxed_shadw_rd_strobe; | |
198 | output muxed_shadw_wr_strobe; | |
199 | output[7:0] muxed_shadw_rd_addr; | |
200 | output[7:0] muxed_shadw_wr_addr; | |
201 | output[147:0] muxed_shadw_wr_data; | |
202 | output muxed_cache_rd_strobe_r; | |
203 | output muxed_shadw_rd_strobe_r; | |
204 | output cache_parity_err; | |
205 | output shadw_parity_err; | |
206 | output[31:0] rdmc_debug_port; | |
207 | output rdmc_pio_port_int; | |
208 | output rdmc_pio_ack; | |
209 | output rdmc_pio_err; | |
210 | output[63:0] rdmc_pio_rdata; | |
211 | ||
212 | reg pio_32b_mode; | |
213 | reg pio_sel; | |
214 | reg pio_rd; | |
215 | reg[19:0] pio_addr; | |
216 | reg pio_sel_a; | |
217 | reg pio_rd_a; | |
218 | reg[19:0] pio_addr_a; | |
219 | reg pio_sel_b; | |
220 | reg pio_rd_b; | |
221 | reg[19:0] pio_addr_b; | |
222 | reg pio_sel_c; | |
223 | reg pio_rd_c; | |
224 | reg[19:0] pio_addr_c; | |
225 | ||
226 | reg[63:0] pio_wdata; | |
227 | reg pio_sel_dly; | |
228 | reg pio_sel_dly_a; | |
229 | reg pio_sel_dly_b; | |
230 | reg pio_sel_dly_c; | |
231 | reg pio_sel_cycle1; | |
232 | reg pio_sel_cycle2; | |
233 | reg rdmc_pio_ack; | |
234 | reg rdmc_pio_err; | |
235 | reg[63:0] rdmc_pio_rdata; | |
236 | reg port_pio_gnt; | |
237 | reg port_pio_rd_err; | |
238 | reg[63:0] port_pio_rd_data_tmp; | |
239 | reg[63:0] port_pio_rd_data; | |
240 | reg rdmc_pio_port_int; | |
241 | ||
242 | reg[15:0] clk_div_value; | |
243 | reg[4:0] def_port0_rdc_reg; | |
244 | reg[4:0] def_port1_rdc_reg; | |
245 | reg[4:0] def_port2_rdc_reg; | |
246 | reg[4:0] def_port3_rdc_reg; | |
247 | ||
248 | reg[15:0] pt_drr_wt0_reg; | |
249 | reg[15:0] pt_drr_wt1_reg; | |
250 | reg[15:0] pt_drr_wt2_reg; | |
251 | reg[15:0] pt_drr_wt3_reg; | |
252 | reg[19:0] pt_use0_reg; | |
253 | reg[19:0] pt_use1_reg; | |
254 | reg[19:0] pt_use2_reg; | |
255 | reg[19:0] pt_use3_reg; | |
256 | ||
257 | reg[16:0] red_ran_init_reg; | |
258 | reg[15:0] red_ran_curr_reg; | |
259 | reg[3:0] rx_addr_mode_reg; | |
260 | reg[9:0] cache_parity_log_reg; | |
261 | reg[9:0] shadw_parity_log_reg; | |
262 | ||
263 | reg[8:0] pio_mem_addr_reg; | |
264 | reg[31:0] pio_mem_data_reg0; | |
265 | reg[31:0] pio_mem_data_reg1; | |
266 | reg[31:0] pio_mem_data_reg2; | |
267 | reg[31:0] pio_mem_data_reg3; | |
268 | ||
269 | reg pio_mem_data_reg4_wen_dly; | |
270 | reg pio_cache_rd; | |
271 | reg pio_shadw_rd; | |
272 | reg pio_cache_wr; | |
273 | reg pio_shadw_wr; | |
274 | reg pio_acc_dly0; | |
275 | reg pio_acc_dly1; | |
276 | reg pio_acc_dly2; | |
277 | ||
278 | reg cache_rd_strobe_r; | |
279 | reg cache_rd_strobe_r1; | |
280 | reg shadw_rd_strobe_r; | |
281 | reg shadw_rd_strobe_r1; | |
282 | reg muxed_cache_rd_strobe_r; | |
283 | reg muxed_cache_rd_strobe_r1; | |
284 | reg muxed_shadw_rd_strobe_r; | |
285 | reg muxed_shadw_rd_strobe_r1; | |
286 | reg[7:0] muxed_cache_rd_addr_r; | |
287 | reg[7:0] muxed_shadw_rd_addr_d; | |
288 | reg[7:0] muxed_shadw_rd_addr_r; | |
289 | reg[8:0] port_err_status_reg; | |
290 | reg[8:0] port_err_mask_reg; | |
291 | ||
292 | reg[31:0] debug_training_vector; | |
293 | reg[31:0] rdmc_debug_port; | |
294 | ||
295 | reg[3:0] pkt_id_err_reg; | |
296 | ||
297 | wire pio_mem_rd; | |
298 | wire muxed_cache_rd_strobe; | |
299 | wire muxed_cache_wr_strobe; | |
300 | wire[7:0] muxed_cache_rd_addr; | |
301 | wire[7:0] muxed_cache_wr_addr; | |
302 | wire[147:0] muxed_cache_wr_data; | |
303 | wire muxed_shadw_rd_strobe; | |
304 | wire muxed_shadw_wr_strobe; | |
305 | wire[7:0] muxed_shadw_rd_addr; | |
306 | wire[7:0] muxed_shadw_wr_addr; | |
307 | wire[147:0] muxed_shadw_wr_data; | |
308 | wire[147:0] muxed_mem_rd_data; | |
309 | wire[147:0] pio_mem_wr_data; | |
310 | ||
311 | wire[32:0] cache_rd_data0; | |
312 | wire[32:0] cache_rd_data1; | |
313 | wire[32:0] cache_rd_data2; | |
314 | wire[32:0] cache_rd_data3; | |
315 | wire[15:0] cache_orig_parity_bits; | |
316 | wire[15:0] cache_data_parity_bits; | |
317 | wire cache_parity_err; | |
318 | wire acc_cache_parity_err; | |
319 | wire[31:0] shadw_rd_data0; | |
320 | wire[31:0] shadw_rd_data1; | |
321 | wire[31:0] shadw_rd_data2; | |
322 | wire[31:0] shadw_rd_data3; | |
323 | wire[15:0] shadw_orig_parity_bits; | |
324 | wire[15:0] shadw_data_parity_bits; | |
325 | wire shadw_parity_err; | |
326 | wire acc_shadw_parity_err; | |
327 | ||
328 | ||
329 | wire pio_sel_cycle0; | |
330 | wire pio_wen; | |
331 | wire pio_ren; | |
332 | ||
333 | wire pio_sel_cycle0_a; | |
334 | wire pio_wen_a; | |
335 | ||
336 | wire pio_sel_cycle0_b; | |
337 | wire pio_wen_b; | |
338 | ||
339 | wire pio_sel_cycle0_c; | |
340 | wire pio_wen_c; | |
341 | ||
342 | wire pio_err; | |
343 | wire[63:0] pio_rd_data; | |
344 | wire[63:0] chnl_pio_rd_data; | |
345 | ||
346 | wire clk_div_pio_wen; | |
347 | wire def_port0_rdc_pio_wen; | |
348 | wire def_port1_rdc_pio_wen; | |
349 | wire def_port2_rdc_pio_wen; | |
350 | wire def_port3_rdc_pio_wen; | |
351 | wire pt_drr_wt0_pio_wen; | |
352 | wire pt_drr_wt1_pio_wen; | |
353 | wire pt_drr_wt2_pio_wen; | |
354 | wire pt_drr_wt3_pio_wen; | |
355 | wire pt_use0_pio_ren; | |
356 | wire pt_use1_pio_ren; | |
357 | wire pt_use2_pio_ren; | |
358 | wire pt_use3_pio_ren; | |
359 | wire red_ran_init_pio_wen; | |
360 | wire rx_addr_mode_pio_wen; | |
361 | wire cache_parity_log_pio_wen; | |
362 | wire shadw_parity_log_pio_wen; | |
363 | wire pio_mem_addr_reg_wen; | |
364 | wire pio_mem_data_reg0_wen; | |
365 | wire pio_mem_data_reg1_wen; | |
366 | wire pio_mem_data_reg2_wen; | |
367 | wire pio_mem_data_reg3_wen; | |
368 | wire pio_mem_data_reg4_wen; | |
369 | wire pio_mem_data_reg4_ren; | |
370 | wire port_err_status_reg_wen; | |
371 | wire port_err_mask_reg_wen; | |
372 | wire debug_training_vector_pio_wen; | |
373 | wire port_err_status_reg_wr; | |
374 | ||
375 | wire pt_use0_reg_overflow; | |
376 | wire pt_use1_reg_overflow; | |
377 | wire pt_use2_reg_overflow; | |
378 | wire pt_use3_reg_overflow; | |
379 | ||
380 | wire[4:0] muxed_port_rdc_num; | |
381 | wire shift_in; | |
382 | wire wred_enable; | |
383 | wire[15:0] random_num = red_ran_curr_reg; | |
384 | ||
385 | wire chnl_pio_gnt_all= |pio_rd_gnt; | |
386 | ||
387 | wire rx_addr_32b_mode = rx_addr_mode_reg[0]; | |
388 | wire debug_mode = rx_addr_mode_reg[1]; | |
389 | wire[1:0] debug_port_mux_sel = rx_addr_mode_reg[3:2]; | |
390 | ||
391 | ||
392 | always @ (posedge clk) | |
393 | if (reset) | |
394 | begin | |
395 | pio_32b_mode <= 1'b0; | |
396 | pio_sel <= 1'b0; | |
397 | pio_rd <= 1'b0; | |
398 | pio_addr <= 20'b0; | |
399 | pio_wdata <= 64'b0; | |
400 | end | |
401 | else | |
402 | begin | |
403 | pio_32b_mode <= pio_client_32b; | |
404 | pio_sel <= pio_rdmc_sel; | |
405 | pio_rd <= pio_rdmc_rd; | |
406 | pio_addr <= pio_rdmc_addr; | |
407 | pio_wdata <= pio_rdmc_wdata; | |
408 | end | |
409 | ||
410 | always @ (posedge clk) | |
411 | if (reset) | |
412 | begin | |
413 | pio_sel_a <= 1'b0; | |
414 | pio_rd_a <= 1'b0; | |
415 | pio_addr_a <= 20'b0; | |
416 | end | |
417 | else | |
418 | begin | |
419 | pio_sel_a <= pio_rdmc_sel; | |
420 | pio_rd_a <= pio_rdmc_rd; | |
421 | pio_addr_a <= pio_rdmc_addr; | |
422 | end | |
423 | ||
424 | always @ (posedge clk) | |
425 | if (reset) | |
426 | begin | |
427 | pio_sel_b <= 1'b0; | |
428 | pio_rd_b <= 1'b0; | |
429 | pio_addr_b <= 20'b0; | |
430 | end | |
431 | else | |
432 | begin | |
433 | pio_sel_b <= pio_rdmc_sel; | |
434 | pio_rd_b <= pio_rdmc_rd; | |
435 | pio_addr_b <= pio_rdmc_addr; | |
436 | end | |
437 | ||
438 | always @ (posedge clk) | |
439 | if (reset) | |
440 | begin | |
441 | pio_sel_c <= 1'b0; | |
442 | pio_rd_c <= 1'b0; | |
443 | pio_addr_c <= 20'b0; | |
444 | end | |
445 | else | |
446 | begin | |
447 | pio_sel_c <= pio_rdmc_sel; | |
448 | pio_rd_c <= pio_rdmc_rd; | |
449 | pio_addr_c <= pio_rdmc_addr; | |
450 | end | |
451 | ||
452 | always @ (posedge clk) | |
453 | if (reset) | |
454 | pio_sel_dly <= 1'b0; | |
455 | else | |
456 | pio_sel_dly <= pio_sel; | |
457 | ||
458 | always @ (posedge clk) | |
459 | if (reset) | |
460 | pio_sel_dly_a <= 1'b0; | |
461 | else | |
462 | pio_sel_dly_a <= pio_sel_a; | |
463 | ||
464 | always @ (posedge clk) | |
465 | if (reset) | |
466 | pio_sel_dly_b <= 1'b0; | |
467 | else | |
468 | pio_sel_dly_b <= pio_sel_b; | |
469 | ||
470 | always @ (posedge clk) | |
471 | if (reset) | |
472 | pio_sel_dly_c <= 1'b0; | |
473 | else | |
474 | pio_sel_dly_c <= pio_sel_c; | |
475 | ||
476 | assign pio_sel_cycle0 = pio_sel & !pio_sel_dly; | |
477 | assign pio_wen = pio_sel_cycle0 & !pio_rd; | |
478 | assign pio_ren = pio_sel_cycle2 & pio_rd; | |
479 | ||
480 | assign pio_sel_cycle0_a = pio_sel_a & !pio_sel_dly_a; | |
481 | assign pio_wen_a = pio_sel_cycle0_a & !pio_rd_a; | |
482 | ||
483 | assign pio_sel_cycle0_b = pio_sel_b & !pio_sel_dly_b; | |
484 | assign pio_wen_b = pio_sel_cycle0_b & !pio_rd_b; | |
485 | ||
486 | assign pio_sel_cycle0_c = pio_sel_c & !pio_sel_dly_c; | |
487 | assign pio_wen_c = pio_sel_cycle0_c & !pio_rd_c; | |
488 | ||
489 | assign pio_err = !(chnl_pio_gnt_all | port_pio_gnt) & pio_sel_cycle2 & pio_rd; | |
490 | assign pio_rd_data = chnl_pio_gnt_all ? chnl_pio_rd_data : port_pio_rd_data; | |
491 | ||
492 | ||
493 | always @ (posedge clk) | |
494 | if (reset) | |
495 | begin | |
496 | pio_sel_cycle1 <= 1'b0; | |
497 | pio_sel_cycle2 <= 1'b0; | |
498 | end | |
499 | else | |
500 | begin | |
501 | pio_sel_cycle1 <= pio_sel_cycle0; | |
502 | pio_sel_cycle2 <= pio_sel_cycle1; | |
503 | end | |
504 | ||
505 | ||
506 | always @ (posedge clk) | |
507 | if (reset) | |
508 | rdmc_pio_ack <= 1'b0; | |
509 | else if (pio_sel_cycle2 & !pio_mem_data_reg4_ren | pio_acc_dly2) | |
510 | rdmc_pio_ack <= 1'b1; | |
511 | else | |
512 | rdmc_pio_ack <= 1'b0; | |
513 | ||
514 | always @ (posedge clk) | |
515 | if (reset) | |
516 | rdmc_pio_err <= 1'b0; | |
517 | else | |
518 | rdmc_pio_err <= pio_err; | |
519 | ||
520 | always @ (posedge clk) | |
521 | if (reset) | |
522 | rdmc_pio_rdata <= 64'b0; | |
523 | else if (pio_sel_cycle2 & !pio_mem_data_reg4_ren | pio_acc_dly2) | |
524 | rdmc_pio_rdata <= pio_rd_data; | |
525 | else | |
526 | rdmc_pio_rdata <= rdmc_pio_rdata; | |
527 | ||
528 | ||
529 | assign clk_div_pio_wen = pio_wen & (pio_addr == 20'h80000); | |
530 | assign def_port0_rdc_pio_wen = pio_wen & (pio_addr == 20'h80008); | |
531 | assign def_port1_rdc_pio_wen = pio_wen & (pio_addr == 20'h80010); | |
532 | assign def_port2_rdc_pio_wen = pio_wen & (pio_addr == 20'h80018); | |
533 | assign def_port3_rdc_pio_wen = pio_wen & (pio_addr == 20'h80020); | |
534 | ||
535 | assign pt_drr_wt0_pio_wen = pio_wen & (pio_addr == 20'h80028); | |
536 | assign pt_drr_wt1_pio_wen = pio_wen & (pio_addr == 20'h80030); | |
537 | assign pt_drr_wt2_pio_wen = pio_wen & (pio_addr == 20'h80038); | |
538 | assign pt_drr_wt3_pio_wen = pio_wen & (pio_addr == 20'h80040); | |
539 | ||
540 | assign pt_use0_pio_ren = pio_ren & (pio_addr == 20'h80048); | |
541 | assign pt_use1_pio_ren = pio_ren & (pio_addr == 20'h80050); | |
542 | assign pt_use2_pio_ren = pio_ren & (pio_addr == 20'h80058); | |
543 | assign pt_use3_pio_ren = pio_ren & (pio_addr == 20'h80060); | |
544 | ||
545 | assign red_ran_init_pio_wen = pio_wen & (pio_addr == 20'h80068); | |
546 | assign rx_addr_mode_pio_wen = pio_wen & (pio_addr == 20'h80070); | |
547 | ||
548 | assign cache_parity_log_pio_wen = pio_wen & (pio_addr == 20'h80078); | |
549 | assign shadw_parity_log_pio_wen = pio_wen & (pio_addr == 20'h80080); | |
550 | ||
551 | assign pio_mem_addr_reg_wen = pio_wen & (pio_addr == 20'h80088); | |
552 | assign pio_mem_data_reg0_wen = pio_wen & (pio_addr == 20'h80090); | |
553 | assign pio_mem_data_reg1_wen = pio_wen & (pio_addr == 20'h80098); | |
554 | assign pio_mem_data_reg2_wen = pio_wen & (pio_addr == 20'h800a0); | |
555 | assign pio_mem_data_reg3_wen = pio_wen & (pio_addr == 20'h800a8); | |
556 | assign pio_mem_data_reg4_wen = pio_wen & (pio_addr == 20'h800b0); | |
557 | assign pio_mem_data_reg4_ren = pio_ren & (pio_addr == 20'h800b0); | |
558 | assign port_err_status_reg_wen = pio_wen & (pio_addr == 20'h800b8); | |
559 | assign port_err_mask_reg_wen = pio_wen & (pio_addr == 20'h800c0); | |
560 | ||
561 | assign debug_training_vector_pio_wen = pio_wen & (pio_addr == 20'h800c8); | |
562 | ||
563 | assign port_err_status_reg_wr = pio_wen & (pio_addr == 20'h800d0); | |
564 | ||
565 | /***********************/ | |
566 | //Program Registers | |
567 | /***********************/ | |
568 | always @ (posedge clk) | |
569 | if (reset) | |
570 | rx_addr_mode_reg <= 4'b0; | |
571 | else if (rx_addr_mode_pio_wen) | |
572 | rx_addr_mode_reg <= pio_wdata[3:0]; | |
573 | else | |
574 | rx_addr_mode_reg <= rx_addr_mode_reg; | |
575 | ||
576 | always @ (posedge clk) | |
577 | if (reset) | |
578 | clk_div_value <= 16'b0; | |
579 | else if (clk_div_pio_wen) | |
580 | clk_div_value <= pio_wdata[15:0]; | |
581 | else | |
582 | clk_div_value <= clk_div_value; | |
583 | ||
584 | always @ (posedge clk) | |
585 | if (reset) | |
586 | def_port0_rdc_reg <= 5'b0; | |
587 | else if (def_port0_rdc_pio_wen) | |
588 | def_port0_rdc_reg <= pio_wdata[4:0]; | |
589 | else | |
590 | def_port0_rdc_reg <= def_port0_rdc_reg; | |
591 | ||
592 | always @ (posedge clk) | |
593 | if (reset) | |
594 | def_port1_rdc_reg <= 5'b0; | |
595 | else if (def_port1_rdc_pio_wen) | |
596 | def_port1_rdc_reg <= pio_wdata[4:0]; | |
597 | else | |
598 | def_port1_rdc_reg <= def_port1_rdc_reg; | |
599 | ||
600 | always @ (posedge clk) | |
601 | if (reset) | |
602 | def_port2_rdc_reg <= 5'b0; | |
603 | else if (def_port2_rdc_pio_wen) | |
604 | def_port2_rdc_reg <= pio_wdata[4:0]; | |
605 | else | |
606 | def_port2_rdc_reg <= def_port2_rdc_reg; | |
607 | ||
608 | always @ (posedge clk) | |
609 | if (reset) | |
610 | def_port3_rdc_reg <= 5'b0; | |
611 | else if (def_port3_rdc_pio_wen) | |
612 | def_port3_rdc_reg <= pio_wdata[4:0]; | |
613 | else | |
614 | def_port3_rdc_reg <= def_port3_rdc_reg; | |
615 | ||
616 | assign muxed_port_rdc_num = {5{port_gnt[0]}} & def_port0_rdc_reg | | |
617 | {5{port_gnt[1]}} & def_port1_rdc_reg | | |
618 | {5{port_gnt[2]}} & def_port2_rdc_reg | | |
619 | {5{port_gnt[3]}} & def_port3_rdc_reg ; | |
620 | ||
621 | always @ (posedge clk) | |
622 | if (reset) | |
623 | pt_drr_wt0_reg <= 16'h0400; | |
624 | else if (pt_drr_wt0_pio_wen) | |
625 | pt_drr_wt0_reg <= pio_wdata[15:0]; | |
626 | else | |
627 | pt_drr_wt0_reg <= pt_drr_wt0_reg; | |
628 | ||
629 | always @ (posedge clk) | |
630 | if (reset) | |
631 | pt_drr_wt1_reg <= 16'h0400; | |
632 | else if (pt_drr_wt1_pio_wen) | |
633 | pt_drr_wt1_reg <= pio_wdata[15:0]; | |
634 | else | |
635 | pt_drr_wt1_reg <= pt_drr_wt1_reg; | |
636 | ||
637 | always @ (posedge clk) | |
638 | if (reset) | |
639 | pt_drr_wt2_reg <= 16'h0066; | |
640 | else if (pt_drr_wt2_pio_wen) | |
641 | pt_drr_wt2_reg <= pio_wdata[15:0]; | |
642 | else | |
643 | pt_drr_wt2_reg <= pt_drr_wt2_reg; | |
644 | ||
645 | always @ (posedge clk) | |
646 | if (reset) | |
647 | pt_drr_wt3_reg <= 16'h0066; | |
648 | else if (pt_drr_wt3_pio_wen) | |
649 | pt_drr_wt3_reg <= pio_wdata[15:0]; | |
650 | else | |
651 | pt_drr_wt3_reg <= pt_drr_wt3_reg; | |
652 | ||
653 | ||
654 | assign pt_use0_reg_overflow = (pt_use0_reg == 20'hfffff); | |
655 | assign pt_use1_reg_overflow = (pt_use1_reg == 20'hfffff); | |
656 | assign pt_use2_reg_overflow = (pt_use2_reg == 20'hfffff); | |
657 | assign pt_use3_reg_overflow = (pt_use3_reg == 20'hfffff); | |
658 | ||
659 | always @ (posedge clk) | |
660 | if (reset) | |
661 | pt_use0_reg <= 20'b0; | |
662 | else if (pt_use0_pio_ren) | |
663 | pt_use0_reg <= 20'b0; | |
664 | else if (pt_use0_reg_overflow) | |
665 | pt_use0_reg <= pt_use0_reg; | |
666 | else if (ipp_dat_req0_data) | |
667 | pt_use0_reg <= pt_use0_reg + 20'd1; | |
668 | else | |
669 | pt_use0_reg <= pt_use0_reg; | |
670 | ||
671 | always @ (posedge clk) | |
672 | if (reset) | |
673 | pt_use1_reg <= 20'b0; | |
674 | else if (pt_use1_pio_ren) | |
675 | pt_use1_reg <= 20'b0; | |
676 | else if (pt_use1_reg_overflow) | |
677 | pt_use1_reg <= pt_use1_reg; | |
678 | else if (ipp_dat_req1_data) | |
679 | pt_use1_reg <= pt_use1_reg + 20'd1; | |
680 | else | |
681 | pt_use1_reg <= pt_use1_reg; | |
682 | ||
683 | always @ (posedge clk) | |
684 | if (reset) | |
685 | pt_use2_reg <= 20'b0; | |
686 | else if (pt_use2_pio_ren) | |
687 | pt_use2_reg <= 20'b0; | |
688 | else if (pt_use2_reg_overflow) | |
689 | pt_use2_reg <= pt_use2_reg; | |
690 | else if (ipp_dat_req2_data) | |
691 | pt_use2_reg <= pt_use2_reg + 20'd1; | |
692 | else | |
693 | pt_use2_reg <= pt_use2_reg; | |
694 | ||
695 | always @ (posedge clk) | |
696 | if (reset) | |
697 | pt_use3_reg <= 20'b0; | |
698 | else if (pt_use3_pio_ren) | |
699 | pt_use3_reg <= 20'b0; | |
700 | else if (pt_use3_reg_overflow) | |
701 | pt_use3_reg <= pt_use3_reg; | |
702 | else if (ipp_dat_req3_data) | |
703 | pt_use3_reg <= pt_use3_reg + 20'd1; | |
704 | else | |
705 | pt_use3_reg <= pt_use3_reg; | |
706 | ||
707 | always @ (posedge clk) | |
708 | if (reset) | |
709 | port_err_mask_reg <= 9'b1_1111_1111; | |
710 | else if (port_err_mask_reg_wen) | |
711 | port_err_mask_reg <= pio_wdata[8:0]; | |
712 | else | |
713 | port_err_mask_reg <= port_err_mask_reg; | |
714 | ||
715 | ||
716 | wire[7:0] port_err_status_reg_tmp = (~pio_wdata[7:0]) & port_err_status_reg[7:0] | port_err_event[7:0]; | |
717 | ||
718 | always @ (posedge clk) | |
719 | if (reset) | |
720 | port_err_status_reg <= 9'b0; | |
721 | else if (port_err_status_reg_wen) | |
722 | port_err_status_reg <= {pio_wdata[8], port_err_status_reg_tmp[7:0]}; | |
723 | else if (port_err_status_reg_wr) | |
724 | port_err_status_reg <= pio_wdata[8:0]; | |
725 | else | |
726 | port_err_status_reg <= port_err_event[8:0] | port_err_status_reg[8:0]; | |
727 | ||
728 | wire pkt_id_err0 = port_err_status_reg[8] | port_err_status_reg[4]; | |
729 | wire pkt_id_err1 = port_err_status_reg[8] | port_err_status_reg[5]; | |
730 | wire pkt_id_err2 = port_err_status_reg[8] | port_err_status_reg[6]; | |
731 | wire pkt_id_err3 = port_err_status_reg[8] | port_err_status_reg[7]; | |
732 | ||
733 | always @ (posedge clk) | |
734 | if (reset) | |
735 | pkt_id_err_reg <= 4'b0; | |
736 | else | |
737 | pkt_id_err_reg <= {pkt_id_err3, pkt_id_err2, pkt_id_err1, pkt_id_err0}; | |
738 | ||
739 | ||
740 | wire port0_err = pkt_id_err_reg[0] | port_err_status_reg[0]; | |
741 | wire port1_err = pkt_id_err_reg[1] | port_err_status_reg[1]; | |
742 | wire port2_err = pkt_id_err_reg[2] | port_err_status_reg[2]; | |
743 | wire port3_err = pkt_id_err_reg[3] | port_err_status_reg[3]; | |
744 | ||
745 | wire[3:0] port_err_status = {port3_err, port2_err, port1_err, port0_err}; | |
746 | wire port_int_tmp = |(port_err_status_reg & (~port_err_mask_reg)); | |
747 | ||
748 | always @ (posedge clk) | |
749 | if (reset) | |
750 | rdmc_pio_port_int <= 1'b0; | |
751 | else | |
752 | rdmc_pio_port_int <= port_int_tmp; | |
753 | ||
754 | /*************************/ | |
755 | //Random Number Gen | |
756 | /*************************/ | |
757 | assign shift_in = red_ran_curr_reg[15] ^ red_ran_curr_reg[4] ^ red_ran_curr_reg[2] ^ red_ran_curr_reg[1]; | |
758 | assign wred_enable = red_ran_init_reg[16]; | |
759 | ||
760 | always @ (posedge clk) | |
761 | if (reset) | |
762 | red_ran_init_reg <= 17'b0; | |
763 | else if (red_ran_init_pio_wen) | |
764 | red_ran_init_reg <= pio_wdata[16:0]; | |
765 | else | |
766 | red_ran_init_reg <= red_ran_init_reg; | |
767 | ||
768 | ||
769 | always @ (posedge clk) | |
770 | if (reset) | |
771 | red_ran_curr_reg <= 16'b0; | |
772 | else if (red_ran_init_pio_wen) | |
773 | red_ran_curr_reg <= pio_wdata[15:0]; | |
774 | else if (stage1_en_r) | |
775 | red_ran_curr_reg <= {shift_in, red_ran_curr_reg[15:1]}; | |
776 | else | |
777 | red_ran_curr_reg <= red_ran_curr_reg; | |
778 | ||
779 | ||
780 | /*************************/ | |
781 | //Memory Access | |
782 | /*************************/ | |
783 | always @ (posedge clk) | |
784 | if (reset) | |
785 | pio_mem_addr_reg <= 9'b0; | |
786 | else if (pio_mem_addr_reg_wen) | |
787 | pio_mem_addr_reg <= pio_wdata[8:0]; | |
788 | else | |
789 | pio_mem_addr_reg <= pio_mem_addr_reg; | |
790 | ||
791 | always @ (posedge clk) | |
792 | if (reset) | |
793 | pio_mem_data_reg0 <= 32'b0; | |
794 | else if (pio_mem_data_reg0_wen) | |
795 | pio_mem_data_reg0 <= pio_wdata[31:0]; | |
796 | else if (pio_acc_dly1 & pio_rd) | |
797 | pio_mem_data_reg0 <= muxed_mem_rd_data[31:0]; | |
798 | else | |
799 | pio_mem_data_reg0 <= pio_mem_data_reg0; | |
800 | ||
801 | always @ (posedge clk) | |
802 | if (reset) | |
803 | pio_mem_data_reg1 <= 32'b0; | |
804 | else if (pio_mem_data_reg1_wen) | |
805 | pio_mem_data_reg1 <= pio_wdata[31:0]; | |
806 | else if (pio_acc_dly1 & pio_rd) | |
807 | pio_mem_data_reg1 <= muxed_mem_rd_data[63:32]; | |
808 | else | |
809 | pio_mem_data_reg1 <= pio_mem_data_reg1; | |
810 | ||
811 | ||
812 | always @ (posedge clk) | |
813 | if (reset) | |
814 | pio_mem_data_reg2 <= 32'b0; | |
815 | else if (pio_mem_data_reg2_wen) | |
816 | pio_mem_data_reg2 <= pio_wdata[31:0]; | |
817 | else if (pio_acc_dly1 & pio_rd) | |
818 | pio_mem_data_reg2 <= muxed_mem_rd_data[95:64]; | |
819 | else | |
820 | pio_mem_data_reg2 <= pio_mem_data_reg2; | |
821 | ||
822 | always @ (posedge clk) | |
823 | if (reset) | |
824 | pio_mem_data_reg3 <= 32'b0; | |
825 | else if (pio_mem_data_reg3_wen) | |
826 | pio_mem_data_reg3 <= pio_wdata[31:0]; | |
827 | else if (pio_acc_dly1 & pio_rd) | |
828 | pio_mem_data_reg3 <= muxed_mem_rd_data[127:96]; | |
829 | else | |
830 | pio_mem_data_reg3 <= pio_mem_data_reg3; | |
831 | ||
832 | assign pio_mem_wr_data = {pio_wdata[19:0], | |
833 | pio_mem_data_reg3, pio_mem_data_reg2, | |
834 | pio_mem_data_reg1, pio_mem_data_reg0}; | |
835 | ||
836 | always @ (posedge clk) | |
837 | if (reset) | |
838 | pio_cache_rd <= 1'b0; | |
839 | else if (pio_mem_data_reg4_ren & !pio_mem_addr_reg[8]) | |
840 | pio_cache_rd <= 1'b1; | |
841 | else | |
842 | pio_cache_rd <= 1'b0; | |
843 | ||
844 | always @ (posedge clk) | |
845 | if (reset) | |
846 | pio_shadw_rd <= 1'b0; | |
847 | else if (pio_mem_data_reg4_ren & pio_mem_addr_reg[8]) | |
848 | pio_shadw_rd <= 1'b1; | |
849 | else | |
850 | pio_shadw_rd <= 1'b0; | |
851 | ||
852 | always @ (posedge clk) | |
853 | if (reset) | |
854 | pio_cache_wr <= 1'b0; | |
855 | else if (pio_mem_data_reg4_wen & !pio_mem_addr_reg[8]) | |
856 | pio_cache_wr <= 1'b1; | |
857 | else | |
858 | pio_cache_wr <= 1'b0; | |
859 | ||
860 | ||
861 | always @ (posedge clk) | |
862 | if (reset) | |
863 | pio_mem_data_reg4_wen_dly <= 1'b0; | |
864 | else if (pio_mem_data_reg4_wen & wr_transfer_comp_int) | |
865 | pio_mem_data_reg4_wen_dly <= 1'b1; | |
866 | else | |
867 | pio_mem_data_reg4_wen_dly <= 1'b0; | |
868 | ||
869 | wire pio_shadw_wr_en = (pio_mem_data_reg4_wen & !wr_transfer_comp_int | pio_mem_data_reg4_wen_dly); | |
870 | ||
871 | always @ (posedge clk) | |
872 | if (reset) | |
873 | pio_shadw_wr <= 1'b0; | |
874 | else if (pio_shadw_wr_en & pio_mem_addr_reg[8]) | |
875 | pio_shadw_wr <= 1'b1; | |
876 | else | |
877 | pio_shadw_wr <= 1'b0; | |
878 | ||
879 | always @ (posedge clk) | |
880 | if (reset) | |
881 | begin | |
882 | pio_acc_dly0 <= 1'b0; | |
883 | pio_acc_dly1 <= 1'b0; | |
884 | pio_acc_dly2 <= 1'b0; | |
885 | end | |
886 | else | |
887 | begin | |
888 | pio_acc_dly0 <= pio_mem_rd; | |
889 | pio_acc_dly1 <= pio_acc_dly0; | |
890 | pio_acc_dly2 <= pio_acc_dly1; | |
891 | end | |
892 | ||
893 | assign pio_mem_rd = pio_cache_rd | pio_shadw_rd; | |
894 | assign muxed_cache_rd_strobe = debug_mode ? pio_cache_rd : cache_rd_strobe; | |
895 | assign muxed_cache_wr_strobe = debug_mode ? pio_cache_wr : cache_wr_strobe; | |
896 | ||
897 | assign muxed_cache_rd_addr = debug_mode ? pio_mem_addr_reg[7:0] : cache_rd_addr; | |
898 | assign muxed_cache_wr_addr = debug_mode ? pio_mem_addr_reg[7:0] : cache_wr_addr; | |
899 | ||
900 | assign muxed_cache_wr_data = debug_mode ? pio_mem_wr_data : cache_wr_data; | |
901 | ||
902 | assign muxed_shadw_rd_strobe = debug_mode ? pio_shadw_rd : shadw_rd_strobe; | |
903 | assign muxed_shadw_rd_addr = debug_mode ? pio_mem_addr_reg[7:0] : shadw_rd_addr; | |
904 | assign muxed_mem_rd_data = pio_mem_addr_reg[8] ? shadw_rd_data_reg : cache_rd_data_reg; | |
905 | ||
906 | //assign muxed_shadw_wr_strobe = debug_mode ? pio_shadw_wr : shadw_wr_strobe; | |
907 | //assign muxed_shadw_wr_addr = debug_mode ? pio_mem_addr_reg[7:0] : shadw_wr_addr; | |
908 | //assign muxed_shadw_wr_data = debug_mode ? pio_mem_wr_data : shadw_wr_data; | |
909 | ||
910 | assign muxed_shadw_wr_strobe = pio_shadw_wr | shadw_wr_strobe; | |
911 | assign muxed_shadw_wr_addr = pio_shadw_wr ? pio_mem_addr_reg[7:0] : shadw_wr_addr; | |
912 | assign muxed_shadw_wr_data = pio_shadw_wr ? pio_mem_wr_data : shadw_wr_data; | |
913 | ||
914 | ||
915 | /**********************/ | |
916 | //Parity Check | |
917 | /**********************/ | |
918 | always @ (posedge clk) | |
919 | if (reset) | |
920 | begin | |
921 | muxed_cache_rd_strobe_r <= 1'b0; | |
922 | muxed_cache_rd_strobe_r1 <= 1'b0; | |
923 | muxed_shadw_rd_strobe_r <= 1'b0; | |
924 | muxed_shadw_rd_strobe_r1 <= 1'b0; | |
925 | cache_rd_strobe_r <= 1'b0; | |
926 | cache_rd_strobe_r1 <= 1'b0; | |
927 | shadw_rd_strobe_r <= 1'b0; | |
928 | shadw_rd_strobe_r1 <= 1'b0; | |
929 | muxed_cache_rd_addr_r <= 8'b0; | |
930 | muxed_shadw_rd_addr_d <= 8'b0; | |
931 | muxed_shadw_rd_addr_r <= 8'b0; | |
932 | end | |
933 | else | |
934 | begin | |
935 | muxed_cache_rd_strobe_r <= muxed_cache_rd_strobe; | |
936 | muxed_cache_rd_strobe_r1 <= muxed_cache_rd_strobe_r; | |
937 | muxed_shadw_rd_strobe_r <= muxed_shadw_rd_strobe; | |
938 | muxed_shadw_rd_strobe_r1 <= muxed_shadw_rd_strobe_r; | |
939 | cache_rd_strobe_r <= cache_rd_strobe; | |
940 | cache_rd_strobe_r1 <= cache_rd_strobe_r; | |
941 | shadw_rd_strobe_r <= shadw_rd_strobe; | |
942 | shadw_rd_strobe_r1 <= shadw_rd_strobe_r; | |
943 | muxed_cache_rd_addr_r <= muxed_cache_rd_addr; | |
944 | muxed_shadw_rd_addr_d <= muxed_shadw_rd_addr; | |
945 | muxed_shadw_rd_addr_r <= muxed_shadw_rd_addr_d; | |
946 | end | |
947 | ||
948 | assign cache_rd_data0 = {cache_rd_data_reg[128], cache_rd_data_reg[31:0]}; | |
949 | assign cache_rd_data1 = {cache_rd_data_reg[129], cache_rd_data_reg[63:32]}; | |
950 | assign cache_rd_data2 = {cache_rd_data_reg[130], cache_rd_data_reg[95:64]}; | |
951 | assign cache_rd_data3 = {cache_rd_data_reg[131], cache_rd_data_reg[127:96]}; | |
952 | ||
953 | assign cache_orig_parity_bits = cache_rd_data_reg[147:132]; | |
954 | assign cache_data_parity_bits = {^cache_rd_data3[32:24], | |
955 | ^cache_rd_data3[23:16], | |
956 | ^cache_rd_data3[15:8], | |
957 | ^cache_rd_data3[7:0], | |
958 | ^cache_rd_data2[32:24], | |
959 | ^cache_rd_data2[23:16], | |
960 | ^cache_rd_data2[15:8], | |
961 | ^cache_rd_data2[7:0], | |
962 | ^cache_rd_data1[32:24], | |
963 | ^cache_rd_data1[23:16], | |
964 | ^cache_rd_data1[15:8], | |
965 | ^cache_rd_data1[7:0], | |
966 | ^cache_rd_data0[32:24], | |
967 | ^cache_rd_data0[23:16], | |
968 | ^cache_rd_data0[15:8], | |
969 | ^cache_rd_data0[7:0]}; | |
970 | ||
971 | assign acc_cache_parity_err = !(cache_orig_parity_bits == cache_data_parity_bits) & muxed_cache_rd_strobe_r1; | |
972 | assign cache_parity_err = !(cache_orig_parity_bits == cache_data_parity_bits) & cache_rd_strobe_r1; | |
973 | ||
974 | assign shadw_rd_data0 = shadw_rd_data_reg[31:0]; | |
975 | assign shadw_rd_data1 = shadw_rd_data_reg[63:32]; | |
976 | assign shadw_rd_data2 = shadw_rd_data_reg[95:64]; | |
977 | assign shadw_rd_data3 = shadw_rd_data_reg[127:96]; | |
978 | ||
979 | assign shadw_orig_parity_bits = shadw_rd_data_reg[147:132]; | |
980 | assign shadw_data_parity_bits = {^shadw_rd_data3[31:24], | |
981 | ^shadw_rd_data3[23:16], | |
982 | ^shadw_rd_data3[15:8], | |
983 | ^shadw_rd_data3[7:0], | |
984 | ^shadw_rd_data2[31:24], | |
985 | ^shadw_rd_data2[23:16], | |
986 | ^shadw_rd_data2[15:8], | |
987 | ^shadw_rd_data2[7:0], | |
988 | ^shadw_rd_data1[31:24], | |
989 | ^shadw_rd_data1[23:16], | |
990 | ^shadw_rd_data1[15:8], | |
991 | ^shadw_rd_data1[7:0], | |
992 | ^shadw_rd_data0[31:24], | |
993 | ^shadw_rd_data0[23:16], | |
994 | ^shadw_rd_data0[15:8], | |
995 | ^shadw_rd_data0[7:0]}; | |
996 | ||
997 | assign acc_shadw_parity_err = !(shadw_orig_parity_bits == shadw_data_parity_bits) & muxed_shadw_rd_strobe_r1; | |
998 | assign shadw_parity_err = !(shadw_orig_parity_bits == shadw_data_parity_bits) & shadw_rd_strobe_r1; | |
999 | ||
1000 | always @ (posedge clk) | |
1001 | if (reset) | |
1002 | cache_parity_log_reg <= 10'b0; | |
1003 | else if (cache_parity_log_pio_wen) | |
1004 | cache_parity_log_reg <= {pio_wdata[15:14], pio_wdata[7:0]}; | |
1005 | else if (acc_cache_parity_err & cache_parity_log_reg[8]) | |
1006 | cache_parity_log_reg <= {2'b11, cache_parity_log_reg[7:0]}; | |
1007 | else if (acc_cache_parity_err) | |
1008 | cache_parity_log_reg <= {2'b10, muxed_cache_rd_addr_r[7:0]}; | |
1009 | else | |
1010 | cache_parity_log_reg <= cache_parity_log_reg; | |
1011 | ||
1012 | ||
1013 | always @ (posedge clk) | |
1014 | if (reset) | |
1015 | shadw_parity_log_reg <= 10'b0; | |
1016 | else if (shadw_parity_log_pio_wen) | |
1017 | shadw_parity_log_reg <= {pio_wdata[15:14], pio_wdata[7:0]}; | |
1018 | else if (acc_shadw_parity_err & shadw_parity_log_reg[8]) | |
1019 | shadw_parity_log_reg <= {2'b11, shadw_parity_log_reg[7:0]}; | |
1020 | else if (acc_shadw_parity_err) | |
1021 | shadw_parity_log_reg <= {2'b10, muxed_shadw_rd_addr_r[7:0]}; | |
1022 | else | |
1023 | shadw_parity_log_reg <= shadw_parity_log_reg; | |
1024 | ||
1025 | ||
1026 | /*****************/ | |
1027 | //Debug port | |
1028 | /*****************/ | |
1029 | ||
1030 | always @ (posedge clk) | |
1031 | if (reset) | |
1032 | debug_training_vector <= 32'b0; | |
1033 | else if (debug_training_vector_pio_wen) | |
1034 | debug_training_vector <= pio_wdata[31:0]; | |
1035 | else | |
1036 | debug_training_vector <= debug_training_vector; | |
1037 | ||
1038 | ||
1039 | wire[31:0] debug_default_data = debug_port_mux_sel[0] ? wr_debug_data[31:0] : {16'b0, pkt_buf_gnt[15:0]}; | |
1040 | wire[31:0] debug_port_data = (debug_port_mux_sel == 2'b10) ? debug_training_vector[31:0] : | |
1041 | (debug_port_mux_sel == 2'b11) ? ~rdmc_debug_port : | |
1042 | debug_default_data; | |
1043 | ||
1044 | always @ (posedge clk) | |
1045 | if (reset) | |
1046 | rdmc_debug_port <= 32'b0; | |
1047 | else | |
1048 | rdmc_debug_port <= debug_port_data; | |
1049 | ||
1050 | ||
1051 | /***************/ | |
1052 | //PIO Read | |
1053 | /***************/ | |
1054 | assign chnl_pio_rd_data = {64{pio_rd_gnt[0]}} & chnl_pio_rd_data0 | | |
1055 | {64{pio_rd_gnt[1]}} & chnl_pio_rd_data1 | | |
1056 | {64{pio_rd_gnt[2]}} & chnl_pio_rd_data2 | | |
1057 | {64{pio_rd_gnt[3]}} & chnl_pio_rd_data3 | | |
1058 | {64{pio_rd_gnt[4]}} & chnl_pio_rd_data4 | | |
1059 | {64{pio_rd_gnt[5]}} & chnl_pio_rd_data5 | | |
1060 | {64{pio_rd_gnt[6]}} & chnl_pio_rd_data6 | | |
1061 | {64{pio_rd_gnt[7]}} & chnl_pio_rd_data7 | | |
1062 | {64{pio_rd_gnt[8]}} & chnl_pio_rd_data8 | | |
1063 | {64{pio_rd_gnt[9]}} & chnl_pio_rd_data9 | | |
1064 | {64{pio_rd_gnt[10]}} & chnl_pio_rd_data10 | | |
1065 | {64{pio_rd_gnt[11]}} & chnl_pio_rd_data11 | | |
1066 | {64{pio_rd_gnt[12]}} & chnl_pio_rd_data12 | | |
1067 | {64{pio_rd_gnt[13]}} & chnl_pio_rd_data13 | | |
1068 | {64{pio_rd_gnt[14]}} & chnl_pio_rd_data14 | | |
1069 | {64{pio_rd_gnt[15]}} & chnl_pio_rd_data15; | |
1070 | ||
1071 | ||
1072 | /* | |
1073 | always @ (pio_addr or clk_div_value or | |
1074 | def_port0_rdc_reg or def_port1_rdc_reg or | |
1075 | def_port2_rdc_reg or def_port3_rdc_reg or | |
1076 | pt_drr_wt0_reg or pt_drr_wt1_reg or | |
1077 | pt_drr_wt2_reg or pt_drr_wt3_reg or | |
1078 | pt_use0_reg or pt_use1_reg or | |
1079 | pt_use2_reg or pt_use3_reg or | |
1080 | red_ran_init_reg or rx_addr_mode_reg or | |
1081 | cache_parity_log_reg or shadw_parity_log_reg or | |
1082 | pio_mem_addr_reg or pio_mem_data_reg0 or | |
1083 | pio_mem_data_reg1 or pio_mem_data_reg2 or | |
1084 | pio_mem_data_reg3 or muxed_mem_rd_data or | |
1085 | port_err_status_reg or port_err_mask_reg or | |
1086 | debug_training_vector) | |
1087 | begin | |
1088 | ||
1089 | port_pio_rd_err = 1'b0; | |
1090 | case (pio_addr) //synopsys parallel_case full_case | |
1091 | ||
1092 | 20'h80000: port_pio_rd_data_tmp = {48'b0, clk_div_value[15:0]}; | |
1093 | 20'h80008: port_pio_rd_data_tmp = {59'b0, def_port0_rdc_reg[4:0]}; | |
1094 | 20'h80010: port_pio_rd_data_tmp = {59'b0, def_port1_rdc_reg[4:0]}; | |
1095 | 20'h80018: port_pio_rd_data_tmp = {59'b0, def_port2_rdc_reg[4:0]}; | |
1096 | 20'h80020: port_pio_rd_data_tmp = {59'b0, def_port3_rdc_reg[4:0]}; | |
1097 | 20'h80028: port_pio_rd_data_tmp = {48'b0, pt_drr_wt0_reg[15:0]}; | |
1098 | 20'h80030: port_pio_rd_data_tmp = {48'b0, pt_drr_wt1_reg[15:0]}; | |
1099 | 20'h80038: port_pio_rd_data_tmp = {48'b0, pt_drr_wt2_reg[15:0]}; | |
1100 | 20'h80040: port_pio_rd_data_tmp = {48'b0, pt_drr_wt3_reg[15:0]}; | |
1101 | 20'h80048: port_pio_rd_data_tmp = {44'b0, pt_use0_reg[19:0]}; | |
1102 | 20'h80050: port_pio_rd_data_tmp = {44'b0, pt_use1_reg[19:0]}; | |
1103 | 20'h80058: port_pio_rd_data_tmp = {44'b0, pt_use2_reg[19:0]}; | |
1104 | 20'h80060: port_pio_rd_data_tmp = {44'b0, pt_use3_reg[19:0]}; | |
1105 | 20'h80068: port_pio_rd_data_tmp = {47'b0, red_ran_init_reg[16:0]}; | |
1106 | 20'h80070: port_pio_rd_data_tmp = {60'b0, rx_addr_mode_reg[3:0]}; | |
1107 | 20'h80078: port_pio_rd_data_tmp = {48'b0, cache_parity_log_reg[9:8], 6'b0, cache_parity_log_reg[7:0]}; | |
1108 | 20'h80080: port_pio_rd_data_tmp = {48'b0, shadw_parity_log_reg[9:8], 6'b0, shadw_parity_log_reg[7:0]}; | |
1109 | 20'h80088: port_pio_rd_data_tmp = {55'b0, pio_mem_addr_reg[8:0]}; | |
1110 | 20'h80090: port_pio_rd_data_tmp = {32'b0, pio_mem_data_reg0[31:0]}; | |
1111 | 20'h80098: port_pio_rd_data_tmp = {32'b0, pio_mem_data_reg1[31:0]}; | |
1112 | 20'h800a0: port_pio_rd_data_tmp = {32'b0, pio_mem_data_reg2[31:0]}; | |
1113 | 20'h800a8: port_pio_rd_data_tmp = {32'b0, pio_mem_data_reg3[31:0]}; | |
1114 | 20'h800b0: port_pio_rd_data_tmp = {44'b0, muxed_mem_rd_data[147:128]}; | |
1115 | 20'h800b8: port_pio_rd_data_tmp = {55'b0, port_err_status_reg[8:0]}; | |
1116 | 20'h800c0: port_pio_rd_data_tmp = {55'b0, port_err_mask_reg[8:0]}; | |
1117 | 20'h800c8: port_pio_rd_data_tmp = {32'b0, debug_training_vector[31:0]}; | |
1118 | 20'h800d0: port_pio_rd_data_tmp = {55'b0, port_err_status_reg[8:0]}; | |
1119 | default: begin | |
1120 | port_pio_rd_err = 1'b1; | |
1121 | port_pio_rd_data_tmp = 64'b0; | |
1122 | end | |
1123 | ||
1124 | endcase | |
1125 | end | |
1126 | */ | |
1127 | ||
1128 | always @ (pio_addr or clk_div_value or | |
1129 | def_port0_rdc_reg or def_port1_rdc_reg or | |
1130 | def_port2_rdc_reg or def_port3_rdc_reg or | |
1131 | pt_drr_wt0_reg or pt_drr_wt1_reg or | |
1132 | pt_drr_wt2_reg or pt_drr_wt3_reg or | |
1133 | pt_use0_reg or pt_use1_reg or | |
1134 | pt_use2_reg or pt_use3_reg or | |
1135 | red_ran_init_reg or rx_addr_mode_reg or | |
1136 | cache_parity_log_reg or shadw_parity_log_reg or | |
1137 | pio_mem_addr_reg or pio_mem_data_reg0 or | |
1138 | pio_mem_data_reg1 or pio_mem_data_reg2 or | |
1139 | pio_mem_data_reg3 or muxed_mem_rd_data or | |
1140 | port_err_status_reg or port_err_mask_reg or | |
1141 | debug_training_vector) | |
1142 | begin | |
1143 | ||
1144 | port_pio_rd_err = 1'b0; | |
1145 | case (pio_addr[19:2]) //synopsys parallel_case full_case | |
1146 | ||
1147 | 18'h20000: port_pio_rd_data_tmp = {48'b0, clk_div_value[15:0]}; | |
1148 | 18'h20001: port_pio_rd_data_tmp = 64'b0; | |
1149 | 18'h20002: port_pio_rd_data_tmp = {59'b0, def_port0_rdc_reg[4:0]}; | |
1150 | 18'h20003: port_pio_rd_data_tmp = 64'b0; | |
1151 | 18'h20004: port_pio_rd_data_tmp = {59'b0, def_port1_rdc_reg[4:0]}; | |
1152 | 18'h20005: port_pio_rd_data_tmp = 64'b0; | |
1153 | 18'h20006: port_pio_rd_data_tmp = {59'b0, def_port2_rdc_reg[4:0]}; | |
1154 | 18'h20007: port_pio_rd_data_tmp = 64'b0; | |
1155 | 18'h20008: port_pio_rd_data_tmp = {59'b0, def_port3_rdc_reg[4:0]}; | |
1156 | 18'h20009: port_pio_rd_data_tmp = 64'b0; | |
1157 | 18'h2000a: port_pio_rd_data_tmp = {48'b0, pt_drr_wt0_reg[15:0]}; | |
1158 | 18'h2000b: port_pio_rd_data_tmp = 64'b0; | |
1159 | 18'h2000c: port_pio_rd_data_tmp = {48'b0, pt_drr_wt1_reg[15:0]}; | |
1160 | 18'h2000d: port_pio_rd_data_tmp = 64'b0; | |
1161 | 18'h2000e: port_pio_rd_data_tmp = {48'b0, pt_drr_wt2_reg[15:0]}; | |
1162 | 18'h2000f: port_pio_rd_data_tmp = 64'b0; | |
1163 | 18'h20010: port_pio_rd_data_tmp = {48'b0, pt_drr_wt3_reg[15:0]}; | |
1164 | 18'h20011: port_pio_rd_data_tmp = 64'b0; | |
1165 | 18'h20012: port_pio_rd_data_tmp = {44'b0, pt_use0_reg[19:0]}; | |
1166 | 18'h20013: port_pio_rd_data_tmp = 64'b0; | |
1167 | 18'h20014: port_pio_rd_data_tmp = {44'b0, pt_use1_reg[19:0]}; | |
1168 | 18'h20015: port_pio_rd_data_tmp = 64'b0; | |
1169 | 18'h20016: port_pio_rd_data_tmp = {44'b0, pt_use2_reg[19:0]}; | |
1170 | 18'h20017: port_pio_rd_data_tmp = 64'b0; | |
1171 | 18'h20018: port_pio_rd_data_tmp = {44'b0, pt_use3_reg[19:0]}; | |
1172 | 18'h20019: port_pio_rd_data_tmp = 64'b0; | |
1173 | 18'h2001a: port_pio_rd_data_tmp = {47'b0, red_ran_init_reg[16:0]}; | |
1174 | 18'h2001b: port_pio_rd_data_tmp = 64'b0; | |
1175 | 18'h2001c: port_pio_rd_data_tmp = {60'b0, rx_addr_mode_reg[3:0]}; | |
1176 | 18'h2001d: port_pio_rd_data_tmp = 64'b0; | |
1177 | 18'h2001e: port_pio_rd_data_tmp = {48'b0, cache_parity_log_reg[9:8], 6'b0, cache_parity_log_reg[7:0]}; | |
1178 | 18'h2001f: port_pio_rd_data_tmp = 64'b0; | |
1179 | 18'h20020: port_pio_rd_data_tmp = {48'b0, shadw_parity_log_reg[9:8], 6'b0, shadw_parity_log_reg[7:0]}; | |
1180 | 18'h20021: port_pio_rd_data_tmp = 64'b0; | |
1181 | 18'h20022: port_pio_rd_data_tmp = {55'b0, pio_mem_addr_reg[8:0]}; | |
1182 | 18'h20023: port_pio_rd_data_tmp = 64'b0; | |
1183 | 18'h20024: port_pio_rd_data_tmp = {32'b0, pio_mem_data_reg0[31:0]}; | |
1184 | 18'h20025: port_pio_rd_data_tmp = 64'b0; | |
1185 | 18'h20026: port_pio_rd_data_tmp = {32'b0, pio_mem_data_reg1[31:0]}; | |
1186 | 18'h20027: port_pio_rd_data_tmp = 64'b0; | |
1187 | 18'h20028: port_pio_rd_data_tmp = {32'b0, pio_mem_data_reg2[31:0]}; | |
1188 | 18'h20029: port_pio_rd_data_tmp = 64'b0; | |
1189 | 18'h2002a: port_pio_rd_data_tmp = {32'b0, pio_mem_data_reg3[31:0]}; | |
1190 | 18'h2002b: port_pio_rd_data_tmp = 64'b0; | |
1191 | 18'h2002c: port_pio_rd_data_tmp = {44'b0, muxed_mem_rd_data[147:128]}; | |
1192 | 18'h2002d: port_pio_rd_data_tmp = 64'b0; | |
1193 | 18'h2002e: port_pio_rd_data_tmp = {55'b0, port_err_status_reg[8:0]}; | |
1194 | 18'h2002f: port_pio_rd_data_tmp = 64'b0; | |
1195 | 18'h20030: port_pio_rd_data_tmp = {55'b0, port_err_mask_reg[8:0]}; | |
1196 | 18'h20031: port_pio_rd_data_tmp = 64'b0; | |
1197 | 18'h20032: port_pio_rd_data_tmp = {32'b0, debug_training_vector[31:0]}; | |
1198 | 18'h20033: port_pio_rd_data_tmp = 64'b0; | |
1199 | 18'h20034: port_pio_rd_data_tmp = {55'b0, port_err_status_reg[8:0]}; | |
1200 | 18'h20035: port_pio_rd_data_tmp = 64'b0; | |
1201 | default: begin | |
1202 | port_pio_rd_err = 1'b1; | |
1203 | port_pio_rd_data_tmp = 64'hdeadbeefdeadbeef; | |
1204 | end | |
1205 | ||
1206 | endcase | |
1207 | end | |
1208 | ||
1209 | ||
1210 | always @ (posedge clk) | |
1211 | if (reset) | |
1212 | port_pio_gnt <= 1'b0; | |
1213 | else | |
1214 | port_pio_gnt <= !port_pio_rd_err; | |
1215 | ||
1216 | always @ (posedge clk) | |
1217 | if (reset) | |
1218 | port_pio_rd_data <= 64'b0; | |
1219 | else | |
1220 | port_pio_rd_data <= port_pio_rd_data_tmp; | |
1221 | ||
1222 | ||
1223 | ||
1224 | ||
1225 | endmodule | |
1226 | ||
1227 | ||
1228 | ||
1229 |