OpenCores
URL https://opencores.org/ocsvn/sparc64soc/sparc64soc/trunk

Subversion Repositories sparc64soc

[/] [sparc64soc/] [trunk/] [T1-CPU/] [ifu/] [sparc_ifu_ifqctl.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dmitryr
// ========== Copyright Header Begin ==========================================
2
// 
3
// OpenSPARC T1 Processor File: sparc_ifu_ifqctl.v
4
// Copyright (c) 2006 Sun Microsystems, Inc.  All Rights Reserved.
5
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES.
6
// 
7
// The above named program is free software; you can redistribute it and/or
8
// modify it under the terms of the GNU General Public
9
// License version 2 as published by the Free Software Foundation.
10
// 
11
// The above named program is distributed in the hope that it will be 
12
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
// General Public License for more details.
15
// 
16
// You should have received a copy of the GNU General Public
17
// License along with this work; if not, write to the Free Software
18
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
19
// 
20
// ========== Copyright Header End ============================================
21
////////////////////////////////////////////////////////////////////////
22
/*
23
//  Module Name: sparc_ifu_ifqctl
24
//  Description:
25
//  Contains the control logic for the ifq and mil.
26
*/
27
////////////////////////////////////////////////////////////////////////
28
// Global header file includes
29
////////////////////////////////////////////////////////////////////////
30
 
31
`include "iop.h"
32
`include "ifu.h"
33
 
34
 
35
module sparc_ifu_ifqctl(/*AUTOARG*/
36
   // Outputs
37
   ifu_lsu_inv_clear, ifu_lsu_ibuf_busy, ifu_lsu_asi_ack,
38
   ifu_lsu_ldxa_illgl_va_w2, ifu_lsu_fwd_wr_ack, ifu_lsu_pcxreq_d,
39
   ifu_lsu_destid_s, ifu_tlu_l2imiss, ifq_fcl_stallreq,
40
   ifq_swl_stallreq, ifq_fcl_flush_sonly_e, ifq_fcl_wrreq_bf,
41
   ifq_fcl_rdreq_bf, ifq_fcl_icd_wrreq_bf, ifq_fcl_ictv_wrreq_bf,
42
   ifq_erb_fwdrd_bf, ifq_erb_rdtag_f, ifq_erb_rdinst_f,
43
   ifq_erb_asi_erren_i2, ifq_erb_asi_errstat_i2,
44
   ifq_erb_asi_errinj_i2, ifq_erb_asi_erraddr_i2,
45
   ifq_erb_asi_imask_i2, ifq_erb_asiwr_i2, ifq_fcl_asird_bf,
46
   ifq_fcl_asi_tid_bf, ifq_erb_ue_rep, ifq_erb_ce_rep, ifq_erb_l2_ue,
47
   ifq_erb_io_ue, ifq_erb_ifet_ce, ifq_erb_l2err_tid,
48
   ifq_icv_wrdata_bf, ifq_icd_worden_bf, ifq_fcl_fill_thr,
49
   ifq_dtu_thrrdy, ifq_dtu_pred_rdy, ifc_ifd_filladdr4_i2,
50
   ifc_ifd_reqvalid_e, ifc_ifd_idx_sel_fwd_i2, ifc_ifd_errinv_e,
51
   ifc_ifd_uncached_e, ifc_ifd_thrid_e, ifc_ifd_pcxline_adj_d,
52
   ifc_inv_asireq_i2, ifc_ifd_repway_s, ifq_sscan_data,
53
   ifc_ifd_milfill_sel_i2_l, ifc_ifd_finst_sel_l,
54
   ifc_ifd_milreq_sel_d_l, ifc_ifd_ifqbyp_sel_fwd_l,
55
   ifc_ifd_ifqbyp_sel_inq_l, ifc_ifd_ifqbyp_sel_asi_l,
56
   ifc_ifd_ifqbyp_sel_lsu_l, ifc_ifd_ifqbyp_en_l,
57
   ifc_ifd_addr_sel_bist_i2_l, ifc_ifd_addr_sel_asi_i2_l,
58
   ifc_ifd_addr_sel_old_i2_l, ifc_ifd_addr_sel_fill_i2_l,
59
   ifq_icd_data_sel_bist_i2, ifq_icd_data_sel_fill_i2,
60
   ifq_icd_data_sel_old_i2, ifc_ifd_ldmil_sel_new, ifc_ifd_ld_inq_i1,
61
   ifc_inv_ifqadv_i2, so,
62
   // Inputs
63
   lsu_ifu_cpxpkt_wayvld_i1, ifd_ifc_milhit_s, ifd_ifc_instoffset0, ifd_ifc_instoffset1,
64
   ifd_ifc_instoffset2, ifd_ifc_instoffset3, ifd_ifc_cpxvalid_i1,
65
   ifd_ifc_cpxreq_i1, ifd_ifc_cpxreq_nxt, ifd_ifc_cpxthr_nxt,
66
   ifd_ifc_cpxvld_i2, ifd_ifc_iobpkt_i2, ifd_ifc_4bpkt_i2,
67
   ifd_ifc_cpxnc_i2, ifd_ifc_fwd2ic_i2, ifd_ifc_cpxce_i2,
68
   ifd_ifc_cpxue_i2, ifd_ifc_cpxms_i2, ifd_ifc_miladdr4_i2,
69
   ifd_ifc_asiaddr_i2, ifd_ifc_asi_vachklo_i2, ifd_ifc_destid0,
70
   ifd_ifc_destid1, ifd_ifc_destid2, ifd_ifc_destid3,
71
   ifd_ifc_newdestid_s, ifd_ifc_pcxline_d, inv_ifc_inv_pending,
72
   fcl_ifq_icmiss_s1, fcl_ifq_rdreq_s1, fcl_ifq_thr_s1,
73
   fcl_ifq_canthr, fcl_ifq_grant_bf, dtu_ifq_kill_latest_d,
74
   erb_ifq_ifeterr_d1, erb_ifq_itlberr_s1, lsu_ifu_pcxpkt_ack_d,
75
   lsu_ifu_direct_map_l1, lsu_ifu_asi_vld, lsu_ifu_asi_state,
76
   lsu_ifu_asi_load, lsu_ifu_asi_thrid, fcl_ifq_icache_en_s_l,
77
   mbist_ifq_run_bist, mbist_icache_write, mbist_icache_read,
78
   ctu_sscan_tid, rclk, se, si, gdbginit_l, arst_l, grst_l,
79
   rst_tri_en, sehold
80
   );
81
 
82
   input          lsu_ifu_cpxpkt_wayvld_i1;
83
   input [3:0]     ifd_ifc_milhit_s;      // if an Imiss hits in MIL
84
   input [1:0]    ifd_ifc_instoffset0; // to select inst to TIR
85
   input [1:0]    ifd_ifc_instoffset1; // to select inst to TIR
86
   input [1:0]    ifd_ifc_instoffset2; // to select inst to TIR
87
   input [1:0]    ifd_ifc_instoffset3; // to select inst to TIR
88
 
89
   input         ifd_ifc_cpxvalid_i1;
90
   input [`CPX_RQ_SIZE:0] ifd_ifc_cpxreq_i1;
91
 
92
   input [3:0]   ifd_ifc_cpxreq_nxt;
93
   input [1:0]   ifd_ifc_cpxthr_nxt;
94
   input         ifd_ifc_cpxvld_i2;
95
 
96
   input         ifd_ifc_iobpkt_i2;
97
   input         ifd_ifc_4bpkt_i2;
98
   input         ifd_ifc_cpxnc_i2;
99
   input         ifd_ifc_fwd2ic_i2;
100
   input         ifd_ifc_cpxce_i2,
101
                             ifd_ifc_cpxue_i2,
102
                 ifd_ifc_cpxms_i2;
103
 
104
   input [3:0]   ifd_ifc_miladdr4_i2;
105
 
106
   input [3:2]   ifd_ifc_asiaddr_i2;
107
   input         ifd_ifc_asi_vachklo_i2;
108
 
109
   input [2:0]   ifd_ifc_destid0,
110
                             ifd_ifc_destid1,
111
                             ifd_ifc_destid2,
112
                             ifd_ifc_destid3,
113
                             ifd_ifc_newdestid_s;
114
   input [4:2]   ifd_ifc_pcxline_d;
115
//   input [7:0]   ifd_ifc_mil_repway_s;   
116
 
117
   input         inv_ifc_inv_pending;
118
 
119
   input         fcl_ifq_icmiss_s1;   // icache miss
120
   input         fcl_ifq_rdreq_s1;
121
 
122
   input [1:0]   fcl_ifq_thr_s1;
123
 
124
   input [3:0]   fcl_ifq_canthr;        // cancel the imiss reqs to
125
                                        // these threads
126
   input         fcl_ifq_grant_bf;
127
 
128
   input         dtu_ifq_kill_latest_d;
129
   input         erb_ifq_ifeterr_d1;
130
   input         erb_ifq_itlberr_s1;
131
 
132
   input         lsu_ifu_pcxpkt_ack_d;
133
   input         lsu_ifu_direct_map_l1;
134
 
135
   input         lsu_ifu_asi_vld;
136
   input [7:0]   lsu_ifu_asi_state;
137
   input         lsu_ifu_asi_load;
138
   input [1:0]   lsu_ifu_asi_thrid;
139
 
140
   input         fcl_ifq_icache_en_s_l;
141
 
142
   input         mbist_ifq_run_bist,
143
                 mbist_icache_write,
144
                             mbist_icache_read;
145
 
146
   input [3:0]   ctu_sscan_tid;
147
 
148
   input         rclk,
149
                 se,
150
                 si,
151
                 gdbginit_l,
152
                 arst_l,
153
                 grst_l;
154
 
155
   input         rst_tri_en;
156
   input         sehold;
157
 
158
   // outputs
159
   output        ifu_lsu_inv_clear;
160
   output        ifu_lsu_ibuf_busy;
161
   output        ifu_lsu_asi_ack;
162
   output        ifu_lsu_ldxa_illgl_va_w2;
163
 
164
   output        ifu_lsu_fwd_wr_ack;
165
 
166
   output        ifu_lsu_pcxreq_d;
167
   output [2:0]  ifu_lsu_destid_s;
168
 
169
   output [3:0]  ifu_tlu_l2imiss;
170
 
171
   output        ifq_fcl_stallreq;
172
   output        ifq_swl_stallreq;
173
   output        ifq_fcl_flush_sonly_e;
174
 
175
   output        ifq_fcl_wrreq_bf;
176
   output        ifq_fcl_rdreq_bf;
177
 
178
   output        ifq_fcl_icd_wrreq_bf,
179
                             ifq_fcl_ictv_wrreq_bf;
180
   output        ifq_erb_fwdrd_bf;
181
   output        ifq_erb_rdtag_f;
182
   output        ifq_erb_rdinst_f;
183
   output        ifq_erb_asi_erren_i2;
184
   output        ifq_erb_asi_errstat_i2;
185
   output        ifq_erb_asi_errinj_i2;
186
   output        ifq_erb_asi_erraddr_i2;
187
   output        ifq_erb_asi_imask_i2;
188
   output        ifq_erb_asiwr_i2;
189
 
190
   output        ifq_fcl_asird_bf;
191
   output [1:0]  ifq_fcl_asi_tid_bf;
192
 
193
   output        ifq_erb_ue_rep;
194
   output        ifq_erb_ce_rep;
195
   output        ifq_erb_l2_ue;
196
   output        ifq_erb_io_ue;
197
   output        ifq_erb_ifet_ce;
198
   output [1:0]  ifq_erb_l2err_tid;
199
 
200
   output        ifq_icv_wrdata_bf;
201
   output [3:0]  ifq_icd_worden_bf;
202
 
203
   output [3:0]  ifq_fcl_fill_thr;     // should be same stage as 
204
   // fill_inst
205
   output [3:0]  ifq_dtu_thrrdy;
206
   output [3:0]  ifq_dtu_pred_rdy;
207
 
208
   output        ifc_ifd_filladdr4_i2;
209
   output        ifc_ifd_reqvalid_e;
210
   output        ifc_ifd_idx_sel_fwd_i2;
211
 
212
   output        ifc_ifd_errinv_e;
213
   output        ifc_ifd_uncached_e;
214
   output [1:0]  ifc_ifd_thrid_e;
215
   output [4:2]  ifc_ifd_pcxline_adj_d;
216
 
217
   output        ifc_inv_asireq_i2;
218
 
219
   output [1:0]  ifc_ifd_repway_s;
220
 
221
   output [3:0]  ifq_sscan_data;
222
 
223
   // mux selects
224
   output [3:0]  ifc_ifd_milfill_sel_i2_l;
225
   output [3:0]  ifc_ifd_finst_sel_l;
226
   output [3:0]  ifc_ifd_milreq_sel_d_l;
227
   output        ifc_ifd_ifqbyp_sel_fwd_l, // select next input to ifq pipe
228
                             ifc_ifd_ifqbyp_sel_inq_l,
229
                             ifc_ifd_ifqbyp_sel_asi_l,
230
                             ifc_ifd_ifqbyp_sel_lsu_l;
231
         output        ifc_ifd_ifqbyp_en_l;
232
 
233
   output        ifc_ifd_addr_sel_bist_i2_l,
234
                             ifc_ifd_addr_sel_asi_i2_l,
235
                 ifc_ifd_addr_sel_old_i2_l,
236
                             ifc_ifd_addr_sel_fill_i2_l;
237
 
238
   output        ifq_icd_data_sel_bist_i2,
239
                             ifq_icd_data_sel_fill_i2,
240
                             ifq_icd_data_sel_old_i2;
241
 
242
   // 2:1 mux selects
243
   output [3:0]  ifc_ifd_ldmil_sel_new;     // mil load enable
244
 
245
 
246
   output        ifc_ifd_ld_inq_i1;
247
 
248
   output        ifc_inv_ifqadv_i2;         // move a new op from ifq
249
         // pipe to icache
250
 
251
   output        so;
252
 
253
   //----------------------------------------------------------------------
254
   // Declarations
255
   //----------------------------------------------------------------------   
256
   // local signals
257
   wire [3:0]    thr_s1,      // s1 thread which missed in I$
258
                             thr_d1,
259
                 thr_e1,
260
                             dfthr_f,     // thread currently being filled in I$
261
                 dfthr_next_i2,
262
                             dfthr_i2,    // next thread to be filled from CPX
263
                 milfthr_i2,
264
                             dpcxthr_s,
265
                             dpcxthr_d;   // thread being transmitted to lsu
266
 
267
   wire [1:0]    thrid_d,
268
                 thrid_e;
269
 
270
   wire [3:0]    pcx_accept_d;
271
 
272
   wire          req_pending_d,
273
//                           req_pending_e,
274
                             req_accept_d,
275
//                 can_pcx_d,
276
                 pcxreq_vbit_d;
277
 
278
   wire [3:0]    comp_valid_s,
279
                             mil_valid_s,
280
                 mil_cancel;
281
 
282
   wire [3:0]    finst_i2,
283
                 finst0,
284
                 finst1,
285
                 finst2,
286
                 finst3;
287
 
288
   wire [2:0]    milchld0,
289
                             milchld1,
290
                             milchld2,
291
                             milchld3,
292
                             next_milchld,
293
                             milchld_d1;
294
   wire          milchld_vld_f,
295
                             next_milchld_i2,
296
                             milchld_vld_i2;
297
 
298
   wire [3:0]    mil0_state,
299
                 mil1_state,
300
                 mil2_state,
301
                 mil3_state;
302
 
303
   wire [2:0]    i2out;         // state machine output in i2 stage
304
 
305
   wire          any_milhit_qual_s,     // hit in MIL
306
                 any_qualhit_or_io_s,
307
                             icmiss_qual_s,
308
//                           reqq_empty,    // no pending requests in MIL
309
                             oldreq_valid,
310
                             next_wrreq_i2,
311
                             wrreq_f;
312
   wire          block_fetch_s1,
313
                 block_fetch_d1;
314
 
315
   wire [3:0]    mil_thr_ready,
316
                 all_retry_rdy_e1,
317
                 all_retry_rdy_m1;
318
   wire          retry_rdy_final_d1,
319
                 retry_rdy_e1;
320
 
321
   wire          rst_starv_ctr_l;
322
   wire          starv_alert;
323
 
324
   wire [3:0]    milhit_vec_s;
325
   wire          any_milhit_s;
326
 
327
   wire [1:0]    rand_repway_s;
328
//   wire [1:0]    mil_repway_s;
329
 
330
   wire [3:0]    errthr_d1,
331
                             err_vec_d1,
332
                             err_req;
333
   wire          errinv_d1;
334
 
335
   wire          ifeterr_qual_d1,
336
                 ifeterr_e1;
337
   wire          thr_match_d1e1;
338
   wire          ifqadv_i1;
339
 
340
   wire          ifqadvi2_nxt,
341
                 ifqadv_i2_ff;
342
   wire          access_grant_l;
343
 
344
   wire          addrbit4_i2;
345
   wire          addrbit4_nxt_i2;
346
 
347
   wire [3:0]    cpxreq_i2;
348
   wire [1:0]    cpxthr_i2;
349
 
350
 
351
   wire          uncached_i2,
352
                 uncached_s,
353
                 mil_vld_i2,
354
                 mil_uncan_i2,
355
                 mil_nc_i2,
356
                 mil_nc_e,
357
                 mil_nc_d,
358
                             uncached_fill_i2,
359
                             uncached_f;
360
 
361
   wire [3:0]    mil_nc_vec,
362
                 mil_nc_vec_nxt;
363
 
364
 
365
   wire [3:0]    pcxreq_s,          // req bit from MIL
366
                 pcxreq_qual_s,
367
//                           newpcxreq_s,       // valid new request from latest miss
368
//                           oldpcxreq_s,
369
                             rr_gnt,          // round robin grant signal
370
                             fill_addr4_i2;    // fill address bit 4 - determines
371
         // which 16B of the 32B line gets
372
         // written. Assume 0 first then 1
373
 
374
   wire          newreq_valid,    // latest S stage miss creates request.
375
                             nextreq_valid_s, // if either a new req from i$ or old
376
                                         // req from MIL is made in this cycle.
377
                             req_valid_d;     // req to LSU is valid
378
 
379
   wire          inq_vld,
380
                             inq_vld_nxt;
381
 
382
   wire          ic_pkt_i1;
383
 
384
//   wire          fill_this16b;
385
 
386
   wire [1:0]    filltid_i2,
387
                             next_filltid_i2,
388
                             filltid_f;
389
 
390
   wire          imissrtn_i2,   // input cpx is ifill return
391
                 imissrtn_next_i2,
392
                 imissrtn_f,
393
                             imissrtn_i1;   // pkt in inq is ifill ret
394
 
395
   wire          invalidate_i1;
396
 
397
   wire [3:0]    icmiss_thr_s,
398
                             icmiss_thr_d;
399
   wire          icmiss_d1,
400
                 icmiss_qual_d1;
401
   wire          canthr_s1,
402
                 canthr_d1,
403
                 canthr_s1_del1;
404
   wire          itlberr_d1;
405
 
406
   wire [2:0]    old_destid_s;
407
 
408
   wire          destid_iob_s,
409
                 destid_iob_d;
410
 
411
   wire          iosp_d1_l,
412
                 n763;
413
 
414
   wire [3:0]    wrt_tir;
415
 
416
   wire [3:0]    wr_complete_f;
417
   wire [3:0]    pred_rdy_i2;
418
   wire [3:0]    fill_retn_thr_i2;
419
 
420
   wire          filladdr4_f;
421
 
422
   wire [3:0]    milhit_to_thr_s,
423
                             icmiss_for_milchk,
424
                 qualhit_pe_s,
425
                 qualhit_or_io_s;
426
//                           milhit_qual_s;
427
 
428
   wire          l2_ue_i2,
429
                             l2_ce_i2,
430
                             io_ue_i2;
431
   wire          l2_miss_i2,
432
                 l2_miss_f;
433
//   wire [3:0]    l2ms_thr;
434
 
435
   wire          ce_rep_i2,
436
                             ue_rep_i2;
437
 
438
   wire          fwdreq_i2,
439
                 fwdreq_i3,
440
                 fwd_stall,
441
                 fwdwr_i3,
442
                 fwdrd_i3;
443
 
444
   wire          cpxnc_i3;
445
 
446
   wire          stallreq_d0,
447
                 stallreq_d1;
448
 
449
   wire          ifu_asireq_i1,
450
                 ifu_asireq_i0,
451
                 byp_sel_asi_l,
452
                 asird_i1,
453
                             asireq_i2,
454
                 asireq_i2_l,
455
                             asi_load_i1,
456
                             asi_load_i2,
457
                             asi_vld_next,
458
                 asi_vld_i0,
459
                 asi_vld_qual_i0;
460
 
461
   wire [7:0]    asi_state_i1;
462
   wire          asi_ic_data_i1,
463
                             asi_ic_data_i2,
464
                             asi_ic_tag_i1,
465
                             asi_ic_tag_i2;
466
 
467
   wire          asi_erren_i1,
468
                             asi_errstat_i1,
469
                             asi_errinj_i1,
470
                             asi_erraddr_i1,
471
                             asi_imask_i1;
472
 
473
   wire          asi_ic_data_unchk_i1,
474
                             asi_ic_tag_unchk_i1;
475
 
476
   wire          asi_erren_unchk_i1,
477
                             asi_errstat_unchk_i1,
478
                             asi_errinj_unchk_i1,
479
                             asi_erraddr_unchk_i1,
480
                             asi_imask_unchk_i1;
481
 
482
   wire          illva_i0,
483
                 illva_i1,
484
                 illva_i2,
485
                 illva_f,
486
                 illva_s,
487
                 illva_w2;
488
 
489
   wire [3:0]    word_sel_i2;
490
   wire          bist_op;
491
 
492
   wire          rdinst_bf,
493
                             rd_tag_bf;
494
 
495
   wire          errpkt_i1;
496
 
497
   wire          stpkt_i1,
498
                 strmack_i1,
499
                             ldpkt_i1,
500
                             evpkt_i1,
501
                             errpkt_i2;
502
 
503
   wire          icv_wrdata_i2,
504
                             icv_wbit_i2,
505
                             icv_wrdata_f;
506
 
507
   wire          rst_way_lfsr;
508
 
509
   wire          inq_wayvld_i1;
510
   wire          inq_wayvld_i1_nxt;
511
   wire          ldinv_i1;
512
   wire          ldinv_i2_nxt;
513
   wire          ldinv_i2;
514
 
515
   wire          ifq_reset,
516
                 rnd_reset,
517
                 ifq_reset_l;
518
 
519
 
520
   wire          clk;
521
 
522
 
523
//----------------------------------------------------------------------
524
// Code start here 
525
//----------------------------------------------------------------------
526
 
527
   assign        clk = rclk;
528
 
529
 
530
   // reset buffer
531
   dffrl_async rstff(.din (grst_l),
532
                     .q   (ifq_reset_l),
533
                     .clk (clk), .se(se), .si(), .so(),
534
                     .rst_l (arst_l));
535
 
536
   assign       ifq_reset = ~ifq_reset_l;
537
 
538
 
539
//---------
540
// MIL fsm
541
//---------   
542
   sparc_ifu_milfsm mil0(
543
                               .ifc_fsm_can_thisthr      (fcl_ifq_canthr[0]),
544
                         //     .ifc_fsm_orphan_thisthr (orphan_thr_d1[0]),
545
 
546
 
547
                               .ifc_fsm_fill_thisthr_i2  (fill_retn_thr_i2[0]),
548
                               .ifc_fsm_wr_complete_f    (wr_complete_f[0]),
549
 
550
                         .ifqadv_i2  (ifc_inv_ifqadv_i2),
551
 
552
                         .ifd_ifc_4bpkt_i2         (ifd_ifc_4bpkt_i2),
553
                               .fcl_ifq_thr_s1           (fcl_ifq_thr_s1),
554
                               .ifc_fsm_imiss_thisthr_s  (icmiss_thr_s[0]),
555
                               .ifc_fsm_milhit_s         (any_milhit_qual_s),
556
 
557
                               .ifc_fsm_hiton_thismil_s  (milhit_to_thr_s[0]),
558
 
559
                               .ifc_fsm_pcxaccept_thisthr(pcx_accept_d[0]),
560
                         .ifc_fsm_miladdr4         (ifd_ifc_miladdr4_i2[0]),
561
 
562
                               .clk                      (clk),
563
                         .se                       (se),
564
                         .si                       (si),
565
                               .reset                    (ifq_reset),
566
 
567
                         .so                       (),
568
 
569
                               .ifc_fsm_err_thisthr      (errthr_d1[0]),
570
 
571
                               // outputs        
572
                         .fsm_ifc_errreq           (err_req[0]),
573
 
574
                               .fsm_ifc_wrt_tir          (wrt_tir[0]),
575
                               .fsm_ifc_comp_valid       (comp_valid_s[0]),
576
                               .fsm_ifc_mil_valid        (mil_valid_s[0]),
577
                               .fsm_ifc_mil_cancel       (mil_cancel[0]),
578
                         .fsm_ifc_milstate         (mil0_state[3:0]),
579
 
580
                               .fsm_ifc_thr_ready        (mil_thr_ready[0]),
581
                               .fsm_ifc_pred_rdy         (pred_rdy_i2[0]),
582
                               .fsm_ifc_pcxreq           (pcxreq_s[0]),
583
                               .fsm_ifc_addrbit4_i2      (fill_addr4_i2[0]),
584
                               .fsm_ifc_milchld          (milchld0[2:0]));
585
 
586
 
587
   sparc_ifu_milfsm mil1(
588
                         .ifc_fsm_can_thisthr      (fcl_ifq_canthr[1]),
589
                         //        .ifc_fsm_orphan_thisthr   (orphan_thr_d1[1]),     
590
 
591
                               .ifc_fsm_fill_thisthr_i2  (fill_retn_thr_i2[1]),
592
                               .ifc_fsm_wr_complete_f    (wr_complete_f[1]),
593
 
594
                         .ifqadv_i2  (ifc_inv_ifqadv_i2),
595
 
596
                         .ifd_ifc_4bpkt_i2         (ifd_ifc_4bpkt_i2),
597
                               .fcl_ifq_thr_s1           (fcl_ifq_thr_s1),
598
                               .ifc_fsm_milhit_s         (any_milhit_qual_s),
599
                               .ifc_fsm_hiton_thismil_s (milhit_to_thr_s[1]),
600
                               .ifc_fsm_imiss_thisthr_s   (icmiss_thr_s[1]),
601
 
602
                               .ifc_fsm_pcxaccept_thisthr   (pcx_accept_d[1]),
603
                         //        .ifc_fsm_reqq_empty       (reqq_empty),         
604
                         .ifc_fsm_miladdr4         (ifd_ifc_miladdr4_i2[1]),
605
 
606
                               .clk                      (clk),
607
                         .se                       (se),
608
                         .si                       (si),
609
                               .reset                    (ifq_reset),
610
 
611
                               .ifc_fsm_err_thisthr      (errthr_d1[1]),
612
 
613
                               // outputs        
614
                         .fsm_ifc_errreq           (err_req[1]),
615
 
616
                               .fsm_ifc_wrt_tir          (wrt_tir[1]),
617
                         .so                       (),
618
                         //        .fsm_ifc_cm_pending       (can_miss_pending[1]),
619
                         //        .fsm_ifc_delay_mil        (delay_mil[1]),
620
                               .fsm_ifc_comp_valid       (comp_valid_s[1]),
621
                               .fsm_ifc_mil_valid        (mil_valid_s[1]),
622
                               .fsm_ifc_mil_cancel       (mil_cancel[1]),
623
                         .fsm_ifc_milstate         (mil1_state[3:0]),
624
 
625
                               .fsm_ifc_pcxreq           (pcxreq_s[1]),
626
                               .fsm_ifc_thr_ready        (mil_thr_ready[1]),
627
                               .fsm_ifc_pred_rdy         (pred_rdy_i2[1]),
628
                               .fsm_ifc_addrbit4_i2      (fill_addr4_i2[1]),
629
                               .fsm_ifc_milchld          (milchld1[2:0]));
630
 
631
   sparc_ifu_milfsm mil2(
632
                         .ifc_fsm_can_thisthr      (fcl_ifq_canthr[2]),
633
                         //        .ifc_fsm_orphan_thisthr   (orphan_thr_d1[2]),     
634
 
635
                               .ifc_fsm_fill_thisthr_i2  (fill_retn_thr_i2[2]),
636
                               .ifc_fsm_wr_complete_f    (wr_complete_f[2]),
637
 
638
                         .ifqadv_i2  (ifc_inv_ifqadv_i2),
639
 
640
                         .ifd_ifc_4bpkt_i2         (ifd_ifc_4bpkt_i2),
641
                               .fcl_ifq_thr_s1           (fcl_ifq_thr_s1),
642
                               .ifc_fsm_milhit_s         (any_milhit_qual_s),
643
                               .ifc_fsm_hiton_thismil_s (milhit_to_thr_s[2]),
644
                               .ifc_fsm_imiss_thisthr_s  (icmiss_thr_s[2]),
645
 
646
                               .ifc_fsm_pcxaccept_thisthr(pcx_accept_d[2]),
647
                         //        .ifc_fsm_reqq_empty       (reqq_empty),         
648
 
649
                         .ifc_fsm_miladdr4         (ifd_ifc_miladdr4_i2[2]),
650
 
651
                               .clk                      (clk),
652
                         .se                       (se),
653
                         .si                       (si),
654
                               .reset                    (ifq_reset),
655
 
656
                               .ifc_fsm_err_thisthr      (errthr_d1[2]),
657
 
658
                               // outputs        
659
                         .fsm_ifc_errreq           (err_req[2]),
660
 
661
                         .so                       (),
662
                         //        .fsm_ifc_cm_pending       (can_miss_pending[2]),
663
                         //        .fsm_ifc_delay_mil        (delay_mil[2]),
664
                               .fsm_ifc_wrt_tir          (wrt_tir[2]),
665
                               .fsm_ifc_comp_valid       (comp_valid_s[2]),
666
                               .fsm_ifc_mil_valid        (mil_valid_s[2]),
667
                               .fsm_ifc_mil_cancel       (mil_cancel[2]),
668
                         .fsm_ifc_milstate         (mil2_state[3:0]),
669
 
670
                               .fsm_ifc_pcxreq           (pcxreq_s[2]),
671
                               .fsm_ifc_thr_ready        (mil_thr_ready[2]),
672
                               .fsm_ifc_pred_rdy         (pred_rdy_i2[2]),
673
                               .fsm_ifc_addrbit4_i2      (fill_addr4_i2[2]),
674
                               .fsm_ifc_milchld          (milchld2[2:0]));
675
 
676
 
677
   sparc_ifu_milfsm mil3(
678
                         .ifc_fsm_can_thisthr      (fcl_ifq_canthr[3]),
679
                         //        .ifc_fsm_orphan_thisthr   (orphan_thr_d1[3]),     
680
 
681
                               .ifc_fsm_fill_thisthr_i2  (fill_retn_thr_i2[3]),
682
                               .ifc_fsm_wr_complete_f    (wr_complete_f[3]),
683
 
684
                         .ifqadv_i2  (ifc_inv_ifqadv_i2),
685
 
686
                         .ifd_ifc_4bpkt_i2         (ifd_ifc_4bpkt_i2),
687
                               .fcl_ifq_thr_s1           (fcl_ifq_thr_s1),
688
                               .ifc_fsm_milhit_s         (any_milhit_qual_s),
689
                               .ifc_fsm_hiton_thismil_s (milhit_to_thr_s[3]),
690
                               .ifc_fsm_imiss_thisthr_s   (icmiss_thr_s[3]),
691
 
692
                               .ifc_fsm_pcxaccept_thisthr(pcx_accept_d[3]),
693
                         //        .ifc_fsm_reqq_empty       (reqq_empty),         
694
 
695
                         .ifc_fsm_miladdr4         (ifd_ifc_miladdr4_i2[3]),
696
 
697
                               .clk                      (clk),
698
                         .se                       (se),
699
                         .si                       (si),
700
                               .reset                    (ifq_reset),
701
 
702
                               .ifc_fsm_err_thisthr      (errthr_d1[3]),
703
 
704
                               // outputs        
705
                         .fsm_ifc_errreq           (err_req[3]),
706
 
707
                         .so                       (),
708
                         //        .fsm_ifc_cm_pending       (can_miss_pending[3]),
709
                         //        .fsm_ifc_delay_mil        (delay_mil[3]),
710
                               .fsm_ifc_wrt_tir          (wrt_tir[3]),
711
                               .fsm_ifc_comp_valid       (comp_valid_s[3]),
712
                               .fsm_ifc_mil_valid        (mil_valid_s[3]),
713
                               .fsm_ifc_mil_cancel       (mil_cancel[3]),
714
                         .fsm_ifc_milstate         (mil3_state[3:0]),
715
 
716
                               .fsm_ifc_pcxreq           (pcxreq_s[3]),
717
                               .fsm_ifc_thr_ready        (mil_thr_ready[3]),
718
                               .fsm_ifc_pred_rdy         (pred_rdy_i2[3]),
719
                               .fsm_ifc_addrbit4_i2      (fill_addr4_i2[3]),
720
                               .fsm_ifc_milchld          (milchld3[2:0]));
721
 
722
 
723
 
724
//-------------------------------------------
725
// Fill Return Control (IFU interfac to CPX)
726
//-------------------------------------------
727
 
728
   // use soffm2 for lower setup
729
   dffe_s #(4) cpxreq_reg(.din (ifd_ifc_cpxreq_nxt),
730
                        .q   (cpxreq_i2),
731
                        .en  (ifqadv_i1),
732
                        .clk (clk), .se(se), .si(), .so());
733
   dffe_s #(2) cpxthr_reg(.din (ifd_ifc_cpxthr_nxt),
734
                        .q   (cpxthr_i2),
735
                        .en  (ifqadv_i1),
736
                        .clk (clk), .se(se), .si(), .so());
737
 
738
 
739
   // Decode CPX request
740
   assign imissrtn_i1 = (ifd_ifc_cpxreq_i1 == `CPX_IFILLPKT) ? 1'b1 : 1'b0;
741
   assign imissrtn_i2 = (cpxreq_i2 == `IFILL_RET) ? ifd_ifc_cpxvld_i2 : 1'b0;
742
 
743
   assign imissrtn_next_i2 = ifc_inv_ifqadv_i2 ? imissrtn_i2 : imissrtn_f;
744
 
745
   dff_s #(1) imsf_ff(.din (imissrtn_next_i2),
746
                    .q   (imissrtn_f),
747
                    .clk (clk), .se (se), .si(), .so());
748
 
749
   // Determine if this is an IFILL RET to one of the threads
750
   assign fill_retn_thr_i2 = dfthr_i2 & {4{imissrtn_i2}};
751
 
752
   // decode current icache fill thread
753
   assign dfthr_f[0] = ~filltid_f[1] & ~filltid_f[0];
754
   assign dfthr_f[1] = ~filltid_f[1] &  filltid_f[0];
755
   assign dfthr_f[2] =  filltid_f[1] & ~filltid_f[0];
756
   assign dfthr_f[3] =  filltid_f[1] &  filltid_f[0];
757
 
758
//`ifdef IFU_SAT
759
//   assign ifc_ifd_uncached_s = fcl_ifq_icache_en_s_l;   
760
//`else   
761
//`endif
762
 
763
   assign uncached_s = ifd_ifc_newdestid_s[2] | fcl_ifq_icache_en_s_l;
764
 
765
   // timing fix: keep nc bit locally instead of in DP
766
   assign mil_nc_vec_nxt = ({4{uncached_s & fcl_ifq_rdreq_s1}} &
767
                              thr_s1 & ~errthr_d1 |
768
                              mil_nc_vec & (mil_valid_s |
769
                                            errthr_d1));
770
 
771
   dff_s #(4) nc_reg(.din (mil_nc_vec_nxt),
772
                   .q   (mil_nc_vec),
773
                   .clk (clk), .se(se), .si(), .so());
774
 
775
   assign mil_nc_i2 = (dfthr_i2[0] & mil_nc_vec[0] |
776
                       dfthr_i2[1] & mil_nc_vec[1] |
777
                       dfthr_i2[2] & mil_nc_vec[2] |
778
                       dfthr_i2[3] & mil_nc_vec[3]);
779
 
780
   assign mil_nc_d = (dpcxthr_d[0] & mil_nc_vec[0] |
781
                      dpcxthr_d[1] & mil_nc_vec[1] |
782
                      dpcxthr_d[2] & mil_nc_vec[2] |
783
                      dpcxthr_d[3] & mil_nc_vec[3]);
784
 
785
   dff_s #(1) nce_ff(.din (mil_nc_d),
786
                   .q   (mil_nc_e),
787
                   .clk (clk), .se(se), .si(), .so());
