Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / design / sys / iop / dmu / rtl / dmu_tmu_dim_datafsm.v
CommitLineData
86530b38
AT
1// ========== Copyright Header Begin ==========================================
2//
3// OpenSPARC T2 Processor File: dmu_tmu_dim_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_tmu_dim_datafsm (
36 clk,
37 rst_l,
38
39 // DIU interface
40 tm2di_wr,
41 tm2di_addr,
42
43 // IMU interface
44 tm2im_data_enq,
45
46 // talk to xfrfsm.v
47 data_start,
48 data_done,
49
50 // talk to bufmgr.v
51 diu_dma_full,
52 dma_cl_req,
53 dma_cl_inc,
54 pio_cl_inc,
55 diu_dma_cl_wptr,
56 diu_pio_cl_wptr,
57
58 // talk to rcdbldr.v
59 rcd_is_cpld,
60 rcd_is_msi,
61 align_addr,
62 payld_len,
63 first_dwbe,
64 last_dwbe,
65
66 // talk to datapath.v
67 idb_rptr_inc,
68 data_mux_select,
69 first_dwbe_dp,
70 last_dwbe_dp,
71 align_addr_dp,
72 end_addr_dp,
73 payld_len_is_one_dp,
74 ld_saved_data_dp,
75
76 // talk to relgen.v
77 rcd_is_cpld_reg,
78
79 // debug
80 y2k_buf_addr_vld_monitor,
81 rel_type,
82 k2y_rel_enq,
83 low_dbg_sel_a,
84 low_dbg_sel_b,
85 datafsm_dbg_a,
86 datafsm_dbg_b,
87
88 // idle check
89 datafsm_is_idle );
90
91 //synopsys sync_set_reset "rst_l"
92
93 // >>>>>>>>>>>>>>>>>>>>>>>>> Parameter Declarations <<<<<<<<<<<<<<<<<<<<<<<<<
94
95 // states
96 parameter // summit enum data_enum
97 IDLE = 0,
98 MSI = 1,
99 ZF_PRE_WR = 2,
100 FRST_VD_WR = 3,
101 MID_VD_WR = 4,
102 LST_VD_WR = 5,
103 ZF_PST_WR = 6,
104 WAIT = 7;
105
106 // state number
107 parameter STATE_NUM = 8;
108
109 // data_mux_select
110 parameter ONLY_VDB = 0,
111 LAST_VDB = 1,
112 MID_VDB = 2,
113 FRST_VDB = 3,
114 ZERO_FILL = 4;
115
116 // data_mux_select number
117 parameter DATA_MUX_NUM = 5;
118
119 // >>>>>>>>>>>>>>>>>>>>>>>>> Port Declarations <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
120
121 //------------------------------------------------------------------------
122 // Clock and Reset Signals
123 //------------------------------------------------------------------------
124 input clk;
125 input rst_l;
126
127 //------------------------------------------------------------------------
128 // DIU interface
129 //------------------------------------------------------------------------
130 output tm2di_wr;
131 output [`FIRE_DLC_TRD_ADDR_WDTH-1:0] tm2di_addr; // DIU address
132
133 //------------------------------------------------------------------------
134 // IMU interface
135 //------------------------------------------------------------------------
136 output tm2im_data_enq;
137
138 //------------------------------------------------------------------------
139 // talk to xfrfsm.v
140 //------------------------------------------------------------------------
141 input data_start;
142 output data_done; // to bufmgr.v also
143
144 //------------------------------------------------------------------------
145 // talk to bufmgr.v
146 //------------------------------------------------------------------------
147 input diu_dma_full;
148 output dma_cl_req;
149 output dma_cl_inc;
150 output pio_cl_inc;
151 input [`FIRE_DLC_DMA_WPTR_WDTH-2:0] diu_dma_cl_wptr;
152 input [`FIRE_DLC_PIO_WPTR_WDTH-2:0] diu_pio_cl_wptr;
153
154 //------------------------------------------------------------------------
155 // talk to rcdbldr.v
156 //------------------------------------------------------------------------
157 input rcd_is_msi;
158 input rcd_is_cpld;
159 input [5:2] align_addr;
160 input [7:0] payld_len; // only 8-bit due to max. MPS = 512B,
161 // the possible max. value is 8'b10000000.
162 input [3:0] first_dwbe;
163 input [3:0] last_dwbe;
164
165 //------------------------------------------------------------------------
166 // talk to datapath.v
167 //------------------------------------------------------------------------
168 output idb_rptr_inc;
169 output [DATA_MUX_NUM-1:0] data_mux_select;
170 output [3:0] first_dwbe_dp;
171 output [3:0] last_dwbe_dp;
172 output [3:2] align_addr_dp;
173 output [3:2] end_addr_dp;
174 output payld_len_is_one_dp;
175 output ld_saved_data_dp;
176
177 //------------------------------------------------------------------------
178 // talk to relgen.v
179 //------------------------------------------------------------------------
180 output rcd_is_cpld_reg;
181
182 //------------------------------------------------------------------------
183 // debug
184 //------------------------------------------------------------------------
185 input y2k_buf_addr_vld_monitor;
186 input rel_type;
187 input k2y_rel_enq;
188 input [2:0] low_dbg_sel_a;
189 input [2:0] low_dbg_sel_b;
190 output [`FIRE_DBG_DATA_BITS] datafsm_dbg_a;
191 output [`FIRE_DBG_DATA_BITS] datafsm_dbg_b;
192
193 //------------------------------------------------------------------------
194 // idle check
195 //------------------------------------------------------------------------
196 output datafsm_is_idle;
197
198 // >>>>>>>>>>>>>>>>>>>>>>>>> Data Type Declarations <<<<<<<<<<<<<<<<<<<<<<<<<
199
200 // ~~~~~~~~~~~~~~~~~~~~~~~~~ REGISTER - FLOPS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
201 reg [3:0] first_dwbe_reg;
202 reg [3:0] last_dwbe_reg;
203 reg [5:2] align_addr_reg;
204 reg [3:2] end_addr_reg;
205 reg rcd_is_cpld_reg;
206 reg payld_len_is_one_reg;
207
208 reg [1:0] diu_addr_low;
209
210 reg [5:0] num_wrs;
211 reg [5:0] num_rds;
212 reg [5:0] num_vd_wrs;
213 reg only_one_vd_wr_reg;
214
215 reg diu_wr_ps1;
216 reg msi_wr_ps1;
217 reg [`FIRE_DLC_TRD_ADDR_WDTH-1:0] diu_wr_addr_ps1;
218 reg [DATA_MUX_NUM-1:0] data_mux_sel_ps1;
219
220 reg diu_wr_ps2;
221 reg msi_wr_ps2;
222 reg [`FIRE_DLC_TRD_ADDR_WDTH-1:0] diu_wr_addr_ps2;
223 reg [DATA_MUX_NUM-1:0] data_mux_sel_ps2;
224
225 reg diu_wr_ps3;
226 reg [`FIRE_DLC_TRD_ADDR_WDTH-1:0] diu_wr_addr_ps3;
227
228 reg [3:0] first_dwbe_ps1;
229 reg [3:0] last_dwbe_ps1;
230 reg [3:2] align_addr_ps1;
231 reg [3:2] end_addr_ps1;
232 reg payld_len_is_one_ps1;
233 reg ld_saved_data_ps1;
234
235 reg [3:0] first_dwbe_ps2;
236 reg [3:0] last_dwbe_ps2;
237 reg [3:2] align_addr_ps2;
238 reg [3:2] end_addr_ps2;
239 reg payld_len_is_one_ps2;
240 reg ld_saved_data_ps2;
241
242
243 reg [STATE_NUM-1:0] data_state; // 0in one_hot
244
245 reg [`FIRE_DBG_DATA_BITS] dbg_bus [0:1];
246
247
248 // ~~~~~~~~~~~~~~~~~~~~~~~~~ REGISTER - NON-FLOPS ~~~~~~~~~~~~~~~~~~~~~~~~
249
250 reg diu_vd_wr_inc;
251 reg idb_rptr_inc;
252
253 reg diu_wr_ne0;
254 reg msi_wr_ne0;
255 reg [DATA_MUX_NUM-1:0] data_mux_sel_ne0 ;
256
257 reg data_done;
258
259 reg [STATE_NUM-1:0] n_data_state;
260
261 reg [`FIRE_DBG_DATA_BITS] nxt_dbg_bus [0:1];
262
263 reg [2:0] dbg_sel [0:1];
264
265 // ~~~~~~~~~~~~~~~~~~~~~~~~~ NETS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
266
267 wire dw_carry;
268 wire init_num_cls_inc;
269 wire init_num_vd_wrs_inc;
270 wire init_num_rds_inc;
271
272 wire [5:2] end_addr;
273 wire [7:0] new_len_claligned; // possible max. value is 8'b10001111
274 wire [7:0] new_len_dwaligned; // possible max. value is 8'b10000011
275 wire [3:0] init_num_cls; // possible max. value is 4'b1001
276 wire [5:0] init_num_wrs; // possible max. value is 6'b100100
277 wire [5:0] init_num_rds; // possible max. value is 6'b100000
278 wire [5:0] init_num_vd_wrs; // possible max. value is 6'b100001
279
280 wire [5:2] align_addr_cur;
281 wire rcd_is_cpld_cur;
282 wire [5:0] diu_cl_addr;
283 wire [`FIRE_DLC_TRD_ADDR_WDTH-1:0] diu_wr_addr_ne0;
284 wire [3:0] first_dwbe_ne0;
285 wire [3:0] last_dwbe_ne0;
286 wire [3:2] align_addr_ne0;
287 wire [3:2] end_addr_ne0;
288 wire payld_len_is_one_ne0;
289 wire ld_saved_data_ne0;
290
291 wire only_one_vd_wr;
292 wire diu_no_space;
293 wire frst_vd_wr;
294 wire last_vd_wr;
295 wire more_vd_wrs;
296 wire last_wr;
297 wire more_wrs;
298 wire more_rds;
299 wire only_one_rd;
300 wire last_rd ;
301 wire end_of_cl;
302 wire diu_cl_req;
303 wire diu_cl_inc;
304 wire payld_len_is_one;
305
306 integer i;
307 integer j;
308
309 // >>>>>>>>>>>>>>>>>>>>>>>>> Zero In Checkers <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
310
311 // 0in bits_on -var data_mux_select -max 1
312
313 // 0in max -var new_len_claligned -val 8'b10001111 -active data_start
314 // 0in max -var new_len_dwaligned -val 8'b10000011 -active data_start
315 // 0in max -var init_num_cls -val 4'b1001 -active data_start
316 // 0in max -var init_num_wrs -val 6'b100100 -active data_start
317 // 0in max -var init_num_rds -val 6'b100000 -active data_start
318 // 0in max -var init_num_vd_wrs -val 6'b100001 -active data_start
319
320 /* 0in state -var data_state -val (8'b1 << IDLE) -next
321 (8'b1 << IDLE)
322 (8'b1 << MSI)
323 (8'b1 << ZF_PRE_WR)
324 (8'b1 << FRST_VD_WR) */
325
326 /* 0in state -var data_state -val (8'b1 << MSI) -next
327 (8'b1 << MSI)
328 (8'b1 << IDLE) */
329
330 /* 0in state -var data_state -val (8'b1 << ZF_PRE_WR) -next
331 (8'b1 << ZF_PRE_WR)
332 (8'b1 << FRST_VD_WR) */
333
334 /* 0in state -var data_state -val (8'b1 << FRST_VD_WR) -next
335 (8'b1 << IDLE)
336 (8'b1 << MSI)
337 (8'b1 << ZF_PRE_WR)
338 (8'b1 << FRST_VD_WR)
339 (8'b1 << WAIT)
340 (8'b1 << MID_VD_WR)
341 (8'b1 << LST_VD_WR)
342 (8'b1 << ZF_PST_WR) */
343
344 /* 0in state -var data_state -val (8'b1 << MID_VD_WR) -next
345 (8'b1 << MID_VD_WR)
346 (8'b1 << WAIT)
347 (8'b1 << LST_VD_WR) */
348
349 /* 0in state -var data_state -val (8'b1 << LST_VD_WR) -next
350 (8'b1 << IDLE)
351 (8'b1 << MSI)
352 (8'b1 << ZF_PRE_WR)
353 (8'b1 << FRST_VD_WR)
354 (8'b1 << ZF_PST_WR) */
355
356 /* 0in state -var data_state -val (8'b1 << ZF_PST_WR) -next
357 (8'b1 << ZF_PST_WR)
358 (8'b1 << IDLE)
359 (8'b1 << MSI)
360 (8'b1 << ZF_PRE_WR)
361 (8'b1 << FRST_VD_WR) */
362
363 /* 0in state -var data_state -val (8'b1 << WAIT) -next
364 (8'b1 << WAIT)
365 (8'b1 << MID_VD_WR)
366 (8'b1 << LST_VD_WR) */
367
368 // >>>>>>>>>>>>>>>>>>>>>>>>> Function Declarations <<<<<<<<<<<<<<<<<<<<<<<<<<
369 function [STATE_NUM + DATA_MUX_NUM + 4 : 0] data_start_handling;
370 input rcd_is_msi;
371 input frst_vd_wr;
372 input only_one_rd;
373 input only_one_vd_wr;
374
375 reg [STATE_NUM-1:0] n_state;
376 reg [DATA_MUX_NUM-1:0] data_mux_sel;
377 reg diu_wr_ne0;
378 reg msi_wr_ne0;
379 reg idb_rptr_inc;
380 reg diu_vd_wr_inc;
381 reg data_done;
382
383 begin
384 n_state = {STATE_NUM{1'b0}};
385 data_mux_sel = {DATA_MUX_NUM{1'b0}};
386 diu_wr_ne0 = 1'b0;
387 msi_wr_ne0 = 1'b0;
388 idb_rptr_inc = 1'b0;
389 diu_vd_wr_inc = 1'b0;
390 data_done = 1'b0;
391
392 if (rcd_is_msi) begin
393 msi_wr_ne0 = 1'b1;
394 idb_rptr_inc = 1'b1;
395 if (only_one_rd) begin
396 n_state[IDLE] = 1'b1;
397 data_done = 1'b1;
398 end
399 else begin
400 n_state[MSI] = 1'b1;
401 end
402 end
403 else begin
404 if (frst_vd_wr) begin
405 n_state[FRST_VD_WR] = 1'b1;
406 diu_wr_ne0 = 1'b1;
407 idb_rptr_inc = 1'b1;
408 diu_vd_wr_inc = 1'b1;
409 if (only_one_vd_wr) data_mux_sel[ONLY_VDB] = 1'b1;
410 else data_mux_sel[FRST_VDB] = 1'b1;
411 end
412 else begin
413 n_state[ZF_PRE_WR] = 1'b1;
414 diu_wr_ne0 = 1'b1;
415 data_mux_sel[ZERO_FILL] = 1'b1;
416 end
417 end
418 data_start_handling = {n_state, data_mux_sel, diu_wr_ne0,
419 msi_wr_ne0, idb_rptr_inc, diu_vd_wr_inc, data_done};
420 end
421 endfunction // data_start_handling
422
423 // >>>>>>>>>>>>>>>>>>>>>>>>> RTL/Behavioral Model <<<<<<<<<<<<<<<<<<<<<<<<<<<
424
425
426 //---------------------------------------------------------------------
427 // mux out diu_cl_addr
428 //---------------------------------------------------------------------
429 assign rcd_is_cpld_cur = data_start ? rcd_is_cpld : rcd_is_cpld_reg;
430//BP n2 6-23-04
431// assign diu_cl_addr = rcd_is_cpld_cur ? {2'b10, diu_pio_cl_wptr[3:0]}
432 assign diu_cl_addr = rcd_is_cpld_cur ? {2'b10, 2'b00, diu_pio_cl_wptr[3:2]}
433 : {1'b0, diu_dma_cl_wptr[4:0]};
434
435 //---------------------------------------------------------------------
436 // computing some initial values
437 //---------------------------------------------------------------------
438
439 assign new_len_claligned = payld_len + {4'b0, align_addr};
440 assign end_addr = new_len_claligned[3:0];
441
442 assign {dw_carry, new_len_dwaligned[1:0]} = {1'b0, payld_len[1:0]} +
443 {1'b0, align_addr[3:2]};
444 assign new_len_dwaligned[7:2] = dw_carry ? (payld_len[7:2] + 1'b1) :
445 payld_len[7:2];
446
447 assign init_num_cls_inc = |end_addr;
448 assign init_num_cls = init_num_cls_inc ? (new_len_claligned[7:4] + 1'b1) :
449 new_len_claligned[7:4];
450
451 assign init_num_wrs = {init_num_cls, 2'b00};
452
453 assign init_num_rds_inc = |payld_len[1:0];
454 assign init_num_rds = init_num_rds_inc ? (payld_len[7:2] + 1'b1) :
455 payld_len[7:2];
456
457 assign init_num_vd_wrs_inc = |new_len_dwaligned[1:0];
458 assign init_num_vd_wrs = init_num_vd_wrs_inc ? (new_len_dwaligned[7:2] + 1'b1) :
459 new_len_dwaligned[7:2];
460
461 //---------------------------------------------------------------------
462 // flops to lock data transfer rcd info
463 //---------------------------------------------------------------------
464 assign only_one_vd_wr = (~(|init_num_vd_wrs[5:1])) & init_num_vd_wrs[0];
465 assign payld_len_is_one = payld_len[0] & (~(|payld_len[7:1]));
466
467 always @ (posedge clk)
468 if(~rst_l) begin
469 rcd_is_cpld_reg <= 1'b0;
470 align_addr_reg <= 4'b0;
471 end_addr_reg <= 2'b0;
472 first_dwbe_reg <= 4'b0;
473 last_dwbe_reg <= 4'b0;
474 only_one_vd_wr_reg <= 1'b0;
475 payld_len_is_one_reg <= 1'b0;
476 end
477 else if (data_start)
478 begin
479 rcd_is_cpld_reg <= rcd_is_cpld;
480 align_addr_reg <= align_addr;
481 end_addr_reg <= end_addr[3:2];
482 first_dwbe_reg <= first_dwbe;
483 last_dwbe_reg <= last_dwbe;
484 only_one_vd_wr_reg <= only_one_vd_wr;
485 payld_len_is_one_reg <= payld_len_is_one;
486 end
487
488 //---------------------------------------------------------------------
489 // flops to keep track of data movement
490 //---------------------------------------------------------------------
491 // num_wrs
492 always @ (posedge clk)
493 if(~rst_l) begin
494 num_wrs <= 6'b0;
495 end
496 else begin
497//BP n2 6-24-04
498// if (data_start) begin
499 if (data_start && ~rcd_is_cpld) begin
500 num_wrs <= init_num_wrs - 1'b1;
501 end
502//BP n2 6-24-04
503// else if (diu_wr_ne0) begin
504 else if (diu_wr_ne0 & ~rcd_is_cpld_cur) begin
505 num_wrs <= num_wrs - 1'b1;
506 end
507 end
508
509 // num_rds
510 always @ (posedge clk)
511 if(~rst_l) begin
512 num_rds <= 6'b0;
513 end
514 else begin
515 if (data_start) begin
516 if (idb_rptr_inc) num_rds <= init_num_rds - 1'b1;
517 else num_rds <= init_num_rds;
518 end
519 else if (idb_rptr_inc) num_rds <= num_rds - 1'b1;
520 end
521
522 // num_vd_wrs
523 always @ (posedge clk)
524 if(~rst_l) begin
525 num_vd_wrs <= 6'b0;
526 end
527 else begin
528 if (data_start) begin
529 if (diu_vd_wr_inc) num_vd_wrs <= init_num_vd_wrs - 1'b1;
530 else num_vd_wrs <= init_num_vd_wrs;
531 end
532 else if (diu_vd_wr_inc) num_vd_wrs <= num_vd_wrs - 1'b1;
533 end
534
535 // 2-bit LSB diu_addr_low which is appended to diu_cl_addr to form tm2di_addr
536 always @ (posedge clk)
537 begin
538 if (!rst_l) begin
539 diu_addr_low <= 2'b0;
540 end
541//BP n2 6-24-04
542// else if (diu_wr_ne0) diu_addr_low <= diu_addr_low + 1'b1;
543 else if (diu_wr_ne0 & ~rcd_is_cpld_cur) diu_addr_low <= diu_addr_low + 1'b1;
544 end
545
546
547 //---------------------------------------------------------------------
548 // FSM
549 //---------------------------------------------------------------------
550
551 // summit state_vector data_state enum data_enum
552
553 // present state
554 always @ (posedge clk)
555 if (!rst_l) begin
556 data_state <= {STATE_NUM{1'b0}};
557 data_state[IDLE] <= 1'b1;
558 end
559 else
560 data_state <= n_data_state;
561
562 // next state logic
563//BP n2 6-23-04
564wire [1:0] diu_addr_low_2;
565 assign diu_addr_low_2 = rcd_is_cpld_cur ? diu_pio_cl_wptr[1:0] : diu_addr_low;
566 assign diu_wr_addr_ne0 = {diu_cl_addr, diu_addr_low_2};
567
568
569
570 assign diu_no_space = (~rcd_is_cpld_reg) & diu_dma_full;
571 assign align_addr_cur = data_start ? align_addr : align_addr_reg;
572 assign frst_vd_wr = (align_addr_cur[5:4] == diu_addr_low);
573 assign last_vd_wr = (~(|num_vd_wrs[5:1])) & num_vd_wrs[0];
574 assign more_vd_wrs = |num_vd_wrs;
575 assign last_wr = (~(|num_wrs[5:1])) & num_wrs[0];
576 assign more_wrs = |num_wrs;
577 assign more_rds = |num_rds;
578 assign only_one_rd = (~(|init_num_rds[5:1])) & init_num_rds[0];
579 assign last_rd = (~(|num_rds[5:1])) & num_rds[0];
580 assign end_of_cl = ~(|diu_addr_low);
581
582 always @ (data_state or data_start or diu_no_space or
583 rcd_is_msi or only_one_vd_wr or only_one_vd_wr_reg or
584 frst_vd_wr or last_vd_wr or more_vd_wrs or
585 last_wr or more_wrs or more_rds or
586 only_one_rd or last_rd or end_of_cl or rcd_is_cpld_cur )
587 begin
588 n_data_state = {STATE_NUM{1'b0}};
589 data_mux_sel_ne0 = {DATA_MUX_NUM{1'b0}};
590 diu_wr_ne0 = 1'b0;
591 msi_wr_ne0 = 1'b0;
592
593 idb_rptr_inc = 1'b0;
594 diu_vd_wr_inc = 1'b0;
595
596 data_done = 1'b0;
597
598 case (1'b1) // 0in < case -parallel -full // synopsys parallel_case
599 data_state[IDLE] :
600 if (data_start) begin
601 {n_data_state,
602 data_mux_sel_ne0,
603 diu_wr_ne0,
604 msi_wr_ne0,
605 idb_rptr_inc,
606 diu_vd_wr_inc,
607 data_done} = data_start_handling (rcd_is_msi,
608 frst_vd_wr,
609 only_one_rd,
610 only_one_vd_wr);
611 end
612 else n_data_state[IDLE] = 1'b1;
613
614 data_state[MSI] :
615 begin
616 idb_rptr_inc = 1'b1;
617 if (last_rd) begin
618 n_data_state[IDLE] = 1'b1;
619 data_done = 1'b1;
620 end
621 else n_data_state[MSI] = 1'b1;
622 end
623
624 data_state[ZF_PRE_WR] :
625 begin
626 diu_wr_ne0 = 1'b1;
627 data_done = last_wr;
628 if (frst_vd_wr) begin
629 n_data_state[FRST_VD_WR] = 1'b1;
630 idb_rptr_inc = 1'b1;
631 diu_vd_wr_inc = 1'b1;
632 if (only_one_vd_wr_reg) data_mux_sel_ne0[ONLY_VDB] = 1'b1;
633 else data_mux_sel_ne0[FRST_VDB] = 1'b1;
634 end
635 else begin
636 n_data_state[ZF_PRE_WR] = 1'b1;
637 data_mux_sel_ne0[ZERO_FILL] = 1'b1;
638 end
639 end
640
641 data_state[FRST_VD_WR] :
642 begin
643 if (data_start) begin
644 {n_data_state,
645 data_mux_sel_ne0,
646 diu_wr_ne0,
647 msi_wr_ne0,
648 idb_rptr_inc,
649 diu_vd_wr_inc,
650 data_done} = data_start_handling (rcd_is_msi,
651 frst_vd_wr,
652 only_one_rd,
653 only_one_vd_wr);
654 end
655 else begin
656 data_done = last_wr;
657 if (more_wrs & end_of_cl & diu_no_space) begin
658 n_data_state[WAIT] = 1'b1;
659 end
660 else begin
661 if (more_vd_wrs) begin
662 diu_wr_ne0 = 1'b1;
663 diu_vd_wr_inc = 1'b1;
664 idb_rptr_inc = more_rds;
665 if (last_vd_wr) begin
666 n_data_state[LST_VD_WR] = 1'b1;
667 data_mux_sel_ne0[LAST_VDB] = 1'b1;
668 end
669 else begin
670 n_data_state[MID_VD_WR] = 1'b1;
671 data_mux_sel_ne0[MID_VDB] = 1'b1;
672 end
673 end
674//BP n2 6-24-04
675// else if (more_wrs) begin
676 else if (more_wrs && ~rcd_is_cpld_cur) begin
677 diu_wr_ne0 = 1'b1;
678 n_data_state[ZF_PST_WR] = 1'b1;
679 data_mux_sel_ne0[ZERO_FILL] = 1'b1;
680 end
681//BP n2 6-24-04
682// else begin
683// n_data_state[IDLE] = 1'b1;
684 else if (rcd_is_cpld_cur) begin
685 data_done = 1'b1;
686 n_data_state[IDLE] = 1'b1;
687 end
688 else begin
689 n_data_state[IDLE] = 1'b1;
690 end
691 end
692 end // else: !if(data_start)
693 end // case: data_state[FRST_VD_WR]
694
695 data_state[MID_VD_WR] :
696 begin
697 if (end_of_cl & diu_no_space) begin
698 n_data_state[WAIT] = 1'b1;
699 end
700 else begin
701 diu_wr_ne0 = 1'b1;
702 diu_vd_wr_inc = 1'b1;
703 idb_rptr_inc = more_rds;
704 data_done = last_wr;
705 if (last_vd_wr) begin
706 n_data_state[LST_VD_WR] = 1'b1;
707 data_mux_sel_ne0[LAST_VDB] = 1'b1;
708 end
709 else begin
710 n_data_state[MID_VD_WR] = 1'b1;
711 data_mux_sel_ne0[MID_VDB] = 1'b1;
712 end
713 end
714 end
715
716 data_state[LST_VD_WR] :
717 begin
718 if (data_start) begin
719 {n_data_state,
720 data_mux_sel_ne0,
721 diu_wr_ne0,
722 msi_wr_ne0,
723 idb_rptr_inc,
724 diu_vd_wr_inc,
725 data_done} = data_start_handling (rcd_is_msi,
726 frst_vd_wr,
727 only_one_rd,
728 only_one_vd_wr);
729 end
730 else begin
731 if (more_wrs) begin
732 data_done = last_wr;
733 diu_wr_ne0 = 1'b1;
734 n_data_state[ZF_PST_WR] = 1'b1;
735 data_mux_sel_ne0[ZERO_FILL] = 1'b1;
736 end
737 else begin
738 n_data_state[IDLE] = 1'b1;
739 end
740 end
741 end
742
743 data_state[ZF_PST_WR] :
744 begin
745 if (data_start) begin
746 {n_data_state,
747 data_mux_sel_ne0,
748 diu_wr_ne0,
749 msi_wr_ne0,
750 idb_rptr_inc,
751 diu_vd_wr_inc,
752 data_done} = data_start_handling (rcd_is_msi,
753 frst_vd_wr,
754 only_one_rd,
755 only_one_vd_wr);
756 end
757 else if (more_wrs) begin
758 data_done = last_wr;
759 diu_wr_ne0 = 1'b1;
760 n_data_state[ZF_PST_WR] = 1'b1;
761 data_mux_sel_ne0[ZERO_FILL] = 1'b1;
762 end
763 else begin
764 n_data_state[IDLE] = 1'b1;
765 end
766 end
767
768 data_state[WAIT] :
769 begin
770 if (diu_no_space) begin
771 n_data_state[WAIT] = 1'b1;
772 end
773 else begin
774 diu_wr_ne0 = 1'b1;
775 idb_rptr_inc = more_rds;
776 diu_vd_wr_inc = 1'b1;
777 if (last_vd_wr) begin
778 n_data_state[LST_VD_WR] = 1'b1;
779 data_mux_sel_ne0[LAST_VDB] = 1'b1;
780 end
781 else begin
782 n_data_state[MID_VD_WR] = 1'b1;
783 data_mux_sel_ne0[MID_VDB] = 1'b1;
784 end
785 end
786 end
787 endcase // case(1'b1)
788 end // always @ (data_state or data_start or diu_no_space or...
789
790 //---------------------------------------------------------------------
791 // data control pipeline
792 //---------------------------------------------------------------------
793 always @ (posedge clk)
794 if (!rst_l) begin
795 diu_wr_ps1 <= 1'b0;
796 msi_wr_ps1 <=1'b0;
797 diu_wr_addr_ps1 <= {`FIRE_DLC_TRD_ADDR_WDTH{1'b0}};
798 data_mux_sel_ps1 <= {DATA_MUX_NUM{1'b0}};
799
800 diu_wr_ps2 <= 1'b0;
801 msi_wr_ps2 <= 1'b0;
802 diu_wr_addr_ps2 <= {`FIRE_DLC_TRD_ADDR_WDTH{1'b0}};
803 data_mux_sel_ps2 <= {DATA_MUX_NUM{1'b0}};
804
805 diu_wr_ps3 <= 1'b0;
806 diu_wr_addr_ps3 <= {`FIRE_DLC_TRD_ADDR_WDTH{1'b0}};
807 end
808 else begin
809//BP n2 6-24-04 only 1 write for PIO's now, n2 limits PIO's to 16 bytes
810// diu_wr_ps1 <= diu_wr_ne0;
811 diu_wr_ps1 <= (diu_wr_ne0 && ~rcd_is_cpld_cur) | (rcd_is_cpld_cur & data_start);
812 msi_wr_ps1 <= msi_wr_ne0;
813 diu_wr_addr_ps1 <= diu_wr_addr_ne0;
814 data_mux_sel_ps1 <= data_mux_sel_ne0;
815
816 diu_wr_ps2 <= diu_wr_ps1;
817 msi_wr_ps2 <= msi_wr_ps1;
818 diu_wr_addr_ps2 <= diu_wr_addr_ps1;
819 data_mux_sel_ps2 <= data_mux_sel_ps1;
820
821 diu_wr_ps3 <= diu_wr_ps2;
822 diu_wr_addr_ps3 <= diu_wr_addr_ps2;
823 end
824
825 assign first_dwbe_ne0 = data_start ? first_dwbe : first_dwbe_reg;
826 assign last_dwbe_ne0 = data_start ? last_dwbe : last_dwbe_reg;
827 assign align_addr_ne0 = align_addr_cur[3:2];
828 assign end_addr_ne0 = data_start ? end_addr[3:2] : end_addr_reg;
829 assign payld_len_is_one_ne0 = data_start ? payld_len_is_one : payld_len_is_one_reg;
830 assign ld_saved_data_ne0 = ~n_data_state[WAIT];
831
832
833 always @ (posedge clk)
834 if(~rst_l) begin
835 first_dwbe_ps1 <= 4'b0;
836 last_dwbe_ps1 <= 4'b0;
837 align_addr_ps1 <= 2'b0;
838 end_addr_ps1 <= 2'b0;
839 payld_len_is_one_ps1 <= 1'b0;
840 ld_saved_data_ps1 <= 1'b0;
841
842 first_dwbe_ps2 <= 4'b0;
843 last_dwbe_ps2 <= 4'b0;
844 align_addr_ps2 <= 2'b0;
845 end_addr_ps2 <= 2'b0;
846 payld_len_is_one_ps2 <= 1'b0;
847 ld_saved_data_ps2 <= 1'b0;
848 end
849 else begin
850 first_dwbe_ps1 <= first_dwbe_ne0;
851 last_dwbe_ps1 <= last_dwbe_ne0;
852 align_addr_ps1 <= align_addr_ne0;
853 end_addr_ps1 <= end_addr_ne0;
854 payld_len_is_one_ps1 <= payld_len_is_one_ne0;
855 ld_saved_data_ps1 <= ld_saved_data_ne0;
856
857 first_dwbe_ps2 <= first_dwbe_ps1;
858 last_dwbe_ps2 <= last_dwbe_ps1;
859 align_addr_ps2 <= align_addr_ps1;
860 end_addr_ps2 <= end_addr_ps1;
861 payld_len_is_one_ps2 <= payld_len_is_one_ps1;
862 ld_saved_data_ps2 <= ld_saved_data_ps1;
863 end
864
865 //---------------------------------------------------------------------
866 // outputs
867 //---------------------------------------------------------------------
868
869 assign diu_cl_req = (diu_addr_low == 2'b01); // asserted at 2nd wr in a cache line
870 assign diu_cl_inc = (diu_addr_low == 2'b11); // asserted at 4th wr in a cache line
871 assign dma_cl_req = (~rcd_is_cpld_reg) & diu_cl_req;
872 assign dma_cl_inc = (~rcd_is_cpld_reg) & diu_cl_inc;
873//BP n2 6-24-04
874// assign pio_cl_inc = rcd_is_cpld_reg & diu_cl_inc;
875 assign pio_cl_inc = rcd_is_cpld & data_start;
876
877 assign tm2di_addr = diu_wr_addr_ps3;
878 assign tm2im_data_enq = msi_wr_ps2;
879 assign tm2di_wr = diu_wr_ps3;
880 assign data_mux_select = data_mux_sel_ps2;
881
882 assign align_addr_dp = align_addr_ps2;
883 assign end_addr_dp = end_addr_ps2;
884 assign first_dwbe_dp = first_dwbe_ps2;
885 assign last_dwbe_dp = last_dwbe_ps2;
886 assign payld_len_is_one_dp = payld_len_is_one_ps2;
887 assign ld_saved_data_dp = ld_saved_data_ps2;
888
889 //---------------------------------------------------------------------
890 // debug
891 //---------------------------------------------------------------------
892
893 always @ (low_dbg_sel_a or low_dbg_sel_b) begin
894 dbg_sel[0] = low_dbg_sel_a;
895 dbg_sel[1] = low_dbg_sel_b;
896 end
897
898 always @ (dbg_sel[0] or dbg_sel[1] or data_state or data_start
899 or data_done or diu_dma_full or idb_rptr_inc or diu_vd_wr_inc
900 or num_rds or num_wrs or num_vd_wrs or last_rd
901 or last_wr or more_rds or more_wrs or align_addr_cur
902 or rcd_is_cpld_cur or rcd_is_msi
903 or rel_type or k2y_rel_enq or y2k_buf_addr_vld_monitor)
904 begin
905 for (i = 0; i < 2; i = i + 1) begin
906 case (dbg_sel[i]) // synopsys infer_mux
907 3'b000: nxt_dbg_bus[i] = data_state;
908 3'b001: nxt_dbg_bus[i] = {num_rds, last_rd, more_rds};
909 3'b010: nxt_dbg_bus[i] = {num_wrs, last_wr, more_wrs};
910 3'b011: nxt_dbg_bus[i] = {num_vd_wrs, data_start, data_done};
911 3'b100: nxt_dbg_bus[i] = {5'b0, idb_rptr_inc, diu_vd_wr_inc, diu_dma_full};
912 3'b101: nxt_dbg_bus[i] = {2'b0, align_addr_cur, rcd_is_cpld_cur, rcd_is_msi};
913 3'b110: nxt_dbg_bus[i] = {5'b0, y2k_buf_addr_vld_monitor, rel_type, k2y_rel_enq};
914 3'b111: nxt_dbg_bus[i] = 8'h00;
915 endcase
916 end
917 end
918
919 assign datafsm_dbg_a = dbg_bus[0];
920 assign datafsm_dbg_b = dbg_bus[1];
921
922 always @ (posedge clk)
923 if(~rst_l) begin : dbg_rst
924// integer i;
925 for (i = 0; i < 2; i = i + 1) begin
926 dbg_bus[i] <= 8'h00;
927 end
928 end
929
930 else begin
931 for (j = 0; j < 2; j = j + 1) begin
932 dbg_bus[j] <= nxt_dbg_bus[j];
933 end
934 end
935
936 //---------------------------------------------------------------------
937 // debug
938 //---------------------------------------------------------------------
939 assign datafsm_is_idle = data_state[IDLE];
940
941 // >>>>>>>>>>>>>>>>>>>>>>>>> Instantiations <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
942
943endmodule // dmu_tmu_dim_datafsm
944
945
946
947