Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / design / sys / iop / mcu / rtl / mcu_drq_ctl.v
CommitLineData
86530b38
AT
1// ========== Copyright Header Begin ==========================================
2//
3// OpenSPARC T2 Processor File: mcu_drq_ctl.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 mcu_drq_ctl (
36 drq_wrbuf_valids,
37 drq_pending_wr_req,
38 drq_write_queue_cnt,
39 drq_rdbuf_valids,
40 drq_read_queue_cnt,
41 drq_rdq_full,
42 drq_rdq_free,
43 drq_empty,
44 drq_rd_req,
45 drq_wr_req,
46 drq_rd_entry7_val,
47 drq_rd_entry6_val,
48 drq_rd_entry5_val,
49 drq_rd_entry4_val,
50 drq_rd_entry3_val,
51 drq_rd_entry2_val,
52 drq_rd_entry1_val,
53 drq_rd_entry0_val,
54 drq_rd_bank_val,
55 drq_rd_entry0_rank,
56 drq_rd_entry1_rank,
57 drq_rd_entry2_rank,
58 drq_rd_entry3_rank,
59 drq_rd_entry4_rank,
60 drq_rd_entry5_rank,
61 drq_rd_entry6_rank,
62 drq_rd_entry7_rank,
63 drq_rd_entry0_dimm,
64 drq_rd_entry1_dimm,
65 drq_rd_entry2_dimm,
66 drq_rd_entry3_dimm,
67 drq_rd_entry4_dimm,
68 drq_rd_entry5_dimm,
69 drq_rd_entry6_dimm,
70 drq_rd_entry7_dimm,
71 drq_wr_entry0_rank,
72 drq_wr_entry1_rank,
73 drq_wr_entry2_rank,
74 drq_wr_entry3_rank,
75 drq_wr_entry4_rank,
76 drq_wr_entry5_rank,
77 drq_wr_entry6_rank,
78 drq_wr_entry7_rank,
79 drq_wr_entry0_dimm,
80 drq_wr_entry1_dimm,
81 drq_wr_entry2_dimm,
82 drq_wr_entry3_dimm,
83 drq_wr_entry4_dimm,
84 drq_wr_entry5_dimm,
85 drq_wr_entry6_dimm,
86 drq_wr_entry7_dimm,
87 drq_wr_queue_ent0,
88 drq_wr_queue_ent1,
89 drq_wr_queue_ent2,
90 drq_wr_queue_ent3,
91 drq_wr_queue_ent4,
92 drq_wr_queue_ent5,
93 drq_wr_queue_ent6,
94 drq_wr_queue_ent7,
95 drq_wdq_valid,
96 drq_rd_index_picked,
97 drq_wr_index_picked,
98 drq_wr_id_picked,
99 drq_rd_addr_picked,
100 drq_pd_mode_rd_incr,
101 drq_pd_mode_rd_decr,
102 drq_pd_mode_wr_incr,
103 drq_rd_adr_queue7_en,
104 drq_rd_adr_queue6_en,
105 drq_rd_adr_queue5_en,
106 drq_rd_adr_queue4_en,
107 drq_rd_adr_queue3_en,
108 drq_rd_adr_queue2_en,
109 drq_rd_adr_queue1_en,
110 drq_rd_adr_queue0_en,
111 drq_wr_adr_queue7_en,
112 drq_wr_adr_queue6_en,
113 drq_wr_adr_queue5_en,
114 drq_wr_adr_queue4_en,
115 drq_wr_adr_queue3_en,
116 drq_wr_adr_queue2_en,
117 drq_wr_adr_queue1_en,
118 drq_wr_adr_queue0_en,
119 drq_rd_adr_queue_sel,
120 drq_req_rdwr_addr_sel,
121 l2b_rank_rd_adr,
122 l2b_dimm_rd_adr,
123 l2b_bank_rd_adr,
124 l2b_addr_rd_err,
125 l2b_addr_rd_par,
126 l2b_rank_wr_adr,
127 l2b_dimm_wr_adr,
128 l2b_bank_wr_adr,
129 l2b_addr_wr_err,
130 l2b_addr_wr_par,
131 l2if_wr_req,
132 l2if_rd_req,
133 drq_cpu_wr_addr,
134 l2if_wdq_in_cntr,
135 drif_init,
136 drif_init_mcu_done,
137 drif_mcu_state_1,
138 drif_mcu_state_2,
139 drif_mcu_state_4,
140 drif_cmd_picked,
141 drif_rd_entry_picked,
142 drif_wr_entry_picked,
143 drif_blk_new_openbank,
144 pdmc_rank_avail,
145 drif_dimm_rd_available,
146 drif_refresh_rank,
147 drif_rd_picked,
148 drif_wr_picked,
149 drif_raw_hazard,
150 rdpctl_drq_clear_ent,
151 woq_wrq_clear_ent,
152 drif_drq_clear_ent,
153 woq_wr_queue_clear,
154 woq_wr_entry_picked,
155 drif_eight_bank_mode,
156 drif_stacked_dimm,
157 l1clk,
158 scan_in,
159 scan_out,
160 tcu_aclk,
161 tcu_bclk,
162 tcu_scan_en);
163wire siclk;
164wire soclk;
165wire se;
166wire ff_rd_wr_val_scanin;
167wire ff_rd_wr_val_scanout;
168wire [3:0] drq_wdq_in_cntr;
169wire ff_rd_addr_scanin;
170wire ff_rd_addr_scanout;
171wire [8:0] drq_rd_addr0;
172wire ff_wr_addr_scanin;
173wire ff_wr_addr_scanout;
174wire [8:0] drq_wr_addr0;
175wire [7:0] drq_clear_ent;
176wire drq_rdq_free_in;
177wire ff_rdq_free_scanin;
178wire ff_rdq_free_scanout;
179wire [7:0] drq_rdq_ent7_index_dec;
180wire [7:0] drq_rdq_ent6_index_dec;
181wire [7:0] drq_rdq_ent5_index_dec;
182wire [7:0] drq_rdq_ent4_index_dec;
183wire [7:0] drq_rdq_ent3_index_dec;
184wire [7:0] drq_rdq_ent2_index_dec;
185wire [7:0] drq_rdq_ent1_index_dec;
186wire [7:0] drq_rdq_ent0_index_dec;
187wire drq_wrq_empty;
188wire drq_rdq_empty;
189wire [2:0] drq_rd_addr_in;
190wire [2:0] drq_wr_addr_in;
191wire [7:0] drq_rdbuf_valids_in;
192wire ff_rdbuf_valids_scanin;
193wire ff_rdbuf_valids_scanout;
194wire [7:0] drq_wrq_clear_ent;
195wire [7:0] drq_wrbuf_valids_in;
196wire ff_wrbuf_valids_scanin;
197wire ff_wrbuf_valids_scanout;
198wire [7:0] drq_wrbuf_issued_in;
199wire [7:0] drq_wrbuf_issued;
200wire ff_wrbuf_issued_scanin;
201wire ff_wrbuf_issued_scanout;
202wire [11:0] drq_rd_entry;
203wire drq_rdq_bank_bit2;
204wire [7:0] drq_read_queue_clear_in;
205wire ff_read_queue_clear_scanin;
206wire ff_read_queue_clear_scanout;
207wire [7:0] drq_read_queue_clear;
208wire drq_rd_entry_en;
209wire [3:0] drq_read_queue_cnt_in;
210wire ff_rd_collapse_fifo_cnt_scanin;
211wire ff_rd_collapse_fifo_cnt_scanout;
212wire [7:0] drq_rd_queue_valid;
213wire drq_rd_queue_ent0_en;
214wire drq_rd_queue_ent1_en;
215wire drq_rd_queue_ent2_en;
216wire drq_rd_queue_ent3_en;
217wire drq_rd_queue_ent4_en;
218wire drq_rd_queue_ent5_en;
219wire drq_rd_queue_ent6_en;
220wire drq_rd_queue_ent7_en;
221wire [11:0] drq_rd_queue_ent0_in;
222wire [11:0] drq_rd_queue_ent1;
223wire [11:0] drq_rd_queue_ent1_in;
224wire [11:0] drq_rd_queue_ent2;
225wire [11:0] drq_rd_queue_ent2_in;
226wire [11:0] drq_rd_queue_ent3;
227wire [11:0] drq_rd_queue_ent3_in;
228wire [11:0] drq_rd_queue_ent4;
229wire [11:0] drq_rd_queue_ent4_in;
230wire [11:0] drq_rd_queue_ent5;
231wire [11:0] drq_rd_queue_ent5_in;
232wire [11:0] drq_rd_queue_ent6;
233wire [11:0] drq_rd_queue_ent6_in;
234wire [11:0] drq_rd_queue_ent7;
235wire [11:0] drq_rd_queue_ent7_in;
236wire ff_rd_collapse_fifo_ent0_scanin;
237wire ff_rd_collapse_fifo_ent0_scanout;
238wire [11:0] drq_rd_queue_ent0;
239wire ff_rd_collapse_fifo_ent1_scanin;
240wire ff_rd_collapse_fifo_ent1_scanout;
241wire ff_rd_collapse_fifo_ent2_scanin;
242wire ff_rd_collapse_fifo_ent2_scanout;
243wire ff_rd_collapse_fifo_ent3_scanin;
244wire ff_rd_collapse_fifo_ent3_scanout;
245wire ff_rd_collapse_fifo_ent4_scanin;
246wire ff_rd_collapse_fifo_ent4_scanout;
247wire ff_rd_collapse_fifo_ent5_scanin;
248wire ff_rd_collapse_fifo_ent5_scanout;
249wire ff_rd_collapse_fifo_ent6_scanin;
250wire ff_rd_collapse_fifo_ent6_scanout;
251wire ff_rd_collapse_fifo_ent7_scanin;
252wire ff_rd_collapse_fifo_ent7_scanout;
253wire drq_wrq_full;
254wire [14:0] drq_wr_entry;
255wire drq_wrq_bank_bit2;
256wire [7:0] drq_write_queue_clear;
257wire drq_wr_entry_en;
258wire [3:0] drq_write_queue_cnt_in;
259wire ff_wr_collapse_fifo_cnt_scanin;
260wire ff_wr_collapse_fifo_cnt_scanout;
261wire [7:0] drq_wr_queue_valid;
262wire drq_wr_queue_ent0_en;
263wire drq_wr_queue_ent1_en;
264wire drq_wr_queue_ent2_en;
265wire drq_wr_queue_ent3_en;
266wire drq_wr_queue_ent4_en;
267wire drq_wr_queue_ent5_en;
268wire drq_wr_queue_ent6_en;
269wire drq_wr_queue_ent7_en;
270wire [14:0] drq_wr_queue_ent0_in;
271wire [14:0] drq_wr_queue_ent1_in;
272wire [14:0] drq_wr_queue_ent2_in;
273wire [14:0] drq_wr_queue_ent3_in;
274wire [14:0] drq_wr_queue_ent4_in;
275wire [14:0] drq_wr_queue_ent5_in;
276wire [14:0] drq_wr_queue_ent6_in;
277wire [14:0] drq_wr_queue_ent7_in;
278wire ff_wr_collapse_fifo_ent0_scanin;
279wire ff_wr_collapse_fifo_ent0_scanout;
280wire ff_wr_collapse_fifo_ent1_scanin;
281wire ff_wr_collapse_fifo_ent1_scanout;
282wire ff_wr_collapse_fifo_ent2_scanin;
283wire ff_wr_collapse_fifo_ent2_scanout;
284wire ff_wr_collapse_fifo_ent3_scanin;
285wire ff_wr_collapse_fifo_ent3_scanout;
286wire ff_wr_collapse_fifo_ent4_scanin;
287wire ff_wr_collapse_fifo_ent4_scanout;
288wire ff_wr_collapse_fifo_ent5_scanin;
289wire ff_wr_collapse_fifo_ent5_scanout;
290wire ff_wr_collapse_fifo_ent6_scanin;
291wire ff_wr_collapse_fifo_ent6_scanout;
292wire ff_wr_collapse_fifo_ent7_scanin;
293wire ff_wr_collapse_fifo_ent7_scanout;
294wire [3:0] drq_wdq_out_cntr_in;
295wire [3:0] drq_wdq_out_cntr;
296wire drq_wdq_out_cntr_en;
297wire ff_wdq_out_cntr_scanin;
298wire ff_wdq_out_cntr_scanout;
299wire [3:0] drq_wdq_cnt;
300wire [3:0] drq_rdq_ent0_bnk;
301wire [3:0] drq_rdq_ent1_bnk;
302wire [3:0] drq_rdq_ent2_bnk;
303wire [3:0] drq_rdq_ent3_bnk;
304wire [3:0] drq_rdq_ent4_bnk;
305wire [3:0] drq_rdq_ent5_bnk;
306wire [3:0] drq_rdq_ent6_bnk;
307wire [3:0] drq_rdq_ent7_bnk;
308wire [15:0] drq_rd_banksel_addr0_dec;
309wire [15:0] drq_rd_banksel_addr1_dec;
310wire [15:0] drq_rd_banksel_addr2_dec;
311wire [15:0] drq_rd_banksel_addr3_dec;
312wire [15:0] drq_rd_banksel_addr4_dec;
313wire [15:0] drq_rd_banksel_addr5_dec;
314wire [15:0] drq_rd_banksel_addr6_dec;
315wire [15:0] drq_rd_banksel_addr7_dec;
316wire drq_rdq_ent7_rank_avail;
317wire drq_rdq_ent6_rank_avail;
318wire drq_rdq_ent5_rank_avail;
319wire drq_rdq_ent4_rank_avail;
320wire drq_rdq_ent3_rank_avail;
321wire drq_rdq_ent2_rank_avail;
322wire drq_rdq_ent1_rank_avail;
323wire drq_rdq_ent0_rank_avail;
324wire [6:0] drq_wr_addr_picked;
325wire [15:0] drq_rdq_ent0_rank_dec;
326wire [15:0] drq_rdq_ent1_rank_dec;
327wire [15:0] drq_rdq_ent2_rank_dec;
328wire [15:0] drq_rdq_ent3_rank_dec;
329wire [15:0] drq_rdq_ent4_rank_dec;
330wire [15:0] drq_rdq_ent5_rank_dec;
331wire [15:0] drq_rdq_ent6_rank_dec;
332wire [15:0] drq_rdq_ent7_rank_dec;
333wire [15:0] drq_rank_avail;
334wire [15:0] drq_pd_mode_rd_decr_in;
335wire ff_pd_mode_rd_decr_scanin;
336wire ff_pd_mode_rd_decr_scanout;
337
338
339// from mcu to cpu clk domain
340output [7:0] drq_wrbuf_valids; // write request queue entries that are valid
341output [7:0] drq_pending_wr_req;
342output [3:0] drq_write_queue_cnt; // count of write requests for performance counters
343
344output [7:0] drq_rdbuf_valids; // read request queue entries that are valid
345output [3:0] drq_read_queue_cnt; // count of read requests for performance counters
346output drq_rdq_full; // read reuest queue full
347output drq_rdq_free; // indicates read queue enties has been freed up
348
349output drq_empty;
350output drq_rd_req;
351output drq_wr_req;
352
353// bank indicator for read queue entries
354output [15:0] drq_rd_entry7_val;
355output [15:0] drq_rd_entry6_val;
356output [15:0] drq_rd_entry5_val;
357output [15:0] drq_rd_entry4_val;
358output [15:0] drq_rd_entry3_val;
359output [15:0] drq_rd_entry2_val;
360output [15:0] drq_rd_entry1_val;
361output [15:0] drq_rd_entry0_val;
362
363output [15:0] drq_rd_bank_val;
364
365// rank of read queue entries
366output drq_rd_entry0_rank;
367output drq_rd_entry1_rank;
368output drq_rd_entry2_rank;
369output drq_rd_entry3_rank;
370output drq_rd_entry4_rank;
371output drq_rd_entry5_rank;
372output drq_rd_entry6_rank;
373output drq_rd_entry7_rank;
374
375// dimm of read queue entries
376output [2:0] drq_rd_entry0_dimm;
377output [2:0] drq_rd_entry1_dimm;
378output [2:0] drq_rd_entry2_dimm;
379output [2:0] drq_rd_entry3_dimm;
380output [2:0] drq_rd_entry4_dimm;
381output [2:0] drq_rd_entry5_dimm;
382output [2:0] drq_rd_entry6_dimm;
383output [2:0] drq_rd_entry7_dimm;
384
385// rank of write queue entries
386output drq_wr_entry0_rank;
387output drq_wr_entry1_rank;
388output drq_wr_entry2_rank;
389output drq_wr_entry3_rank;
390output drq_wr_entry4_rank;
391output drq_wr_entry5_rank;
392output drq_wr_entry6_rank;
393output drq_wr_entry7_rank;
394
395// dimm of write queue entries
396output [2:0] drq_wr_entry0_dimm;
397output [2:0] drq_wr_entry1_dimm;
398output [2:0] drq_wr_entry2_dimm;
399output [2:0] drq_wr_entry3_dimm;
400output [2:0] drq_wr_entry4_dimm;
401output [2:0] drq_wr_entry5_dimm;
402output [2:0] drq_wr_entry6_dimm;
403output [2:0] drq_wr_entry7_dimm;
404
405output [14:0] drq_wr_queue_ent0;
406output [14:0] drq_wr_queue_ent1;
407output [14:0] drq_wr_queue_ent2;
408output [14:0] drq_wr_queue_ent3;
409output [14:0] drq_wr_queue_ent4;
410output [14:0] drq_wr_queue_ent5;
411output [14:0] drq_wr_queue_ent6;
412output [14:0] drq_wr_queue_ent7;
413output [7:0] drq_wdq_valid;
414
415output [2:0] drq_rd_index_picked; // index in read request queue of picked read
416output [2:0] drq_wr_index_picked; // index in write request queue of picked write
417output [2:0] drq_wr_id_picked; // index in write data queue of picked write
418
419output [9:0] drq_rd_addr_picked; // bank, rank, parity, err for picked read
420
421output [15:0] drq_pd_mode_rd_incr;
422output [15:0] drq_pd_mode_rd_decr;
423output [15:0] drq_pd_mode_wr_incr;
424
425// load enables for read request queue entries
426output drq_rd_adr_queue7_en;
427output drq_rd_adr_queue6_en;
428output drq_rd_adr_queue5_en;
429output drq_rd_adr_queue4_en;
430output drq_rd_adr_queue3_en;
431output drq_rd_adr_queue2_en;
432output drq_rd_adr_queue1_en;
433output drq_rd_adr_queue0_en;
434
435// load enables for write request queue entries
436output drq_wr_adr_queue7_en;
437output drq_wr_adr_queue6_en;
438output drq_wr_adr_queue5_en;
439output drq_wr_adr_queue4_en;
440output drq_wr_adr_queue3_en;
441output drq_wr_adr_queue2_en;
442output drq_wr_adr_queue1_en;
443output drq_wr_adr_queue0_en;
444
445output [7:0] drq_rd_adr_queue_sel; // output select for read request queue
446output drq_req_rdwr_addr_sel; // select between read and write request queues
447
448// bank, rank, parity, err for incoming read request
449input l2b_rank_rd_adr;
450input [2:0] l2b_dimm_rd_adr;
451input [2:0] l2b_bank_rd_adr;
452input l2b_addr_rd_err;
453input l2b_addr_rd_par;
454
455// bank, rank, parity, err for incoming write request
456input l2b_rank_wr_adr;
457input [2:0] l2b_dimm_wr_adr;
458input [2:0] l2b_bank_wr_adr;
459input l2b_addr_wr_err;
460input l2b_addr_wr_par;
461
462// incoming request signals
463input l2if_wr_req;
464input l2if_rd_req;
465input [2:0] drq_cpu_wr_addr;
466input [3:0] l2if_wdq_in_cntr;
467
468// state information from drif state machine
469input drif_init;
470input drif_init_mcu_done;
471input drif_mcu_state_1;
472input drif_mcu_state_2;
473input drif_mcu_state_4;
474
475input drif_cmd_picked; // 0=read, 1=write picked
476input [7:0] drif_rd_entry_picked; // entry in read request queue that was picked
477input [7:0] drif_wr_entry_picked; // entry in write request queue that was picked
478
479input drif_blk_new_openbank; // block new open banks when asserted for power throttling
480input [15:0] pdmc_rank_avail;
481input [7:0] drif_dimm_rd_available;
482input [3:0] drif_refresh_rank; // rank being refreshed; requests are blocked to this rank
483 // during refresh
484input drif_rd_picked; // read command picked, qualifies drif_cmd_picked
485input drif_wr_picked; // write command picked, qualifies drif_cmd_picked
486input drif_raw_hazard; // read after write hazard detected, don't dequeue read
487
488input [7:0] rdpctl_drq_clear_ent; // read request queue entry to clear
489input [7:0] woq_wrq_clear_ent; // write request queue entry to clear
490input [7:0] drif_drq_clear_ent; // read request queue entry to clear after error processing
491
492input [7:0] woq_wr_queue_clear;
493input [7:0] woq_wr_entry_picked;
494
495// address mode information for using 8-bank scheduling algorithm when in 4-bank mode
496input drif_eight_bank_mode;
497input drif_stacked_dimm;
498
499input l1clk;
500input scan_in;
501output scan_out;
502input tcu_aclk;
503input tcu_bclk;
504input tcu_scan_en;
505
506// Scan reassigns
507assign siclk = tcu_aclk;
508assign soclk = tcu_bclk;
509assign se = tcu_scan_en;
510
511//////////////////////////////////////////////////////////////////
512// Flopping the cpu domain signals to mcu domain
513//////////////////////////////////////////////////////////////////
514mcu_drq_ctl_msff_ctl_macro__width_6 ff_rd_wr_val (
515 .scan_in(ff_rd_wr_val_scanin),
516 .scan_out(ff_rd_wr_val_scanout),
517 .din({l2if_wr_req, l2if_rd_req, l2if_wdq_in_cntr[3:0]}),
518 .dout({drq_wr_req, drq_rd_req, drq_wdq_in_cntr[3:0]}),
519 .l1clk(l1clk),
520 .siclk(siclk),
521 .soclk(soclk));
522
523// read address information for scheduling
524mcu_drq_ctl_msff_ctl_macro__width_9 ff_rd_addr (
525 .scan_in(ff_rd_addr_scanin),
526 .scan_out(ff_rd_addr_scanout),
527 .din({l2b_addr_rd_par,l2b_addr_rd_err,l2b_rank_rd_adr,l2b_dimm_rd_adr[2:0],l2b_bank_rd_adr[2:0]}),
528 .dout(drq_rd_addr0[8:0]),
529 .l1clk(l1clk),
530 .siclk(siclk),
531 .soclk(soclk));
532
533// write address information for scheduling
534mcu_drq_ctl_msff_ctl_macro__width_9 ff_wr_addr (
535 .scan_in(ff_wr_addr_scanin),
536 .scan_out(ff_wr_addr_scanout),
537 .din({l2b_addr_wr_par,l2b_addr_wr_err,l2b_rank_wr_adr,l2b_dimm_wr_adr[2:0],l2b_bank_wr_adr[2:0]}),
538 .dout(drq_wr_addr0[8:0]),
539 .l1clk(l1clk),
540 .siclk(siclk),
541 .soclk(soclk));
542
543// clearing an entry from read queue
544// drif_drq_clear_ent - for clearing after error retries
545// rdpctl_drq_clear_ent - for clearing when no error has occurred
546assign drq_clear_ent[7:0] = drif_drq_clear_ent[7:0] | rdpctl_drq_clear_ent[7:0];
547
548// let l2if know that a read request queue entry was cleared
549assign drq_rdq_free_in = |drq_clear_ent[7:0];
550
551mcu_drq_ctl_msff_ctl_macro__width_1 ff_rdq_free (
552 .scan_in(ff_rdq_free_scanin),
553 .scan_out(ff_rdq_free_scanout),
554 .din(drq_rdq_free_in),
555 .dout(drq_rdq_free),
556 .l1clk(l1clk),
557 .siclk(siclk),
558 .soclk(soclk));
559
560// select for read address queue entry
561// 0in one_hot -var drq_rd_adr_queue_sel[7:0]
562assign drq_rd_adr_queue_sel[7:0] = {8{drif_rd_entry_picked[7]}} & drq_rdq_ent7_index_dec[7:0] |
563 {8{drif_rd_entry_picked[6]}} & drq_rdq_ent6_index_dec[7:0] |
564 {8{drif_rd_entry_picked[5]}} & drq_rdq_ent5_index_dec[7:0] |
565 {8{drif_rd_entry_picked[4]}} & drq_rdq_ent4_index_dec[7:0] |
566 {8{drif_rd_entry_picked[3]}} & drq_rdq_ent3_index_dec[7:0] |
567 {8{drif_rd_entry_picked[2]}} & drq_rdq_ent2_index_dec[7:0] |
568 {8{drif_rd_entry_picked[1]}} & drq_rdq_ent1_index_dec[7:0] |
569 {8{drif_rd_entry_picked[0]}} & drq_rdq_ent0_index_dec[7:0] |
570 {7'h0,~(|drif_rd_entry_picked[7:0])};
571
572// select between read and write address queues
573// 0 = read, 1 = write
574assign drq_req_rdwr_addr_sel = ~(|drif_rd_entry_picked[7:0]);
575
576assign drq_empty = drq_wrq_empty & drq_rdq_empty;
577
578//////////////////////////////////////////////////////////////////
579// Determine which read address queue entry to load
580//////////////////////////////////////////////////////////////////
581
582// Assertions to ensure valid entries are not overwritten
583// nor empty entries cleared
584// 0in req_ack -req drq_rd_adr_queue0_en -ack drq_clear_ent[0]
585// 0in req_ack -req drq_rd_adr_queue1_en -ack drq_clear_ent[1]
586// 0in req_ack -req drq_rd_adr_queue2_en -ack drq_clear_ent[2]
587// 0in req_ack -req drq_rd_adr_queue3_en -ack drq_clear_ent[3]
588// 0in req_ack -req drq_rd_adr_queue4_en -ack drq_clear_ent[4]
589// 0in req_ack -req drq_rd_adr_queue5_en -ack drq_clear_ent[5]
590// 0in req_ack -req drq_rd_adr_queue6_en -ack drq_clear_ent[6]
591// 0in req_ack -req drq_rd_adr_queue7_en -ack drq_clear_ent[7]
592
593assign drq_rd_adr_queue0_en = ~drq_rdbuf_valids[0] & drq_rd_req;
594assign drq_rd_adr_queue1_en = ~drq_rdbuf_valids[1] & drq_rdbuf_valids[0] & drq_rd_req;
595assign drq_rd_adr_queue2_en = ~drq_rdbuf_valids[2] & (&drq_rdbuf_valids[1:0]) & drq_rd_req;
596assign drq_rd_adr_queue3_en = ~drq_rdbuf_valids[3] & (&drq_rdbuf_valids[2:0]) & drq_rd_req;
597assign drq_rd_adr_queue4_en = ~drq_rdbuf_valids[4] & (&drq_rdbuf_valids[3:0]) & drq_rd_req;
598assign drq_rd_adr_queue5_en = ~drq_rdbuf_valids[5] & (&drq_rdbuf_valids[4:0]) & drq_rd_req;
599assign drq_rd_adr_queue6_en = ~drq_rdbuf_valids[6] & (&drq_rdbuf_valids[5:0]) & drq_rd_req;
600assign drq_rd_adr_queue7_en = ~drq_rdbuf_valids[7] & (&drq_rdbuf_valids[6:0]) & drq_rd_req;
601
602assign drq_rd_addr_in[2:0] = {drq_rd_adr_queue4_en | drq_rd_adr_queue5_en | drq_rd_adr_queue6_en | drq_rd_adr_queue7_en,
603 drq_rd_adr_queue2_en | drq_rd_adr_queue3_en | drq_rd_adr_queue6_en | drq_rd_adr_queue7_en,
604 drq_rd_adr_queue1_en | drq_rd_adr_queue3_en | drq_rd_adr_queue5_en | drq_rd_adr_queue7_en};
605
606//////////////////////////////////////////////////////////////////
607// Determine which write address queue entry to load.
608// Silently drop req if address is out of range.
609// so AND it with address error bit (drq_wr_addr0[7])
610//////////////////////////////////////////////////////////////////
611
612// Assertions to ensure valid entries are not overwritten
613// nor empty entries cleared
614// 0in req_ack -req drq_wr_adr_queue0_en -ack drq_wrq_clear_ent[0]
615// 0in req_ack -req drq_wr_adr_queue1_en -ack drq_wrq_clear_ent[1]
616// 0in req_ack -req drq_wr_adr_queue2_en -ack drq_wrq_clear_ent[2]
617// 0in req_ack -req drq_wr_adr_queue3_en -ack drq_wrq_clear_ent[3]
618// 0in req_ack -req drq_wr_adr_queue4_en -ack drq_wrq_clear_ent[4]
619// 0in req_ack -req drq_wr_adr_queue5_en -ack drq_wrq_clear_ent[5]
620// 0in req_ack -req drq_wr_adr_queue6_en -ack drq_wrq_clear_ent[6]
621// 0in req_ack -req drq_wr_adr_queue7_en -ack drq_wrq_clear_ent[7]
622
623assign drq_wr_adr_queue0_en = ~drq_wrbuf_valids[0] & drq_wr_req & ~drq_wr_addr0[7];
624assign drq_wr_adr_queue1_en = ~drq_wrbuf_valids[1] & drq_wrbuf_valids[0] & drq_wr_req & ~drq_wr_addr0[7];
625assign drq_wr_adr_queue2_en = ~drq_wrbuf_valids[2] & (&drq_wrbuf_valids[1:0]) & drq_wr_req & ~drq_wr_addr0[7];
626assign drq_wr_adr_queue3_en = ~drq_wrbuf_valids[3] & (&drq_wrbuf_valids[2:0]) & drq_wr_req & ~drq_wr_addr0[7];
627assign drq_wr_adr_queue4_en = ~drq_wrbuf_valids[4] & (&drq_wrbuf_valids[3:0]) & drq_wr_req & ~drq_wr_addr0[7];
628assign drq_wr_adr_queue5_en = ~drq_wrbuf_valids[5] & (&drq_wrbuf_valids[4:0]) & drq_wr_req & ~drq_wr_addr0[7];
629assign drq_wr_adr_queue6_en = ~drq_wrbuf_valids[6] & (&drq_wrbuf_valids[5:0]) & drq_wr_req & ~drq_wr_addr0[7];
630assign drq_wr_adr_queue7_en = ~drq_wrbuf_valids[7] & (&drq_wrbuf_valids[6:0]) & drq_wr_req & ~drq_wr_addr0[7];
631
632assign drq_wr_addr_in[2:0] = {drq_wr_adr_queue4_en | drq_wr_adr_queue5_en | drq_wr_adr_queue6_en | drq_wr_adr_queue7_en,
633 drq_wr_adr_queue2_en | drq_wr_adr_queue3_en | drq_wr_adr_queue6_en | drq_wr_adr_queue7_en,
634 drq_wr_adr_queue1_en | drq_wr_adr_queue3_en | drq_wr_adr_queue5_en | drq_wr_adr_queue7_en};
635
636//////////////////////////////////////////////////////////////////
637// Valids for address queue entries
638//////////////////////////////////////////////////////////////////
639
640// Valids for address queue entries
641
642assign drq_rdbuf_valids_in[0] = drq_rd_adr_queue0_en ? 1'b1 : drq_clear_ent[0] ? 1'b0 : drq_rdbuf_valids[0];
643assign drq_rdbuf_valids_in[1] = drq_rd_adr_queue1_en ? 1'b1 : drq_clear_ent[1] ? 1'b0 : drq_rdbuf_valids[1];
644assign drq_rdbuf_valids_in[2] = drq_rd_adr_queue2_en ? 1'b1 : drq_clear_ent[2] ? 1'b0 : drq_rdbuf_valids[2];
645assign drq_rdbuf_valids_in[3] = drq_rd_adr_queue3_en ? 1'b1 : drq_clear_ent[3] ? 1'b0 : drq_rdbuf_valids[3];
646assign drq_rdbuf_valids_in[4] = drq_rd_adr_queue4_en ? 1'b1 : drq_clear_ent[4] ? 1'b0 : drq_rdbuf_valids[4];
647assign drq_rdbuf_valids_in[5] = drq_rd_adr_queue5_en ? 1'b1 : drq_clear_ent[5] ? 1'b0 : drq_rdbuf_valids[5];
648assign drq_rdbuf_valids_in[6] = drq_rd_adr_queue6_en ? 1'b1 : drq_clear_ent[6] ? 1'b0 : drq_rdbuf_valids[6];
649assign drq_rdbuf_valids_in[7] = drq_rd_adr_queue7_en ? 1'b1 : drq_clear_ent[7] ? 1'b0 : drq_rdbuf_valids[7];
650
651mcu_drq_ctl_msff_ctl_macro__width_8 ff_rdbuf_valids (
652 .scan_in(ff_rdbuf_valids_scanin),
653 .scan_out(ff_rdbuf_valids_scanout),
654 .din(drq_rdbuf_valids_in[7:0]),
655 .dout(drq_rdbuf_valids[7:0]),
656 .l1clk(l1clk),
657 .siclk(siclk),
658 .soclk(soclk));
659
660//////////////////////////////////////////////////////////////////
661// Writes Address queue entry valids
662//////////////////////////////////////////////////////////////////
663
664// Valids for write address queue entries
665
666assign drq_wrq_clear_ent[7:0] = woq_wrq_clear_ent[7:0];
667assign drq_wrbuf_valids_in[0] = drq_wr_adr_queue0_en ? 1'b1 : drq_wrq_clear_ent[0] ? 1'b0 : drq_wrbuf_valids[0];
668assign drq_wrbuf_valids_in[1] = drq_wr_adr_queue1_en ? 1'b1 : drq_wrq_clear_ent[1] ? 1'b0 : drq_wrbuf_valids[1];
669assign drq_wrbuf_valids_in[2] = drq_wr_adr_queue2_en ? 1'b1 : drq_wrq_clear_ent[2] ? 1'b0 : drq_wrbuf_valids[2];
670assign drq_wrbuf_valids_in[3] = drq_wr_adr_queue3_en ? 1'b1 : drq_wrq_clear_ent[3] ? 1'b0 : drq_wrbuf_valids[3];
671assign drq_wrbuf_valids_in[4] = drq_wr_adr_queue4_en ? 1'b1 : drq_wrq_clear_ent[4] ? 1'b0 : drq_wrbuf_valids[4];
672assign drq_wrbuf_valids_in[5] = drq_wr_adr_queue5_en ? 1'b1 : drq_wrq_clear_ent[5] ? 1'b0 : drq_wrbuf_valids[5];
673assign drq_wrbuf_valids_in[6] = drq_wr_adr_queue6_en ? 1'b1 : drq_wrq_clear_ent[6] ? 1'b0 : drq_wrbuf_valids[6];
674assign drq_wrbuf_valids_in[7] = drq_wr_adr_queue7_en ? 1'b1 : drq_wrq_clear_ent[7] ? 1'b0 : drq_wrbuf_valids[7];
675
676mcu_drq_ctl_msff_ctl_macro__width_8 ff_wrbuf_valids (
677 .scan_in(ff_wrbuf_valids_scanin),
678 .scan_out(ff_wrbuf_valids_scanout),
679 .din(drq_wrbuf_valids_in[7:0]),
680 .dout(drq_wrbuf_valids[7:0]),
681 .l1clk(l1clk),
682 .siclk(siclk),
683 .soclk(soclk));
684
685// CLEANUP - write retiring
686// set when write transaction is issued from woq; used for RAW hazard detection
687assign drq_wrbuf_issued_in[0] = woq_wr_entry_picked[0] ? 1'b1 : drq_wrq_clear_ent[0] ? 1'b0 : drq_wrbuf_issued[0];
688assign drq_wrbuf_issued_in[1] = woq_wr_entry_picked[1] ? 1'b1 : drq_wrq_clear_ent[1] ? 1'b0 : drq_wrbuf_issued[1];
689assign drq_wrbuf_issued_in[2] = woq_wr_entry_picked[2] ? 1'b1 : drq_wrq_clear_ent[2] ? 1'b0 : drq_wrbuf_issued[2];
690assign drq_wrbuf_issued_in[3] = woq_wr_entry_picked[3] ? 1'b1 : drq_wrq_clear_ent[3] ? 1'b0 : drq_wrbuf_issued[3];
691assign drq_wrbuf_issued_in[4] = woq_wr_entry_picked[4] ? 1'b1 : drq_wrq_clear_ent[4] ? 1'b0 : drq_wrbuf_issued[4];
692assign drq_wrbuf_issued_in[5] = woq_wr_entry_picked[5] ? 1'b1 : drq_wrq_clear_ent[5] ? 1'b0 : drq_wrbuf_issued[5];
693assign drq_wrbuf_issued_in[6] = woq_wr_entry_picked[6] ? 1'b1 : drq_wrq_clear_ent[6] ? 1'b0 : drq_wrbuf_issued[6];
694assign drq_wrbuf_issued_in[7] = woq_wr_entry_picked[7] ? 1'b1 : drq_wrq_clear_ent[7] ? 1'b0 : drq_wrbuf_issued[7];
695
696mcu_drq_ctl_msff_ctl_macro__width_8 ff_wrbuf_issued (
697 .scan_in(ff_wrbuf_issued_scanin),
698 .scan_out(ff_wrbuf_issued_scanout),
699 .din(drq_wrbuf_issued_in[7:0]),
700 .dout(drq_wrbuf_issued[7:0]),
701 .l1clk(l1clk),
702 .siclk(siclk),
703 .soclk(soclk));
704
705assign drq_pending_wr_req[7:0] = drq_wrbuf_valids[7:0] & ~drq_wrbuf_issued[7:0];
706
707//////////////////////////////////////////////////////////////////
708// Collapsing queue for reads
709// This queue allows requests to be pulled from any location.
710// The newest request is always added at the tail. The oldest
711// entry is in the queue always at ent0.
712//////////////////////////////////////////////////////////////////
713assign drq_rdq_full = &drq_rdbuf_valids[7:0];
714assign drq_rdq_empty = ~(|drq_rdbuf_valids[7:0]);
715
716// read request queue entry contents
717// 11:9 - index into address queue
718// 8 - parity
719// 7 - address error
720// 6 - rank
721// 5:3 - dimm
722// 2:0 - bank for scheduling
723assign drq_rd_entry[11:0] = {drq_rd_addr_in[2:0], drq_rd_addr0[8:3], drq_rdq_bank_bit2, drq_rd_addr0[1:0]};
724
725// when in 4-bank mode, use rank information for bank bit 2 when scheduling requests
726assign drq_rdq_bank_bit2 = drif_eight_bank_mode ? drq_rd_addr0[2] :
727 drif_stacked_dimm ? drq_rd_addr0[6] : drq_rd_addr0[3];
728
729// reset request queue entry's valid bit once it gets scheduled
730assign drq_read_queue_clear_in[7:0] = drif_rd_entry_picked[7:0] & {8{~drif_raw_hazard}};
731mcu_drq_ctl_msff_ctl_macro__width_8 ff_read_queue_clear (
732 .scan_in(ff_read_queue_clear_scanin),
733 .scan_out(ff_read_queue_clear_scanout),
734 .din(drq_read_queue_clear_in[7:0]),
735 .dout(drq_read_queue_clear[7:0]),
736 .l1clk(l1clk),
737 .siclk(siclk),
738 .soclk(soclk));
739
740// keep track of entry count
741assign drq_rd_entry_en = drq_rd_req & ~drq_rdq_full;
742assign drq_read_queue_cnt_in[3:0] = drq_rd_entry_en & ~(|drq_read_queue_clear[7:0]) ? drq_read_queue_cnt[3:0] + 4'h1 :
743 (|drq_read_queue_clear[7:0]) & ~drq_rd_entry_en ? drq_read_queue_cnt[3:0] - 4'h1 :
744 drq_read_queue_cnt[3:0];
745
746mcu_drq_ctl_msff_ctl_macro__width_4 ff_rd_collapse_fifo_cnt (
747 .scan_in(ff_rd_collapse_fifo_cnt_scanin),
748 .scan_out(ff_rd_collapse_fifo_cnt_scanout),
749 .din(drq_read_queue_cnt_in[3:0]),
750 .dout(drq_read_queue_cnt[3:0]),
751 .l1clk(l1clk),
752 .siclk(siclk),
753 .soclk(soclk));
754
755// set the valids in the request queue based on the entry count
756assign drq_rd_queue_valid[7:0] = {7'h0, drq_read_queue_cnt[3:0] == 4'h1} |
757 {6'h0,{2{drq_read_queue_cnt[3:0] == 4'h2}}} |
758 {5'h0,{3{drq_read_queue_cnt[3:0] == 4'h3}}} |
759 {4'h0,{4{drq_read_queue_cnt[3:0] == 4'h4}}} |
760 {3'h0,{5{drq_read_queue_cnt[3:0] == 4'h5}}} |
761 {2'h0,{6{drq_read_queue_cnt[3:0] == 4'h6}}} |
762 {1'h0,{7{drq_read_queue_cnt[3:0] == 4'h7}}} |
763 {8{drq_read_queue_cnt[3:0] == 4'h8}};
764
765// 0in fifo -enq drq_rd_entry_en -deq (|drq_read_queue_clear[7:0]) -depth 8
766assign drq_rd_queue_ent0_en = (drq_read_queue_cnt[3:0] == 4'h0) & drq_rd_entry_en | drq_read_queue_clear[0];
767assign drq_rd_queue_ent1_en = ~drq_rd_queue_valid[1] & drq_rd_entry_en | (|drq_read_queue_clear[1:0]);
768assign drq_rd_queue_ent2_en = ~drq_rd_queue_valid[2] & drq_rd_entry_en | (|drq_read_queue_clear[2:0]);
769assign drq_rd_queue_ent3_en = ~drq_rd_queue_valid[3] & drq_rd_entry_en | (|drq_read_queue_clear[3:0]);
770assign drq_rd_queue_ent4_en = ~drq_rd_queue_valid[4] & drq_rd_entry_en | (|drq_read_queue_clear[4:0]);
771assign drq_rd_queue_ent5_en = ~drq_rd_queue_valid[5] & drq_rd_entry_en | (|drq_read_queue_clear[5:0]);
772assign drq_rd_queue_ent6_en = ~drq_rd_queue_valid[6] & drq_rd_entry_en | (|drq_read_queue_clear[6:0]);
773assign drq_rd_queue_ent7_en = ~drq_rd_queue_valid[7] & drq_rd_entry_en | (|drq_read_queue_clear[7:0]);
774
775assign drq_rd_queue_ent0_in[11:0] = drq_rd_queue_valid[1] ? drq_rd_queue_ent1[11:0] : drq_rd_entry[11:0];
776assign drq_rd_queue_ent1_in[11:0] = drq_rd_queue_valid[2] ? drq_rd_queue_ent2[11:0] : drq_rd_entry[11:0];
777assign drq_rd_queue_ent2_in[11:0] = drq_rd_queue_valid[3] ? drq_rd_queue_ent3[11:0] : drq_rd_entry[11:0];
778assign drq_rd_queue_ent3_in[11:0] = drq_rd_queue_valid[4] ? drq_rd_queue_ent4[11:0] : drq_rd_entry[11:0];
779assign drq_rd_queue_ent4_in[11:0] = drq_rd_queue_valid[5] ? drq_rd_queue_ent5[11:0] : drq_rd_entry[11:0];
780assign drq_rd_queue_ent5_in[11:0] = drq_rd_queue_valid[6] ? drq_rd_queue_ent6[11:0] : drq_rd_entry[11:0];
781assign drq_rd_queue_ent6_in[11:0] = drq_rd_queue_valid[7] ? drq_rd_queue_ent7[11:0] : drq_rd_entry[11:0];
782assign drq_rd_queue_ent7_in[11:0] = drq_rd_entry[11:0];
783
784mcu_drq_ctl_msff_ctl_macro__en_1__width_12 ff_rd_collapse_fifo_ent0 (
785 .scan_in(ff_rd_collapse_fifo_ent0_scanin),
786 .scan_out(ff_rd_collapse_fifo_ent0_scanout),
787 .din(drq_rd_queue_ent0_in[11:0]),
788 .dout(drq_rd_queue_ent0[11:0]),
789 .en(drq_rd_queue_ent0_en),
790 .l1clk(l1clk),
791 .siclk(siclk),
792 .soclk(soclk));
793
794mcu_drq_ctl_msff_ctl_macro__en_1__width_12 ff_rd_collapse_fifo_ent1 (
795 .scan_in(ff_rd_collapse_fifo_ent1_scanin),
796 .scan_out(ff_rd_collapse_fifo_ent1_scanout),
797 .din(drq_rd_queue_ent1_in[11:0]),
798 .dout(drq_rd_queue_ent1[11:0]),
799 .en(drq_rd_queue_ent1_en),
800 .l1clk(l1clk),
801 .siclk(siclk),
802 .soclk(soclk));
803
804mcu_drq_ctl_msff_ctl_macro__en_1__width_12 ff_rd_collapse_fifo_ent2 (
805 .scan_in(ff_rd_collapse_fifo_ent2_scanin),
806 .scan_out(ff_rd_collapse_fifo_ent2_scanout),
807 .din(drq_rd_queue_ent2_in[11:0]),
808 .dout(drq_rd_queue_ent2[11:0]),
809 .en(drq_rd_queue_ent2_en),
810 .l1clk(l1clk),
811 .siclk(siclk),
812 .soclk(soclk));
813
814mcu_drq_ctl_msff_ctl_macro__en_1__width_12 ff_rd_collapse_fifo_ent3 (
815 .scan_in(ff_rd_collapse_fifo_ent3_scanin),
816 .scan_out(ff_rd_collapse_fifo_ent3_scanout),
817 .din(drq_rd_queue_ent3_in[11:0]),
818 .dout(drq_rd_queue_ent3[11:0]),
819 .en(drq_rd_queue_ent3_en),
820 .l1clk(l1clk),
821 .siclk(siclk),
822 .soclk(soclk));
823
824mcu_drq_ctl_msff_ctl_macro__en_1__width_12 ff_rd_collapse_fifo_ent4 (
825 .scan_in(ff_rd_collapse_fifo_ent4_scanin),
826 .scan_out(ff_rd_collapse_fifo_ent4_scanout),
827 .din(drq_rd_queue_ent4_in[11:0]),
828 .dout(drq_rd_queue_ent4[11:0]),
829 .en(drq_rd_queue_ent4_en),
830 .l1clk(l1clk),
831 .siclk(siclk),
832 .soclk(soclk));
833
834mcu_drq_ctl_msff_ctl_macro__en_1__width_12 ff_rd_collapse_fifo_ent5 (
835 .scan_in(ff_rd_collapse_fifo_ent5_scanin),
836 .scan_out(ff_rd_collapse_fifo_ent5_scanout),
837 .din(drq_rd_queue_ent5_in[11:0]),
838 .dout(drq_rd_queue_ent5[11:0]),
839 .en(drq_rd_queue_ent5_en),
840 .l1clk(l1clk),
841 .siclk(siclk),
842 .soclk(soclk));
843
844mcu_drq_ctl_msff_ctl_macro__en_1__width_12 ff_rd_collapse_fifo_ent6 (
845 .scan_in(ff_rd_collapse_fifo_ent6_scanin),
846 .scan_out(ff_rd_collapse_fifo_ent6_scanout),
847 .din(drq_rd_queue_ent6_in[11:0]),
848 .dout(drq_rd_queue_ent6[11:0]),
849 .en(drq_rd_queue_ent6_en),
850 .l1clk(l1clk),
851 .siclk(siclk),
852 .soclk(soclk));
853
854mcu_drq_ctl_msff_ctl_macro__en_1__width_12 ff_rd_collapse_fifo_ent7 (
855 .scan_in(ff_rd_collapse_fifo_ent7_scanin),
856 .scan_out(ff_rd_collapse_fifo_ent7_scanout),
857 .din(drq_rd_queue_ent7_in[11:0]),
858 .dout(drq_rd_queue_ent7[11:0]),
859 .en(drq_rd_queue_ent7_en),
860 .l1clk(l1clk),
861 .siclk(siclk),
862 .soclk(soclk));
863
864// read request rank information for scheduler - this allows scheduler to
865// keep scheduling to the same rank if possible so as not to lose a
866// cycle when switching ranks
867assign drq_rd_entry0_rank = drq_rd_queue_ent0[6];
868assign drq_rd_entry1_rank = drq_rd_queue_ent1[6];
869assign drq_rd_entry2_rank = drq_rd_queue_ent2[6];
870assign drq_rd_entry3_rank = drq_rd_queue_ent3[6];
871assign drq_rd_entry4_rank = drq_rd_queue_ent4[6];
872assign drq_rd_entry5_rank = drq_rd_queue_ent5[6];
873assign drq_rd_entry6_rank = drq_rd_queue_ent6[6];
874assign drq_rd_entry7_rank = drq_rd_queue_ent7[6];
875
876assign drq_rd_entry0_dimm[2:0] = drq_rd_queue_ent0[5:3];
877assign drq_rd_entry1_dimm[2:0] = drq_rd_queue_ent1[5:3];
878assign drq_rd_entry2_dimm[2:0] = drq_rd_queue_ent2[5:3];
879assign drq_rd_entry3_dimm[2:0] = drq_rd_queue_ent3[5:3];
880assign drq_rd_entry4_dimm[2:0] = drq_rd_queue_ent4[5:3];
881assign drq_rd_entry5_dimm[2:0] = drq_rd_queue_ent5[5:3];
882assign drq_rd_entry6_dimm[2:0] = drq_rd_queue_ent6[5:3];
883assign drq_rd_entry7_dimm[2:0] = drq_rd_queue_ent7[5:3];
884
885//////////////////////////////////////////////////////////////////
886// Collapsing queue for writes
887// This queue allows requests to be pulled from any location.
888// The newest request is always added at the tail
889//////////////////////////////////////////////////////////////////
890assign drq_wrq_full = &drq_wrbuf_valids[7:0];
891assign drq_wrq_empty = ~(|drq_wrbuf_valids[7:0]);
892
893// write request queue entry contents
894// 14:12 - index into wdq for write data
895// 11:9 - index into address queue
896// 8 - parity
897// 7 - addr error
898// 6 - rank
899// 5:3 - dimm
900// 2:0 - bank for scheduling
901assign drq_wr_entry[14:0] = {drq_cpu_wr_addr[2:0], drq_wr_addr_in[2:0], drq_wr_addr0[8:3], drq_wrq_bank_bit2, drq_wr_addr0[1:0]};
902
903// when in 4-bank mode, use rank information for bank bit 2 when scheduling requests
904assign drq_wrq_bank_bit2 = drif_eight_bank_mode ? drq_wr_addr0[2] :
905 drif_stacked_dimm ? drq_wr_addr0[6] : drq_wr_addr0[3];
906
907// reset request queue entry's valid bit once it gets scheduled
908assign drq_write_queue_clear[7:0] = woq_wr_queue_clear[7:0];
909
910// keep track of entry count
911assign drq_wr_entry_en = drq_wr_req & ~drq_wr_addr0[7] & ~drq_wrq_full;
912assign drq_write_queue_cnt_in[3:0] = drq_wr_entry_en & ~(|drq_write_queue_clear[7:0]) ? drq_write_queue_cnt[3:0] + 4'h1 :
913 (|drq_write_queue_clear[7:0]) & ~drq_wr_entry_en ? drq_write_queue_cnt[3:0] - 4'h1 :
914 drq_write_queue_cnt[3:0];
915
916mcu_drq_ctl_msff_ctl_macro__width_4 ff_wr_collapse_fifo_cnt (
917 .scan_in(ff_wr_collapse_fifo_cnt_scanin),
918 .scan_out(ff_wr_collapse_fifo_cnt_scanout),
919 .din(drq_write_queue_cnt_in[3:0]),
920 .dout(drq_write_queue_cnt[3:0]),
921 .l1clk(l1clk),
922 .siclk(siclk),
923 .soclk(soclk));
924
925// set the valids in the request queue based on the entry count
926assign drq_wr_queue_valid[7:0] = {7'h0, drq_write_queue_cnt[3:0] == 4'h1} |
927 {6'h0,{2{drq_write_queue_cnt[3:0] == 4'h2}}} |
928 {5'h0,{3{drq_write_queue_cnt[3:0] == 4'h3}}} |
929 {4'h0,{4{drq_write_queue_cnt[3:0] == 4'h4}}} |
930 {3'h0,{5{drq_write_queue_cnt[3:0] == 4'h5}}} |
931 {2'h0,{6{drq_write_queue_cnt[3:0] == 4'h6}}} |
932 {1'h0,{7{drq_write_queue_cnt[3:0] == 4'h7}}} |
933 {8{drq_write_queue_cnt[3:0] == 4'h8}};
934
935// 0in fifo -enq drq_wr_entry_en -deq (|drq_write_queue_clear[7:0]) -depth 8
936assign drq_wr_queue_ent0_en = (drq_write_queue_cnt[3:0] == 4'h0) & drq_wr_entry_en | drq_write_queue_clear[0];
937assign drq_wr_queue_ent1_en = ~drq_wr_queue_valid[1] & drq_wr_entry_en | (|drq_write_queue_clear[1:0]);
938assign drq_wr_queue_ent2_en = ~drq_wr_queue_valid[2] & drq_wr_entry_en | (|drq_write_queue_clear[2:0]);
939assign drq_wr_queue_ent3_en = ~drq_wr_queue_valid[3] & drq_wr_entry_en | (|drq_write_queue_clear[3:0]);
940assign drq_wr_queue_ent4_en = ~drq_wr_queue_valid[4] & drq_wr_entry_en | (|drq_write_queue_clear[4:0]);
941assign drq_wr_queue_ent5_en = ~drq_wr_queue_valid[5] & drq_wr_entry_en | (|drq_write_queue_clear[5:0]);
942assign drq_wr_queue_ent6_en = ~drq_wr_queue_valid[6] & drq_wr_entry_en | (|drq_write_queue_clear[6:0]);
943assign drq_wr_queue_ent7_en = ~drq_wr_queue_valid[7] & drq_wr_entry_en | (|drq_write_queue_clear[7:0]);
944
945assign drq_wr_queue_ent0_in[14:0] = drq_wr_queue_valid[1] ? drq_wr_queue_ent1[14:0] : drq_wr_entry[14:0];
946assign drq_wr_queue_ent1_in[14:0] = drq_wr_queue_valid[2] ? drq_wr_queue_ent2[14:0] : drq_wr_entry[14:0];
947assign drq_wr_queue_ent2_in[14:0] = drq_wr_queue_valid[3] ? drq_wr_queue_ent3[14:0] : drq_wr_entry[14:0];
948assign drq_wr_queue_ent3_in[14:0] = drq_wr_queue_valid[4] ? drq_wr_queue_ent4[14:0] : drq_wr_entry[14:0];
949assign drq_wr_queue_ent4_in[14:0] = drq_wr_queue_valid[5] ? drq_wr_queue_ent5[14:0] : drq_wr_entry[14:0];
950assign drq_wr_queue_ent5_in[14:0] = drq_wr_queue_valid[6] ? drq_wr_queue_ent6[14:0] : drq_wr_entry[14:0];
951assign drq_wr_queue_ent6_in[14:0] = drq_wr_queue_valid[7] ? drq_wr_queue_ent7[14:0] : drq_wr_entry[14:0];
952assign drq_wr_queue_ent7_in[14:0] = drq_wr_entry[14:0];
953
954mcu_drq_ctl_msff_ctl_macro__en_1__width_15 ff_wr_collapse_fifo_ent0 (
955 .scan_in(ff_wr_collapse_fifo_ent0_scanin),
956 .scan_out(ff_wr_collapse_fifo_ent0_scanout),
957 .din(drq_wr_queue_ent0_in[14:0]),
958 .dout(drq_wr_queue_ent0[14:0]),
959 .en(drq_wr_queue_ent0_en),
960 .l1clk(l1clk),
961 .siclk(siclk),
962 .soclk(soclk));
963
964mcu_drq_ctl_msff_ctl_macro__en_1__width_15 ff_wr_collapse_fifo_ent1 (
965 .scan_in(ff_wr_collapse_fifo_ent1_scanin),
966 .scan_out(ff_wr_collapse_fifo_ent1_scanout),
967 .din(drq_wr_queue_ent1_in[14:0]),
968 .dout(drq_wr_queue_ent1[14:0]),
969 .en(drq_wr_queue_ent1_en),
970 .l1clk(l1clk),
971 .siclk(siclk),
972 .soclk(soclk));
973
974mcu_drq_ctl_msff_ctl_macro__en_1__width_15 ff_wr_collapse_fifo_ent2 (
975 .scan_in(ff_wr_collapse_fifo_ent2_scanin),
976 .scan_out(ff_wr_collapse_fifo_ent2_scanout),
977 .din(drq_wr_queue_ent2_in[14:0]),
978 .dout(drq_wr_queue_ent2[14:0]),
979 .en(drq_wr_queue_ent2_en),
980 .l1clk(l1clk),
981 .siclk(siclk),
982 .soclk(soclk));
983
984mcu_drq_ctl_msff_ctl_macro__en_1__width_15 ff_wr_collapse_fifo_ent3 (
985 .scan_in(ff_wr_collapse_fifo_ent3_scanin),
986 .scan_out(ff_wr_collapse_fifo_ent3_scanout),
987 .din(drq_wr_queue_ent3_in[14:0]),
988 .dout(drq_wr_queue_ent3[14:0]),
989 .en(drq_wr_queue_ent3_en),
990 .l1clk(l1clk),
991 .siclk(siclk),
992 .soclk(soclk));
993
994mcu_drq_ctl_msff_ctl_macro__en_1__width_15 ff_wr_collapse_fifo_ent4 (
995 .scan_in(ff_wr_collapse_fifo_ent4_scanin),
996 .scan_out(ff_wr_collapse_fifo_ent4_scanout),
997 .din(drq_wr_queue_ent4_in[14:0]),
998 .dout(drq_wr_queue_ent4[14:0]),
999 .en(drq_wr_queue_ent4_en),
1000 .l1clk(l1clk),
1001 .siclk(siclk),
1002 .soclk(soclk));
1003
1004mcu_drq_ctl_msff_ctl_macro__en_1__width_15 ff_wr_collapse_fifo_ent5 (
1005 .scan_in(ff_wr_collapse_fifo_ent5_scanin),
1006 .scan_out(ff_wr_collapse_fifo_ent5_scanout),
1007 .din(drq_wr_queue_ent5_in[14:0]),
1008 .dout(drq_wr_queue_ent5[14:0]),
1009 .en(drq_wr_queue_ent5_en),
1010 .l1clk(l1clk),
1011 .siclk(siclk),
1012 .soclk(soclk));
1013
1014mcu_drq_ctl_msff_ctl_macro__en_1__width_15 ff_wr_collapse_fifo_ent6 (
1015 .scan_in(ff_wr_collapse_fifo_ent6_scanin),
1016 .scan_out(ff_wr_collapse_fifo_ent6_scanout),
1017 .din(drq_wr_queue_ent6_in[14:0]),
1018 .dout(drq_wr_queue_ent6[14:0]),
1019 .en(drq_wr_queue_ent6_en),
1020 .l1clk(l1clk),
1021 .siclk(siclk),
1022 .soclk(soclk));
1023
1024mcu_drq_ctl_msff_ctl_macro__en_1__width_15 ff_wr_collapse_fifo_ent7 (
1025 .scan_in(ff_wr_collapse_fifo_ent7_scanin),
1026 .scan_out(ff_wr_collapse_fifo_ent7_scanout),
1027 .din(drq_wr_queue_ent7_in[14:0]),
1028 .dout(drq_wr_queue_ent7[14:0]),
1029 .en(drq_wr_queue_ent7_en),
1030 .l1clk(l1clk),
1031 .siclk(siclk),
1032 .soclk(soclk));
1033
1034// valids for wdq
1035assign drq_wdq_out_cntr_in[3:0] = drq_wdq_out_cntr[3:0] + 4'h1;
1036assign drq_wdq_out_cntr_en = |drq_write_queue_clear[7:0];
1037
1038mcu_drq_ctl_msff_ctl_macro__en_1__width_4 ff_wdq_out_cntr (
1039 .scan_in(ff_wdq_out_cntr_scanin),
1040 .scan_out(ff_wdq_out_cntr_scanout),
1041 .din(drq_wdq_out_cntr_in[3:0]),
1042 .dout(drq_wdq_out_cntr[3:0]),
1043 .en(drq_wdq_out_cntr_en),
1044 .l1clk(l1clk),
1045 .siclk(siclk),
1046 .soclk(soclk));
1047
1048assign drq_wdq_cnt[3:0] = drq_wdq_in_cntr[3:0] >= drq_wdq_out_cntr[3:0] ? drq_wdq_in_cntr[3:0] - drq_wdq_out_cntr[3:0] :
1049 ~(drq_wdq_out_cntr[3:0] - drq_wdq_in_cntr[3:0]) + 4'h1;
1050
1051assign drq_wdq_valid[7:0] = drq_wr_queue_valid[7:0] &
1052 ({7'h0, drq_wdq_cnt[3:0] == 4'h1} |
1053 {6'h0,{2{drq_wdq_cnt[3:0] == 4'h2}}} |
1054 {5'h0,{3{drq_wdq_cnt[3:0] == 4'h3}}} |
1055 {4'h0,{4{drq_wdq_cnt[3:0] == 4'h4}}} |
1056 {3'h0,{5{drq_wdq_cnt[3:0] == 4'h5}}} |
1057 {2'h0,{6{drq_wdq_cnt[3:0] == 4'h6}}} |
1058 {1'h0,{7{drq_wdq_cnt[3:0] == 4'h7}}} |
1059 {8{drq_wdq_cnt[3:0] == 4'h8}});
1060
1061// write request rank information for scheduler - this allows scheduler to keep
1062// scheduling to the same rank if possible so as not to lose a cycle when
1063// switching ranks
1064assign drq_wr_entry0_rank = drq_wr_queue_ent0[6];
1065assign drq_wr_entry1_rank = drq_wr_queue_ent1[6];
1066assign drq_wr_entry2_rank = drq_wr_queue_ent2[6];
1067assign drq_wr_entry3_rank = drq_wr_queue_ent3[6];
1068assign drq_wr_entry4_rank = drq_wr_queue_ent4[6];
1069assign drq_wr_entry5_rank = drq_wr_queue_ent5[6];
1070assign drq_wr_entry6_rank = drq_wr_queue_ent6[6];
1071assign drq_wr_entry7_rank = drq_wr_queue_ent7[6];
1072
1073assign drq_wr_entry0_dimm[2:0] = drq_wr_queue_ent0[5:3];
1074assign drq_wr_entry1_dimm[2:0] = drq_wr_queue_ent1[5:3];
1075assign drq_wr_entry2_dimm[2:0] = drq_wr_queue_ent2[5:3];
1076assign drq_wr_entry3_dimm[2:0] = drq_wr_queue_ent3[5:3];
1077assign drq_wr_entry4_dimm[2:0] = drq_wr_queue_ent4[5:3];
1078assign drq_wr_entry5_dimm[2:0] = drq_wr_queue_ent5[5:3];
1079assign drq_wr_entry6_dimm[2:0] = drq_wr_queue_ent6[5:3];
1080assign drq_wr_entry7_dimm[2:0] = drq_wr_queue_ent7[5:3];
1081
1082//////////////////////////////////////////////////////////////////
1083// Generate bank valids for the read scheduler
1084//////////////////////////////////////////////////////////////////
1085assign drq_rdq_ent0_bnk[3:0] = {drif_eight_bank_mode ? (drif_stacked_dimm ? drq_rd_queue_ent0[6] :
1086 drq_rd_queue_ent0[3]) :
1087 (drif_stacked_dimm ? drq_rd_queue_ent0[3] :
1088 drq_rd_queue_ent0[4]), drq_rd_queue_ent0[2:0]};
1089assign drq_rdq_ent1_bnk[3:0] = {drif_eight_bank_mode ? (drif_stacked_dimm ? drq_rd_queue_ent1[6] :
1090 drq_rd_queue_ent1[3]) :
1091 (drif_stacked_dimm ? drq_rd_queue_ent1[3] :
1092 drq_rd_queue_ent1[4]), drq_rd_queue_ent1[2:0]};
1093assign drq_rdq_ent2_bnk[3:0] = {drif_eight_bank_mode ? (drif_stacked_dimm ? drq_rd_queue_ent2[6] :
1094 drq_rd_queue_ent2[3]) :
1095 (drif_stacked_dimm ? drq_rd_queue_ent2[3] :
1096 drq_rd_queue_ent2[4]), drq_rd_queue_ent2[2:0]};
1097assign drq_rdq_ent3_bnk[3:0] = {drif_eight_bank_mode ? (drif_stacked_dimm ? drq_rd_queue_ent3[6] :
1098 drq_rd_queue_ent3[3]) :
1099 (drif_stacked_dimm ? drq_rd_queue_ent3[3] :
1100 drq_rd_queue_ent3[4]), drq_rd_queue_ent3[2:0]};
1101assign drq_rdq_ent4_bnk[3:0] = {drif_eight_bank_mode ? (drif_stacked_dimm ? drq_rd_queue_ent4[6] :
1102 drq_rd_queue_ent4[3]) :
1103 (drif_stacked_dimm ? drq_rd_queue_ent4[3] :
1104 drq_rd_queue_ent4[4]), drq_rd_queue_ent4[2:0]};
1105assign drq_rdq_ent5_bnk[3:0] = {drif_eight_bank_mode ? (drif_stacked_dimm ? drq_rd_queue_ent5[6] :
1106 drq_rd_queue_ent5[3]) :
1107 (drif_stacked_dimm ? drq_rd_queue_ent5[3] :
1108 drq_rd_queue_ent5[4]), drq_rd_queue_ent5[2:0]};
1109assign drq_rdq_ent6_bnk[3:0] = {drif_eight_bank_mode ? (drif_stacked_dimm ? drq_rd_queue_ent6[6] :
1110 drq_rd_queue_ent6[3]) :
1111 (drif_stacked_dimm ? drq_rd_queue_ent6[3] :
1112 drq_rd_queue_ent6[4]), drq_rd_queue_ent6[2:0]};
1113assign drq_rdq_ent7_bnk[3:0] = {drif_eight_bank_mode ? (drif_stacked_dimm ? drq_rd_queue_ent7[6] :
1114 drq_rd_queue_ent7[3]) :
1115 (drif_stacked_dimm ? drq_rd_queue_ent7[3] :
1116 drq_rd_queue_ent7[4]), drq_rd_queue_ent7[2:0]};
1117
1118assign drq_rd_banksel_addr0_dec[15:0] = {(drq_rdq_ent0_bnk[3:0] == 4'hf), (drq_rdq_ent0_bnk[3:0] == 4'he),
1119 (drq_rdq_ent0_bnk[3:0] == 4'hd), (drq_rdq_ent0_bnk[3:0] == 4'hc),
1120 (drq_rdq_ent0_bnk[3:0] == 4'hb), (drq_rdq_ent0_bnk[3:0] == 4'ha),
1121 (drq_rdq_ent0_bnk[3:0] == 4'h9), (drq_rdq_ent0_bnk[3:0] == 4'h8),
1122 (drq_rdq_ent0_bnk[3:0] == 4'h7), (drq_rdq_ent0_bnk[3:0] == 4'h6),
1123 (drq_rdq_ent0_bnk[3:0] == 4'h5), (drq_rdq_ent0_bnk[3:0] == 4'h4),
1124 (drq_rdq_ent0_bnk[3:0] == 4'h3), (drq_rdq_ent0_bnk[3:0] == 4'h2),
1125 (drq_rdq_ent0_bnk[3:0] == 4'h1), (drq_rdq_ent0_bnk[3:0] == 4'h0)};
1126
1127assign drq_rd_banksel_addr1_dec[15:0] = {(drq_rdq_ent1_bnk[3:0] == 4'hf), (drq_rdq_ent1_bnk[3:0] == 4'he),
1128 (drq_rdq_ent1_bnk[3:0] == 4'hd), (drq_rdq_ent1_bnk[3:0] == 4'hc),
1129 (drq_rdq_ent1_bnk[3:0] == 4'hb), (drq_rdq_ent1_bnk[3:0] == 4'ha),
1130 (drq_rdq_ent1_bnk[3:0] == 4'h9), (drq_rdq_ent1_bnk[3:0] == 4'h8),
1131 (drq_rdq_ent1_bnk[3:0] == 4'h7), (drq_rdq_ent1_bnk[3:0] == 4'h6),
1132 (drq_rdq_ent1_bnk[3:0] == 4'h5), (drq_rdq_ent1_bnk[3:0] == 4'h4),
1133 (drq_rdq_ent1_bnk[3:0] == 4'h3), (drq_rdq_ent1_bnk[3:0] == 4'h2),
1134 (drq_rdq_ent1_bnk[3:0] == 4'h1), (drq_rdq_ent1_bnk[3:0] == 4'h0)};
1135
1136assign drq_rd_banksel_addr2_dec[15:0] = {(drq_rdq_ent2_bnk[3:0] == 4'hf), (drq_rdq_ent2_bnk[3:0] == 4'he),
1137 (drq_rdq_ent2_bnk[3:0] == 4'hd), (drq_rdq_ent2_bnk[3:0] == 4'hc),
1138 (drq_rdq_ent2_bnk[3:0] == 4'hb), (drq_rdq_ent2_bnk[3:0] == 4'ha),
1139 (drq_rdq_ent2_bnk[3:0] == 4'h9), (drq_rdq_ent2_bnk[3:0] == 4'h8),
1140 (drq_rdq_ent2_bnk[3:0] == 4'h7), (drq_rdq_ent2_bnk[3:0] == 4'h6),
1141 (drq_rdq_ent2_bnk[3:0] == 4'h5), (drq_rdq_ent2_bnk[3:0] == 4'h4),
1142 (drq_rdq_ent2_bnk[3:0] == 4'h3), (drq_rdq_ent2_bnk[3:0] == 4'h2),
1143 (drq_rdq_ent2_bnk[3:0] == 4'h1), (drq_rdq_ent2_bnk[3:0] == 4'h0)};
1144
1145assign drq_rd_banksel_addr3_dec[15:0] = {(drq_rdq_ent3_bnk[3:0] == 4'hf), (drq_rdq_ent3_bnk[3:0] == 4'he),
1146 (drq_rdq_ent3_bnk[3:0] == 4'hd), (drq_rdq_ent3_bnk[3:0] == 4'hc),
1147 (drq_rdq_ent3_bnk[3:0] == 4'hb), (drq_rdq_ent3_bnk[3:0] == 4'ha),
1148 (drq_rdq_ent3_bnk[3:0] == 4'h9), (drq_rdq_ent3_bnk[3:0] == 4'h8),
1149 (drq_rdq_ent3_bnk[3:0] == 4'h7), (drq_rdq_ent3_bnk[3:0] == 4'h6),
1150 (drq_rdq_ent3_bnk[3:0] == 4'h5), (drq_rdq_ent3_bnk[3:0] == 4'h4),
1151 (drq_rdq_ent3_bnk[3:0] == 4'h3), (drq_rdq_ent3_bnk[3:0] == 4'h2),
1152 (drq_rdq_ent3_bnk[3:0] == 4'h1), (drq_rdq_ent3_bnk[3:0] == 4'h0)};
1153
1154assign drq_rd_banksel_addr4_dec[15:0] = {(drq_rdq_ent4_bnk[3:0] == 4'hf), (drq_rdq_ent4_bnk[3:0] == 4'he),
1155 (drq_rdq_ent4_bnk[3:0] == 4'hd), (drq_rdq_ent4_bnk[3:0] == 4'hc),
1156 (drq_rdq_ent4_bnk[3:0] == 4'hb), (drq_rdq_ent4_bnk[3:0] == 4'ha),
1157 (drq_rdq_ent4_bnk[3:0] == 4'h9), (drq_rdq_ent4_bnk[3:0] == 4'h8),
1158 (drq_rdq_ent4_bnk[3:0] == 4'h7), (drq_rdq_ent4_bnk[3:0] == 4'h6),
1159 (drq_rdq_ent4_bnk[3:0] == 4'h5), (drq_rdq_ent4_bnk[3:0] == 4'h4),
1160 (drq_rdq_ent4_bnk[3:0] == 4'h3), (drq_rdq_ent4_bnk[3:0] == 4'h2),
1161 (drq_rdq_ent4_bnk[3:0] == 4'h1), (drq_rdq_ent4_bnk[3:0] == 4'h0)};
1162
1163assign drq_rd_banksel_addr5_dec[15:0] = {(drq_rdq_ent5_bnk[3:0] == 4'hf), (drq_rdq_ent5_bnk[3:0] == 4'he),
1164 (drq_rdq_ent5_bnk[3:0] == 4'hd), (drq_rdq_ent5_bnk[3:0] == 4'hc),
1165 (drq_rdq_ent5_bnk[3:0] == 4'hb), (drq_rdq_ent5_bnk[3:0] == 4'ha),
1166 (drq_rdq_ent5_bnk[3:0] == 4'h9), (drq_rdq_ent5_bnk[3:0] == 4'h8),
1167 (drq_rdq_ent5_bnk[3:0] == 4'h7), (drq_rdq_ent5_bnk[3:0] == 4'h6),
1168 (drq_rdq_ent5_bnk[3:0] == 4'h5), (drq_rdq_ent5_bnk[3:0] == 4'h4),
1169 (drq_rdq_ent5_bnk[3:0] == 4'h3), (drq_rdq_ent5_bnk[3:0] == 4'h2),
1170 (drq_rdq_ent5_bnk[3:0] == 4'h1), (drq_rdq_ent5_bnk[3:0] == 4'h0)};
1171
1172assign drq_rd_banksel_addr6_dec[15:0] = {(drq_rdq_ent6_bnk[3:0] == 4'hf), (drq_rdq_ent6_bnk[3:0] == 4'he),
1173 (drq_rdq_ent6_bnk[3:0] == 4'hd), (drq_rdq_ent6_bnk[3:0] == 4'hc),
1174 (drq_rdq_ent6_bnk[3:0] == 4'hb), (drq_rdq_ent6_bnk[3:0] == 4'ha),
1175 (drq_rdq_ent6_bnk[3:0] == 4'h9), (drq_rdq_ent6_bnk[3:0] == 4'h8),
1176 (drq_rdq_ent6_bnk[3:0] == 4'h7), (drq_rdq_ent6_bnk[3:0] == 4'h6),
1177 (drq_rdq_ent6_bnk[3:0] == 4'h5), (drq_rdq_ent6_bnk[3:0] == 4'h4),
1178 (drq_rdq_ent6_bnk[3:0] == 4'h3), (drq_rdq_ent6_bnk[3:0] == 4'h2),
1179 (drq_rdq_ent6_bnk[3:0] == 4'h1), (drq_rdq_ent6_bnk[3:0] == 4'h0)};
1180
1181assign drq_rd_banksel_addr7_dec[15:0] = {(drq_rdq_ent7_bnk[3:0] == 4'hf), (drq_rdq_ent7_bnk[3:0] == 4'he),
1182 (drq_rdq_ent7_bnk[3:0] == 4'hd), (drq_rdq_ent7_bnk[3:0] == 4'hc),
1183 (drq_rdq_ent7_bnk[3:0] == 4'hb), (drq_rdq_ent7_bnk[3:0] == 4'ha),
1184 (drq_rdq_ent7_bnk[3:0] == 4'h9), (drq_rdq_ent7_bnk[3:0] == 4'h8),
1185 (drq_rdq_ent7_bnk[3:0] == 4'h7), (drq_rdq_ent7_bnk[3:0] == 4'h6),
1186 (drq_rdq_ent7_bnk[3:0] == 4'h5), (drq_rdq_ent7_bnk[3:0] == 4'h4),
1187 (drq_rdq_ent7_bnk[3:0] == 4'h3), (drq_rdq_ent7_bnk[3:0] == 4'h2),
1188 (drq_rdq_ent7_bnk[3:0] == 4'h1), (drq_rdq_ent7_bnk[3:0] == 4'h0)};
1189
1190// Qualify the read's decoded bank address with queue entry valid signal
1191assign drq_rd_entry7_val[15:0] = {16{drq_rd_queue_valid[7] & drq_rdq_ent7_rank_avail}} & drq_rd_banksel_addr7_dec[15:0] &
1192 {16{(((drif_refresh_rank[3:0] != drq_rd_queue_ent7[6:3]) &
1193 (drif_mcu_state_2 | drif_mcu_state_4) & ~drif_init) | drif_mcu_state_1)}};
1194assign drq_rd_entry6_val[15:0] = {16{drq_rd_queue_valid[6] & drq_rdq_ent6_rank_avail}} & drq_rd_banksel_addr6_dec[15:0] &
1195 {16{(((drif_refresh_rank[3:0] != drq_rd_queue_ent6[6:3]) &
1196 (drif_mcu_state_2 | drif_mcu_state_4) & ~drif_init) | drif_mcu_state_1)}};
1197assign drq_rd_entry5_val[15:0] = {16{drq_rd_queue_valid[5] & drq_rdq_ent5_rank_avail}} & drq_rd_banksel_addr5_dec[15:0] &
1198 {16{(((drif_refresh_rank[3:0] != drq_rd_queue_ent5[6:3]) &
1199 (drif_mcu_state_2 | drif_mcu_state_4) & ~drif_init) | drif_mcu_state_1)}};
1200assign drq_rd_entry4_val[15:0] = {16{drq_rd_queue_valid[4] & drq_rdq_ent4_rank_avail}} & drq_rd_banksel_addr4_dec[15:0] &
1201 {16{(((drif_refresh_rank[3:0] != drq_rd_queue_ent4[6:3]) &
1202 (drif_mcu_state_2 | drif_mcu_state_4) & ~drif_init) | drif_mcu_state_1)}};
1203assign drq_rd_entry3_val[15:0] = {16{drq_rd_queue_valid[3] & drq_rdq_ent3_rank_avail}} & drq_rd_banksel_addr3_dec[15:0] &
1204 {16{(((drif_refresh_rank[3:0] != drq_rd_queue_ent3[6:3]) &
1205 (drif_mcu_state_2 | drif_mcu_state_4) & ~drif_init) | drif_mcu_state_1)}};
1206assign drq_rd_entry2_val[15:0] = {16{drq_rd_queue_valid[2] & drq_rdq_ent2_rank_avail}} & drq_rd_banksel_addr2_dec[15:0] &
1207 {16{(((drif_refresh_rank[3:0] != drq_rd_queue_ent2[6:3]) &
1208 (drif_mcu_state_2 | drif_mcu_state_4) & ~drif_init) | drif_mcu_state_1)}};
1209assign drq_rd_entry1_val[15:0] = {16{drq_rd_queue_valid[1] & drq_rdq_ent1_rank_avail}} & drq_rd_banksel_addr1_dec[15:0] &
1210 {16{(((drif_refresh_rank[3:0] != drq_rd_queue_ent1[6:3]) &
1211 (drif_mcu_state_2 | drif_mcu_state_4) & ~drif_init) | drif_mcu_state_1)}};
1212assign drq_rd_entry0_val[15:0] = {16{drq_rd_queue_valid[0] & drq_rdq_ent0_rank_avail}} & drq_rd_banksel_addr0_dec[15:0] &
1213 {16{(((drif_refresh_rank[3:0] != drq_rd_queue_ent0[6:3]) &
1214 (drif_mcu_state_2 | drif_mcu_state_4) & ~drif_init) | drif_mcu_state_1)}};
1215
1216// OR bank valids together so scheduler can know which banks have requests
1217assign drq_rd_bank_val[15:0] = (drq_rd_banksel_addr0_dec[15:0] & {16{drq_rd_queue_valid[0]}} |
1218 drq_rd_banksel_addr1_dec[15:0] & {16{drq_rd_queue_valid[1]}} |
1219 drq_rd_banksel_addr2_dec[15:0] & {16{drq_rd_queue_valid[2]}} |
1220 drq_rd_banksel_addr3_dec[15:0] & {16{drq_rd_queue_valid[3]}} |
1221 drq_rd_banksel_addr4_dec[15:0] & {16{drq_rd_queue_valid[4]}} |
1222 drq_rd_banksel_addr5_dec[15:0] & {16{drq_rd_queue_valid[5]}} |
1223 drq_rd_banksel_addr6_dec[15:0] & {16{drq_rd_queue_valid[6]}} |
1224 drq_rd_banksel_addr7_dec[15:0] & {16{drq_rd_queue_valid[7]}}) & {16{drif_init_mcu_done}};
1225
1226//////////////////////////////////////////////////////////////////
1227// Select info from request queues based on which entry was picked
1228//////////////////////////////////////////////////////////////////
1229
1230// index into read address queue
1231assign drq_rd_index_picked[2:0] = {3{drif_rd_entry_picked[7]}} & drq_rd_queue_ent7[11:9] |
1232 {3{drif_rd_entry_picked[6]}} & drq_rd_queue_ent6[11:9] |
1233 {3{drif_rd_entry_picked[5]}} & drq_rd_queue_ent5[11:9] |
1234 {3{drif_rd_entry_picked[4]}} & drq_rd_queue_ent4[11:9] |
1235 {3{drif_rd_entry_picked[3]}} & drq_rd_queue_ent3[11:9] |
1236 {3{drif_rd_entry_picked[2]}} & drq_rd_queue_ent2[11:9] |
1237 {3{drif_rd_entry_picked[1]}} & drq_rd_queue_ent1[11:9] |
1238 {3{drif_rd_entry_picked[0]}} & drq_rd_queue_ent0[11:9];
1239
1240// error, parity, rank, dimm, and bank information
1241assign {drq_rd_addr_picked[9:4],drq_rd_addr_picked[2:0]} =
1242 {9{drif_rd_entry_picked[7]}} & drq_rd_queue_ent7[8:0] |
1243 {9{drif_rd_entry_picked[6]}} & drq_rd_queue_ent6[8:0] |
1244 {9{drif_rd_entry_picked[5]}} & drq_rd_queue_ent5[8:0] |
1245 {9{drif_rd_entry_picked[4]}} & drq_rd_queue_ent4[8:0] |
1246 {9{drif_rd_entry_picked[3]}} & drq_rd_queue_ent3[8:0] |
1247 {9{drif_rd_entry_picked[2]}} & drq_rd_queue_ent2[8:0] |
1248 {9{drif_rd_entry_picked[1]}} & drq_rd_queue_ent1[8:0] |
1249 {9{drif_rd_entry_picked[0]}} & drq_rd_queue_ent0[8:0];
1250
1251assign drq_rd_addr_picked[3] = drif_eight_bank_mode ? (drif_stacked_dimm ? drq_rd_addr_picked[7] :
1252 drq_rd_addr_picked[4]) :
1253 (drif_stacked_dimm ? drq_rd_addr_picked[4] :
1254 drq_rd_addr_picked[5]);
1255
1256// index into write address queue
1257assign drq_wr_index_picked[2:0] = {3{drif_wr_entry_picked[7]}} & drq_wr_queue_ent7[11:9] |
1258 {3{drif_wr_entry_picked[6]}} & drq_wr_queue_ent6[11:9] |
1259 {3{drif_wr_entry_picked[5]}} & drq_wr_queue_ent5[11:9] |
1260 {3{drif_wr_entry_picked[4]}} & drq_wr_queue_ent4[11:9] |
1261 {3{drif_wr_entry_picked[3]}} & drq_wr_queue_ent3[11:9] |
1262 {3{drif_wr_entry_picked[2]}} & drq_wr_queue_ent2[11:9] |
1263 {3{drif_wr_entry_picked[1]}} & drq_wr_queue_ent1[11:9] |
1264 {3{drif_wr_entry_picked[0]}} & drq_wr_queue_ent0[11:9];
1265
1266// rank, bank, and parity information
1267assign drq_wr_addr_picked[6:0] = {7{drif_wr_entry_picked[7]}} & {drq_wr_queue_ent7[12],drq_wr_queue_ent7[8:6],drq_wr_queue_ent7[2:0]} |
1268 {7{drif_wr_entry_picked[6]}} & {drq_wr_queue_ent6[12],drq_wr_queue_ent6[8:6],drq_wr_queue_ent6[2:0]} |
1269 {7{drif_wr_entry_picked[5]}} & {drq_wr_queue_ent5[12],drq_wr_queue_ent5[8:6],drq_wr_queue_ent5[2:0]} |
1270 {7{drif_wr_entry_picked[4]}} & {drq_wr_queue_ent4[12],drq_wr_queue_ent4[8:6],drq_wr_queue_ent4[2:0]} |
1271 {7{drif_wr_entry_picked[3]}} & {drq_wr_queue_ent3[12],drq_wr_queue_ent3[8:6],drq_wr_queue_ent3[2:0]} |
1272 {7{drif_wr_entry_picked[2]}} & {drq_wr_queue_ent2[12],drq_wr_queue_ent2[8:6],drq_wr_queue_ent2[2:0]} |
1273 {7{drif_wr_entry_picked[1]}} & {drq_wr_queue_ent1[12],drq_wr_queue_ent1[8:6],drq_wr_queue_ent1[2:0]} |
1274 {7{drif_wr_entry_picked[0]}} & {drq_wr_queue_ent0[12],drq_wr_queue_ent0[8:6],drq_wr_queue_ent0[2:0]};
1275
1276// write data queue (wdq) index
1277assign drq_wr_id_picked[2:0] = {3{drif_wr_entry_picked[7]}} & drq_wr_queue_ent7[11:9] |
1278 {3{drif_wr_entry_picked[6]}} & drq_wr_queue_ent6[11:9] |
1279 {3{drif_wr_entry_picked[5]}} & drq_wr_queue_ent5[11:9] |
1280 {3{drif_wr_entry_picked[4]}} & drq_wr_queue_ent4[11:9] |
1281 {3{drif_wr_entry_picked[3]}} & drq_wr_queue_ent3[11:9] |
1282 {3{drif_wr_entry_picked[2]}} & drq_wr_queue_ent2[11:9] |
1283 {3{drif_wr_entry_picked[1]}} & drq_wr_queue_ent1[11:9] |
1284 {3{drif_wr_entry_picked[0]}} & drq_wr_queue_ent0[11:9];
1285
1286//////////////////////////////////////////////////////////////////
1287// Decode index for address queue entry selection
1288//////////////////////////////////////////////////////////////////
1289
1290// decoded read index for accessing read address queue
1291assign drq_rdq_ent0_index_dec[7:0] = { (drq_rd_queue_ent0[11:9] == 3'h7), (drq_rd_queue_ent0[11:9] == 3'h6),
1292 (drq_rd_queue_ent0[11:9] == 3'h5), (drq_rd_queue_ent0[11:9] == 3'h4),
1293 (drq_rd_queue_ent0[11:9] == 3'h3), (drq_rd_queue_ent0[11:9] == 3'h2),
1294 (drq_rd_queue_ent0[11:9] == 3'h1), (drq_rd_queue_ent0[11:9] == 3'h0) };
1295
1296assign drq_rdq_ent1_index_dec[7:0] = { (drq_rd_queue_ent1[11:9] == 3'h7), (drq_rd_queue_ent1[11:9] == 3'h6),
1297 (drq_rd_queue_ent1[11:9] == 3'h5), (drq_rd_queue_ent1[11:9] == 3'h4),
1298 (drq_rd_queue_ent1[11:9] == 3'h3), (drq_rd_queue_ent1[11:9] == 3'h2),
1299 (drq_rd_queue_ent1[11:9] == 3'h1), (drq_rd_queue_ent1[11:9] == 3'h0) };
1300
1301assign drq_rdq_ent2_index_dec[7:0] = { (drq_rd_queue_ent2[11:9] == 3'h7), (drq_rd_queue_ent2[11:9] == 3'h6),
1302 (drq_rd_queue_ent2[11:9] == 3'h5), (drq_rd_queue_ent2[11:9] == 3'h4),
1303 (drq_rd_queue_ent2[11:9] == 3'h3), (drq_rd_queue_ent2[11:9] == 3'h2),
1304 (drq_rd_queue_ent2[11:9] == 3'h1), (drq_rd_queue_ent2[11:9] == 3'h0) };
1305
1306assign drq_rdq_ent3_index_dec[7:0] = { (drq_rd_queue_ent3[11:9] == 3'h7), (drq_rd_queue_ent3[11:9] == 3'h6),
1307 (drq_rd_queue_ent3[11:9] == 3'h5), (drq_rd_queue_ent3[11:9] == 3'h4),
1308 (drq_rd_queue_ent3[11:9] == 3'h3), (drq_rd_queue_ent3[11:9] == 3'h2),
1309 (drq_rd_queue_ent3[11:9] == 3'h1), (drq_rd_queue_ent3[11:9] == 3'h0) };
1310
1311assign drq_rdq_ent4_index_dec[7:0] = { (drq_rd_queue_ent4[11:9] == 3'h7), (drq_rd_queue_ent4[11:9] == 3'h6),
1312 (drq_rd_queue_ent4[11:9] == 3'h5), (drq_rd_queue_ent4[11:9] == 3'h4),
1313 (drq_rd_queue_ent4[11:9] == 3'h3), (drq_rd_queue_ent4[11:9] == 3'h2),
1314 (drq_rd_queue_ent4[11:9] == 3'h1), (drq_rd_queue_ent4[11:9] == 3'h0) };
1315
1316assign drq_rdq_ent5_index_dec[7:0] = { (drq_rd_queue_ent5[11:9] == 3'h7), (drq_rd_queue_ent5[11:9] == 3'h6),
1317 (drq_rd_queue_ent5[11:9] == 3'h5), (drq_rd_queue_ent5[11:9] == 3'h4),
1318 (drq_rd_queue_ent5[11:9] == 3'h3), (drq_rd_queue_ent5[11:9] == 3'h2),
1319 (drq_rd_queue_ent5[11:9] == 3'h1), (drq_rd_queue_ent5[11:9] == 3'h0) };
1320
1321assign drq_rdq_ent6_index_dec[7:0] = { (drq_rd_queue_ent6[11:9] == 3'h7), (drq_rd_queue_ent6[11:9] == 3'h6),
1322 (drq_rd_queue_ent6[11:9] == 3'h5), (drq_rd_queue_ent6[11:9] == 3'h4),
1323 (drq_rd_queue_ent6[11:9] == 3'h3), (drq_rd_queue_ent6[11:9] == 3'h2),
1324 (drq_rd_queue_ent6[11:9] == 3'h1), (drq_rd_queue_ent6[11:9] == 3'h0) };
1325
1326assign drq_rdq_ent7_index_dec[7:0] = { (drq_rd_queue_ent7[11:9] == 3'h7), (drq_rd_queue_ent7[11:9] == 3'h6),
1327 (drq_rd_queue_ent7[11:9] == 3'h5), (drq_rd_queue_ent7[11:9] == 3'h4),
1328 (drq_rd_queue_ent7[11:9] == 3'h3), (drq_rd_queue_ent7[11:9] == 3'h2),
1329 (drq_rd_queue_ent7[11:9] == 3'h1), (drq_rd_queue_ent7[11:9] == 3'h0) };
1330
1331// Rank/DIMM decodes for power down mode
1332assign drq_rdq_ent0_rank_dec[15:0] = {drq_rd_queue_ent0[6:3] == 4'hf, drq_rd_queue_ent0[6:3] == 4'he,
1333 drq_rd_queue_ent0[6:3] == 4'hd, drq_rd_queue_ent0[6:3] == 4'hc,
1334 drq_rd_queue_ent0[6:3] == 4'hb, drq_rd_queue_ent0[6:3] == 4'ha,
1335 drq_rd_queue_ent0[6:3] == 4'h9, drq_rd_queue_ent0[6:3] == 4'h8,
1336 drq_rd_queue_ent0[6:3] == 4'h7, drq_rd_queue_ent0[6:3] == 4'h6,
1337 drq_rd_queue_ent0[6:3] == 4'h5, drq_rd_queue_ent0[6:3] == 4'h4,
1338 drq_rd_queue_ent0[6:3] == 4'h3, drq_rd_queue_ent0[6:3] == 4'h2,
1339 drq_rd_queue_ent0[6:3] == 4'h1, drq_rd_queue_ent0[6:3] == 4'h0};
1340assign drq_rdq_ent1_rank_dec[15:0] = {drq_rd_queue_ent1[6:3] == 4'hf, drq_rd_queue_ent1[6:3] == 4'he,
1341 drq_rd_queue_ent1[6:3] == 4'hd, drq_rd_queue_ent1[6:3] == 4'hc,
1342 drq_rd_queue_ent1[6:3] == 4'hb, drq_rd_queue_ent1[6:3] == 4'ha,
1343 drq_rd_queue_ent1[6:3] == 4'h9, drq_rd_queue_ent1[6:3] == 4'h8,
1344 drq_rd_queue_ent1[6:3] == 4'h7, drq_rd_queue_ent1[6:3] == 4'h6,
1345 drq_rd_queue_ent1[6:3] == 4'h5, drq_rd_queue_ent1[6:3] == 4'h4,
1346 drq_rd_queue_ent1[6:3] == 4'h3, drq_rd_queue_ent1[6:3] == 4'h2,
1347 drq_rd_queue_ent1[6:3] == 4'h1, drq_rd_queue_ent1[6:3] == 4'h0};
1348assign drq_rdq_ent2_rank_dec[15:0] = {drq_rd_queue_ent2[6:3] == 4'hf, drq_rd_queue_ent2[6:3] == 4'he,
1349 drq_rd_queue_ent2[6:3] == 4'hd, drq_rd_queue_ent2[6:3] == 4'hc,
1350 drq_rd_queue_ent2[6:3] == 4'hb, drq_rd_queue_ent2[6:3] == 4'ha,
1351 drq_rd_queue_ent2[6:3] == 4'h9, drq_rd_queue_ent2[6:3] == 4'h8,
1352 drq_rd_queue_ent2[6:3] == 4'h7, drq_rd_queue_ent2[6:3] == 4'h6,
1353 drq_rd_queue_ent2[6:3] == 4'h5, drq_rd_queue_ent2[6:3] == 4'h4,
1354 drq_rd_queue_ent2[6:3] == 4'h3, drq_rd_queue_ent2[6:3] == 4'h2,
1355 drq_rd_queue_ent2[6:3] == 4'h1, drq_rd_queue_ent2[6:3] == 4'h0};
1356assign drq_rdq_ent3_rank_dec[15:0] = {drq_rd_queue_ent3[6:3] == 4'hf, drq_rd_queue_ent3[6:3] == 4'he,
1357 drq_rd_queue_ent3[6:3] == 4'hd, drq_rd_queue_ent3[6:3] == 4'hc,
1358 drq_rd_queue_ent3[6:3] == 4'hb, drq_rd_queue_ent3[6:3] == 4'ha,
1359 drq_rd_queue_ent3[6:3] == 4'h9, drq_rd_queue_ent3[6:3] == 4'h8,
1360 drq_rd_queue_ent3[6:3] == 4'h7, drq_rd_queue_ent3[6:3] == 4'h6,
1361 drq_rd_queue_ent3[6:3] == 4'h5, drq_rd_queue_ent3[6:3] == 4'h4,
1362 drq_rd_queue_ent3[6:3] == 4'h3, drq_rd_queue_ent3[6:3] == 4'h2,
1363 drq_rd_queue_ent3[6:3] == 4'h1, drq_rd_queue_ent3[6:3] == 4'h0};
1364assign drq_rdq_ent4_rank_dec[15:0] = {drq_rd_queue_ent4[6:3] == 4'hf, drq_rd_queue_ent4[6:3] == 4'he,
1365 drq_rd_queue_ent4[6:3] == 4'hd, drq_rd_queue_ent4[6:3] == 4'hc,
1366 drq_rd_queue_ent4[6:3] == 4'hb, drq_rd_queue_ent4[6:3] == 4'ha,
1367 drq_rd_queue_ent4[6:3] == 4'h9, drq_rd_queue_ent4[6:3] == 4'h8,
1368 drq_rd_queue_ent4[6:3] == 4'h7, drq_rd_queue_ent4[6:3] == 4'h6,
1369 drq_rd_queue_ent4[6:3] == 4'h5, drq_rd_queue_ent4[6:3] == 4'h4,
1370 drq_rd_queue_ent4[6:3] == 4'h3, drq_rd_queue_ent4[6:3] == 4'h2,
1371 drq_rd_queue_ent4[6:3] == 4'h1, drq_rd_queue_ent4[6:3] == 4'h0};
1372assign drq_rdq_ent5_rank_dec[15:0] = {drq_rd_queue_ent5[6:3] == 4'hf, drq_rd_queue_ent5[6:3] == 4'he,
1373 drq_rd_queue_ent5[6:3] == 4'hd, drq_rd_queue_ent5[6:3] == 4'hc,
1374 drq_rd_queue_ent5[6:3] == 4'hb, drq_rd_queue_ent5[6:3] == 4'ha,
1375 drq_rd_queue_ent5[6:3] == 4'h9, drq_rd_queue_ent5[6:3] == 4'h8,
1376 drq_rd_queue_ent5[6:3] == 4'h7, drq_rd_queue_ent5[6:3] == 4'h6,
1377 drq_rd_queue_ent5[6:3] == 4'h5, drq_rd_queue_ent5[6:3] == 4'h4,
1378 drq_rd_queue_ent5[6:3] == 4'h3, drq_rd_queue_ent5[6:3] == 4'h2,
1379 drq_rd_queue_ent5[6:3] == 4'h1, drq_rd_queue_ent5[6:3] == 4'h0};
1380assign drq_rdq_ent6_rank_dec[15:0] = {drq_rd_queue_ent6[6:3] == 4'hf, drq_rd_queue_ent6[6:3] == 4'he,
1381 drq_rd_queue_ent6[6:3] == 4'hd, drq_rd_queue_ent6[6:3] == 4'hc,
1382 drq_rd_queue_ent6[6:3] == 4'hb, drq_rd_queue_ent6[6:3] == 4'ha,
1383 drq_rd_queue_ent6[6:3] == 4'h9, drq_rd_queue_ent6[6:3] == 4'h8,
1384 drq_rd_queue_ent6[6:3] == 4'h7, drq_rd_queue_ent6[6:3] == 4'h6,
1385 drq_rd_queue_ent6[6:3] == 4'h5, drq_rd_queue_ent6[6:3] == 4'h4,
1386 drq_rd_queue_ent6[6:3] == 4'h3, drq_rd_queue_ent6[6:3] == 4'h2,
1387 drq_rd_queue_ent6[6:3] == 4'h1, drq_rd_queue_ent6[6:3] == 4'h0};
1388assign drq_rdq_ent7_rank_dec[15:0] = {drq_rd_queue_ent7[6:3] == 4'hf, drq_rd_queue_ent7[6:3] == 4'he,
1389 drq_rd_queue_ent7[6:3] == 4'hd, drq_rd_queue_ent7[6:3] == 4'hc,
1390 drq_rd_queue_ent7[6:3] == 4'hb, drq_rd_queue_ent7[6:3] == 4'ha,
1391 drq_rd_queue_ent7[6:3] == 4'h9, drq_rd_queue_ent7[6:3] == 4'h8,
1392 drq_rd_queue_ent7[6:3] == 4'h7, drq_rd_queue_ent7[6:3] == 4'h6,
1393 drq_rd_queue_ent7[6:3] == 4'h5, drq_rd_queue_ent7[6:3] == 4'h4,
1394 drq_rd_queue_ent7[6:3] == 4'h3, drq_rd_queue_ent7[6:3] == 4'h2,
1395 drq_rd_queue_ent7[6:3] == 4'h1, drq_rd_queue_ent7[6:3] == 4'h0};
1396
1397assign drq_rank_avail[15:0] = pdmc_rank_avail[15:0] & {drif_dimm_rd_available[7:0],drif_dimm_rd_available[7:0]};
1398
1399assign drq_rdq_ent0_rank_avail = |(drq_rdq_ent0_rank_dec[15:0] & drq_rank_avail[15:0]);
1400assign drq_rdq_ent1_rank_avail = |(drq_rdq_ent1_rank_dec[15:0] & drq_rank_avail[15:0]);
1401assign drq_rdq_ent2_rank_avail = |(drq_rdq_ent2_rank_dec[15:0] & drq_rank_avail[15:0]);
1402assign drq_rdq_ent3_rank_avail = |(drq_rdq_ent3_rank_dec[15:0] & drq_rank_avail[15:0]);
1403assign drq_rdq_ent4_rank_avail = |(drq_rdq_ent4_rank_dec[15:0] & drq_rank_avail[15:0]);
1404assign drq_rdq_ent5_rank_avail = |(drq_rdq_ent5_rank_dec[15:0] & drq_rank_avail[15:0]);
1405assign drq_rdq_ent6_rank_avail = |(drq_rdq_ent6_rank_dec[15:0] & drq_rank_avail[15:0]);
1406assign drq_rdq_ent7_rank_avail = |(drq_rdq_ent7_rank_dec[15:0] & drq_rank_avail[15:0]);
1407
1408// Power Down mode counter increments
1409assign drq_pd_mode_rd_incr[15:0] = {16{drq_rd_req}} &
1410 {drq_rd_addr0[6:3] == 4'hf, drq_rd_addr0[6:3] == 4'he,
1411 drq_rd_addr0[6:3] == 4'hd, drq_rd_addr0[6:3] == 4'hc,
1412 drq_rd_addr0[6:3] == 4'hb, drq_rd_addr0[6:3] == 4'ha,
1413 drq_rd_addr0[6:3] == 4'h9, drq_rd_addr0[6:3] == 4'h8,
1414 drq_rd_addr0[6:3] == 4'h7, drq_rd_addr0[6:3] == 4'h6,
1415 drq_rd_addr0[6:3] == 4'h5, drq_rd_addr0[6:3] == 4'h4,
1416 drq_rd_addr0[6:3] == 4'h3, drq_rd_addr0[6:3] == 4'h2,
1417 drq_rd_addr0[6:3] == 4'h1, drq_rd_addr0[6:3] == 4'h0};
1418
1419assign drq_pd_mode_wr_incr[15:0] = {16{drq_wr_req}} &
1420 {drq_wr_addr0[6:3] == 4'hf, drq_wr_addr0[6:3] == 4'he,
1421 drq_wr_addr0[6:3] == 4'hd, drq_wr_addr0[6:3] == 4'hc,
1422 drq_wr_addr0[6:3] == 4'hb, drq_wr_addr0[6:3] == 4'ha,
1423 drq_wr_addr0[6:3] == 4'h9, drq_wr_addr0[6:3] == 4'h8,
1424 drq_wr_addr0[6:3] == 4'h7, drq_wr_addr0[6:3] == 4'h6,
1425 drq_wr_addr0[6:3] == 4'h5, drq_wr_addr0[6:3] == 4'h4,
1426 drq_wr_addr0[6:3] == 4'h3, drq_wr_addr0[6:3] == 4'h2,
1427 drq_wr_addr0[6:3] == 4'h1, drq_wr_addr0[6:3] == 4'h0};
1428
1429assign drq_pd_mode_rd_decr_in[15:0] = {16{(|drif_rd_entry_picked[7:0]) & ~drif_raw_hazard}} &
1430 {drq_rd_addr_picked[7:4] == 4'hf, drq_rd_addr_picked[7:4] == 4'he,
1431 drq_rd_addr_picked[7:4] == 4'hd, drq_rd_addr_picked[7:4] == 4'hc,
1432 drq_rd_addr_picked[7:4] == 4'hb, drq_rd_addr_picked[7:4] == 4'ha,
1433 drq_rd_addr_picked[7:4] == 4'h9, drq_rd_addr_picked[7:4] == 4'h8,
1434 drq_rd_addr_picked[7:4] == 4'h7, drq_rd_addr_picked[7:4] == 4'h6,
1435 drq_rd_addr_picked[7:4] == 4'h5, drq_rd_addr_picked[7:4] == 4'h4,
1436 drq_rd_addr_picked[7:4] == 4'h3, drq_rd_addr_picked[7:4] == 4'h2,
1437 drq_rd_addr_picked[7:4] == 4'h1, drq_rd_addr_picked[7:4] == 4'h0};
1438
1439mcu_drq_ctl_msff_ctl_macro__width_16 ff_pd_mode_rd_decr (
1440 .scan_in(ff_pd_mode_rd_decr_scanin),
1441 .scan_out(ff_pd_mode_rd_decr_scanout),
1442 .din(drq_pd_mode_rd_decr_in[15:0]),
1443 .dout(drq_pd_mode_rd_decr[15:0]),
1444 .l1clk(l1clk),
1445 .siclk(siclk),
1446 .soclk(soclk));
1447
1448// CLEANUP
1449
1450// fixscan start:
1451assign ff_rd_wr_val_scanin = scan_in ;
1452assign ff_rd_addr_scanin = ff_rd_wr_val_scanout ;
1453assign ff_wr_addr_scanin = ff_rd_addr_scanout ;
1454assign ff_rdq_free_scanin = ff_wr_addr_scanout ;
1455assign ff_rdbuf_valids_scanin = ff_rdq_free_scanout ;
1456assign ff_wrbuf_valids_scanin = ff_rdbuf_valids_scanout ;
1457assign ff_wrbuf_issued_scanin = ff_wrbuf_valids_scanout ;
1458assign ff_read_queue_clear_scanin = ff_wrbuf_issued_scanout ;
1459assign ff_rd_collapse_fifo_cnt_scanin = ff_read_queue_clear_scanout;
1460assign ff_rd_collapse_fifo_ent0_scanin = ff_rd_collapse_fifo_cnt_scanout;
1461assign ff_rd_collapse_fifo_ent1_scanin = ff_rd_collapse_fifo_ent0_scanout;
1462assign ff_rd_collapse_fifo_ent2_scanin = ff_rd_collapse_fifo_ent1_scanout;
1463assign ff_rd_collapse_fifo_ent3_scanin = ff_rd_collapse_fifo_ent2_scanout;
1464assign ff_rd_collapse_fifo_ent4_scanin = ff_rd_collapse_fifo_ent3_scanout;
1465assign ff_rd_collapse_fifo_ent5_scanin = ff_rd_collapse_fifo_ent4_scanout;
1466assign ff_rd_collapse_fifo_ent6_scanin = ff_rd_collapse_fifo_ent5_scanout;
1467assign ff_rd_collapse_fifo_ent7_scanin = ff_rd_collapse_fifo_ent6_scanout;
1468assign ff_wr_collapse_fifo_cnt_scanin = ff_rd_collapse_fifo_ent7_scanout;
1469assign ff_wr_collapse_fifo_ent0_scanin = ff_wr_collapse_fifo_cnt_scanout;
1470assign ff_wr_collapse_fifo_ent1_scanin = ff_wr_collapse_fifo_ent0_scanout;
1471assign ff_wr_collapse_fifo_ent2_scanin = ff_wr_collapse_fifo_ent1_scanout;
1472assign ff_wr_collapse_fifo_ent3_scanin = ff_wr_collapse_fifo_ent2_scanout;
1473assign ff_wr_collapse_fifo_ent4_scanin = ff_wr_collapse_fifo_ent3_scanout;
1474assign ff_wr_collapse_fifo_ent5_scanin = ff_wr_collapse_fifo_ent4_scanout;
1475assign ff_wr_collapse_fifo_ent6_scanin = ff_wr_collapse_fifo_ent5_scanout;
1476assign ff_wr_collapse_fifo_ent7_scanin = ff_wr_collapse_fifo_ent6_scanout;
1477assign ff_wdq_out_cntr_scanin = ff_wr_collapse_fifo_ent7_scanout;
1478assign ff_pd_mode_rd_decr_scanin = ff_wdq_out_cntr_scanout ;
1479assign scan_out = ff_pd_mode_rd_decr_scanout;
1480// fixscan end:
1481endmodule
1482
1483
1484
1485
1486
1487
1488// any PARAMS parms go into naming of macro
1489
1490module mcu_drq_ctl_msff_ctl_macro__width_6 (
1491 din,
1492 l1clk,
1493 scan_in,
1494 siclk,
1495 soclk,
1496 dout,
1497 scan_out);
1498wire [5:0] fdin;
1499wire [4:0] so;
1500
1501 input [5:0] din;
1502 input l1clk;
1503 input scan_in;
1504
1505
1506 input siclk;
1507 input soclk;
1508
1509 output [5:0] dout;
1510 output scan_out;
1511assign fdin[5:0] = din[5:0];
1512
1513
1514
1515
1516
1517
1518dff #(6) d0_0 (
1519.l1clk(l1clk),
1520.siclk(siclk),
1521.soclk(soclk),
1522.d(fdin[5:0]),
1523.si({scan_in,so[4:0]}),
1524.so({so[4:0],scan_out}),
1525.q(dout[5:0])
1526);
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539endmodule
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553// any PARAMS parms go into naming of macro
1554
1555module mcu_drq_ctl_msff_ctl_macro__width_9 (
1556 din,
1557 l1clk,
1558 scan_in,
1559 siclk,
1560 soclk,
1561 dout,
1562 scan_out);
1563wire [8:0] fdin;
1564wire [7:0] so;
1565
1566 input [8:0] din;
1567 input l1clk;
1568 input scan_in;
1569
1570
1571 input siclk;
1572 input soclk;
1573
1574 output [8:0] dout;
1575 output scan_out;
1576assign fdin[8:0] = din[8:0];
1577
1578
1579
1580
1581
1582
1583dff #(9) d0_0 (
1584.l1clk(l1clk),
1585.siclk(siclk),
1586.soclk(soclk),
1587.d(fdin[8:0]),
1588.si({scan_in,so[7:0]}),
1589.so({so[7:0],scan_out}),
1590.q(dout[8:0])
1591);
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604endmodule
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618// any PARAMS parms go into naming of macro
1619
1620module mcu_drq_ctl_msff_ctl_macro__width_1 (
1621 din,
1622 l1clk,
1623 scan_in,
1624 siclk,
1625 soclk,
1626 dout,
1627 scan_out);
1628wire [0:0] fdin;
1629
1630 input [0:0] din;
1631 input l1clk;
1632 input scan_in;
1633
1634
1635 input siclk;
1636 input soclk;
1637
1638 output [0:0] dout;
1639 output scan_out;
1640assign fdin[0:0] = din[0:0];
1641
1642
1643
1644
1645
1646
1647dff #(1) d0_0 (
1648.l1clk(l1clk),
1649.siclk(siclk),
1650.soclk(soclk),
1651.d(fdin[0:0]),
1652.si(scan_in),
1653.so(scan_out),
1654.q(dout[0:0])
1655);
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668endmodule
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682// any PARAMS parms go into naming of macro
1683
1684module mcu_drq_ctl_msff_ctl_macro__width_8 (
1685 din,
1686 l1clk,
1687 scan_in,
1688 siclk,
1689 soclk,
1690 dout,
1691 scan_out);
1692wire [7:0] fdin;
1693wire [6:0] so;
1694
1695 input [7:0] din;
1696 input l1clk;
1697 input scan_in;
1698
1699
1700 input siclk;
1701 input soclk;
1702
1703 output [7:0] dout;
1704 output scan_out;
1705assign fdin[7:0] = din[7:0];
1706
1707
1708
1709
1710
1711
1712dff #(8) d0_0 (
1713.l1clk(l1clk),
1714.siclk(siclk),
1715.soclk(soclk),
1716.d(fdin[7:0]),
1717.si({scan_in,so[6:0]}),
1718.so({so[6:0],scan_out}),
1719.q(dout[7:0])
1720);
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733endmodule
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747// any PARAMS parms go into naming of macro
1748
1749module mcu_drq_ctl_msff_ctl_macro__width_4 (
1750 din,
1751 l1clk,
1752 scan_in,
1753 siclk,
1754 soclk,
1755 dout,
1756 scan_out);
1757wire [3:0] fdin;
1758wire [2:0] so;
1759
1760 input [3:0] din;
1761 input l1clk;
1762 input scan_in;
1763
1764
1765 input siclk;
1766 input soclk;
1767
1768 output [3:0] dout;
1769 output scan_out;
1770assign fdin[3:0] = din[3:0];
1771
1772
1773
1774
1775
1776
1777dff #(4) d0_0 (
1778.l1clk(l1clk),
1779.siclk(siclk),
1780.soclk(soclk),
1781.d(fdin[3:0]),
1782.si({scan_in,so[2:0]}),
1783.so({so[2:0],scan_out}),
1784.q(dout[3:0])
1785);
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798endmodule
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812// any PARAMS parms go into naming of macro
1813
1814module mcu_drq_ctl_msff_ctl_macro__en_1__width_12 (
1815 din,
1816 en,
1817 l1clk,
1818 scan_in,
1819 siclk,
1820 soclk,
1821 dout,
1822 scan_out);
1823wire [11:0] fdin;
1824wire [10:0] so;
1825
1826 input [11:0] din;
1827 input en;
1828 input l1clk;
1829 input scan_in;
1830
1831
1832 input siclk;
1833 input soclk;
1834
1835 output [11:0] dout;
1836 output scan_out;
1837assign fdin[11:0] = (din[11:0] & {12{en}}) | (dout[11:0] & ~{12{en}});
1838
1839
1840
1841
1842
1843
1844dff #(12) d0_0 (
1845.l1clk(l1clk),
1846.siclk(siclk),
1847.soclk(soclk),
1848.d(fdin[11:0]),
1849.si({scan_in,so[10:0]}),
1850.so({so[10:0],scan_out}),
1851.q(dout[11:0])
1852);
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865endmodule
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879// any PARAMS parms go into naming of macro
1880
1881module mcu_drq_ctl_msff_ctl_macro__en_1__width_15 (
1882 din,
1883 en,
1884 l1clk,
1885 scan_in,
1886 siclk,
1887 soclk,
1888 dout,
1889 scan_out);
1890wire [14:0] fdin;
1891wire [13:0] so;
1892
1893 input [14:0] din;
1894 input en;
1895 input l1clk;
1896 input scan_in;
1897
1898
1899 input siclk;
1900 input soclk;
1901
1902 output [14:0] dout;
1903 output scan_out;
1904assign fdin[14:0] = (din[14:0] & {15{en}}) | (dout[14:0] & ~{15{en}});
1905
1906
1907
1908
1909
1910
1911dff #(15) d0_0 (
1912.l1clk(l1clk),
1913.siclk(siclk),
1914.soclk(soclk),
1915.d(fdin[14:0]),
1916.si({scan_in,so[13:0]}),
1917.so({so[13:0],scan_out}),
1918.q(dout[14:0])
1919);
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932endmodule
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946// any PARAMS parms go into naming of macro
1947
1948module mcu_drq_ctl_msff_ctl_macro__en_1__width_4 (
1949 din,
1950 en,
1951 l1clk,
1952 scan_in,
1953 siclk,
1954 soclk,
1955 dout,
1956 scan_out);
1957wire [3:0] fdin;
1958wire [2:0] so;
1959
1960 input [3:0] din;
1961 input en;
1962 input l1clk;
1963 input scan_in;
1964
1965
1966 input siclk;
1967 input soclk;
1968
1969 output [3:0] dout;
1970 output scan_out;
1971assign fdin[3:0] = (din[3:0] & {4{en}}) | (dout[3:0] & ~{4{en}});
1972
1973
1974
1975
1976
1977
1978dff #(4) d0_0 (
1979.l1clk(l1clk),
1980.siclk(siclk),
1981.soclk(soclk),
1982.d(fdin[3:0]),
1983.si({scan_in,so[2:0]}),
1984.so({so[2:0],scan_out}),
1985.q(dout[3:0])
1986);
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999endmodule
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013// any PARAMS parms go into naming of macro
2014
2015module mcu_drq_ctl_msff_ctl_macro__width_16 (
2016 din,
2017 l1clk,
2018 scan_in,
2019 siclk,
2020 soclk,
2021 dout,
2022 scan_out);
2023wire [15:0] fdin;
2024wire [14:0] so;
2025
2026 input [15:0] din;
2027 input l1clk;
2028 input scan_in;
2029
2030
2031 input siclk;
2032 input soclk;
2033
2034 output [15:0] dout;
2035 output scan_out;
2036assign fdin[15:0] = din[15:0];
2037
2038
2039
2040
2041
2042
2043dff #(16) d0_0 (
2044.l1clk(l1clk),
2045.siclk(siclk),
2046.soclk(soclk),
2047.d(fdin[15:0]),
2048.si({scan_in,so[14:0]}),
2049.so({so[14:0],scan_out}),
2050.q(dout[15:0])
2051);
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064endmodule
2065
2066
2067
2068
2069
2070
2071
2072