788
   assign ifc_ifd_uncached_e = mil_nc_e;
789
 
790
//   assign uncached_fill_i2 = ifd_ifc_uncached_i2 | ifd_ifc_cpxnc_i2;
791
   assign uncached_fill_i2 = mil_nc_i2 | ifd_ifc_cpxnc_i2;
792
 
793
   // uncached fill -- do not write to icache
794
   assign uncached_i2 = ifc_inv_ifqadv_i2 ?
795
                                  uncached_fill_i2 : uncached_f;
796
 
797
   dff_s unc_ff(.din (uncached_i2),
798
                    .q   (uncached_f),
799
                    .clk (clk),
800
                    .se  (se), .si(), .so());
801
 
802
   // Determine if Icache write is done or 
803
   // if none is necessary (i.e. if this is a child process or NC)
804
   assign wr_complete_f = dfthr_f & {4{(wrreq_f & ifc_inv_ifqadv_i2 |
805
                                        milchld_vld_f |
806
                                                                uncached_f) & imissrtn_f}};
807
 
808
   // State Machine Outputs
809
   // One of these has to be chosen for I2 stage operation
810
   mux4ds #(3)  i2out_mux(.dout  (i2out),
811
                       .in0   (milchld0),
812
                       .in1   (milchld1),
813
                       .in2   (milchld2),
