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

Subversion Repositories s1_core

[/] [s1_core/] [trunk/] [hdl/] [rtl/] [sparc_core/] [sparc_ifu_ifqctl.v] - Blame information for rev 113

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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