Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / design / sys / iop / dmu / rtl / dmu_ilu_eil_datafsm.v
CommitLineData
86530b38
AT
1// ========== Copyright Header Begin ==========================================
2//
3// OpenSPARC T2 Processor File: dmu_ilu_eil_datafsm.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 ============================================
35module dmu_ilu_eil_datafsm (
36 clk,
37 rst_l,
38
39 y2k_buf_addr,
40 k2y_buf_data,
41 k2y_buf_dpar,
42
43 d2p_edb_we,
44 d2p_edb_addr,
45 d2p_edb_data,
46 d2p_edb_dpar,
47
48 data_start,
49 data_done,
50 only_one_rd_and_can_move,
51
52 ecd_full,
53 erd_full,
54 edb_full_adv,
55 edb_wptr,
56 edb_wptr_inc,
57
58 align_addr,
59 payld_len,
60 d_ptr_in,
61 rcd_is_cpl,
62 rcd_is_cpl_reg,
63
64 n_y2k_buf_addr_cl,
65
66 dou_sbd_vld_datafsm,
67
68 cib2eil_drain,
69
70 // idle check
71 datafsm_is_idle,
72
73 // parity invert signals
74 ilu_diagnos_edi_trig_hw_clr,
75 ilu_diagnos_edi_trig_hw_read,
76 ilu_diagnos_edi_par_hw_read,
77
78 // debug signals
79 data_state,
80 set_residue,
81 clr_residue,
82 there_is_data_residue,
83 set_early_data_done,
84 clr_early_data_done,
85 early_data_done,
86 last_rd,
87 last_wr,
88 more_rds,
89 more_wrs,
90 dou_rptr_inc );
91
92
93 // synopsys sync_set_reset "rst_l"
94
95 // >>>>>>>>>>>>>>>>>>>>>>>>> Parameter Declarations <<<<<<<<<<<<<<<<<<<<<<<<<
96
97 // data_states
98 parameter // summit enum data_enum
99 IDLE = 0,
100 FIRST = 1,
101 MOVE = 2,
102 WFEDB = 3, // wait for EDB data space for last wr
103 WFDOUEDB = 4; // wait for EDB or DOU when more rds and more wrs
104
105
106 // data_state number
107 parameter STATE_NUM = 5;
108
109 // >>>>>>>>>>>>>>>>>>>>>>>>> Port Declarations <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
110
111 //------------------------------------------------------------------------
112 // Clock and Reset Signals
113 //------------------------------------------------------------------------
114 input clk; // input clock
115 input rst_l; // input reset
116
117 //------------------------------------------------------------------------
118 // data buffer interface to DOU
119 //------------------------------------------------------------------------
120 output [7:0] y2k_buf_addr; // read address to DOU
121 input [127:0] k2y_buf_data; // payload
122 input [3:0] k2y_buf_dpar; // word parity for the payload
123
124 //------------------------------------------------------------------------
125 // EDB interface
126 //------------------------------------------------------------------------
127 output d2p_edb_we; // EDB write stroke
128 output [7:0] d2p_edb_addr;
129 output [127:0] d2p_edb_data; // EDB payload
130 output [3:0] d2p_edb_dpar; // EDB word parity for payload
131
132 //------------------------------------------------------------------------
133 // talk to xfrsfm.v
134 //------------------------------------------------------------------------
135 input data_start; // trigger, from *_xfrfsm.v
136 output data_done; // data transfer is done, to *_xfrfsm.v
137 output only_one_rd_and_can_move;
138
139 //------------------------------------------------------------------------
140 // talk to bufmgr.v
141 //------------------------------------------------------------------------
142 input ecd_full;
143 input erd_full;
144 input edb_full_adv;
145 input [7:0] edb_wptr;
146 output edb_wptr_inc;
147
148 //------------------------------------------------------------------------
149 // talk to rcdbldr.v
150 //------------------------------------------------------------------------
151 input [5:2] align_addr; // align address from rcd, from *_rcdbldr.v
152 input [7:0] payld_len; // only 8-bit due to max. MPS = 512B,
153 // the possible max. value is 8'b10000000.
154 // from *_rcdbldr.v
155 input [5:0] d_ptr_in; // DOU read start ptr = {d_ptr_in[5:0], align_addr[5:4]}
156 // from *_rcdbldr.v
157 input rcd_is_cpl; // from *_rcdbldr.v
158 input rcd_is_cpl_reg; // flopped rcd_is_cpl, from *_rcdbldr.v
159
160 //------------------------------------------------------------------------
161 // talk to relgen.v
162 //------------------------------------------------------------------------
163 output [6:2] n_y2k_buf_addr_cl;
164
165 input dou_sbd_vld_datafsm; // dou cl aveirable to pull
166
167 //------------------------------------------------------------------------
168 // special handling
169 //------------------------------------------------------------------------
170 input cib2eil_drain; // drain signal from CIB
171
172 //---------------------------------------------------------------------
173 // debug signals
174 //---------------------------------------------------------------------
175 output [STATE_NUM-1:0] data_state;
176 output set_residue;
177 output clr_residue;
178 output there_is_data_residue;
179 output set_early_data_done;
180 output clr_early_data_done;
181 output early_data_done;
182 output last_rd;
183 output last_wr;
184 output more_rds;
185 output more_wrs;
186 output dou_rptr_inc;
187
188 output ilu_diagnos_edi_trig_hw_clr;
189 input ilu_diagnos_edi_trig_hw_read;
190 input [`FIRE_DLC_ILU_CIB_CSR_ILU_DIAGNOS_EDI_PAR_INT_SLC] ilu_diagnos_edi_par_hw_read;
191
192 //---------------------------------------------------------------------
193 // idle check
194 //---------------------------------------------------------------------
195
196 output datafsm_is_idle;
197
198 // >>>>>>>>>>>>>>>>>>>>>>>>> Data Type Declarations <<<<<<<<<<<<<<<<<<<<<<<<<
199
200 // ~~~~~~~~~~~~~~~~~~~~~~~~~ REGISTER - FLOPS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
201
202 reg [7:0] y2k_buf_addr;
203 reg [3:2] align_addr_reg;
204
205 reg [STATE_NUM-1:0] data_state; // 0in one_hot
206
207 reg [5:0] num_rds; // remaining read data beats to DOU
208 reg [5:0] num_wrs; // remaining write data beats to EDB
209
210 reg [127:0] d2p_edb_data;
211 reg [3:0] d2p_edb_dpar_0;
212
213 reg [127:0] saved_data;
214 reg [3:0] saved_dpar;
215
216 reg there_is_data_residue; // there is residue on the data_ps3 reg
217 reg early_data_done;
218
219 reg edb_we_ps1;
220 reg [7:0] edb_wptr_ps1;
221 reg [3:2] align_addr_ps1;
222 reg zero_fill_ps1;
223
224 reg edb_we_ps2;
225 reg [7:0] edb_wptr_ps2;
226 reg [3:2] align_addr_ps2;
227 reg zero_fill_ps2;
228
229 reg edb_we_ps3;
230 reg [7:0] edb_wptr_ps3;
231
232
233 // ~~~~~~~~~~~~~~~~~~~~~~~~~ REGISTER - NON-FLOPS ~~~~~~~~~~~~~~~~~~~~~~~~~~
234 reg [7:0] n_y2k_buf_addr;
235 reg [6:0] n_y2k_buf_addr_low;
236
237 reg [STATE_NUM-1:0] n_data_state;
238
239 reg [5:0] n_num_rds; // next value of num_rds
240 reg [5:0] n_num_wrs; // next value of num_wrs
241
242 reg [127:0] n_d2p_edb_data;
243 reg [3:0] n_d2p_edb_dpar;
244
245 reg dou_rptr_inc;
246 reg num_wrs_dec;
247 reg set_residue;
248 reg clr_residue;
249 reg set_early_data_done;
250 reg clr_early_data_done;
251 reg data_done;
252 reg drain_spcl_case;
253
254 // ~~~~~~~~~~~~~~~~~~~~~~~~~ NETS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
255 wire new_payld_len_inc;
256 wire payld_len_inc;
257 wire carry;
258
259 wire [7:0] new_payld_len; // possible max. value is 8'b10000011
260 wire [5:0] init_num_rds; // initial value of num_rds
261 // possible max. value is 6'b100001
262 wire [5:0] init_num_wrs; // initial value of num_wrs
263 // possible max. value is 6'b100000
264
265 wire [5:0] num_rds_adv; // num_rds - 1
266 wire [5:0] num_wrs_adv; // num_wrs
267
268 wire more_rds;
269 wire more_wrs;
270 wire last_rd;
271 wire last_wr;
272
273 wire need_wait_for_dou_edb;
274
275 wire edb_we_ne0;
276 wire [7:0] edb_wptr_ne0;
277 wire [3:2] align_addr_ne0;
278 wire [3:2] align_addr_dp;
279 wire zero_fill_ne0;
280
281 wire only_one_rd;
282
283 wire rcd_is_cpl_cur;
284 wire edb_full;
285 wire edb_full_for_cur_rcd;
286 wire diff_rcd_type_from_prev;
287 wire can_write_one_db;
288
289 // >>>>>>>>>>>>>>>>>>>>>>>>> Zero In Checkers <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
290
291 // 0in known_driven -var set_residue
292 // 0in known_driven -var clr_residue
293 // 0in known_driven -var set_early_data_done
294 // 0in known_driven -var clr_early_data_done
295 // 0in known_driven -var data_start
296 // 0in known_driven -var there_is_data_residue
297 // 0in known_driven -var edb_full
298 // 0in known_driven -var early_data_done
299 // 0in known_driven -var edb_full_adv
300 // 0in known_driven -var dou_rptr_inc
301 // 0in known_driven -var num_wrs_dec
302
303 /* 0in custom -fire early_data_done -active data_state[WFEDB]
304 -message "HW bug if early_data_done is asserted in WFEDB state" */
305
306 // 0in max -var new_payld_len -val 8'b10000011 -active data_start
307 // 0in max -var init_num_rds -val 6'b100001 -active data_start
308 // 0in max -var init_num_wrs -val 6'b100000 -active data_start
309
310 /* 0in state -var data_state -val (5'b1 << IDLE) -next
311 (5'b1 << IDLE)
312 (5'b1 << FIRST) */
313
314 /* 0in state -var data_state -val (5'b1 << FIRST) -next
315 (5'b1 << IDLE)
316 (5'b1 << FIRST)
317 (5'b1 << MOVE)
318 (5'b1 << WFEDB)
319 (5'b1 << WFDOUEDB) */
320
321 /* 0in state -var data_state -val (5'b1 << MOVE) -next
322 (5'b1 << IDLE)
323 (5'b1 << FIRST)
324 (5'b1 << MOVE)
325 (5'b1 << WFEDB)
326 (5'b1 << WFDOUEDB) */
327
328 /* 0in state -var data_state -val (5'b1 << WFEDB) -next
329 (5'b1 << WFEDB)
330 (5'b1 << MOVE) */
331
332 /* 0in state -var data_state -val (5'b1 << WFDOUEDB) -next
333 (5'b1 << WFDOUEDB)
334 (5'b1 << MOVE) */
335
336//BP n2 5-31-05
337 // 0in custom -fire d2p_edb_we -active $0in_delay((cib2eil_drain & ~drain_spcl_case), 3)
338
339 // >>>>>>>>>>>>>>>>>>>>>>>>> RTL/Behavioral Model <<<<<<<<<<<<<<<<<<<<<<<<<<<
340
341 //---------------------------------------------------------------------
342 // to figure out edb_full
343 //---------------------------------------------------------------------
344 assign rcd_is_cpl_cur = there_is_data_residue ? rcd_is_cpl_reg : rcd_is_cpl;
345//BP 9-16-05 assign edb_full = (rcd_is_cpl_cur ? ecd_full : erd_full) & (~cib2eil_drain);
346 assign edb_full = (rcd_is_cpl_cur ? ecd_full : erd_full) & (~cib2eil_drain | drain_spcl_case);
347
348 //---------------------------------------------------------------------
349 // track of left over on the saved_data reg
350 // set_residue & clr_residue must not asserted at same time
351 //---------------------------------------------------------------------
352 always @ (posedge clk)
353 if (~rst_l) there_is_data_residue <= 1'b0;
354 else if (set_residue) begin
355 there_is_data_residue <= 1'b1;
356 end
357 else if (clr_residue) begin
358 there_is_data_residue <= 1'b0;
359 end
360
361 //---------------------------------------------------------------------
362 // track of data_done signal for last rd, 2 more wrs case &
363 // no more rd, last wr case
364 // set_early_data_done & clr_early_data_done must not asserted at same time
365 //---------------------------------------------------------------------
366 always @ (posedge clk)
367 if (~rst_l) early_data_done <= 1'b0;
368 else if (set_early_data_done) begin
369 early_data_done <= 1'b1;
370 end
371 else if (clr_early_data_done) begin
372 early_data_done <= 1'b0;
373 end
374
375 //---------------------------------------------------------------------
376 // FSM
377 //---------------------------------------------------------------------
378
379 // summit state_vector data_state enum data_enum
380
381 // present data_state
382 always @ (posedge clk)
383 if (!rst_l) begin
384 data_state <= {STATE_NUM{1'b0}};
385 data_state[IDLE] <= 1'b1;
386 end
387 else
388 data_state <= n_data_state;
389
390 // next data_state logic
391 assign num_rds_adv = num_rds - 1'b1;
392 assign num_wrs_adv = num_wrs;
393
394 assign more_rds = |(num_rds_adv);
395 assign more_wrs = |(num_wrs_adv);
396 assign last_rd = (~(|num_rds_adv[5:1])) & num_rds_adv[0];
397 assign last_wr = (~(|num_wrs_adv[5:1])) & num_wrs_adv[0];
398
399 assign need_wait_for_dou_edb = edb_full | (~dou_sbd_vld_datafsm);
400
401 assign edb_full_for_cur_rcd = rcd_is_cpl ? ecd_full : erd_full;
402 assign diff_rcd_type_from_prev = rcd_is_cpl ^ rcd_is_cpl_reg;
403 assign can_write_one_db = diff_rcd_type_from_prev ? ~edb_full_for_cur_rcd :
404 (there_is_data_residue ? ~edb_full_adv : ~edb_full);
405 assign only_one_rd_and_can_move = only_one_rd & can_write_one_db;
406
407 always @ (data_state or data_start or
408 more_rds or more_wrs or
409 last_rd or last_wr or
410 only_one_rd_and_can_move or
411 edb_full or
412 there_is_data_residue or
413 need_wait_for_dou_edb or
414 edb_full_adv or
415 early_data_done)
416 begin
417 n_data_state = {STATE_NUM{1'b0}};
418 data_done = 1'b0;
419 dou_rptr_inc = 1'b0;
420 num_wrs_dec = 1'b0;
421 set_residue = 1'b0;
422 clr_residue = 1'b0;
423 set_early_data_done = 1'b0;
424 clr_early_data_done = 1'b0;
425
426 case (1'b1) // 0in < case -full // synopsys parallel_case
427 data_state[IDLE] :
428 if (data_start) begin
429 clr_early_data_done = 1'b1;
430 dou_rptr_inc = 1'b1;
431 n_data_state[FIRST] = 1'b1;
432 set_residue = 1'b1;
433 if (only_one_rd_and_can_move) begin
434 data_done = 1'b1;
435 set_early_data_done = 1'b1;
436 end
437 end
438 else n_data_state[IDLE] = 1'b1;
439
440 data_state[FIRST],
441 data_state[MOVE] :
442 begin
443 if (data_start) begin
444 clr_early_data_done = 1'b1;
445 dou_rptr_inc = 1'b1;
446 set_residue = 1'b1;
447 if (there_is_data_residue) begin
448 num_wrs_dec = 1'b1;
449 end
450 n_data_state[FIRST] = 1'b1;
451 if (only_one_rd_and_can_move) begin
452 data_done = 1'b1;
453 set_early_data_done = 1'b1;
454 end
455 end
456 else begin
457 case ({last_rd, last_wr, more_rds, more_wrs}) // 0in < case -parallel -full
458 4'b1111: // last rd, last wr
459 begin
460 if (need_wait_for_dou_edb) begin
461 n_data_state[WFDOUEDB] = 1'b1;
462 end
463 else begin
464 data_done = 1'b1;
465 dou_rptr_inc = 1'b1;
466 num_wrs_dec = 1'b1;
467 clr_residue = 1'b1;
468 n_data_state[MOVE] = 1'b1;
469 end
470 end
471 4'b0101: // no more rd, last wr
472 begin
473 if (edb_full) begin
474 n_data_state[WFEDB] = 1'b1;
475 end
476 else begin
477 num_wrs_dec = 1'b1;
478 clr_residue = 1'b1;
479 n_data_state[MOVE] = 1'b1;
480 if (early_data_done) begin
481 clr_early_data_done = 1'b1;
482 end
483 else data_done = 1'b1;
484 end
485 end
486 4'b0011: // more rd, more wr
487 begin
488 if (need_wait_for_dou_edb) begin
489 n_data_state[WFDOUEDB] = 1'b1;
490 end
491 else begin
492 dou_rptr_inc = 1'b1;
493 num_wrs_dec = 1'b1;
494 n_data_state[MOVE] = 1'b1;
495 end
496 end
497 4'b1011: // last rd, two more wrs
498 begin
499 if (need_wait_for_dou_edb) begin
500 n_data_state[WFDOUEDB] = 1'b1;
501 end
502 else begin
503 dou_rptr_inc = 1'b1;
504 num_wrs_dec = 1'b1;
505 n_data_state[MOVE] = 1'b1;
506 if (~edb_full_adv) begin
507 data_done = 1'b1;
508 set_early_data_done = 1'b1;
509 end
510 end
511 end
512 4'b0000: // no more rd, no more wr
513 n_data_state[IDLE] = 1'b1;
514 endcase // case({last_rd, last_wr, more_rds, more_wrs})
515 end
516 end
517
518 data_state[WFEDB]:
519 begin
520 if (edb_full) begin
521 n_data_state[WFEDB] = 1'b1; // for last wr only
522 end
523 else begin
524 num_wrs_dec = 1'b1;
525 clr_residue = 1'b1;
526 n_data_state[MOVE] = 1'b1;
527// if (early_data_done) begin
528// clr_early_data_done = 1'b1;
529// end
530// else data_done = 1'b1;
531 data_done = 1'b1;
532 end
533 end
534
535 data_state[WFDOUEDB]:
536 begin
537 if (need_wait_for_dou_edb) begin
538 n_data_state[WFDOUEDB] = 1'b1;
539 end
540 else begin
541 case ({last_rd, last_wr, more_rds, more_wrs}) // 0in < case -parallel -full
542 4'b1111: // last rd, last wr
543 begin
544 data_done = 1'b1;
545 dou_rptr_inc = 1'b1;
546 num_wrs_dec = 1'b1;
547 clr_residue = 1'b1;
548 n_data_state[MOVE] = 1'b1;
549 end
550 4'b0011: // more rd, more wr
551 begin
552 dou_rptr_inc = 1'b1;
553 num_wrs_dec = 1'b1;
554 n_data_state[MOVE] = 1'b1;
555 end
556 4'b1011: // last rd, two more wrs
557 begin
558 dou_rptr_inc = 1'b1;
559 num_wrs_dec = 1'b1;
560 n_data_state[MOVE] = 1'b1;
561 if (~edb_full_adv) begin
562 data_done = 1'b1;
563 set_early_data_done = 1'b1;
564 end
565 end
566 endcase // case({last_rd, last_wr, more_rds, more_wrs})
567 end
568 end
569 endcase // case(1'b1)
570 end
571
572
573 //------------------------------------------------------------------------
574 // Counters of num_rds & num_wrs
575 //------------------------------------------------------------------------
576
577 // compute init_num_rds & init_num_wrs
578 assign new_payld_len_inc = |new_payld_len[1:0];
579 assign payld_len_inc = |payld_len[1:0];
580
581 assign {carry, new_payld_len[1:0]} = {1'b0, payld_len[1:0]} + {1'b0, align_addr[3:2]};
582 assign new_payld_len[7:2] = carry ? (payld_len[7:2] + 1'b1) :
583 payld_len[7:2];
584
585 assign init_num_rds = new_payld_len_inc ? (new_payld_len[7:2] + 1'b1) :
586 new_payld_len[7:2];
587
588 assign init_num_wrs = payld_len_inc ? (payld_len[7:2] + 1'b1) :
589 payld_len[7:2];
590
591 assign only_one_rd = (new_payld_len_inc & (~(|new_payld_len[7:2]))) |
592 (~new_payld_len_inc & (~(|new_payld_len[7:3])));
593
594 // present counter value
595 always @ (posedge clk)
596 if(~rst_l) begin
597 num_rds <= {6{1'b0}};
598 num_wrs <= {6{1'b0}};
599 end
600 else begin
601 num_rds <= n_num_rds;
602 num_wrs <= n_num_wrs;
603 end
604
605 // next counter value of n_num_rds
606 always @ (n_data_state or init_num_rds or num_rds or dou_rptr_inc)
607 begin
608 if (n_data_state[FIRST]) begin
609 n_num_rds = init_num_rds;
610 end
611 else if (dou_rptr_inc) begin
612 n_num_rds = num_rds - 1'b1;
613 end
614 else n_num_rds = num_rds;
615 end
616
617 // next counter value of n_num_wrs
618 always @ (n_data_state or init_num_wrs or num_wrs or num_wrs_dec)
619 begin
620 if (n_data_state[FIRST]) begin
621 n_num_wrs = init_num_wrs;
622 end
623 else if (num_wrs_dec) begin
624 n_num_wrs = num_wrs - 1'b1;
625 end
626 else n_num_wrs = num_wrs;
627 end
628
629 //------------------------------------------------------------------------
630 // outputs
631 //------------------------------------------------------------------------
632 assign d2p_edb_we = edb_we_ps3;
633 assign d2p_edb_addr = edb_wptr_ps3;
634
635 always @ (posedge clk)
636 begin
637 if (~rst_l) begin
638 y2k_buf_addr <= {`FIRE_DLC_ERD_ADDR_WDTH{1'b0}};
639 end
640 else begin
641 y2k_buf_addr <= n_y2k_buf_addr;
642 end
643 end
644
645 always @ (n_data_state or y2k_buf_addr or d_ptr_in or
646 align_addr or rcd_is_cpl or dou_rptr_inc)
647 begin
648 n_y2k_buf_addr_low = y2k_buf_addr[6:0];
649 if (n_data_state[FIRST]) begin
650//BP n2 6-22-04
651// n_y2k_buf_addr = {d_ptr_in[5:0],
652// (rcd_is_cpl ? align_addr[5:4] : 2'b00)};
653 n_y2k_buf_addr = (rcd_is_cpl ? {d_ptr_in[5:0],align_addr[5:4]} : {4'b1000,d_ptr_in[3:0]});
654 end
655 else if (dou_rptr_inc) begin
656 n_y2k_buf_addr_low = y2k_buf_addr[6:0] + 1'b1;
657 n_y2k_buf_addr = {y2k_buf_addr[7], n_y2k_buf_addr_low};
658 end
659 else n_y2k_buf_addr = y2k_buf_addr;
660 end
661
662 assign n_y2k_buf_addr_cl = n_y2k_buf_addr[6:2];
663
664 //------------------------------------------------------------------------
665 // data path control pipeline
666 //------------------------------------------------------------------------
667// BP n2 5-23-05 special case if drain is asserted and we had a data_start and data_stop
668// in the same cycle, ie pio wr
669 always @ (posedge clk)
670 begin
671 if (~rst_l) begin
672 drain_spcl_case <= 1'b0;
673 end
674 else if( data_start & ~cib2eil_drain) begin
675 drain_spcl_case <= 1'b1;
676 end
677 else if( last_wr ) begin
678 drain_spcl_case <= 1'b0;
679 end
680 else begin
681 drain_spcl_case <= drain_spcl_case;
682 end
683 end
684
685 assign edb_wptr_inc = num_wrs_dec & (!cib2eil_drain | drain_spcl_case);
686
687 assign edb_we_ne0 = edb_wptr_inc;
688 assign edb_wptr_ne0 = edb_wptr;
689 assign align_addr_ne0 = align_addr_reg[3:2];
690 assign zero_fill_ne0 = last_wr & (~last_rd);
691
692 always @ (posedge clk)
693 if(~rst_l) begin
694 edb_we_ps1 <= {{1'b0}};
695 edb_wptr_ps1 <= {8{1'b0}};
696 align_addr_ps1 <= {2{1'b0}};
697 zero_fill_ps1 <= 1'b0;
698
699 edb_we_ps2 <= {{1'b0}};
700 edb_wptr_ps2 <= {8{1'b0}};
701 align_addr_ps2 <= {2{1'b0}};
702 zero_fill_ps2 <= 1'b0;
703
704 edb_we_ps3 <= {{1'b0}};
705 edb_wptr_ps3 <= {8{1'b0}};
706 end
707 else begin
708 edb_we_ps1 <= edb_we_ne0;
709 edb_wptr_ps1 <= edb_wptr_ne0;
710 align_addr_ps1 <= align_addr_ne0;
711 zero_fill_ps1 <= zero_fill_ne0;
712
713 edb_we_ps2 <= edb_we_ps1;
714 edb_wptr_ps2 <= edb_wptr_ps1;
715 align_addr_ps2 <= align_addr_ps1;
716 zero_fill_ps2 <= zero_fill_ps1;
717
718 edb_we_ps3 <= edb_we_ps2;
719 edb_wptr_ps3 <= edb_wptr_ps2;
720 end
721
722 //------------------------------------------------------------------------
723 // data path
724 //------------------------------------------------------------------------
725 assign align_addr_dp = align_addr_ps2;
726
727 // SV - 04/06/05
728 assign d2p_edb_dpar = (d2p_edb_dpar_0 ^ ({4{ilu_diagnos_edi_trig_hw_read}} & ilu_diagnos_edi_par_hw_read &
729 {4{edb_we_ps3}}));
730 assign ilu_diagnos_edi_trig_hw_clr = ilu_diagnos_edi_trig_hw_read & edb_we_ps3 ;
731
732 always @ (posedge clk)
733 if(~rst_l) begin
734 saved_data <= {128{1'b0}};
735 saved_dpar <= {4{1'b0}};
736 d2p_edb_data <= {128{1'b0}};
737 //SV d2p_edb_dpar <= {4{1'b0}};
738 d2p_edb_dpar_0 <= {4{1'b0}};
739 end
740 else begin
741 saved_data <= k2y_buf_data;
742 saved_dpar <= k2y_buf_dpar;
743 d2p_edb_data <= n_d2p_edb_data;
744 //SV d2p_edb_dpar <= n_d2p_edb_dpar;
745 d2p_edb_dpar_0 <= n_d2p_edb_dpar;
746 end
747
748 always @ (saved_data or saved_dpar or k2y_buf_data or k2y_buf_dpar or
749 align_addr_dp or zero_fill_ps2)
750 case (align_addr_dp)
751 2'b00: begin
752 n_d2p_edb_data = saved_data;
753 n_d2p_edb_dpar = saved_dpar;
754 end
755 2'b01: begin
756 if (zero_fill_ps2) begin
757 n_d2p_edb_data = {saved_data[95:0], 32'b0};
758 n_d2p_edb_dpar = {saved_dpar[2:0], 1'b1};
759 end
760 else begin
761 n_d2p_edb_data = {saved_data[95:0], k2y_buf_data[127:96]};
762 n_d2p_edb_dpar = {saved_dpar[2:0], k2y_buf_dpar[3]};
763 end
764 end
765 2'b10: begin
766 if (zero_fill_ps2) begin
767 n_d2p_edb_data = {saved_data[63:0], 64'b0};
768 n_d2p_edb_dpar = {saved_dpar[1:0], 2'b11};
769 end
770 else begin
771 n_d2p_edb_data = {saved_data[63:0], k2y_buf_data[127:64]};
772 n_d2p_edb_dpar = {saved_dpar[1:0], k2y_buf_dpar[3:2]};
773 end
774 end
775 2'b11: begin
776 if (zero_fill_ps2) begin
777 n_d2p_edb_data = {saved_data[31:0], 96'b0};
778 n_d2p_edb_dpar = {saved_dpar[0], 3'b111};
779 end
780 else begin
781 n_d2p_edb_data = {saved_data[31:0], k2y_buf_data[127:32]};
782 n_d2p_edb_dpar = {saved_dpar[0], k2y_buf_dpar[3:1]};
783 end
784 end
785 endcase // case(align_addr_dp)
786
787 // flop align_addr[3:2]
788 always @ (posedge clk)
789 if(~rst_l) begin
790 align_addr_reg <= {2{1'b0}};
791 end
792 else begin
793 align_addr_reg <= align_addr[3:2];
794 end
795
796 //---------------------------------------------------------------------
797 // idle check output
798 //---------------------------------------------------------------------
799
800 assign datafsm_is_idle = data_state[IDLE];
801
802 // >>>>>>>>>>>>>>>>>>>>>>>>> Debug Info <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
803
804endmodule // dmu_ilu_eil_datafsm