814
                       .in3   (milchld3),
815
                       .sel0  (dfthr_i2[0]),
816
                       .sel1  (dfthr_i2[1]),
817
                       .sel2  (dfthr_i2[2]),
818
                       .sel3  (dfthr_i2[3]));
819
 
820
   assign mil_vld_i2 = (mil_valid_s[0] & dfthr_i2[0] |
821
                        mil_valid_s[1] & dfthr_i2[1] |
822
                        mil_valid_s[2] & dfthr_i2[2] |
823
                        mil_valid_s[3] & dfthr_i2[3]);
824
 
825
   assign mil_uncan_i2 = (mil_valid_s[0] & ~mil_cancel[0] & dfthr_i2[0] |
826
                          mil_valid_s[1] & ~mil_cancel[1] & dfthr_i2[1] |
827
                          mil_valid_s[2] & ~mil_cancel[2] & dfthr_i2[2] |
828
                          mil_valid_s[3] & ~mil_cancel[3] & dfthr_i2[3]);
829
 
830
   // Don't make a wrreq if this is a child entry.  However, if this is
831
   // a child and the parent was cancelled, then go ahead and
832
   // write... is this really necessary?  Not for functionality.
833
   // 3/19: parent will write even if cancelled.  So never write child
834
   assign next_wrreq_i2 = imissrtn_i2 & mil_vld_i2 & ~uncached_fill_i2 &
