Commit | Line | Data |
---|---|---|
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 ============================================ | |
35 | module 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 | ||
804 | endmodule // dmu_ilu_eil_datafsm |