835
                          ~milchld_vld_i2 & ~ifd_ifc_4bpkt_i2; // was: iobpkt_i2
836
 
837
   assign addrbit4_i2 = (milfthr_i2[0] & fill_addr4_i2[0] |
838
                         milfthr_i2[1] & fill_addr4_i2[1] |
839
                         milfthr_i2[2] & fill_addr4_i2[2] |
840
                         milfthr_i2[3] & fill_addr4_i2[3]);
841
 
842
   assign addrbit4_nxt_i2= ifc_inv_ifqadv_i2 ? addrbit4_i2 : filladdr4_f;
843
   dff_s #(1) ab4_ff(.din (addrbit4_nxt_i2),
844
                   .q   (filladdr4_f),
845
                   .clk (clk),
846
                   .se  (se), .si(), .so());
847
 
848
   assign ifc_ifd_filladdr4_i2 = addrbit4_nxt_i2;
849
 
850
   assign next_milchld = ifc_inv_ifqadv_i2 ?
851
                                  {(i2out[2] & imissrtn_i2), i2out[1:0]} :
852
                                  milchld_d1;
853
 
854
   // After the packet is processed, the child entry in the MIL,
855
   // pointed to by the reg below is processed next (if valid)
856
   dffr_s #(3)  milchldd_reg(.din  (next_milchld),
857
                                             .clk  (clk),
858
                                             .rst  (ifq_reset),
859
                                             .q    (milchld_d1),
860
                                             .se   (se), .si(), .so());
861
 
862
   assign milchld_vld_i2 = milchld_d1[2];
863
   assign next_milchld_i2 = ifc_inv_ifqadv_i2 ? milchld_d1[2] :
864
                                                      milchld_vld_f;
865
 
866
   dffr_s #(1) milchldf_ff(.din  (next_milchld_i2),
867
                       .q    (milchld_vld_f),
868
                       .clk  (clk),
869
                       .rst  (ifq_reset),
870
                       .se   (se), .si(), .so());
871
 
872
   // need this to avoid x's in the simulation
873
//   assign cpxthrid_adj_i2 = ifd_ifc_cpxthr_i2 &
874
//                                {2{ifd_ifc_cpxreq_i2[`CPX_RQ_SIZE]}};
875
 
876
   // Determine if we should process the child or a new entry
877
//   assign next_thr_sel_milchld_i2 = ifc_inv_ifqadv_i2 & milchld_vld_i2 & 
878
//                                  ~errpkt_i2;
879
//   assign next_thr_sel_milchld_i2 = milchld_vld_i2 & ~errpkt_i2;
880
 
881
 
882
   // if previous mil entry had a child, process that next
883
//   mux2ds  #(2) filltid_mux(.dout  (filltid_i2),
884
//                                      .in0   (cpxthrid_adj_i2),
885
//                                      .in1   (milchld_d1[1:0]),
886
//                                      .sel0  (~milchld_vld_i2),
887
//                                      .sel1  (milchld_vld_i2));
888
   assign filltid_i2 = milchld_vld_i2 ? milchld_d1[1:0] :
889
                                        cpxthr_i2[1:0];
890
 
891
   // decode fill thread  (either cpx thread or MIL child thread from above)
892
   // need to qual with valid bit to avoid X's in simulation
893
//   assign cpxvld_or_milc_i2 = ifd_ifc_cpxreq_i2[`CPX_RQ_SIZE] | milchld_vld_i2;
894
   assign dfthr_i2[0] = ~filltid_i2[1] & ~filltid_i2[0];
895
   assign dfthr_i2[1] = ~filltid_i2[1] &  filltid_i2[0];
896
   assign dfthr_i2[2] =  filltid_i2[1] & ~filltid_i2[0];
897
   assign dfthr_i2[3] =  filltid_i2[1] &  filltid_i2[0];
898
 
899
   dp_mux2es  #(2)  thren_mux(.dout (next_filltid_i2),
900
                                                .in0  (filltid_f),
901
                                                .in1  (filltid_i2),
902
                                                .sel  (ifc_inv_ifqadv_i2));
903
 
904
   dff_s #(2) wrthr_reg(.din  (next_filltid_i2),
905
                                  .clk  (clk),
906
                                  .q    (filltid_f),
907
                                  .se   (se), .si(), .so());
908
 
909
 
910
   dp_mux2es  #(4)  dthren_mux(.dout (dfthr_next_i2),
911
                                                 .in0  (dfthr_f),
912
                                                 .in1  (dfthr_i2),
913
                                                 .sel  (ifc_inv_ifqadv_i2));
914
 
915
 
916
   // Early start of threads
917
   // Do we need a control bit to turn this off?
918
   // -- do it in SWL
919
   assign ifq_dtu_pred_rdy =  pred_rdy_i2 & {dfthr_next_i2[3:0]} &
920
                              {4{imissrtn_next_i2}};
921
 
922
// If timing is a problem resort to:
923
//   assign ifq_dtu_pred_rdy =  pred_rdy_i2 & {4{ifc_inv_ifqadv_i2}} &
924
//                              dfthr_i2 & {4{imissrtn_i2}};
925
 
926
 
927
 
928
   // pick 16B half cache line which contains the instruction we want
929
//   assign fill_this16b = ~(ifc_ifd_filladdr4_i2 ^ ifd_ifc_missaddr4_i2);
930
                         // | ifd_ifc_4bpkt_i2;
931
 
932
   // write to thread instruction register
933
//   assign ifq_fcl_fill_thr = wrt_tir & {4{fill_this16b | ifd_ifc_4bpkt_i2}};
934
//   assign ifq_fcl_fill_thr = wrt_tir & {4{fill_this16b}};
935
   assign ifq_fcl_fill_thr = wrt_tir | thr_d1 & {4{itlberr_d1 &
936
                                                   ~canthr_d1 &
937
                                                   icmiss_d1 &
938
                                                   ~canthr_s1_del1}};
939
 
940
   // Select instruction to send to TIR
941
   // TBD: Need to find out how the inst from boot PROM is aligned -- Done
942
   // From kinkee 02/21/03: It is aligned to the correct 4B of the 16B 
943
   // packet.  The other locations are X.
944
   assign finst0[0] = ~ifd_ifc_instoffset0[1] & ~ifd_ifc_instoffset0[0];
945
   assign finst0[1] = ~ifd_ifc_instoffset0[1] &  ifd_ifc_instoffset0[0];
946
   assign finst0[2] =  ifd_ifc_instoffset0[1] & ~ifd_ifc_instoffset0[0];
947
   assign finst0[3] =  ifd_ifc_instoffset0[1] &  ifd_ifc_instoffset0[0];
948
 
949
   assign finst1[0] = ~ifd_ifc_instoffset1[1] & ~ifd_ifc_instoffset1[0];
950
   assign finst1[1] = ~ifd_ifc_instoffset1[1] &  ifd_ifc_instoffset1[0];
951
   assign finst1[2] =  ifd_ifc_instoffset1[1] & ~ifd_ifc_instoffset1[0];
952
   assign finst1[3] =  ifd_ifc_instoffset1[1] &  ifd_ifc_instoffset1[0];
953
 
954
   assign finst2[0] = ~ifd_ifc_instoffset2[1] & ~ifd_ifc_instoffset2[0];
955
   assign finst2[1] = ~ifd_ifc_instoffset2[1] &  ifd_ifc_instoffset2[0];
956
   assign finst2[2] =  ifd_ifc_instoffset2[1] & ~ifd_ifc_instoffset2[0];
957
   assign finst2[3] =  ifd_ifc_instoffset2[1] &  ifd_ifc_instoffset2[0];
958
 
959
   assign finst3[0] = ~ifd_ifc_instoffset3[1] & ~ifd_ifc_instoffset3[0];
960
   assign finst3[1] = ~ifd_ifc_instoffset3[1] &  ifd_ifc_instoffset3[0];
961
   assign finst3[2] =  ifd_ifc_instoffset3[1] & ~ifd_ifc_instoffset3[0];
962
   assign finst3[3] =  ifd_ifc_instoffset3[1] &  ifd_ifc_instoffset3[0];
963
 
964
//   mux4ds #(4) finst_mx(.dout (finst_i2),
965
//                        .in0  (finst0),
966
//                        .in1  (finst1),
967
//                        .in2  (finst2),
968
//                        .in3  (finst3),
969
//                        .sel0 (dfthr_i2[0]),
970
//                        .sel1 (dfthr_i2[1]),
971
//                        .sel2 (dfthr_i2[2]),
972
//                        .sel3 (dfthr_i2[3]));
973
 
974
   wire [3:0] finst_ev,
975
              finst_od,
976
              finst_i2_l;
977
   wire [1:0] filltid_i2_l;
978
   bw_u1_inv_10x UZsize_ftid_bf0(.z (filltid_i2_l[0]),
979
                                 .a (filltid_i2[0]));
980
   bw_u1_inv_20x UZsize_ftid_bf1(.z (filltid_i2_l[1]),
981
                                 .a (filltid_i2[1]));
982
   // use bw_u1_muxi21_4x
983
   assign finst_ev = filltid_i2_l[1] ? finst0 : finst2;
984
   assign finst_od = filltid_i2_l[1] ? finst1 : finst3;
985
   assign finst_i2_l = filltid_i2_l[0] ? (~finst_ev) : (~finst_od);
986
   assign finst_i2 = ~finst_i2_l;
987
 
988
   assign ifc_ifd_finst_sel_l = ~finst_i2;
989
 
990
   // pick MIL entry corresponding to current thread
991
   assign milfthr_i2[0] = ~cpxthr_i2[1] & ~cpxthr_i2[0];
992
   assign milfthr_i2[1] = ~cpxthr_i2[1] &  cpxthr_i2[0];
993
   assign milfthr_i2[2] =  cpxthr_i2[1] & ~cpxthr_i2[0];
994
   assign milfthr_i2[3] =  cpxthr_i2[1] &  cpxthr_i2[0];
995
   assign ifc_ifd_milfill_sel_i2_l = ~milfthr_i2;
996
 
997
   // write request
998
   // assign ifq_fcl_wrreq_bf = ifc_inv_ifqadv_i2 ? next_wrreq_i2 : wrreq_f;
999
   // assign ifq_fcl_wrreq_bf = ~ifc_inv_ifqadv_i2 | next_wrreq_i2;
1000
   assign ifq_fcl_wrreq_bf = wrreq_f & ~ifc_inv_ifqadv_i2 | next_wrreq_i2;
1001
 
1002
   dffr_s #(1) wrreq_ff(.din (ifq_fcl_wrreq_bf),
1003
                                  .clk (clk),
1004
                                  .q   (wrreq_f),
1005
                                  .rst (ifq_reset),
1006
                                  .se  (se), .si(), .so());
1007
 
1008
   // starvation check
1009
   // if a write is not granted for 24 cycles, sound the alarm
1010
   sparc_ifu_ctr5 starv_ctr(
1011
                                              // Outputs
1012
                                              .limit    (starv_alert),
1013
                                              .so       (so),
1014
                                              // Inputs
1015
                                              .clk      (clk),
1016
                                              .se       (se),
1017
                                              .si       (si),
1018
                                              .rst_ctr_l (rst_starv_ctr_l));
1019
   assign rst_starv_ctr_l = ~ifq_reset & wrreq_f;
1020
 
1021
   // advance in i2 when a write ack is received or if not a fill
1022
   // Can help timing of this signal by doing
1023
   //  ifqadv_nxt = ~ifq_fcl_wrreq_bf | fcl_icd_index_sel_ifq_bf
1024
   assign access_grant_l = ~fcl_ifq_grant_bf;
1025
   bw_u1_nand2_2x UZsize_acc_n2(.z (ifqadvi2_nxt),
1026
                                .a (ifq_fcl_wrreq_bf),
1027
                                .b (access_grant_l));
1028
   dff_s #(1) qadv_ff(.din (ifqadvi2_nxt),
1029
                    .q   (ifqadv_i2_ff),
1030
                    .clk (clk), .se(se), .si(), .so());
1031
   assign ifc_inv_ifqadv_i2 = ifqadv_i2_ff;
1032
 
1033
 
1034
 
1035
   // advance in i1 when a write ack is received AND there are no
1036
   // child threads to be taken care of
1037
   assign ifqadv_i1 = (ifc_inv_ifqadv_i2 & ~next_milchld[2] & ~fwd_stall) |
1038
                        ifq_reset;
1039
 
1040
//-----------------------------------
1041
// Errors and Error Packet
1042
//-----------------------------------   
1043
 
1044
   assign errpkt_i1 = (ifd_ifc_cpxreq_i1 == `CPX_ERRPKT) ? 1'b1 : 1'b0;
1045
   assign errpkt_i2 = (cpxreq_i2 == `ERR_RET) ? ifd_ifc_cpxvld_i2 : 1'b0;
1046
 
1047
   // Reported Errors are not logged in ERB
1048
   assign ce_rep_i2 = ifd_ifc_cpxce_i2 & ~ifd_ifc_cpxue_i2 & errpkt_i2 &
1049
                            ifc_inv_ifqadv_i2;
1050
   assign ue_rep_i2 = ifd_ifc_cpxue_i2 & errpkt_i2 & ifc_inv_ifqadv_i2;
1051
 
1052
   dff_s #(1) cerep_ff(.din (ce_rep_i2),
1053
                                 .q   (ifq_erb_ce_rep),
1054
                                 .clk (clk), .se(se), .si(), .so());
1055
   dff_s #(1) uerep_ff(.din (ue_rep_i2),
1056
                                 .q   (ifq_erb_ue_rep),
1057
                                 .clk (clk), .se(se), .si(), .so());
1058
 
1059
//   dff #(2) ertid_reg(.din (filltid_i2),
1060
//                                .q   (ifq_erb_l2err_tid),
1061
//                                .clk (clk), .se(se), .si(), .so());
1062
   // send thread id one cycle earlier to help crit path
1063
   assign ifq_erb_l2err_tid = filltid_i2;
1064
 
1065
   // Ifetch Errors are logged in ERB
1066
   assign l2_ce_i2 = ifd_ifc_cpxce_i2 & ~ifd_ifc_cpxue_i2 & imissrtn_i2 &
1067
                           ifc_inv_ifqadv_i2 & mil_uncan_i2;
1068
   assign l2_ue_i2 = ifd_ifc_cpxue_i2 & imissrtn_i2 & ~ifd_ifc_iobpkt_i2 &
1069
                           ifc_inv_ifqadv_i2 & mil_uncan_i2;
1070
   assign io_ue_i2 = ifd_ifc_cpxue_i2 & imissrtn_i2 & ifd_ifc_iobpkt_i2 &
1071
                           ifc_inv_ifqadv_i2 & mil_uncan_i2;
1072
 
1073
   dff_s #(1) l2ce_ff(.din (l2_ce_i2),
1074
                                .q   (ifq_erb_ifet_ce),
1075
                                .clk (clk), .se(se), .si(), .so());
1076
   dff_s #(1) l2ue_ff(.din (l2_ue_i2),
1077
                                .q   (ifq_erb_l2_ue),
1078
                                .clk (clk), .se(se), .si(), .so());
1079
   dff_s #(1) ioue_ff(.din (io_ue_i2),
1080
                                .q   (ifq_erb_io_ue),
1081
                                .clk (clk), .se(se), .si(), .so());
1082
 
1083
   assign l2_miss_i2 = ifd_ifc_cpxms_i2 & imissrtn_i2 & ifc_inv_ifqadv_i2;
1084
   dff_s #(1) l2ms_ff(.din (l2_miss_i2),
1085
                                .q   (l2_miss_f),
1086
                                .clk (clk), .se(se), .si(), .so());
1087
 
1088
   assign ifu_tlu_l2imiss = dfthr_f & {4{l2_miss_f}};
1089
 
1090
//--------------------------------------------
1091
// Miss Request Control (IFU interface to PCX)
1092
//--------------------------------------------
1093
 
1094
   // decode imiss thread
1095
   assign thr_s1[0] = ~fcl_ifq_thr_s1[0] & ~fcl_ifq_thr_s1[1];
1096
   assign thr_s1[1] =  fcl_ifq_thr_s1[0] & ~fcl_ifq_thr_s1[1];
1097
   assign thr_s1[2] = ~fcl_ifq_thr_s1[0] & fcl_ifq_thr_s1[1];
1098
   assign thr_s1[3] =  fcl_ifq_thr_s1[0] & fcl_ifq_thr_s1[1];
1099
 
1100
   // signal ic miss to thread MIL state machines
1101
   assign icmiss_thr_s = {4{fcl_ifq_icmiss_s1 & ~block_fetch_s1}} & thr_s1 &
1102
                               ~icmiss_thr_d;
1103
 
1104
//   dff #(4) icmsreg(.din  (icmiss_thr_s),
1105
//                              .clk  (clk),
1106
//                              .q    (icmiss_thr_d),
1107
//                              .se   (se), .si(), .so());
1108
 
1109
   dff_s #(1) icmsd_ff(.din  (fcl_ifq_icmiss_s1),
1110
                                 .clk  (clk),
1111
                                 .q    (icmiss_d1),
1112
                                 .se   (se), .si(), .so());
1113
 
1114
   assign icmiss_qual_d1 = icmiss_d1 & ~(thr_match_d1e1 & ifeterr_e1);
1115
 
1116
   // bug 5926
1117
   assign n763 = ~ifd_ifc_newdestid_s[2];
1118
   dff_s #(1) iosp_ff(.din (n763),
1119
                                .q   (iosp_d1_l),
1120
                                .clk (clk), .se(se), .si(), .so());
1121
 
1122
   assign icmiss_thr_d = {4{icmiss_d1 | erb_ifq_ifeterr_d1 & iosp_d1_l}} & thr_d1 |
1123
                         {4{ifeterr_e1}} & thr_e1;
1124
 
1125
   dff_s #(4) thrdreg(.din  (thr_s1),
1126
                                .clk  (clk),
1127
                                .q    (thr_d1),
1128
                                .se   (se), .si(), .so());
1129
 
1130
   dff_s #(4) threreg(.din  (thr_d1),
1131
                                .clk  (clk),
1132
                                .q    (thr_e1),
1133
                                .se   (se), .si(), .so());
1134
 
1135
   dff_s #(1) erre_ff(.din (ifeterr_qual_d1),
1136
                    .q   (ifeterr_e1),
1137
                    .clk (clk), .se(se), .si(), .so());
1138
   assign thr_match_d1e1 =  (thr_d1[0] & thr_e1[0] |
1139
                             thr_d1[1] & thr_e1[1] |
1140
                             thr_d1[2] & thr_e1[2] |
1141
                             thr_d1[3] & thr_e1[3]);
1142
 
1143
//   assign ifeterr_qual_d1 = ~(thr_match_d1e1 & ifeterr_e1) & ~canthr_d1 & 
1144
//                               erb_ifq_ifeterr_d1;
1145
   assign ifeterr_qual_d1 = ~(thr_match_d1e1 & ifeterr_e1) &
1146
                               erb_ifq_ifeterr_d1 & iosp_d1_l;
1147
 
1148
   assign errthr_d1 = (thr_d1 & {4{ifeterr_qual_d1 & ~block_fetch_d1}});
1149
 
1150
   // If misses to same thread, (in successive cycles), ignore
1151
   assign ifc_ifd_ldmil_sel_new = (thr_s1 & {4{fcl_ifq_rdreq_s1}} &
1152
                                                           ~errthr_d1 & ~mil_valid_s);
1153
 
1154
   // Check hit in MIL -- a thread cannot hit 
1155
   //   1. its own MIL
1156
   //   2. an MIL that is being filled
1157
   //   3. if it is to an IOB line
1158
   assign qualhit_or_io_s = ifd_ifc_milhit_s & comp_valid_s &
1159
                                  ~thr_s1 &
1160
                            ~fill_retn_thr_i2 &
1161
                            {4{~ifd_ifc_newdestid_s[2]}};
1162
 
1163
   assign any_qualhit_or_io_s = (qualhit_or_io_s[0] |
1164
                                             qualhit_or_io_s[1] |
1165
                                             qualhit_or_io_s[2] |
1166
                                             qualhit_or_io_s[3]);
1167
 
1168
//   assign milhit_qual_s = ifd_ifc_milhit_s & comp_valid_s & 
1169
//                              ~thr_s1 & 
1170
//                          ~fill_retn_thr_i2 & 
1171
//                          {4{~ifd_ifc_newdestid_s[2]}};
1172
 
1173
//   assign any_milhit_qual_s = any_qualhit_or_io_s & ~ifd_ifc_newdestid_s[2];
1174
   assign any_milhit_qual_s = any_qualhit_or_io_s;
1175
 
1176
   // Generate Replacement Way
1177
   // Make sure a req doesn't go out to a different way than 
1178
   // what is pending
1179
   assign milhit_vec_s = ifd_ifc_milhit_s & (mil_valid_s | errthr_d1);
1180
   assign any_milhit_s = (|milhit_vec_s[3:0]);
1181
 
1182
//   assign mil_repway_s = (ifd_ifc_mil_repway_s[7:6] & {2{milhit_vec_s[3]}} | 
1183
//                          ifd_ifc_mil_repway_s[5:4] & {2{milhit_vec_s[2]}} | 
1184
//                          ifd_ifc_mil_repway_s[3:2] & {2{milhit_vec_s[1]}} | 
1185
//                          ifd_ifc_mil_repway_s[1:0] & {2{milhit_vec_s[0]}});
1186
 
1187
//   assign ifc_ifd_repway_s = any_milhit_s ? mil_repway_s : rand_repway_s;
1188
   assign ifc_ifd_repway_s = rand_repway_s;
1189
 
1190
   // pick any way at random
1191
   // reset with dbg_init as well
1192
   sparc_ifu_lfsr5  lfsr(.out (rand_repway_s),
1193
                                           .clk  (clk),
1194
                                           .advance (fcl_ifq_icmiss_s1),
1195
                                           .reset (rst_way_lfsr),
1196
                                           .se (se),
1197
                                           .si (si),
1198
                                           .so (so));
1199
 
1200
   assign rst_way_lfsr = ifq_reset | lsu_ifu_direct_map_l1 | ~gdbginit_l;
1201
 
1202
   // check if miss req is valid in a given pipe stage
1203
   assign canthr_s1 = (fcl_ifq_canthr[0] & thr_s1[0] |
1204
                       fcl_ifq_canthr[1] & thr_s1[1] |
1205
                       fcl_ifq_canthr[2] & thr_s1[2] |
1206
                       fcl_ifq_canthr[3] & thr_s1[3]);
1207
   assign canthr_d1 = (fcl_ifq_canthr[0] & thr_d1[0] |
1208
                       fcl_ifq_canthr[1] & thr_d1[1] |
1209
                       fcl_ifq_canthr[2] & thr_d1[2] |
1210
                       fcl_ifq_canthr[3] & thr_d1[3]);
1211
 
1212
   // retry a fetch if the imiss occurs while it is being filled
1213
//   assign block_fetch_s1 = any_milhit_s & 
1214
//                           ~(any_qualhit_or_io_s | ifd_ifc_newdestid_s[2]) |
1215
//                           dtu_ifq_kill_latest_d;
1216
   assign block_fetch_s1 = any_milhit_s & ~ifd_ifc_newdestid_s[2] &
1217
                           ~any_qualhit_or_io_s |
1218
                           dtu_ifq_kill_latest_d |
1219
                           erb_ifq_itlberr_s1;
1220
 
1221
   dff_s #(1) bfd_ff(.din (block_fetch_s1),
1222
                   .q   (block_fetch_d1),
1223
                   .clk (clk), .se(se), .si(), .so());
1224
 
1225
   dff_s #(1) tlbe_ff(.din (erb_ifq_itlberr_s1),
1226
                    .q   (itlberr_d1),
1227
                    .clk (clk), .se(se), .si(), .so());
1228
 
1229
//   assign retry_rdy_s1 = block_fetch_s1 & fcl_ifq_icmiss_s1;
1230
//   dff #(1) retrd_ff(.din (retry_rdy_s1),
1231
//                     .q   (retry_rdy_d1),
1232
//                     .clk (clk), .se(se), .si(), .so());
1233
 
1234
   assign retry_rdy_final_d1 = block_fetch_d1 & (icmiss_qual_d1 |
1235
                                                 ifeterr_qual_d1);
1236
   dff_s #(1) retre_ff(.din (retry_rdy_final_d1),
1237
                     .q   (retry_rdy_e1),
1238
                     .clk (clk), .se(se), .si(), .so());
1239
 
1240
   assign all_retry_rdy_e1 = {4{retry_rdy_e1}} & thr_e1;
1241
   dff_s #(4) retrm_reg(.din (all_retry_rdy_e1),
1242
                      .q   (all_retry_rdy_m1),
1243
                     .clk (clk), .se(se), .si(), .so());
1244
 
1245
   assign ifq_dtu_thrrdy = mil_thr_ready | all_retry_rdy_m1;
1246
 
1247
//   assign retry_fetch_s1 = block_fetch_s1 & fcl_ifq_icmiss_s1 & 
1248
//                           ~canthr_s1;
1249
   dff_s #(1) cans_ff(.din (canthr_s1),
1250
                    .q   (canthr_s1_del1),
1251
                    .clk (clk), .se(se), .si(), .so());
1252
 
1253
   assign ifq_fcl_flush_sonly_e = (block_fetch_d1 &
1254
                                   (icmiss_qual_d1 & ~canthr_s1_del1 |
1255
                                    ifeterr_qual_d1) &
1256
                                   ~canthr_d1 & ~itlberr_d1);
1257
 
1258
   // Determine which thread's MIL was hit, if at all
1259
   // first check if this really was an imiss
1260
   assign icmiss_for_milchk = thr_s1 & ~icmiss_thr_d & ~errthr_d1;
1261
   assign icmiss_qual_s = (|icmiss_for_milchk[3:0]) & fcl_ifq_icmiss_s1 &
1262
                          ~dtu_ifq_kill_latest_d & ~erb_ifq_itlberr_s1;
1263
 
1264
   // since multiple requests can be outstanding when an error is
1265
   // encountered, need to prioritise the mil hits.
1266
   // TBD: there must be a cleaner way to do this!
1267
   assign qualhit_pe_s[0] = qualhit_or_io_s[0];
1268
   assign qualhit_pe_s[1] = ~qualhit_or_io_s[0] & qualhit_or_io_s[1];
1269
   assign qualhit_pe_s[2] = ~qualhit_or_io_s[0] & ~qualhit_or_io_s[1] &
1270
                             qualhit_or_io_s[2];
1271
   assign qualhit_pe_s[3] = ~qualhit_or_io_s[0] & ~qualhit_or_io_s[1] &
1272
                            ~qualhit_or_io_s[2] & qualhit_or_io_s[3];
1273
 
1274
   // A thread cannot hit on an MIL to the IOB
1275
   assign milhit_to_thr_s = qualhit_pe_s & {4{icmiss_qual_s &
1276
                                                 ~ifd_ifc_newdestid_s[2]}};
1277
 
1278
   // Make Request to PCX if miss in Icache and MIL
1279
   // determine if we need to send req to L2
1280
//   assign newpcxreq_s = icmiss_for_milchk & ~fcl_ifq_canthr;
1281
//   assign newreq_valid = fcl_ifq_icmiss_s1 & ~dtu_ifq_kill_latest_d & 
1282
//                             (newpcxreq_s[0] | 
1283
//                                          newpcxreq_s[1] | 
1284
//                                          newpcxreq_s[2] | 
1285
//                                          newpcxreq_s[3]) & 
1286
//                           (~any_milhit_s | ifd_ifc_newdestid_s[2]);
1287
 
1288
   assign newreq_valid = icmiss_qual_s &
1289
                          (~any_milhit_s | ifd_ifc_newdestid_s[2]);
1290
 
1291
   // check if there are any old requests outstanding, that are not
1292
   // current in  the D stage. 
1293
   assign pcxreq_qual_s = pcxreq_s & ~(dpcxthr_d & {4{req_valid_d}});
1294
 
1295
//   assign reqq_empty = ~(|pcxreq_qual_s[3:0]);
1296
//   assign oldpcxreq_s = pcxreq_qual_s & rr_gnt & ~fcl_ifq_canthr;
1297
//   assign oldreq_valid = (|oldpcxreq_s);
1298
//   assign oldpcxreq_s = pcxreq_qual_s & rr_gnt;   
1299
   assign oldreq_valid = (|pcxreq_qual_s);
1300
 
1301
   // Send out PCX request in round robin order if there are other
1302
   // reqests pending.  If the request queue is empty send this req
1303
//   assign nextreq_valid_s = ~reqq_empty | newreq_valid;
1304
 
1305
   assign nextreq_valid_s = oldreq_valid | newreq_valid | req_pending_d;
1306
 
1307
   assign rnd_reset = ifq_reset | ~gdbginit_l;
1308
 
1309
   // round robin assignment to pcx
1310
   sparc_ifu_rndrob  pcxrndrob(.req_vec   (pcxreq_qual_s),
1311
                                                 .grant_vec (rr_gnt),
1312
                                                 .advance   (req_accept_d),
1313
                                                 .rst_tri_enable (rst_tri_en),
1314
                                                 .clk       (clk),
1315
                                                 .reset     (rnd_reset),
1316
                                                 .se  (se),
1317
                                                 .si (si),
1318
                                                 .so ());
1319
 
1320
   // if req queue is empty forward the new request to pcx
1321
   // if not store it in the MIL
1322
   assign dpcxthr_s  = req_pending_d ? dpcxthr_d :
1323
                             ~oldreq_valid ? thr_s1    :
1324
                                             rr_gnt;
1325
   dff_s #(4) pcxthr_ff(.din (dpcxthr_s),
1326
                                  .clk (clk),
1327
                                  .q   (dpcxthr_d),
1328
                                  .se  (se), .si(), .so());
1329
 
1330
   assign thrid_d[0] = dpcxthr_d[3] | dpcxthr_d[1];
1331
   assign thrid_d[1] = dpcxthr_d[3] | dpcxthr_d[2];
1332
   dff_s #(2) tide_reg(.din (thrid_d),
1333
                     .q   (thrid_e),
1334
                     .clk (clk), .se(se), .si(), .so());
1335
   assign ifc_ifd_thrid_e = thrid_e;
1336
 
1337
   // Determine the destination to which the request is made:
1338
   mux4ds #(3) dest_mux(.dout (old_destid_s),
1339
                                    .in0  (ifd_ifc_destid0[2:0]),
1340
                                    .in1  (ifd_ifc_destid1[2:0]),
1341
                                    .in2  (ifd_ifc_destid2[2:0]),
1342
                                    .in3  (ifd_ifc_destid3[2:0]),
1343
                                    .sel0 (rr_gnt[0]),
1344
                                    .sel1 (rr_gnt[1]),
1345
                                    .sel2 (rr_gnt[2]),
1346
                                    .sel3 (rr_gnt[3]));
1347
 
1348
//   mux2ds #(3) fdest_mux(.dout (destid_s),
1349
//                                   .in0  (ifd_ifc_newdestid_s),
1350
//                                   .in1  (old_destid_s),
1351
//                                   .sel0 (~oldreq_valid),
1352
//                                   .sel1 (oldreq_valid));
1353
 
1354
//   assign destid_s  = req_pending_d ? ifu_lsu_destid_d    :
1355
//                          ~oldreq_valid ? ifd_ifc_newdestid_s : 
1356
//                                          old_destid_s;
1357
   assign ifu_lsu_destid_s = oldreq_valid ? old_destid_s :
1358
                                            ifd_ifc_newdestid_s;
1359
 
1360
   // remove this
1361
   assign destid_iob_s  = req_pending_d ? destid_iob_d :
1362
                                          ifu_lsu_destid_s[2];
1363
   dff_s #(1) destd_reg(.din (destid_iob_s),
1364
                                  .q   (destid_iob_d),
1365
                                  .clk (clk), .se(se), .si(), .so());
1366
 
1367
   // If this is going to any L2 bank, zero out the line address 
1368
   // for Rams 
1369
   assign ifc_ifd_pcxline_adj_d[4:2] = ifd_ifc_pcxline_d[4:2] &
1370
                                       {3{destid_iob_d}};
1371
 
1372
   // advace req 
1373
   dffr_s #(1) pcxreqvd_ff(.din  (nextreq_valid_s),
1374
                                     .clk  (clk),
1375
                                     .rst  (ifq_reset),
1376
                                     .q    (req_valid_d),
1377
                                     .se   (se), .si(), .so());
1378
 
1379
   assign ifu_lsu_pcxreq_d = req_valid_d;
1380
 
1381
//   assign req_pending_d = req_valid_d & ~can_pcx_d & ~lsu_ifu_pcxpkt_ack_d;
1382
   assign req_pending_d = req_valid_d & ~(lsu_ifu_pcxpkt_ack_d & ~errinv_d1);
1383
   assign req_accept_d = req_valid_d & lsu_ifu_pcxpkt_ack_d;
1384
//   assign rr_advance_d = req_accept_d & ~errinv_d1
1385
 
1386
   // Signal to FSM if pcx request has been accepted by LSU
1387
   assign pcx_accept_d = dpcxthr_d & {4{req_accept_d}};
1388
   // Alternate implementation with canthr delayed by a cycle
1389
//   assign pcxreq_vbit_d = req_valid_d & ~can_pcx_d;
1390
//   assign pcx_accept_d = dpcxthr_d & {4{req_accept_d}} & ~fcl_ifq_canthr;
1391
 
1392
   // check if there was an error to this thread
1393
   assign err_vec_d1 = dpcxthr_d & (errthr_d1 | err_req);
1394
   assign errinv_d1 = (|err_vec_d1[3:0]);
1395
 
1396
   dff_s #(1) errinv_ff(.din (errinv_d1),
1397
                                  .q   (ifc_ifd_errinv_e),
1398
                                  .clk (clk), .se(se), .si(), .so());
1399
 
1400
   assign pcxreq_vbit_d = req_valid_d;
1401
   dff_s #(1) pcxreqve_ff(.din  (pcxreq_vbit_d),  // same as ifu_lsu_pcxreq_d
1402
                                    .clk  (clk),
1403
                                    .q    (ifc_ifd_reqvalid_e),
1404
                                    .se   (se), .si(), .so());
1405
 
1406
//   dff #(1) pcxreqpe_ff(.din  (req_pending_d),
1407
//                                  .clk  (clk),
1408
//                                  .q    (req_pending_e),
1409
//                                  .se   (se), .si(), .so());
1410
 
1411
   // advance pcx request if there is no prev request pending
1412
   // the data is deliberately held valid for one extra cycle.  this
1413
   // is legacy stuff.  LSU guarantees that the data is picked up
1414
   // minimum 1 cycle after request is made. 
1415
//   assign ifc_ifd_nxtpcx_sel_new_d = ~req_pending_e;
1416
//   assign ifc_ifd_nxtpcx_sel_new_d = 1'b1;   
1417
 
1418
   // Select which MIL request to send out to PCX
1419
   assign ifc_ifd_milreq_sel_d_l[0] = ~dpcxthr_d[0] & ~rst_tri_en;
1420
   assign ifc_ifd_milreq_sel_d_l[1] = ~dpcxthr_d[1] | rst_tri_en;
1421
   assign ifc_ifd_milreq_sel_d_l[2] = ~dpcxthr_d[2] | rst_tri_en;
1422
   assign ifc_ifd_milreq_sel_d_l[3] = ~dpcxthr_d[3] | rst_tri_en;
1423
 
1424
 
1425
//-----------------------------
1426
// Invalidate Controls
1427
//----------------------------
1428
   assign stpkt_i1 = (ifd_ifc_cpxreq_i1 == `CPX_STRPKT) ? 1'b1 : 1'b0;
1429
   assign strmack_i1 = (ifd_ifc_cpxreq_i1 == `CPX_STRMACK) ? 1'b1 : 1'b0;
1430
   assign evpkt_i1 = (ifd_ifc_cpxreq_i1 == `CPX_EVPKT) ? 1'b1 : 1'b0;
1431
   assign ldpkt_i1 = (ifd_ifc_cpxreq_i1 == `CPX_LDPKT) ? 1'b1 : 1'b0;
1432
 
1433
   assign invalidate_i1 = (stpkt_i1 | strmack_i1 | evpkt_i1 | ldpkt_i1);
1434
   assign ifu_lsu_inv_clear = ~(invalidate_i1 | inv_ifc_inv_pending);
1435
//       assign ifc_inv_wrreq_i2 = (imissrtn_i2 |
1436
//                              asireq_i2 & asi_ic_tag_i2 & ~asi_load_i2 |
1437
//                                              mbist_icache_write);
1438
 
1439
//   assign wrt_en_wd0_i2 = inv_ifc_word0_inv_i2 & (stpkt_i2 | evpkt_i2) |
1440
//                          ldinv_i2 & ~ifd_ifc_ldaddr5_i2 |
1441
//                                    (imissrtn_i2 |
1442
//                           asireq_i2 & asi_ic_tag_i2 & ~asi_load_i2 |
1443
//                                           mbist_icache_write) & 
1444
//                             ~ifd_ifc_missaddr5_i2;
1445
//
1446
//   assign wrt_en_wd1_i2 = inv_ifc_word1_inv_i2 & (stpkt_i2 | evpkt_i2) |
1447
//                                            ldinv_i2 & ifd_ifc_ldaddr5_i2 |
1448
//                                      (imissrtn_i2 |
1449
//                                             asireq_i2 & asi_ic_tag_i2 & ~asi_load_i2 |
1450
//                                             mbist_icache_write) & 
1451
//                              ifd_ifc_missaddr5_i2;
1452
 
1453
   // calculate the ICV write data
1454
   assign icv_wbit_i2 = imissrtn_i2 & ifc_ifd_filladdr4_i2 |
1455
                           asireq_i2 & asi_ic_tag_i2 & ~asi_load_i2 &
1456
                           cpxreq_i2[2];
1457
 
1458
   assign icv_wrdata_i2 = ifc_inv_ifqadv_i2 ? icv_wbit_i2 : icv_wrdata_f;
1459
 
1460
//   mux2ds #(2) icv_damux(.dout (icv_wrdata_i2),
1461
//                                   .in0  (icv_wrdata_f),
1462
//                                   .in1  (icv_wbit_i2),
1463
//                                   .sel0 (~ifc_inv_ifqadv_i2),
1464
//                                   .sel1 (ifc_inv_ifqadv_i2));
1465
 
1466
   dff_s #(1) icv_daff(.din  (icv_wrdata_i2),
1467
                                 .q    (icv_wrdata_f),
1468
                                 .clk  (clk),
1469
                                 .se   (se), .si(), .so());
1470
   assign ifq_icv_wrdata_bf = icv_wrdata_i2;
1471
 
1472
 
1473
// Begin ECO7010
1474
   dp_mux2es #(1) wayvld_mux (.dout (inq_wayvld_i1_nxt),        //done
1475
                              .in0 (lsu_ifu_cpxpkt_wayvld_i1),
1476
                              .in1 (inq_wayvld_i1),
1477
                              .sel(inq_vld));
1478
 
1479
   dff_s #(1) wayvld_ff (.din (inq_wayvld_i1_nxt),             //done
1480
                       .q   (inq_wayvld_i1),
1481
                       .clk (clk), .se(se), .si(), .so());
1482
 
1483
   assign ldinv_i1 = ldpkt_i1 & inq_wayvld_i1;  //done
1484
 
1485
   dp_mux2es #(1) ldinv_i2_mux (.dout (ldinv_i2_nxt),  //done
1486
                              .in0 (ldinv_i1),
1487
                              .in1 (ldinv_i2),
1488
                              .sel(ifc_ifd_ifqbyp_en_l));
1489
 
1490
   dff_s #(1) ldinv_i2_ff (.din (ldinv_i2_nxt),   //done
1491
                         .q   (ldinv_i2),
1492
                         .clk (clk), .se(se), .si(), .so());
1493
 
1494
//End ECO7010
1495
 
1496
//------------------------------------------------
1497
// Fwd Request to read/write Icache
1498
//------------------------------------------------
1499
   // is this a fwd req to the L1I?
1500
   assign fwdreq_i2 = (cpxreq_i2 == `FWD_RQ_RET) ?
1501
                        (ifd_ifc_fwd2ic_i2 & ifd_ifc_4bpkt_i2 &
1502
                         ifd_ifc_cpxvld_i2) : 1'b0;
1503
 
1504
   // detect first cycle of fwdpkt and stall
1505
   assign fwd_stall = fwdreq_i2 & ~fwdreq_i3;
1506
 
1507
   dff_s #(1) freq_ff(.din (fwd_stall),
1508
                    .q   (fwdreq_i3),
1509
                    .clk (clk), .se(se), .si(), .so());
1510
 
1511
   dff_s #(1) cpx3_ff(.din (ifd_ifc_cpxnc_i2),
1512
                    .q   (cpxnc_i3),
1513
                    .clk (clk), .se(se), .si(), .so());
1514
 
1515
   // NC bit is also R/W_bar bit
1516
   assign fwdrd_i3 = fwdreq_i3 & cpxnc_i3;
1517
   assign fwdwr_i3 = fwdreq_i3 & ~cpxnc_i3;
1518
 
1519
   // ack back to the LSU to send fwd reply
1520
   assign ifu_lsu_fwd_wr_ack = fwdwr_i3;
1521
   assign ifc_ifd_idx_sel_fwd_i2 = fwdreq_i2;
1522
 
1523
   // let errctl know a fwd packet is coming
1524
   assign ifq_erb_fwdrd_bf = fwdrd_i3;
1525
 
1526
//----------------------------------
1527
// INQ controls -- now ibuf controls
1528
//----------------------------------
1529
 
1530
// INQ removed 2/13/02   
1531
 
1532
   // Is the pkt in the inq a pkt that affects the icache?
1533
   assign ic_pkt_i1 = invalidate_i1 | imissrtn_i1 | errpkt_i1;
1534
 
1535
//   assign inq_vld_nxt = ~inq_vld & ifd_ifc_cpxvalid_i1 & 
1536
//                            (~ifqadv_i1 | asireq_i1) | 
1537
//                            inq_vld & ((~ifqadv_i1 | asireq_i1) & ic_pkt_i1 |
1538
//                                                           ifd_ifc_cpxvalid_i1);
1539
 
1540
   // cut this down to 1 aoi gate
1541
   assign inq_vld_nxt = (ifd_ifc_cpxvalid_i1 |
1542
                         inq_vld & ic_pkt_i1) & (~ifqadv_i1 | ifu_asireq_i1);
1543
 
1544
   dffr_s #(1) inqv_ff(.din (inq_vld_nxt),
1545
                                 .q   (inq_vld),
1546
                                 .rst (ifq_reset),
1547
                                 .clk (clk), .se(se), .si(), .so());
1548
 
1549
   assign ifc_ifd_ifqbyp_en_l = ~(ifqadv_i1 | fwd_stall);
1550
 
1551
   assign ifc_ifd_ifqbyp_sel_fwd_l = ~(fwd_stall & ~ifq_reset);
1552
   assign ifc_ifd_ifqbyp_sel_asi_l = ~(~fwd_stall & ~ifq_reset &
1553
                                       ifu_asireq_i1);
1554
   assign ifc_ifd_ifqbyp_sel_inq_l = ~(~fwd_stall & ~ifq_reset &
1555
                                       ~ifu_asireq_i1 & inq_vld);
1556
   assign ifc_ifd_ifqbyp_sel_lsu_l = ~(~fwd_stall & ~ifu_asireq_i1 &
1557
                                       ~inq_vld | ifq_reset);
1558
 
1559
   assign byp_sel_asi_l = ~(ifqadv_i1 & ifu_asireq_i1);
1560
 
1561
//   assign ifu_lsu_ibuf_busy = inq_vld & (~ifqadv_i1 | asireq_i1);
1562
//   assign ifc_ifd_ld_inq_i1 = ~inq_vld | ifqadv_i1 & ~asireq_i1;
1563
 
1564
   assign ifu_lsu_ibuf_busy = inq_vld;
1565
   assign ifc_ifd_ld_inq_i1 = ~inq_vld;
1566
 
1567
//-----------------------------------------
1568
// ASI access controls
1569
//-----------------------------------------
1570
 
1571
   // need this to help with timing
1572
   // - asi_vld is asserted only if the asi transaction is to an IFU asi
1573
   //   register AND that register is not in the IMMU.
1574
   // - it is held valid until an ack is signalled .
1575
   // - the ack is not signalled for atleast 2 cycles
1576
   assign asi_vld_next = lsu_ifu_asi_vld & byp_sel_asi_l &
1577
                               ~asireq_i2 & ~illva_i2;  // not when ack is sent
1578
 
1579
   dff_s #(1) asiv0_ff(.din (asi_vld_next),
1580
                                .q   (asi_vld_i0),
1581
                                .clk (clk), .se(se), .si(), .so());
1582
   assign asi_vld_qual_i0 = asi_vld_i0 & ~asireq_i2 & ~illva_i2 &
1583
                            byp_sel_asi_l & ~illva_i1 &
1584
                            lsu_ifu_asi_vld;
1585
 
1586
   dff_s #(8) asi_reg(.din (lsu_ifu_asi_state[7:0]),
1587
                                .q   (asi_state_i1),
1588
                                .clk (clk), .se(se), .si(), .so());
1589
 
1590
   dff_s #(2) asi_tid_reg(.din (lsu_ifu_asi_thrid[1:0]),
1591
                                    .q   (ifq_fcl_asi_tid_bf[1:0]),
1592
                                    .clk (clk), .se(se), .si(), .so());
1593
 
1594
//   assign ifu_lsu_asi_ack = ~byp_sel_asi_l;
1595
   // Decided to wait one more cycle before sending the ack.
1596
   assign ifu_lsu_asi_ack = asireq_i2 | illva_i2;
1597
 
1598
   // ifu ASIs
1599
   // icache data = 0x66
1600
   assign asi_ic_data_unchk_i1 = ~asi_state_i1[7] &
1601
                asi_state_i1[6] &
1602
                asi_state_i1[5] &
1603
                ~asi_state_i1[4] &
1604
                ~asi_state_i1[3] &
1605
                      asi_state_i1[2] &
1606
                      asi_state_i1[1] &
1607
                      ~asi_state_i1[0];
1608
   assign asi_ic_data_i1 = asi_ic_data_unchk_i1;
1609
 
1610
   // icache tags = 0x67
1611
   // writing to tag also writes to vbits
1612
   assign asi_ic_tag_unchk_i1 = ~asi_state_i1[7] &
1613
                      asi_state_i1[6] &
1614
                      asi_state_i1[5] &
1615
                      ~asi_state_i1[4] &
1616
                      ~asi_state_i1[3] &
1617
                      asi_state_i1[2] &
1618
                      asi_state_i1[1] &
1619
                      asi_state_i1[0];
1620
   assign asi_ic_tag_i1 = asi_ic_tag_unchk_i1;
1621
 
1622
   // error enable 0x4B
1623
   assign asi_erren_unchk_i1 = ~asi_state_i1[7] &
1624
                      asi_state_i1[6] &
1625
                      ~asi_state_i1[5] &
1626
                      ~asi_state_i1[4] &
1627
                      asi_state_i1[3] &
1628
                      ~asi_state_i1[2] &
1629
                      asi_state_i1[1] &
1630
                      asi_state_i1[0];
1631
   assign asi_erren_i1 =  asi_erren_unchk_i1 &
1632
          ~ifd_ifc_asi_vachklo_i2 &
1633
          ~ifd_ifc_asiaddr_i2[2];
1634
 
1635
   // error status 0x4C
1636
   assign asi_errstat_unchk_i1 = ~asi_state_i1[7] &
1637
                      asi_state_i1[6] &
1638
                      ~asi_state_i1[5] &
1639
                      ~asi_state_i1[4] &
1640
                      asi_state_i1[3] &
1641
                      asi_state_i1[2] &
1642
                      ~asi_state_i1[1] &
1643
                      ~asi_state_i1[0];
1644
   assign asi_errstat_i1 = asi_errstat_unchk_i1 &
1645
          ~ifd_ifc_asi_vachklo_i2 &
1646
          ~ifd_ifc_asiaddr_i2[2];
1647
 
1648
   // error addr 0x4D
1649
   assign asi_erraddr_unchk_i1 = ~asi_state_i1[7] &
1650
                      asi_state_i1[6] &
1651
                      ~asi_state_i1[5] &
1652
                      ~asi_state_i1[4] &
1653
                      asi_state_i1[3] &
1654
                      asi_state_i1[2] &
1655
                      ~asi_state_i1[1] &
1656
                      asi_state_i1[0];
1657
   assign asi_erraddr_i1 =  asi_erraddr_unchk_i1 &
1658
          ~ifd_ifc_asi_vachklo_i2 &
1659
          ~ifd_ifc_asiaddr_i2[2];
1660
 
1661
   // error inject 0x43
1662
   assign asi_errinj_unchk_i1 = ~asi_state_i1[7] &
1663
                      asi_state_i1[6] &
1664
                      ~asi_state_i1[5] &
1665
                      ~asi_state_i1[4] &
1666
                      ~asi_state_i1[3] &
1667
                      ~asi_state_i1[2] &
1668
                      asi_state_i1[1] &
1669
                      asi_state_i1[0];
1670
   assign asi_errinj_i1 =  asi_errinj_unchk_i1 &
1671
          ~ifd_ifc_asi_vachklo_i2 &
1672
          ~ifd_ifc_asiaddr_i2[2];
1673
 
1674
   // imask 0x42, va=0x8
1675
   assign asi_imask_unchk_i1 = ~asi_state_i1[7] &
1676
                      asi_state_i1[6] &
1677
                      ~asi_state_i1[5] &
1678
                      ~asi_state_i1[4] &
1679
                      ~asi_state_i1[3] &
1680
                      ~asi_state_i1[2] &
1681
                      asi_state_i1[1] &
1682
                      ~asi_state_i1[0];
1683
   assign asi_imask_i1 = asi_imask_unchk_i1  &
1684
          ~ifd_ifc_asi_vachklo_i2 &
1685
          ifd_ifc_asiaddr_i2[2];  // this is actually va[3]
1686
 
1687
   // illegal va check
1688
   assign illva_i0 = ((asi_erren_unchk_i1 |
1689
                       asi_errstat_unchk_i1 |
1690
                       asi_errinj_unchk_i1 |
1691
                       asi_erraddr_unchk_i1) & (ifd_ifc_asi_vachklo_i2 |
1692
                                                ifd_ifc_asiaddr_i2[2])) &
1693
                       asi_vld_qual_i0;
1694
 
1695
   dff_s #(1) illvai1_ff(.din (illva_i0),
1696
                       .q   (illva_i1),
1697
                       .clk (clk), .se(se), .si(), .so());
1698
   dff_s #(1) illvabf_ff(.din (illva_i1),
1699
                     .q   (illva_i2),
1700
                     .clk (clk), .se(se), .si(), .so());
1701
   dff_s #(1) illvaf_ff(.din (illva_i2),
1702
                     .q   (illva_f),
1703
                     .clk (clk), .se(se), .si(), .so());
1704
   dff_s #(1) illvas_ff(.din (illva_f),
1705
                      .q   (illva_s),
1706
                      .clk (clk), .se(se), .si(), .so());
1707
   dff_s #(1) illvaw2_ff(.din (illva_s),
1708
                       .q   (illva_w2),
1709
                       .clk (clk), .se(se), .si(), .so());
1710
   assign ifu_lsu_ldxa_illgl_va_w2 = illva_w2;
1711
 
1712
   dff_s #(1) tagasi_ff(.din (asi_ic_tag_i1),
1713
                                  .q   (asi_ic_tag_i2),
1714
                                  .clk (clk), .se(se), .si(), .so());
1715
   dff_s #(1) datasi_ff(.din (asi_ic_data_i1),
1716
                                  .q   (asi_ic_data_i2),
1717
                                  .clk (clk), .se(se), .si(), .so());
1718
 
1719
   dff_s #(1) asieeni2_ff(.din (asi_erren_i1),
1720
                                    .q   (ifq_erb_asi_erren_i2),
1721
                                    .clk (clk), .se(se), .si(), .so());
1722
   dff_s #(1) asieini2_ff(.din (asi_errinj_i1),
1723
                                    .q   (ifq_erb_asi_errinj_i2),
1724
                                    .clk (clk), .se(se), .si(), .so());
1725
   dff_s #(1) asiesti2_ff(.din (asi_errstat_i1),
1726
                                    .q   (ifq_erb_asi_errstat_i2),
1727
                                    .clk (clk), .se(se), .si(), .so());
1728
   dff_s #(1) asieadi2_ff(.din (asi_erraddr_i1),
1729
                                    .q   (ifq_erb_asi_erraddr_i2),
1730
                                    .clk (clk), .se(se), .si(), .so());
1731
   dff_s #(1) imaski2_ff(.din (asi_imask_i1),
1732
                                   .q   (ifq_erb_asi_imask_i2),
1733
                                   .clk (clk), .se(se), .si(), .so());
1734
 
1735
   // All IFU asi requests
1736
   assign ifu_asireq_i0 = (asi_ic_tag_i1 | asi_ic_data_i1 | asi_erren_i1 |
1737
                                       asi_errinj_i1 | asi_errstat_i1 | asi_erraddr_i1 |
1738
                                       asi_imask_i1) & asi_vld_qual_i0;
1739
 
1740
   dff_s #(1) asireq1_ff(.din  (ifu_asireq_i0),
1741
                                   .q    (ifu_asireq_i1),
1742
                                   .clk  (clk), .se(se), .si(), .so());
1743
 
1744
   dff_s #(1) asivld_ff(.din  (byp_sel_asi_l),
1745
                                  .q    (asireq_i2_l),
1746
                                  .clk  (clk), .se(se), .si(), .so());
1747
   assign asireq_i2 = ~asireq_i2_l;
1748
   assign ifc_inv_asireq_i2 = asireq_i2;
1749
 
1750
   // Stall if we are doing an asi op or fwdreq
1751
  assign stallreq_d0 = (ifu_asireq_i0 |
1752
                         ~byp_sel_asi_l |
1753
                         fwdreq_i2) |
1754
                          starv_alert |
1755
                          mbist_ifq_run_bist |
1756
                          ldinv_i1 & ~ifqadv_i1 |        //ECO 7010
1757
                          ldinv_i2 & ~ifc_inv_ifqadv_i2; //ECO 7010
1758
 
1759
   dff_s #(1) stal_ff(.din (stallreq_d0),
1760
                    .q   (stallreq_d1),
1761
                    .clk (clk), .se(se), .si(), .so());
1762
 
1763
   // split into two to save repeater
1764
   assign ifq_fcl_stallreq = stallreq_d1;
1765
   assign ifq_swl_stallreq = stallreq_d1;
1766
 
1767
   dff_s #(1) asil1_ff(.din (lsu_ifu_asi_load),
1768
                                 .q   (asi_load_i1),
1769
                                 .clk (clk), .se(se), .si(), .so());
1770
 
1771
   dff_s #(1) asil2_ff(.din (asi_load_i1),
1772
                                 .q   (asi_load_i2),
1773
                                 .clk (clk), .se(se), .si(), .so());
1774
 
1775
   // insert parity error in data and/or tag
1776
   // Don't need to qualify with asireq and imissrtn...
1777
   //   -- moved this to the DP since the qual is not necessary
1778
//   assign ifc_ifd_insert_pe = (asireq_i2 | imissrtn_i2) & 
1779
//                              ifd_ifc_cpxue_i2;
1780
 
1781
   // decode asi
1782
   // generate word selects
1783
   // can use finst instead of word_sel_i2, but it screws up timing
1784
 
1785
   assign word_sel_i2[0] = ~ifd_ifc_asiaddr_i2[3] & ~ifd_ifc_asiaddr_i2[2];
1786
   assign word_sel_i2[1] = ~ifd_ifc_asiaddr_i2[3] &  ifd_ifc_asiaddr_i2[2];
1787
   assign word_sel_i2[2] =  ifd_ifc_asiaddr_i2[3] & ~ifd_ifc_asiaddr_i2[2];
1788
   assign word_sel_i2[3] =  ifd_ifc_asiaddr_i2[3] &  ifd_ifc_asiaddr_i2[2];
1789
 
1790
   // this assumes asi requests are never stalled
1791
   assign ifq_icd_worden_bf = (word_sel_i2 | {4{~asireq_i2 & ~fwdwr_i3  |
1792
//                                                ~ifc_inv_ifqadv_i2 | 
1793
                                                mbist_icache_write}});
1794
// & (mbist_icache_worden | {4{~bist_op}});
1795
 
1796
   // choose where the ic address should come from
1797
//   assign bist_op = (mbist_icache_read | mbist_icache_write);
1798
   dff_s #(1) bist_run_ff(.din (mbist_ifq_run_bist),
1799
                        .q   (bist_op),
1800
                        .clk (clk), .se(se), .si(), .so());
1801
 
1802
   assign ifc_ifd_addr_sel_bist_i2_l = ~bist_op | sehold;
1803
   assign ifc_ifd_addr_sel_old_i2_l = (bist_op | ifc_inv_ifqadv_i2) & ~sehold;
1804
   assign ifc_ifd_addr_sel_asi_i2_l = bist_op | ~ifc_inv_ifqadv_i2 |
1805
                                      sehold | ~(asireq_i2 | fwdreq_i3);
1806
   assign ifc_ifd_addr_sel_fill_i2_l = bist_op | ~ifc_inv_ifqadv_i2 |
1807
                                       sehold | asireq_i2 | fwdreq_i3;
1808
 
1809
   // choose where the data should come from
1810
   assign ifq_icd_data_sel_bist_i2 = mbist_icache_write & ~sehold;
1811
   assign ifq_icd_data_sel_fill_i2 = ~mbist_icache_write & ifc_inv_ifqadv_i2 &
1812
                                     ~sehold;
1813
   assign ifq_icd_data_sel_old_i2 = ~mbist_icache_write & ~ifc_inv_ifqadv_i2 |
1814
                                     sehold;
1815
 
1816
   // generate icache controls
1817
   assign ifq_fcl_rdreq_bf = asireq_i2 & asi_load_i2 &
1818
                                   (asi_ic_data_i2 | asi_ic_tag_i2) |
1819
                                   mbist_icache_read |
1820
                             fwdrd_i3;
1821
 
1822
   assign ifq_fcl_icd_wrreq_bf = asi_ic_data_i2 & asireq_i2 & ~asi_load_i2 |
1823
                                       mbist_icache_write |
1824
                                 fwdwr_i3;
1825
 
1826
   assign ifq_fcl_ictv_wrreq_bf = asi_ic_tag_i2 & asireq_i2 & ~asi_load_i2;
1827
 
1828
   assign rd_tag_bf = asi_ic_tag_i2 & asi_load_i2;
1829
   dff_s #(1) asi_srcf_ff(.din (rd_tag_bf),
1830
                               .q   (ifq_erb_rdtag_f),
1831
                               .clk (clk), .se(se), .si(), .so());
1832
 
1833
   assign rdinst_bf = asi_ic_data_i2 & asi_load_i2;
1834
   dff_s #(1) asi_inst_ff(.din (rdinst_bf),
1835
                               .q   (ifq_erb_rdinst_f),
1836
                               .clk (clk), .se(se), .si(), .so());
1837
 
1838
   assign asird_i1 = asi_load_i1 & (~byp_sel_asi_l | illva_i1);
1839
   dff_s #(1) asirdq_ff(.din (asird_i1),
1840
                      .q   (ifq_fcl_asird_bf),
1841
                      .clk (clk), .se(se), .si(), .so());
1842
 
1843
   assign ifq_erb_asiwr_i2 = ~asi_load_i2 & asireq_i2;
1844
 
1845
 
1846
 
1847
   // Shadow scan mux
1848
   mux4ds #(4) milss_mux(.dout (ifq_sscan_data[3:0]),
1849
                         .in0  (mil0_state),
1850
                         .in1  (mil1_state),
1851
                         .in2  (mil2_state),
1852
                         .in3  (mil3_state),
1853
                         .sel0 (ctu_sscan_tid[0]),
1854
                         .sel1 (ctu_sscan_tid[1]),
1855
                         .sel2 (ctu_sscan_tid[2]),
1856
                         .sel3 (ctu_sscan_tid[3]));
1857
 
1858
 
1859
 
1860
endmodule // sparc_ifu_ifqctl
1861
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.