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

Subversion Repositories sparc64soc

[/] [sparc64soc/] [trunk/] [T1-CPU/] [lsu/] [lsu_qctl1.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: lsu_qctl1.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
//  Description:  LSU Queue Control for Sparc Core
24
//      - includes monitoring for pcx queues
25
//      - control for lsu datapath
26
//      - rd/wr control of dfq
27
*/
28
////////////////////////////////////////////////////////////////////////
29
// header file includes
30
////////////////////////////////////////////////////////////////////////
31
`include  "sys.h" // system level definition file which contains the 
32
                  // time scale definition
33
`include  "iop.h"
34
 
35
`include  "lsu.h"
36
 
37
////////////////////////////////////////////////////////////////////////
38
// Local header file includes / local defines
39
////////////////////////////////////////////////////////////////////////
40
 
41
module lsu_qctl1 ( /*AUTOARG*/
42
   // Outputs
43
   lsu_bld_helper_cmplt_m, lsu_bld_cnt_m, lsu_bld_reset,
44
   lsu_pcx_rq_sz_b3, lsu_ramtest_rd_w, ld_stb_full_raw_w2,
45
   lsu_ld_pcx_rq_sel_d2, spc_pcx_req_pq, spc_pcx_atom_pq,
46
   lsu_ifu_pcxpkt_ack_d, pcx_pkt_src_sel, lmq_enable,
47
   imiss_pcx_mx_sel, fwd_int_fp_pcx_mx_sel, lsu_ffu_bld_cnt_w,
48
   lsu_ld_pcx_rq_mxsel, ld_pcx_thrd, lsu_spu_ldst_ack,
49
   pcx_rq_for_stb, pcx_rq_for_stb_d1, lsu_ffu_ack,
50
   lsu_ifu_ld_pcxpkt_vld, lsu_pcx_req_squash0, lsu_pcx_req_squash1,
51
   lsu_pcx_req_squash2, lsu_pcx_req_squash3, lsu_pcx_req_squash_d1,
52
   lsu_pcx_ld_dtag_perror_w2, lsu_tlu_dcache_miss_w2, lsu_bld_pcx_rq,
53
   lsu_bld_rq_addr, lsu_fwdpkt_pcx_rq_sel, lsu_imiss_pcx_rq_sel_d1,
54
   lsu_tlu_pcxpkt_ack, lsu_intrpt_cmplt, lsu_lmq_byp_misc_sel,
55
   lsu_sscan_data, so, lsu_dfq_byp_tid_d1_sel, lmq0_pcx_pkt_way,
56
   lmq1_pcx_pkt_way, lmq2_pcx_pkt_way, lmq3_pcx_pkt_way,
57
   lsu_st_pcx_rq_pick, lsu_stb_pcx_rvld_d1, lsu_stb_rd_tid,
58
   lsu_ld0_spec_vld_kill_w2, lsu_ld1_spec_vld_kill_w2,
59
   lsu_ld2_spec_vld_kill_w2, lsu_ld3_spec_vld_kill_w2,
60
   lsu_st_pcx_rq_vld,
61
   // Inputs
62
   rclk, si, se, sehold, grst_l, arst_l, lsu_quad_word_access_g,
63
   pcx_spc_grant_px, ld_inst_vld_e, lsu_ldst_va_m, stb0_l2b_addr,
64
   stb1_l2b_addr, stb2_l2b_addr, stb3_l2b_addr, lsu_ld_miss_g,
65
   ifu_lsu_ldst_fp_e, ld_rawp_st_ced_w2, ld_rawp_st_ackid_w2,
66
   stb0_crnt_ack_id, stb1_crnt_ack_id, stb2_crnt_ack_id,
67
   stb3_crnt_ack_id, ifu_tlu_thrid_e, ldxa_internal,
68
   spu_lsu_ldst_pckt, spu_lsu_ldst_pckt_vld, ifu_tlu_inst_vld_m,
69
   ifu_lsu_flush_w, ifu_lsu_casa_e, lsu_ldstub_g, lsu_swap_g,
70
   stb0_atm_rq_type, stb1_atm_rq_type, stb2_atm_rq_type,
71
   stb3_atm_rq_type, tlb_pgnum_g, stb_rd_for_pcx, ffu_lsu_data,
72
   ffu_lsu_fpop_rq_vld, ifu_lsu_ldst_dbl_e, ifu_lsu_pcxreq_d,
73
   ifu_lsu_destid_s, ifu_lsu_pref_inst_e, tlb_cam_hit_g,
74
   lsu_blk_asi_m, stb_cam_hit_bf, lsu_fwdpkt_vld,
75
   lsu_dcfill_active_e, dfq_byp_sel, lsu_dfq_ld_vld, lsu_fldd_vld_en,
76
   lsu_dfill_dcd_thrd, lsu_fwdpkt_dest, tlu_lsu_pcxpkt_tid,
77
   lsu_stb_empty, tlu_lsu_pcxpkt_vld, tlu_lsu_pcxpkt_l2baddr,
78
   ld_sec_hit_thrd0, ld_sec_hit_thrd1, ld_sec_hit_thrd2,
79
   ld_sec_hit_thrd3, ld_thrd_byp_sel_e, lsu_st_pcx_rq_kill_w2,
80
   ifu_lsu_alt_space_e, lsu_dfq_byp_tid, dfq_byp_ff_en,
81
   stb_ld_full_raw, stb_ld_partial_raw, stb_cam_mhit,
82
   lsu_ldquad_inst_m, stb_cam_wr_no_ivld_m, lsu_ldst_va_way_g,
83
   lsu_dcache_rand, lsu_encd_way_hit, lsu_way_hit_or, dc_direct_map,
84
   lsu_tlb_perr_ld_rq_kill_w, lsu_dcache_tag_perror_g,
85
   lsu_ld_inst_vld_g, asi_internal_m, ifu_lsu_pcxpkt_e_b50,
86
   lda_internal_m, atomic_m, lsu_dcache_iob_rd_w,
87
   ifu_lsu_fwd_data_vld, rst_tri_en, lsu_no_spc_pref,
88
   tlu_early_flush_pipe2_w, lsu_ttype_vld_m2
89
   );
90
 
91
 
92
input     rclk ;
93
input                   si;
94
input                   se;
95
input                   sehold;
96
input                   grst_l;
97
input                   arst_l;
98
 
99
//input [1:0]           ld_pcx_pkt_wy_g ;
100
input                   lsu_quad_word_access_g ;
101
 
102
// LSU <- PCX
103
// bit5 - FP, bit4 - IO.
104
input [4:0]             pcx_spc_grant_px ;    // pcx grants packet to destination.
105
input                   ld_inst_vld_e;        // valid ld inst; d-stage
106
input [7:6]             lsu_ldst_va_m ;           // Virt. Addr. of ld/st/atomic.
107
 
108
input [2:0]             stb0_l2b_addr ;         // st's addr for pcx - thread0.
109
input [2:0]             stb1_l2b_addr ;         // st's addr for pcx - thread1.
110
input [2:0]             stb2_l2b_addr ;         // st's addr for pcx - thread2.
111
input [2:0]             stb3_l2b_addr ;         // st's addr for pcx - thread3.
112
input                   lsu_ld_miss_g ;         // load misses in dcache.
113
//input                   lsu_ld_hit_g ;          // load hits in dcache.
114
input                   ifu_lsu_ldst_fp_e ;     // fp load/store.
115
 
116
//input                   ld_stb_full_raw_g ;    // full raw for load - thread0
117
//input                   ld_stb_partial_raw_g ; // partial raw for load - thread0
118
input                   ld_rawp_st_ced_w2 ;      // store has been acked - thread0
119
//input                   ld_rawp_st_ced_g ;      // store has been acked - thread0
120
input   [2:0]           ld_rawp_st_ackid_w2 ;    // ackid for acked store - thread0
121
input [2:0]             stb0_crnt_ack_id ;      // ackid for crnt outstanding st. 
122
input [2:0]             stb1_crnt_ack_id ;      // ackid for crnt outstanding st. 
123
input [2:0]             stb2_crnt_ack_id ;      // ackid for crnt outstanding st. 
124
input [2:0]             stb3_crnt_ack_id ;      // ackid for crnt outstanding st. 
125
input [1:0]             ifu_tlu_thrid_e ;       // thread-id
126
input                   ldxa_internal ;         // internal ldxa, stg g 
127
 
128
input [`PCX_AD_LO+7:`PCX_AD_LO+6] spu_lsu_ldst_pckt ;  // addr bits
129
input                   spu_lsu_ldst_pckt_vld ; // vld
130
input                   ifu_tlu_inst_vld_m ;    // inst is vld - wstage
131
 
132
input                   ifu_lsu_flush_w ;       // ifu's flush
133
input                   ifu_lsu_casa_e ;        // compare-swap instr
134
input                   lsu_ldstub_g ;          // ldstub(a) instruction
135
input                   lsu_swap_g ;            // swap(a) instruction 
136
input  [2:1]            stb0_atm_rq_type ;      // stb pcx rq type - atomic
137
input  [2:1]            stb1_atm_rq_type ;      // stb pcx rq type - atomic
138
input  [2:1]            stb2_atm_rq_type ;      // stb pcx rq type - atomic
139
input  [2:1]            stb3_atm_rq_type ;      // stb_pcx_rq_type - atomic
140
input [39:37]           tlb_pgnum_g ;           // ldst access to io 
141
input [3:0]             stb_rd_for_pcx ;        // rd for pcx can be scheduled
142
input [80:79]           ffu_lsu_data ;
143
input                   ffu_lsu_fpop_rq_vld ;   // ffu dispatches fpop issue request.
144
input                   ifu_lsu_ldst_dbl_e ;    // ld/st double
145
input                   ifu_lsu_pcxreq_d ;
146
input   [2:0]           ifu_lsu_destid_s ;
147
input                   ifu_lsu_pref_inst_e ;      // prefetch inst
148
input                   tlb_cam_hit_g ;            // tlb cam hit ; error included
149
input                   lsu_blk_asi_m ;
150
//input                   stb_cam_wptr_vld;
151
input                   stb_cam_hit_bf;
152
 
153
input                   lsu_fwdpkt_vld;
154
//input  [3:0]            lsu_error_rst;
155
input                   lsu_dcfill_active_e;
156
input  [3:0]            dfq_byp_sel ;
157
//input  [3:0]            lsu_dfq_byp_mxsel ;   
158
//input  [3:0]            lsu_st_ack_rq_stb ;
159
input                   lsu_dfq_ld_vld;
160
input                   lsu_fldd_vld_en;
161
input  [3:0]            lsu_dfill_dcd_thrd ;
162
input  [4:0]            lsu_fwdpkt_dest ;
163
 
164
input [19:18]           tlu_lsu_pcxpkt_tid ;
165
input   [3:0]           lsu_stb_empty ;
166
input                   tlu_lsu_pcxpkt_vld ;
167
input [11:10]           tlu_lsu_pcxpkt_l2baddr ;
168
input                   ld_sec_hit_thrd0 ;      // ld has sec. hit against th0
169
input                   ld_sec_hit_thrd1 ;      // ld has sec. hit against th1
170
input                   ld_sec_hit_thrd2 ;      // ld has sec. hit against th2
171
input                   ld_sec_hit_thrd3 ;      // ld has sec. hit against th3
172
input [2:0]             ld_thrd_byp_sel_e ;       // stb,ldxa thread byp sel
173
input   [3:0]    lsu_st_pcx_rq_kill_w2 ;
174
 
175
input                   ifu_lsu_alt_space_e ;
176
input   [1:0]           lsu_dfq_byp_tid;
177
 
178
input                   dfq_byp_ff_en;
179
 
180
//input [3:0]           lsu_dtag_perror_w2 ;
181
 
182
input [7:0]              stb_ld_full_raw ;
183
input [7:0]              stb_ld_partial_raw ;
184
 
185
input                   stb_cam_mhit ;          // multiple hits in stb
186
input                   lsu_ldquad_inst_m ; // ldquad inst
187
 
188
input                   stb_cam_wr_no_ivld_m ;
189
 
190
input  [1:0]            lsu_ldst_va_way_g ;          // 12:11 for direct map
191
input  [1:0]            lsu_dcache_rand;
192
input  [1:0]            lsu_encd_way_hit;
193
input                   lsu_way_hit_or;
194
input                   dc_direct_map;
195
//input                   lsu_quad_asi_g;
196
 
197
input                   lsu_tlb_perr_ld_rq_kill_w ;
198
 
199
input                   lsu_dcache_tag_perror_g ;  // dcache tag parity error
200
input   [3:0]           lsu_ld_inst_vld_g ;
201
//input                  lsu_pcx_ld_dtag_perror_w2 ;    // from qctl2
202
 
203
input                   asi_internal_m ;
204
 
205
input                   ifu_lsu_pcxpkt_e_b50 ;
206
 
207
input                   lda_internal_m ;
208
input                   atomic_m ;
209
 
210
input                   lsu_dcache_iob_rd_w ;
211
input                   ifu_lsu_fwd_data_vld ;
212
 
213
input                   rst_tri_en ;
214
 
215
output                  lsu_bld_helper_cmplt_m ;
216
output  [2:0]            lsu_bld_cnt_m ;
217
output                  lsu_bld_reset ;
218
 
219
output                  lsu_pcx_rq_sz_b3 ;
220
 
221
output                  lsu_ramtest_rd_w ;
222
 
223
 
224
output                  ld_stb_full_raw_w2 ;
225
 
226
output  [3:0]            lsu_ld_pcx_rq_sel_d2 ;
227
 
228
output  [4:0]           spc_pcx_req_pq;         // request destination for packet.
229
              // FPU, IO, L2_BANK[3:0].
230
              // 1-hot - create monitor !
231
output                  spc_pcx_atom_pq ;       // atomic packet. 
232
output                  lsu_ifu_pcxpkt_ack_d ;  // ack for I$ fill request.
233
output  [3:0]           pcx_pkt_src_sel ;        // - qdp1
234
output  [3:0]           lmq_enable ;     // - qdp1
235
output                  imiss_pcx_mx_sel ;      // - qdp1
236
output  [2:0]           fwd_int_fp_pcx_mx_sel ;  // - qdp1
237
output  [2:0]            lsu_ffu_bld_cnt_w ;
238
//output  [3:0]           ld_pcx_rq_sel ;       // - qctl2
239
output  [3:0]           lsu_ld_pcx_rq_mxsel ;    // - qdp1
240
output  [1:0]           ld_pcx_thrd ;    // - qdp1
241
output                  lsu_spu_ldst_ack ;  // strm ld/st ack to spu
242
//output                  strm_sldst_cam_vld; // strm ld/st xslate rq
243
//output                  strm_sld_dc_rd_vld; // strm alloc. ld xslate rq.
244
//output                  strm_sldst_cam_d2;  // strm ld/st xslate rq-d2
245
output  [3:0]           pcx_rq_for_stb ;      // pcx demands rd for store - stb_ctl
246
output  [3:0]           pcx_rq_for_stb_d1 ;  // pcx demands rd for store - qdp2
247
output                  lsu_ffu_ack ;         // ack to ffu.
248
output                  lsu_ifu_ld_pcxpkt_vld ;
249
//output  [3:0]           lsu_iobrdge_rply_data_sel ;   // - qdp1
250
//output                  lsu_pcx_req_squash ;
251
output                  lsu_pcx_req_squash0 ;
252
output                  lsu_pcx_req_squash1 ;
253
output                  lsu_pcx_req_squash2 ;
254
output                  lsu_pcx_req_squash3 ;
255
output                  lsu_pcx_req_squash_d1 ;
256
output                  lsu_pcx_ld_dtag_perror_w2 ;     // - qdp1
257
output  [3:0]            lsu_tlu_dcache_miss_w2 ;
258
output                  lsu_bld_pcx_rq ;        // cycle after request  // - qdp1
259
output [1:0]             lsu_bld_rq_addr ;       // cycle after request  // - qdp1
260
//output                        lsu_ifu_flush_ireg ;
261
 
262
output                 lsu_fwdpkt_pcx_rq_sel ;
263
//output                 lsu_ld0_pcx_rq_sel_d1, lsu_ld1_pcx_rq_sel_d1 ;
264
//output                 lsu_ld2_pcx_rq_sel_d1, lsu_ld3_pcx_rq_sel_d1 ;
265
output                 lsu_imiss_pcx_rq_sel_d1 ;
266
output                 lsu_tlu_pcxpkt_ack;
267
output  [3:0]           lsu_intrpt_cmplt ;      // intrpt can restart thread
268
//output                  lsu_ld_sec_hit_l2access_g ;
269
//output  [1:0]           lsu_ld_sec_hit_wy_g ;
270
output  [3:0]           lsu_lmq_byp_misc_sel ;    // select g-stage lmq source
271
 
272
output  [12:0]           lsu_sscan_data ;
273
 
274
output                  so;
275
output  [3:0]           lsu_dfq_byp_tid_d1_sel;
276
 
277
 
278
   input [3:0]          lsu_no_spc_pref;
279
 
280
//output  [1:0]           lsu_lmq_pkt_way_g;
281
output  [1:0]           lmq0_pcx_pkt_way;
282
output  [1:0]           lmq1_pcx_pkt_way;
283
output  [1:0]           lmq2_pcx_pkt_way;
284
output  [1:0]           lmq3_pcx_pkt_way;
285
output  [3:0]           lsu_st_pcx_rq_pick;
286
 
287
// signals related to logic moved from stb_rwctl
288
output                  lsu_stb_pcx_rvld_d1;
289
output  [1:0]           lsu_stb_rd_tid;
290
 
291
output                  lsu_ld0_spec_vld_kill_w2 ;
292
output                  lsu_ld1_spec_vld_kill_w2 ;
293
output                  lsu_ld2_spec_vld_kill_w2 ;
294
output                  lsu_ld3_spec_vld_kill_w2 ;
295
 
296
output                  lsu_st_pcx_rq_vld ;
297
 
298
 
299
   input                tlu_early_flush_pipe2_w;
300
   input                lsu_ttype_vld_m2;
301
 
302
/*AUTOWIRE*/
303
// Beginning of automatic wires (for undeclared instantiated-module outputs)
304
// End of automatics
305
 
306
wire  thread0_e,thread1_e,thread2_e,thread3_e;
307
wire  thread0_w2,thread1_w2,thread2_w2,thread3_w2;
308
wire    ld0_inst_vld_e,ld1_inst_vld_e,ld2_inst_vld_e,ld3_inst_vld_e ;
309
wire    ld0_inst_vld_g,ld1_inst_vld_g,ld2_inst_vld_g,ld3_inst_vld_g ;
310
wire    ld0_inst_vld_w2,ld1_inst_vld_w2,ld2_inst_vld_w2,ld3_inst_vld_w2 ;
311
//wire    st_inst_vld_m,st_inst_vld_g;
312
wire  imiss_pcx_rq_sel_d1, strm_pcx_rq_sel_d1 ;
313
wire  imiss_pcx_rq_sel_d2 ;
314
wire    fpop_pcx_rq_sel_d1, fpop_pcx_rq_sel_d2 ;
315
wire        imiss_pcx_rq_sel ;
316
wire        imiss_pkt_vld ;
317
wire  [2:0]     imiss_l2bnk_addr ;
318
wire  [4:0]     imiss_l2bnk_dest ;
319
wire    fpst_vld_m, fpst_vld_g ;
320
wire    fpop_vld_reset ;
321
wire    fpop_pcx_rq_sel ;
322
wire    fpop_pcx_rq_sel_tmp ;
323
wire    fpop_vld_en ;
324
wire    fpop_pkt1 ;
325
wire    fpop_pkt_vld,fpop_pkt_vld_unmasked ;
326
wire    fpop_atom_req, fpop_atom_rq_pq ;
327
wire  [4:0] fpop_l2bnk_dest ;
328
wire        pcx_req_squash ;
329
wire  [4:0] strm_l2bnk_dest ;
330
wire    strm_pkt_vld;
331
wire        st0_pkt_vld ;
332
wire        st1_pkt_vld ;
333
wire        st2_pkt_vld ;
334
wire        st3_pkt_vld ;
335
wire    st0_pcx_rq_sel_d1, st1_pcx_rq_sel_d1;
336
wire    st2_pcx_rq_sel_d1, st3_pcx_rq_sel_d1;
337
wire    st0_pcx_rq_sel_d2, st1_pcx_rq_sel_d2;
338
wire    st2_pcx_rq_sel_d2, st3_pcx_rq_sel_d2;
339
wire    st0_pcx_rq_sel_d3, st1_pcx_rq_sel_d3;
340
wire    st2_pcx_rq_sel_d3, st3_pcx_rq_sel_d3;
341
wire    st0_cas_vld, st1_cas_vld, st2_cas_vld, st3_cas_vld ;
342
wire    st0_atomic_vld, st1_atomic_vld, st2_atomic_vld, st3_atomic_vld ;
343
wire  [4:0]     st0_l2bnk_dest,st1_l2bnk_dest ;
344
wire  [4:0]     st2_l2bnk_dest,st3_l2bnk_dest ;
345
wire    bld_helper_cmplt_e, bld_helper_cmplt_m, bld_helper_cmplt_g ;
346
wire    bld_din,bld_dout ;
347
wire    bld_g ;
348
wire    bld_en ;
349
wire    [1:0]    bld_cnt ;
350
wire    [1:0]    bcnt_din ;
351
wire    [2:0]    bld_rd_din, bld_rd_dout, bld_rd_dout_m ;
352
wire    [3:0]    bld_annul,bld_annul_d1 ;
353
wire    bld_rd_en ;
354
wire    casa_m, casa_g ;
355
wire        ld0_vld_reset, ld0_pkt_vld ;
356
wire        ld0_pcx_rq_sel_d2, ld1_pcx_rq_sel_d2 ;
357
wire        ld2_pcx_rq_sel_d2, ld3_pcx_rq_sel_d2 ;
358
wire    ld0_fill_reset, ld1_fill_reset,ld2_fill_reset,ld3_fill_reset;
359
wire    ld0_fill_reset_d1,ld1_fill_reset_d1,ld2_fill_reset_d1,ld3_fill_reset_d1;
360
wire    ld0_fill_reset_d2,ld1_fill_reset_d2,ld2_fill_reset_d2,ld3_fill_reset_d2;
361
wire    ld0_fill_reset_d2_tmp,ld1_fill_reset_d2_tmp,ld2_fill_reset_d2_tmp,ld3_fill_reset_d2_tmp;
362
wire  [4:0]     ld0_l2bnk_dest, ld1_l2bnk_dest ;
363
wire  [4:0]     ld2_l2bnk_dest, ld3_l2bnk_dest ;
364
wire        ld1_vld_reset, ld1_pkt_vld ;
365
wire        ld2_vld_reset, ld2_pkt_vld ;
366
wire        ld3_vld_reset, ld3_pkt_vld ;
367
//wire    casa0_g, casa1_g, casa2_g, casa3_g;
368
wire    ld0_rawp_reset,ld0_rawp_en,ld0_rawp_disabled;
369
wire    ld1_rawp_reset,ld1_rawp_en,ld1_rawp_disabled;
370
wire    ld2_rawp_reset,ld2_rawp_en,ld2_rawp_disabled;
371
wire    ld3_rawp_reset,ld3_rawp_en,ld3_rawp_disabled;
372
wire  [2:0] ld0_rawp_ackid,ld1_rawp_ackid ;
373
wire  [2:0] ld2_rawp_ackid,ld3_rawp_ackid ;
374
wire        ld0_pcx_rq_vld, ld1_pcx_rq_vld ;
375
wire        ld2_pcx_rq_vld, ld3_pcx_rq_vld ;
376
wire  [4:0]     queue_write ;
377
wire    mcycle_squash_d1 ;
378
//wire        ld_pcx_rq_vld, st_pcx_rq_vld ;
379
wire  [4:0] st0_q_wr,st1_q_wr,st2_q_wr,st3_q_wr ;
380
wire  [4:0]     sel_qentry0 ;
381
wire    st0_atom_rq,st1_atom_rq,st2_atom_rq,st3_atom_rq ;
382
wire    st0_atom_rq_d1,st1_atom_rq_d1,st2_atom_rq_d1,st3_atom_rq_d1 ;
383
wire    st0_cas_vld_d1,st1_cas_vld_d1,st2_cas_vld_d1,st3_cas_vld_d1 ;
384
wire    st0_atom_rq_d2,st1_atom_rq_d2,st2_atom_rq_d2,st3_atom_rq_d2 ;
385
wire    st0_cas_vld_d2,st1_cas_vld_d2,st2_cas_vld_d2,st3_cas_vld_d2 ;
386
//wire    st_cas_rq_d2,st_quad_rq_d2;
387
wire    st_cas_rq_d2 ;
388
wire        st0_pcx_rq_vld, st1_pcx_rq_vld;
389
wire        st2_pcx_rq_vld, st3_pcx_rq_vld;
390
wire    st_atom_rq ;
391
wire    st_atom_rq_d1 ;
392
wire        imiss_pcx_rq_vld ;
393
wire  [4:0] spc_pcx_req_update_g,spc_pcx_req_update_w2 ;
394
wire    strm_pcx_rq_vld ;
395
wire    fwdpkt_rq_vld ;
396
wire    intrpt_pcx_rq_vld ;
397
wire    fpop_pcx_rq_vld ;
398
wire    [4:0]    pre_qwr ;
399
wire        ld0_pcx_rq_sel, ld1_pcx_rq_sel ;
400
wire        ld2_pcx_rq_sel, ld3_pcx_rq_sel ;
401
wire    strm_pcx_rq_sel ;
402
wire    intrpt_pcx_rq_sel ;
403
//wire    imiss_strm_pcx_rq_sel ;
404
//wire  [2:0]     dest_pkt_sel ;
405
wire  [4:0] spc_pcx_req_g ;
406
wire  [1:0]   strm_l2bnk_addr ;
407
wire  [2:0]     ld0_l2bnk_addr, ld1_l2bnk_addr ;
408
wire  [2:0]     ld2_l2bnk_addr, ld3_l2bnk_addr ;
409
wire  [4:0]     current_pkt_dest ;
410
wire  [7:6]      ldst_va_m, ldst_va_g ;
411
wire  [4:0]     ld_pkt_dest ;
412
wire  [4:0] st_pkt_dest  ;
413
 
414
 
415
wire  [4:0]            intrpt_l2bnk_dest ;
416
wire                   pcx_req_squash_d1, pcx_req_squash_d2 ;
417
wire                   intrpt_pcx_rq_sel_d1 ;
418
wire  [2:0] intrpt_l2bnk_addr ;
419
//wire                  st0_stq_vld,st1_stq_vld,st2_stq_vld,st3_stq_vld ;
420
wire        st0_pcx_rq_sel, st1_pcx_rq_sel;
421
wire        st2_pcx_rq_sel, st3_pcx_rq_sel;
422
//wire    ld0_sec_hit_g,ld1_sec_hit_g,ld2_sec_hit_g,ld3_sec_hit_g;
423
wire    ld0_sec_hit_w2,ld1_sec_hit_w2,ld2_sec_hit_w2,ld3_sec_hit_w2;
424
//wire  [3:0] dfq_byp_sel_m, dfq_byp_sel_g ;
425
//wire  [3:0] dfq_byp_sel_m;
426
wire                 ld0_unfilled,ld1_unfilled,ld2_unfilled,ld3_unfilled;
427
wire                 ld0_unfilled_tmp,ld1_unfilled_tmp,ld2_unfilled_tmp,ld3_unfilled_tmp;
428
wire  [1:0]          ld0_unfilled_wy,ld1_unfilled_wy,ld2_unfilled_wy,ld3_unfilled_wy ;
429
wire        ld0_l2cache_rq,ld1_l2cache_rq ;
430
wire        ld2_l2cache_rq,ld3_l2cache_rq ;
431
wire                 ld0_pcx_rq_sel_d1, ld1_pcx_rq_sel_d1 ;
432
wire                 ld2_pcx_rq_sel_d1, ld3_pcx_rq_sel_d1 ;
433
wire         intrpt_pkt_vld;
434
wire                 fwdpkt_pcx_rq_sel;
435
wire            fwdpkt_pcx_rq_sel_d1,fwdpkt_pcx_rq_sel_d2,fwdpkt_pcx_rq_sel_d3 ;
436
wire         reset,dbb_reset_l;
437
wire         clk;
438
//wire         st_inst_vld_unflushed;
439
wire         ldst_dbl_g;
440
//wire                  lsu_ld_sec_hit_l2access_g ;
441
wire                  lsu_ld_sec_hit_l2access_w2 ;
442
//wire  [1:0]           lsu_ld_sec_hit_wy_g ;
443
wire  [1:0]           lsu_ld_sec_hit_wy_w2 ;
444
//wire  [1:0]  ld_way;
445
//wire [1:0]          ld_pcx_pkt_wy_g ;
446
 
447
wire    [3:0]            lsu_dtag_perror_w2 ;
448
 
449
wire    [3:0]            lmq_enable_w2 ;
450
wire  ld0_spec_pick_vld_g ,
451
      ld0_spec_pick_vld_w2 ;
452
wire  ld1_spec_pick_vld_g ,
453
      ld1_spec_pick_vld_w2 ;
454
wire  ld2_spec_pick_vld_g ,
455
      ld2_spec_pick_vld_w2 ;
456
wire  ld3_spec_pick_vld_g ,
457
      ld3_spec_pick_vld_w2 ;
458
wire  non_l2bnk_mx0_d1 ;
459
wire  non_l2bnk_mx1_d1 ;
460
wire  non_l2bnk_mx2_d1 ;
461
wire  non_l2bnk_mx3_d1 ;
462
wire  lsu_pcx_req_squash ;
463
wire  spc_pcx_atom_pq_buf2 ;
464
wire  [4:0]  spc_pcx_req_pq_buf2 ;
465
wire         lsu_ld0_pcx_rq_sel_d1, lsu_ld1_pcx_rq_sel_d1 ;
466
wire         lsu_ld2_pcx_rq_sel_d1, lsu_ld3_pcx_rq_sel_d1 ;
467
 
468
wire  [3:0]  ld_thrd_force_d1 ;
469
wire  [3:0]  st_thrd_force_d1 ;
470
wire  [3:0]  misc_thrd_force_d1 ;
471
wire  [3:0]  ld_thrd_force_vld ;
472
wire  [3:0]  st_thrd_force_vld ;
473
wire  [3:0]  misc_thrd_force_vld ;
474
wire  [3:0]  all_thrd_force_vld ;
475
wire  [3:0]  ld_thrd_pick_din ;
476
wire  [3:0]  st_thrd_pick_din ;
477
wire  [3:0]  misc_thrd_pick_din ;
478
wire  [3:0]  ld_thrd_pick_status_din ;
479
wire  [3:0]  st_thrd_pick_status_din ;
480
wire  [3:0]  misc_thrd_pick_status_din ;
481
wire  [3:0]  ld_thrd_pick_status ;
482
wire  [3:0]  st_thrd_pick_status ;
483
wire  [3:0]  misc_thrd_pick_status ;
484
wire         ld_thrd_pick_rst ;
485
wire         st_thrd_pick_rst ;
486
wire         misc_thrd_pick_rst ;
487
wire         all_thrd_pick_rst ;
488
 
489
 
490
 
491
 
492
assign  clk = rclk;
493
 
494
    dffrl_async rstff(.din (grst_l),
495
                        .q   (dbb_reset_l),
496
                        .clk (clk), .se(se), .si(), .so(),
497
                        .rst_l (arst_l));
498
 
499
assign  reset  =  ~dbb_reset_l;
500
 
501
 
502
//assign        lsu_ifu_flush_ireg = 1'b0 ;
503
//=================================================================================================
504
// TEMP !! rm from vlin.filter also !!
505
//=================================================================================================
506
 
507
wire atm_in_stb_g ;
508
assign atm_in_stb_g = 1'b0 ;
509
 
510
//=================================================================================================
511
// LOGIC MOVED FROM STB_RWCTL
512
//=================================================================================================
513
 
514
// pcx is making request for data in current cycle. Can be multi-hot.
515
//assign  pcx_any_rq_for_stb = |pcx_rq_for_stb[3:0] ;
516
//assign  pcx_any_rq_for_stb = 
517
//        (pcx_rq_for_stb[0] & ~lsu_st_pcx_rq_kill_w2[0]) | 
518
//        (pcx_rq_for_stb[1] & ~lsu_st_pcx_rq_kill_w2[1]) | 
519
//        (pcx_rq_for_stb[2] & ~lsu_st_pcx_rq_kill_w2[2]) | 
520
//        (pcx_rq_for_stb[3] & ~lsu_st_pcx_rq_kill_w2[3]) ; 
521
//
522
//dff #(1)  prvld_stgd1 (
523
//  .din  (pcx_any_rq_for_stb), 
524
//  .q  (lsu_stb_pcx_rvld_d1),
525
//  .clk  (clk), 
526
//  .se (1'b0), .si (), .so ()
527
//  );
528
 
529
// replacement for above logic - pcx_rq_for_stb is already qual'ed w/ lsu_st_pcx_rq_kill_w2
530
// this signal is used in qdp1 and qdp2 as pcx paket valids.
531
assign  lsu_stb_pcx_rvld_d1  =  st3_pcx_rq_sel_d1 |
532
                                st2_pcx_rq_sel_d1 |
533
                                st1_pcx_rq_sel_d1 |
534
                                st0_pcx_rq_sel_d1 ;
535
 
536
 
537
//assign  stb_rd_tid[0] = pcx_rq_for_stb[1] | pcx_rq_for_stb[3] ;
538
//assign  stb_rd_tid[1] = pcx_rq_for_stb[2] | pcx_rq_for_stb[3] ;
539
//
540
//dff #(2) stbtid_stgd1 (
541
//  .din    (stb_rd_tid[1:0]),  .q  (lsu_stb_rd_tid[1:0]),
542
//  .clk    (clk),
543
//  .se   (1'b0), .si (), .so ()
544
//  );
545
 
546
assign  lsu_stb_rd_tid[0]  =  st1_pcx_rq_sel_d1 | st3_pcx_rq_sel_d1;
547
assign  lsu_stb_rd_tid[1]  =  st2_pcx_rq_sel_d1 | st3_pcx_rq_sel_d1;
548
 
549
//=================================================================================================
550
 
551
assign  lsu_ramtest_rd_w = lsu_dcache_iob_rd_w | ifu_lsu_fwd_data_vld ;
552
 
553
//=================================================================================================
554
// LD PCX PKT WAY
555
//=================================================================================================
556
 
557
 
558
// For direct-map mode, assume that addition set-index bits 12:11 are
559
// used to file line in set.
560
// timing fix: 5/19/03: move secondary hit way generation to w2
561
//assign  ld_way[1:0] = 
562
//    lsu_way_hit_or ? lsu_encd_way_hit[1:0]: 
563
//                lsu_ld_sec_hit_l2access_g ? lsu_ld_sec_hit_wy_g[1:0] :
564
//                        (dc_direct_map ? lsu_ldst_va_way_g[1:0] : lsu_dcache_rand[1:0]) ;
565
//
566
//assign  lsu_lmq_pkt_way_g[1:0] = 
567
//(ldst_dbl_g & st_inst_vld_unflushed & lsu_quad_asi_g) ? 2'b01 :
568
//        casa_g ? 2'b00 : ld_way[1:0] ;
569
//
570
//assign  ld_pcx_pkt_wy_g[1:0] = lsu_lmq_pkt_way_g[1:0];
571
wire  [1:0]  ld_way_mx1_g , ld_way_mx2_g , ld_way_mx2_w2;
572
 
573
assign  ld_way_mx1_g[1:0] =
574
    lsu_way_hit_or ? lsu_encd_way_hit[1:0]:
575
                        (dc_direct_map ? lsu_ldst_va_way_g[1:0] : lsu_dcache_rand[1:0]) ;
576
 
577
assign  ld_way_mx2_g[1:0] =
578
//(ldst_dbl_g & st_inst_vld_unflushed & lsu_quad_asi_g) ? 2'b01 :  //quad st, obsolete
579
        casa_g ? 2'b00 : ld_way_mx1_g[1:0] ;
580
 
581
dff_s #(2)  ff_ld_way_mx2_w2 (
582
        .din    (ld_way_mx2_g[1:0]),
583
        .q      (ld_way_mx2_w2[1:0]),
584
        .clk    (clk),
585
        .se     (1'b0),       .si (),          .so ()
586
        );
587
 
588
wire  [1:0]  lsu_lmq_pkt_way_w2;
589
assign  lsu_lmq_pkt_way_w2[1:0] =  lsu_ld_sec_hit_l2access_w2 ? lsu_ld_sec_hit_wy_w2[1:0] :
590
                                         ld_way_mx2_w2[1:0];
591
 
592
//bug2705 - add mx for way in w2-cycle
593
wire  [1:0]  lmq0_pcx_pkt_way_tmp, lmq1_pcx_pkt_way_tmp, lmq2_pcx_pkt_way_tmp, lmq3_pcx_pkt_way_tmp ;
594
 
595
assign  lmq0_pcx_pkt_way[1:0] =  ld0_spec_pick_vld_w2 ? lsu_lmq_pkt_way_w2[1:0] : lmq0_pcx_pkt_way_tmp[1:0] ;
596
assign  lmq1_pcx_pkt_way[1:0] =  ld1_spec_pick_vld_w2 ? lsu_lmq_pkt_way_w2[1:0] : lmq1_pcx_pkt_way_tmp[1:0] ;
597
assign  lmq2_pcx_pkt_way[1:0] =  ld2_spec_pick_vld_w2 ? lsu_lmq_pkt_way_w2[1:0] : lmq2_pcx_pkt_way_tmp[1:0] ;
598
assign  lmq3_pcx_pkt_way[1:0] =  ld3_spec_pick_vld_w2 ? lsu_lmq_pkt_way_w2[1:0] : lmq3_pcx_pkt_way_tmp[1:0] ;
599
 
600
wire    qword_access0,qword_access1,qword_access2,qword_access3;
601
 
602
// Extend by 1-b to add support for 3rd size bit for iospace.
603
// move the flops from qdp1 to qctl1
604
dffe_s #(2)  ff_lmq0_pcx_pkt_way (
605
           .din    (lsu_lmq_pkt_way_w2[1:0]),
606
           .q      (lmq0_pcx_pkt_way_tmp[1:0]),
607
           .en     (lmq_enable_w2[0]),
608
           .clk    (clk),
609
           .se     (1'b0),       .si (),          .so ()
610
           );
611
dffe_s #(2)  ff_lmq1_pcx_pkt_way (
612
           .din    (lsu_lmq_pkt_way_w2[1:0]),
613
           .q      (lmq1_pcx_pkt_way_tmp[1:0]),
614
           .en     (lmq_enable_w2[1]),
615
           .clk    (clk),
616
           .se     (1'b0),       .si (),          .so ()
617
           );
618
dffe_s #(2)  ff_lmq2_pcx_pkt_way (
619
           .din    (lsu_lmq_pkt_way_w2[1:0]),
620
           .q      (lmq2_pcx_pkt_way_tmp[1:0]),
621
           .en     (lmq_enable_w2[2]),
622
           .clk    (clk),
623
           .se     (1'b0),       .si (),          .so ()
624
           );
625
dffe_s #(2)  ff_lmq3_pcx_pkt_way (
626
           .din    (lsu_lmq_pkt_way_w2[1:0]),
627
           .q      (lmq3_pcx_pkt_way_tmp[1:0]),
628
           .en     (lmq_enable_w2[3]),
629
           .clk    (clk),
630
           .se     (1'b0),       .si (),          .so ()
631
           );
632
 
633
// Q Word Access to IO
634
dffe_s   ff_lmq0_qw (
635
           .din    (lsu_quad_word_access_g),
636
           .q      (qword_access0),
637
           .en     (lmq_enable[0]),
638
           .clk    (clk),
639
           .se     (1'b0),       .si (),          .so ()
640
           );
641
dffe_s   ff_lmq1_qw (
642
           .din    (lsu_quad_word_access_g),
643
           .q      (qword_access1),
644
           .en     (lmq_enable[1]),
645
           .clk    (clk),
646
           .se     (1'b0),       .si (),          .so ()
647
           );
648
dffe_s   ff_lmq2_qw(
649
           .din    (lsu_quad_word_access_g),
650
           .q      (qword_access2),
651
           .en     (lmq_enable[2]),
652
           .clk    (clk),
653
           .se     (1'b0),       .si (),          .so ()
654
           );
655
dffe_s   ff_lmq3_qw (
656
           .din    (lsu_quad_word_access_g),
657
           .q      (qword_access3),
658
           .en     (lmq_enable[3]),
659
           .clk    (clk),
660
           .se     (1'b0),       .si (),          .so ()
661
           );
662
 
663
assign  lsu_pcx_rq_sz_b3 =
664
        (ld0_pcx_rq_sel_d1 & qword_access0) |
665
        (ld1_pcx_rq_sel_d1 & qword_access1) |
666
        (ld2_pcx_rq_sel_d1 & qword_access2) |
667
        (ld3_pcx_rq_sel_d1 & qword_access3) ;
668
 
669
//=================================================================================================
670
// SHADOW SCAN
671
//=================================================================================================
672
 
673
 
674
// Monitors outstanding loads. This would hang a thread.
675
assign  lsu_sscan_data[3:0] =
676
                {ld0_pcx_rq_vld, ld1_pcx_rq_vld , ld2_pcx_rq_vld , ld3_pcx_rq_vld} ;
677
// Monitors outstanding loads. This would hang issue from stb
678
assign  lsu_sscan_data[7:4] =
679
                {st0_pcx_rq_vld, st1_pcx_rq_vld, st2_pcx_rq_vld, st3_pcx_rq_vld} ;
680
assign  lsu_sscan_data[8] = imiss_pcx_rq_vld ;  // imiss
681
assign  lsu_sscan_data[9] = strm_pcx_rq_vld ;   // strm
682
assign  lsu_sscan_data[10] = fwdpkt_rq_vld ;    // fwd rply/rq 
683
assign  lsu_sscan_data[11] = intrpt_pcx_rq_vld ; // intrpt
684
assign  lsu_sscan_data[12] = fpop_pcx_rq_vld ;  // fpop
685
 
686
 
687
//=================================================================================================
688
// QDP1 selects
689
//=================================================================================================
690
 
691
wire [3:0] dfq_byp_tid_sel;
692
 
693
assign dfq_byp_tid_sel[0]  =  (lsu_dfq_byp_tid[1:0]==2'b00);
694
assign dfq_byp_tid_sel[1]  =  (lsu_dfq_byp_tid[1:0]==2'b01);
695
assign dfq_byp_tid_sel[2]  =  (lsu_dfq_byp_tid[1:0]==2'b10);
696
assign dfq_byp_tid_sel[3]  =  (lsu_dfq_byp_tid[1:0]==2'b11);
697
//assign dfq_byp_tid__sel[3]  =  ~|(lsu_dfq_byp_d1_sel[2:0]);
698
 
699
wire  [3:0]  lsu_dfq_byp_tid_d1_sel_tmp ;
700
 
701
dffe_s #(4)  dfq_byp_tid_sel_ff (
702
           .din    (dfq_byp_tid_sel[3:0]),
703
           .q      (lsu_dfq_byp_tid_d1_sel_tmp[3:0]),
704
           .en     (dfq_byp_ff_en),
705
           .clk    (clk),
706
           .se     (1'b0),       .si (),          .so ()
707
           );
708
 
709
//11/21/03 - add rst_tri_en to lsu_dfq_byp_tid_d1_sel[3:0] going to qdp1 as dfq_byp_sel[3:0]
710
 
711
assign  lsu_dfq_byp_tid_d1_sel[2:0]  =  lsu_dfq_byp_tid_d1_sel_tmp[2:0]  & {3{~rst_tri_en}};
712
assign  lsu_dfq_byp_tid_d1_sel[3]    =  lsu_dfq_byp_tid_d1_sel_tmp[3]    | rst_tri_en;
713
 
714
 
715
//=================================================================================================
716
// INST_VLD_W GENERATION
717
//=================================================================================================
718
 
719
 
720
wire [1:0] thrid_m, thrid_g ;
721
dff_s #(2)  stgm_thrid (
722
        .din    (ifu_tlu_thrid_e[1:0]),
723
        .q      (thrid_m[1:0]),
724
        .clk    (clk),
725
        .se     (1'b0),       .si (),          .so ()
726
        );
727
 
728
dff_s  #(2) stgg_thrid (
729
        .din    (thrid_m[1:0]),
730
        .q      (thrid_g[1:0]),
731
        .clk    (clk),
732
        .se     (1'b0),       .si (),          .so ()
733
        );
734
 
735
wire    flush_w_inst_vld_m ;
736
wire    lsu_inst_vld_w,lsu_inst_vld_tmp ;
737
wire    other_flush_pipe_w ;
738
wire  qctl1_flush_pipe_w;
739
 
740
assign  flush_w_inst_vld_m =
741
        ifu_tlu_inst_vld_m &
742
        ~(qctl1_flush_pipe_w & (thrid_m[1:0] == thrid_g[1:0])) ; // really lsu_flush_pipe_w
743
 
744
dff_s  stgw_ivld (
745
        .din    (flush_w_inst_vld_m),
746
        .q      (lsu_inst_vld_tmp),
747
        .clk    (clk),
748
        .se     (1'b0),       .si (),          .so ()
749
        );
750
 
751
 
752
assign  other_flush_pipe_w = tlu_early_flush_pipe2_w | (lsu_ttype_vld_m2 & lsu_inst_vld_tmp);
753
assign  qctl1_flush_pipe_w = other_flush_pipe_w | ifu_lsu_flush_w ;
754
 
755
assign  lsu_inst_vld_w = lsu_inst_vld_tmp & ~qctl1_flush_pipe_w ;
756
 
757
 
758
//=================================================================================================
759
// SECONDARY VS. PRIMARY LOADS
760
//=================================================================================================
761
 
762
// An incoming load can hit can match addresses with an outstanding load request
763
// from another thread. In this case, the secondary load must wait until the primary
764
// load returns and then it will bypass (but not fill). There can only be one primary
765
// load but multiple secondary loads. The secondary loads will not enter the dfq.
766
// The primary load will however be recirculated until all secondary loads have bypassed.
767
 
768
// Could have multiple secondary hits. Only one thread can be chosen
769
// as primary though.
770
 
771
//An incoming load can match addresses with any outstanding load request from other threads.
772
//can be multiple hits
773
// timing fix: 5/19/03: move secondary hit way generation to w2
774
//
775
//assign  ld0_sec_hit_g = ld_sec_hit_thrd0 & ld0_unfilled  ;
776
//assign  ld1_sec_hit_g = ld_sec_hit_thrd1 & ld1_unfilled  ;
777
//assign  ld2_sec_hit_g = ld_sec_hit_thrd2 & ld2_unfilled  ;
778
//assign  ld3_sec_hit_g = ld_sec_hit_thrd3 & ld3_unfilled  ;
779
//
780
//
781
// Fix for Bug1606
782
//assign  lsu_ld_sec_hit_l2access_g =
783
//         ld0_sec_hit_g | ld1_sec_hit_g | ld2_sec_hit_g | ld3_sec_hit_g ;
784
//
785
//phase 2
786
//since can be multiple hits, it isn't one-hot mux, but fix priority-sel mux
787
//assign  lsu_ld_sec_hit_wy_g[1:0] =
788
//    ld0_sec_hit_g ? ld0_unfilled_wy[1:0] :
789
//      ld1_sec_hit_g ? ld1_unfilled_wy[1:0] :
790
//        ld2_sec_hit_g ? ld2_unfilled_wy[1:0] :
791
//          ld3_sec_hit_g ? ld3_unfilled_wy[1:0] : 2'bxx ;
792
 
793
wire  ld_sec_hit_thrd0_w2,ld_sec_hit_thrd1_w2,ld_sec_hit_thrd2_w2,ld_sec_hit_thrd3_w2;
794
 
795
dff_s #(4) ff_ld_sec_hit_thrd0to3_d1 (
796
        .din    ({ld_sec_hit_thrd0,ld_sec_hit_thrd1,ld_sec_hit_thrd2,ld_sec_hit_thrd3}),
797
        .q      ({ld_sec_hit_thrd0_w2,ld_sec_hit_thrd1_w2,ld_sec_hit_thrd2_w2,ld_sec_hit_thrd3_w2}),
798
        .clk    (clk),
799
        .se     (1'b0),       .si (),          .so ()
800
        );
801
 
802
assign  ld0_sec_hit_w2 = ld_sec_hit_thrd0_w2 & ld0_unfilled  ;
803
assign  ld1_sec_hit_w2 = ld_sec_hit_thrd1_w2 & ld1_unfilled  ;
804
assign  ld2_sec_hit_w2 = ld_sec_hit_thrd2_w2 & ld2_unfilled  ;
805
assign  ld3_sec_hit_w2 = ld_sec_hit_thrd3_w2 & ld3_unfilled  ;
806
 
807
// Fix for Bug1606
808
assign  lsu_ld_sec_hit_l2access_w2 =
809
         ld0_sec_hit_w2 | ld1_sec_hit_w2 | ld2_sec_hit_w2 | ld3_sec_hit_w2 ;
810
 
811
//phase 2
812
//since can be multiple hits, it isn't one-hot mux, but fix priority-sel mux
813
assign  lsu_ld_sec_hit_wy_w2[1:0] =
814
    ld0_sec_hit_w2 ? ld0_unfilled_wy[1:0] :
815
      ld1_sec_hit_w2 ? ld1_unfilled_wy[1:0] :
816
        ld2_sec_hit_w2 ? ld2_unfilled_wy[1:0] :
817
          ld3_sec_hit_w2 ? ld3_unfilled_wy[1:0] : 2'bxx ;
818
 
819
//dff #(4)  stgm_dbypsel (
820
//        .din    (dfq_byp_sel[3:0]),
821
//        .q      (dfq_byp_sel_m[3:0]),
822
//        .clk    (clk),
823
//        .se     (1'b0),       .si (),          .so ()
824
//        );
825
 
826
//dff #(4)  stgg_dbypsel (
827
//        .din    (dfq_byp_sel_m[3:0]),
828
//        .q      (dfq_byp_sel_g[3:0]),
829
//        .clk    (clk),
830
//        .se     (1'b0),       .si (),          .so ()
831
//        );
832
 
833
// select g-stage lmq source.
834
// Selects for lmq contents shared by fill/hit and alternate sources such as ldxa/raw.
835
// Is qualification of dfq_byp_sel_g by ld_thrd_byp_sel necessary ???
836
 
837
wire    [3:0] lmq_byp_misc_sel_e ;
838
 
839
assign  lmq_byp_misc_sel_e[0] = ld_thrd_byp_sel_e[0]  |        // select for ldxa/raw.
840
                                dfq_byp_sel[0]  ;              // select for dfq.
841
assign  lmq_byp_misc_sel_e[1] = ld_thrd_byp_sel_e[1]  |        // select for ldxa/raw.
842
                                dfq_byp_sel[1] ;               // select for dfq.
843
assign  lmq_byp_misc_sel_e[2] = ld_thrd_byp_sel_e[2]  |        // select for ldxa/raw.
844
                                dfq_byp_sel[2] ;               // select for dfq.
845
assign  lmq_byp_misc_sel_e[3] = ~|lmq_byp_misc_sel_e[2:0];
846
                                //ld_thrd_byp_sel_e[3]  |        // select for ldxa/raw.
847
                                //dfq_byp_sel[3] ;               // select for dfq.
848
 
849
/*
850
assign  lmq_byp_misc_sel_e[0] = ld_thrd_byp_sel_e[0]  |        // select for ldxa/raw.
851
          (dfq_byp_sel[0] & ~ld_thrd_byp_sel_e[0]) ;  // select for dfq.
852
assign  lmq_byp_misc_sel_e[1] = ld_thrd_byp_sel_e[1]  |        // select for ldxa/raw.
853
          (dfq_byp_sel[1] & ~ld_thrd_byp_sel_e[1]) ; // select for dfq.
854
assign  lmq_byp_misc_sel_e[2] = ld_thrd_byp_sel_e[2]  |        // select for ldxa/raw.
855
          (dfq_byp_sel[2] & ~ld_thrd_byp_sel_e[2]) ; // select for dfq.
856
assign  lmq_byp_misc_sel_e[3] = ld_thrd_byp_sel_e[3]  |        // select for ldxa/raw.
857
          (dfq_byp_sel[3] & ~ld_thrd_byp_sel_e[3]) ; // select for dfq.
858
*/
859
 
860
// M-Stage 
861
//10/27/03 - add rst_tri_en for the select - lsu_lmq_byp_misc_sel to qdp1
862
wire  [3:0]  lsu_lmq_byp_misc_sel_tmp ;
863
dff_s #(4)  stgg_lbsel (
864
        .din    (lmq_byp_misc_sel_e[3:0]),
865
        .q      (lsu_lmq_byp_misc_sel_tmp[3:0]),
866
        .clk    (clk),
867
        .se     (1'b0),       .si (),          .so ()
868
        );
869
 
870
assign lsu_lmq_byp_misc_sel[2:0]=  lsu_lmq_byp_misc_sel_tmp[2:0] & {3{~rst_tri_en}} ;
871
assign lsu_lmq_byp_misc_sel[3]  =  lsu_lmq_byp_misc_sel_tmp[3] | rst_tri_en ;
872
 
873
 
874
/*
875
assign  lsu_lmq_byp_misc_sel[0] = ld_thrd_byp_sel[0]  |        // select for ldxa/raw.
876
          (dfq_byp_sel_g[0] & ~ld_thrd_byp_sel[0]) ;  // select for dfq.
877
assign  lsu_lmq_byp_misc_sel[1] = ld_thrd_byp_sel[1]  |        // select for ldxa/raw.
878
          (dfq_byp_sel_g[1] & ~ld_thrd_byp_sel[1]) ; // select for dfq.
879
assign  lsu_lmq_byp_misc_sel[2] = ld_thrd_byp_sel[2]  |        // select for ldxa/raw.
880
          (dfq_byp_sel_g[2] & ~ld_thrd_byp_sel[2]) ; // select for dfq.
881
assign  lsu_lmq_byp_misc_sel[3] = ld_thrd_byp_sel[3]  |        // select for ldxa/raw.
882
          (dfq_byp_sel_g[3] & ~ld_thrd_byp_sel[3]) ; // select for dfq.
883
*/
884
 
885
 
886
 
887
//=================================================================================================
888
//  Miscellaneous Staging
889
//=================================================================================================
890
 
891
 
892
assign  thread0_e = ~ifu_tlu_thrid_e[1] & ~ifu_tlu_thrid_e[0] ;
893
assign  thread1_e = ~ifu_tlu_thrid_e[1] &  ifu_tlu_thrid_e[0] ;
894
assign  thread2_e =  ifu_tlu_thrid_e[1] & ~ifu_tlu_thrid_e[0] ;
895
assign  thread3_e =  ifu_tlu_thrid_e[1] &  ifu_tlu_thrid_e[0] ;
896
 
897
assign  ld0_inst_vld_e = ld_inst_vld_e & thread0_e ;
898
assign  ld1_inst_vld_e = ld_inst_vld_e & thread1_e ;
899
assign  ld2_inst_vld_e = ld_inst_vld_e & thread2_e ;
900
assign  ld3_inst_vld_e = ld_inst_vld_e & thread3_e ;
901
 
902
assign ldst_va_m[7:6] = lsu_ldst_va_m[7:6];
903
 
904
dff_s  #(6) stgm_ad_m (
905
        .din    ({ld0_inst_vld_e,ld1_inst_vld_e,
906
    ld2_inst_vld_e,ld3_inst_vld_e,ifu_lsu_ldst_fp_e,
907
    ifu_lsu_ldst_dbl_e}),
908
        .q      ({ld0_inst_vld_m,ld1_inst_vld_m,
909
    ld2_inst_vld_m,ld3_inst_vld_m,ldst_fp_m,
910
    ldst_dbl_m}),
911
        .clk  (clk),
912
        .se     (1'b0),       .si (),          .so ()
913
        );
914
 
915
 
916
dff_s  #(8) stgm_ad_g (
917
        .din    ({ldst_va_m[7:6],ld0_inst_vld_m,ld1_inst_vld_m,
918
        //.din    ({ldst_va_m[8:6],ld0_inst_vld_m,ld1_inst_vld_m,
919
    ld2_inst_vld_m,ld3_inst_vld_m,ldst_fp_m,
920
    //ld2_inst_vld_m,ld3_inst_vld_m,st_inst_vld_m,ldst_fp_m,
921
    ldst_dbl_m}),
922
        .q      ({ldst_va_g[7:6],ld0_inst_vld_unflushed,ld1_inst_vld_unflushed,
923
        //.q      ({ldst_va_g[8:6],ld0_inst_vld_unflushed,ld1_inst_vld_unflushed,
924
    ld2_inst_vld_unflushed,ld3_inst_vld_unflushed,
925
    //ld2_inst_vld_unflushed,ld3_inst_vld_unflushed,st_inst_vld_unflushed,
926
    ldst_fp_g,ldst_dbl_g}),
927
        .clk  (clk),
928
        .se     (1'b0),       .si (),          .so ()
929
  );
930
 
931
assign  ld0_inst_vld_g = ld0_inst_vld_unflushed & lsu_inst_vld_w ;
932
assign  ld1_inst_vld_g = ld1_inst_vld_unflushed & lsu_inst_vld_w ;
933
assign  ld2_inst_vld_g = ld2_inst_vld_unflushed & lsu_inst_vld_w ;
934
assign  ld3_inst_vld_g = ld3_inst_vld_unflushed & lsu_inst_vld_w ;
935
//assign  st_inst_vld_g  = st_inst_vld_unflushed & lsu_inst_vld_w  ;
936
 
937
dff_s  #(4) ivld_stgw2 (
938
        .din    ({ld0_inst_vld_g,ld1_inst_vld_g,ld2_inst_vld_g,ld3_inst_vld_g}),
939
        .q      ({ld0_inst_vld_w2,ld1_inst_vld_w2,ld2_inst_vld_w2,ld3_inst_vld_w2}),
940
        .clk  (clk),
941
        .se     (1'b0),       .si (),          .so ()
942
  );
943
 
944
dff_s  #(4) th_stgm (
945
        .din    ({thread0_e,thread1_e,thread2_e,thread3_e}),
946
        .q      ({thread0_m,thread1_m,thread2_m,thread3_m}),
947
        .clk  (clk),
948
        .se     (1'b0),       .si (),          .so ()
949
  );
950
 
951
dff_s  #(4) th_stgg (
952
        .din    ({thread0_m,thread1_m,thread2_m,thread3_m}),
953
        .q      ({thread0_g,thread1_g,thread2_g,thread3_g}),
954
        .clk  (clk),
955
        .se     (1'b0),       .si (),          .so ()
956
  );
957
 
958
dff_s  #(4) th_stgw2 (
959
        .din    ({thread0_g,thread1_g,thread2_g,thread3_g}),
960
        .q      ({thread0_w2,thread1_w2,thread2_w2,thread3_w2}),
961
        .clk  (clk),
962
        .se     (1'b0),       .si (),          .so ()
963
  );
964
 
965
 
966
 
967
//=================================================================================================
968
//
969
// IMISS PCX PKT REQ CTL
970
//
971
//=================================================================================================
972
 
973
 
974
// ** ifu request packet should be sent out in e-stage **
975
// ** Prefer not to make dfq dual-ported **
976
 
977
// Format of IFU pcx packet (50b) :
978
//  b49 - valid
979
//  b48:44 - req type
980
//  b43:42 - rep way (for "eviction" - maintains directory consistency )
981
//  b41:40 - mil id
982
//  b39:0  - imiss address
983
// *
984
// destid :
985
//  b2  - b39 of pa
986
//  b1  - b8  of pa
987
//  b0  - b7  of pa 
988
// pcxpkt :
989
//  b51 - valid
990
//  b50 - reserved
991
//  b49 - NC
992
//  b48:44 - req type
993
//  b43:42 - rep way (for "eviction" - maintains directory consistency )
994
//  b41:40 - mil id
995
//  b39:0  - imiss address
996
 
997
// IMISS REQUEST CONTROL
998
// Vld is reset if imiss pkt requests and request is not subsequently
999
// squashed and new imiss pkt unavailable.
1000
 
1001
// Request rate is 1/3 cycles.
1002
 
1003
/*dff  iack_stg (
1004
        .din    (imiss_pcx_rq_sel),
1005
        .q      (lsu_ifu_pcxpkt_ack_d),
1006
        .clk    (clk),
1007
        .se     (1'b0),       .si (),          .so ()
1008
        ); */
1009
 
1010
assign  lsu_ifu_pcxpkt_ack_d = imiss_pcx_rq_sel_d2 & ~pcx_req_squash_d1 ;
1011
 
1012
assign  imiss_pkt_vld =  ifu_lsu_pcxreq_d & ~(imiss_pcx_rq_sel_d1 | imiss_pcx_rq_sel_d2) ;
1013
 
1014
//timing fix: 5/21/03 - ifu sends destid 1 cycle early
1015
//assign  imiss_l2bnk_addr[2:0] = ifu_lsu_destid_d[2:0] ;
1016
 
1017
wire  ifu_destid_en ;
1018
assign  ifu_destid_en  =  ~ifu_lsu_pcxreq_d | (lsu_ifu_pcxpkt_ack_d & ~ifu_lsu_pcxpkt_e_b50);
1019
 
1020
wire  [2:0]  ifu_destid_d;
1021
dffe_s #(3)  ff_ifu_destid_d (
1022
           .din    (ifu_lsu_destid_s[2:0]),
1023
           .q      (ifu_destid_d[2:0]),
1024
           .en     (ifu_destid_en),
1025
           .clk    (clk),
1026
           .se     (1'b0),       .si (),          .so ()
1027
           );
1028
assign  imiss_l2bnk_addr[2:0] = ifu_destid_d[2:0] ;
1029
 
1030
assign imiss_l2bnk_dest[0] =
1031
~imiss_l2bnk_addr[2] & ~imiss_l2bnk_addr[1] & ~imiss_l2bnk_addr[0] ;
1032
assign imiss_l2bnk_dest[1] =
1033
~imiss_l2bnk_addr[2] & ~imiss_l2bnk_addr[1] &  imiss_l2bnk_addr[0] ;
1034
assign imiss_l2bnk_dest[2] =
1035
~imiss_l2bnk_addr[2] & imiss_l2bnk_addr[1] & ~imiss_l2bnk_addr[0] ;
1036
assign imiss_l2bnk_dest[3] =
1037
~imiss_l2bnk_addr[2] & imiss_l2bnk_addr[1] &  imiss_l2bnk_addr[0] ;
1038
assign imiss_l2bnk_dest[4] = imiss_l2bnk_addr[2] ;
1039
 
1040
 
1041
//=================================================================================================
1042
//  FPOP PCX RQ CTL
1043
//=================================================================================================
1044
 
1045
 
1046
assign  fpst_vld_m = ffu_lsu_data[80] & ffu_lsu_data[79] ;
1047
 
1048
dff_s  fpst_stg (
1049
        .din    (fpst_vld_m),
1050
        .q      (fpst_vld_g),
1051
        .clk  (clk),
1052
        .se     (1'b0),       .si (),          .so ()
1053
        );
1054
 
1055
// ffu req is  never speculative as it must always begin with the queue empty 
1056
assign  lsu_ffu_ack =
1057
        fpop_pcx_rq_sel_d1 |   // fpop needs to wait until selected;d1 for timing
1058
        //fpop_pcx_rq_sel |   // fpop needs to wait until selected
1059
        fpst_vld_g ;    // fpst responds immediately.
1060
 
1061
// req_squash needs to match up with rq_sel_d1 !!!
1062
// keep vld around for two cycles.
1063
assign fpop_vld_reset =
1064
  (reset | fpop_pcx_rq_sel) ;
1065
  //(reset | fpop_pcx_rq_sel_d1) ; 
1066
 
1067
assign fpop_vld_en = ffu_lsu_fpop_rq_vld ;
1068
 
1069
// fpop valid
1070
dffre_s #(1)  fpop_vld (
1071
        .din  (ffu_lsu_fpop_rq_vld),
1072
        .q    (fpop_pkt_vld_unmasked),
1073
        .rst  (fpop_vld_reset), .en (fpop_vld_en),
1074
        .clk  (clk),
1075
        .se   (1'b0),       .si (),          .so ()
1076
        );
1077
 
1078
// ** fpop_pkt1 should not be required.
1079
assign  fpop_pkt1 = fpop_pkt_vld_unmasked & ~fpop_pcx_rq_sel_d1 ;
1080
 
1081
assign  fpop_pkt_vld = fpop_pkt_vld_unmasked ; // & ~ffu_lsu_kill_fpop_rq ;
1082
 
1083
assign  fpop_atom_req = fpop_pkt1 & fpop_pcx_rq_sel ;
1084
 
1085
dff_s  fpatm_stg (
1086
        .din    (fpop_atom_req),
1087
        .q      (fpop_atom_rq_pq),
1088
        .clk  (clk),
1089
        .se     (1'b0),       .si (),          .so ()
1090
        );
1091
 
1092
assign fpop_l2bnk_dest[4:0]   = 5'b10000 ;
1093
 
1094
 
1095
 
1096
//=================================================================================================
1097
//  SPU PCX PKT REQ CONTROL
1098
//=================================================================================================
1099
 
1100
// If ack is sent in a given cycle, then the earliest the spu can send
1101
// a response is in the same cycle. 
1102
 
1103
wire    strm_pcx_rq_sel_d2 ;
1104
assign  lsu_spu_ldst_ack =
1105
  strm_pcx_rq_sel_d2 & ~pcx_req_squash_d1 ;  // spu request sent to pcx.
1106
  //strm_pcx_rq_sel_d1 & ~pcx_req_squash ;  // spu request sent to pcx.
1107
 
1108
dff_s #(1) rqsel_d2 (
1109
  .din (strm_pcx_rq_sel_d1),
1110
  .q   (strm_pcx_rq_sel_d2),
1111
  .clk (clk),
1112
  .se     (1'b0),       .si (),          .so ()
1113
);
1114
 
1115
wire spu_ack_d1 ;
1116
dff_s #(1) spuack_d1 (
1117
  .din (lsu_spu_ldst_ack),
1118
  .q   (spu_ack_d1),
1119
  .clk (clk),
1120
  .se     (1'b0),       .si (),          .so ()
1121
);
1122
 
1123
dff_s #(2) ff_spu_lsu_ldst_pckt_d1 (
1124
  .din (spu_lsu_ldst_pckt[`PCX_AD_LO+7:`PCX_AD_LO+6]),
1125
  .q   (strm_l2bnk_addr[1:0]),
1126
  .clk (clk),
1127
  .se     (1'b0),       .si (),          .so ()
1128
);
1129
 
1130
// Streaming does not access io space.
1131
assign strm_l2bnk_dest[0] =
1132
~strm_l2bnk_addr[1] & ~strm_l2bnk_addr[0] ;
1133
assign strm_l2bnk_dest[1] =
1134
~strm_l2bnk_addr[1] &  strm_l2bnk_addr[0] ;
1135
assign strm_l2bnk_dest[2] =
1136
strm_l2bnk_addr[1] & ~strm_l2bnk_addr[0] ;
1137
assign strm_l2bnk_dest[3] =
1138
strm_l2bnk_addr[1] &  strm_l2bnk_addr[0] ;
1139
assign strm_l2bnk_dest[4] = 1'b0 ;
1140
 
1141
wire  strm_pkt_vld_unmasked ;
1142
 
1143
dff_s #(1) spu_pkt_vld_d1 (
1144
        .din    (spu_lsu_ldst_pckt_vld),
1145
        .q      (strm_pkt_vld_unmasked),
1146
        .clk    (clk),
1147
        .se     (1'b0),       .si (),          .so ()
1148
        );
1149
 
1150
assign  strm_pkt_vld =
1151
        strm_pkt_vld_unmasked & ~(strm_pcx_rq_sel_d1 | lsu_spu_ldst_ack | spu_ack_d1);
1152
 
1153
// temp = remove strming interface
1154
//assign strm_sldst_cam_vld = 1'b0 ;
1155
//assign strm_sld_dc_rd_vld = 1'b0 ;
1156
//assign strm_sldst_cam_d2 = 1'b0 ;
1157
// temp = remove strming interface
1158
 
1159
 
1160
//=================================================================================================
1161
//  STORE PCX PKT REQ CONTROL
1162
//=================================================================================================
1163
 
1164
// Stage by a cycle.
1165
 
1166
// Thread0
1167
wire    [2:1]   stb0_rqtype ;
1168
wire    [2:0]    stb0_rqaddr ;
1169
dff_s #(5) stgd1_s0rq (
1170
        .din    ({stb0_atm_rq_type[2:1], stb0_l2b_addr[2:0]}),
1171
        .q      ({stb0_rqtype[2:1],stb0_rqaddr[2:0]}),
1172
        .clk    (clk),
1173
        .se     (1'b0),       .si (),          .so ()
1174
        );
1175
 
1176
// Thread1
1177
wire    [2:1]   stb1_rqtype ;
1178
wire    [2:0]    stb1_rqaddr ;
1179
dff_s #(5) stgd1_s1rq (
1180
        .din    ({stb1_atm_rq_type[2:1], stb1_l2b_addr[2:0]}),
1181
        .q      ({stb1_rqtype[2:1],stb1_rqaddr[2:0]}),
1182
        .clk    (clk),
1183
        .se     (1'b0),       .si (),          .so ()
1184
        );
1185
 
1186
// Thread2
1187
wire    [2:1]   stb2_rqtype ;
1188
wire    [2:0]    stb2_rqaddr ;
1189
dff_s #(5) stgd1_s2rq (
1190
        .din    ({stb2_atm_rq_type[2:1], stb2_l2b_addr[2:0]}),
1191
        .q      ({stb2_rqtype[2:1],stb2_rqaddr[2:0]}),
1192
        .clk    (clk),
1193
        .se     (1'b0),       .si (),          .so ()
1194
        );
1195
 
1196
// Thread3
1197
wire    [2:1]   stb3_rqtype ;
1198
wire    [2:0]    stb3_rqaddr ;
1199
dff_s #(5) stgd1_s3rq (
1200
        .din    ({stb3_atm_rq_type[2:1], stb3_l2b_addr[2:0]}),
1201
        .q      ({stb3_rqtype[2:1],stb3_rqaddr[2:0]}),
1202
        .clk    (clk),
1203
        .se     (1'b0),       .si (),          .so ()
1204
        );
1205
 
1206
wire    stb0_rd_for_pcx,stb1_rd_for_pcx,stb2_rd_for_pcx,stb3_rd_for_pcx ;
1207
wire    stb0_rd_for_pcx_tmp,stb1_rd_for_pcx_tmp,stb2_rd_for_pcx_tmp,stb3_rd_for_pcx_tmp ;
1208
dff_s #(4) stgd1_rdpcx (
1209
        .din    (stb_rd_for_pcx[3:0]),
1210
        .q      ({stb3_rd_for_pcx_tmp,stb2_rd_for_pcx_tmp,stb1_rd_for_pcx_tmp,stb0_rd_for_pcx_tmp}),
1211
        .clk    (clk),
1212
        .se     (1'b0),       .si (),          .so ()
1213
        );
1214
 
1215
// timing fix: 5/6 - move kill qual after store pick
1216
//assign        stb0_rd_for_pcx = stb0_rd_for_pcx_tmp & ~lsu_st_pcx_rq_kill_w2[0] ;
1217
//assign        stb1_rd_for_pcx = stb1_rd_for_pcx_tmp & ~lsu_st_pcx_rq_kill_w2[1] ;
1218
//assign        stb2_rd_for_pcx = stb2_rd_for_pcx_tmp & ~lsu_st_pcx_rq_kill_w2[2] ;
1219
//assign        stb3_rd_for_pcx = stb3_rd_for_pcx_tmp & ~lsu_st_pcx_rq_kill_w2[3] ;
1220
 
1221
assign  stb0_rd_for_pcx = stb0_rd_for_pcx_tmp;
1222
assign  stb1_rd_for_pcx = stb1_rd_for_pcx_tmp;
1223
assign  stb2_rd_for_pcx = stb2_rd_for_pcx_tmp;
1224
assign  stb3_rd_for_pcx = stb3_rd_for_pcx_tmp;
1225
 
1226
// STORE REQUEST CONTROL
1227
// ** Data must come from bypass mux output.
1228
// THREAD0
1229
 
1230
// Reads for stores will have to be made non-speculative ????
1231
// or delay when ced bit is set such that there is no need
1232
// to replay store.
1233
// The size of atm_rq_type can be reduced in stb_ctl etc !!!
1234
assign  st0_pkt_vld = stb0_rd_for_pcx & ~st0_pcx_rq_sel_d1 ;
1235
assign  st0_cas_vld = ~stb0_rqtype[2] & stb0_rqtype[1] ;
1236
// stquad not supported.
1237
//assign  st0_stq_vld = 1'b0 ;
1238
assign  st0_atomic_vld = st0_cas_vld ;
1239
  //st0_stq_vld |               // stq(1)
1240
  //(~stb0_rqtype[2] & stb0_rqtype[1] & ~stb0_rqtype[0]) ; // cas(1)
1241
 
1242
assign  st1_pkt_vld = stb1_rd_for_pcx & ~st1_pcx_rq_sel_d1 ;
1243
assign  st1_cas_vld = ~stb1_rqtype[2] & stb1_rqtype[1] ;
1244
//assign  st1_stq_vld = 1'b0 ;
1245
assign  st1_atomic_vld = st1_cas_vld ;
1246
 
1247
assign  st2_pkt_vld = stb2_rd_for_pcx & ~st2_pcx_rq_sel_d1 ;
1248
assign  st2_cas_vld = ~stb2_rqtype[2] & stb2_rqtype[1] ;
1249
//assign  st2_stq_vld = 1'b0 ;
1250
assign  st2_atomic_vld = st2_cas_vld ;
1251
 
1252
assign  st3_pkt_vld = stb3_rd_for_pcx & ~st3_pcx_rq_sel_d1 ;
1253
assign  st3_cas_vld = ~stb3_rqtype[2] & stb3_rqtype[1] ;
1254
//assign  st3_stq_vld = 1'b0 ;
1255
assign  st3_atomic_vld = st3_cas_vld ;
1256
 
1257
// Can this be based on st0_pcx_rq_vld instead to ease critical path.
1258
 
1259
//assign  pcx_rq_for_stb[0] = st_pcx_rq_mhot_sel[0] ;
1260
//assign  pcx_rq_for_stb[1] = st_pcx_rq_mhot_sel[1] ;
1261
//assign  pcx_rq_for_stb[2] = st_pcx_rq_mhot_sel[2] ;
1262
//assign  pcx_rq_for_stb[3] = st_pcx_rq_mhot_sel[3] ;
1263
 
1264
 
1265
assign st0_l2bnk_dest[0] =
1266
~stb0_rqaddr[2] & ~stb0_rqaddr[1] & ~stb0_rqaddr[0] ;
1267
assign st0_l2bnk_dest[1] =
1268
~stb0_rqaddr[2] & ~stb0_rqaddr[1] &  stb0_rqaddr[0] ;
1269
assign st0_l2bnk_dest[2] =
1270
~stb0_rqaddr[2] &  stb0_rqaddr[1] & ~stb0_rqaddr[0] ;
1271
assign st0_l2bnk_dest[3] =
1272
~stb0_rqaddr[2] &  stb0_rqaddr[1] &  stb0_rqaddr[0] ;
1273
assign st0_l2bnk_dest[4] =  stb0_rqaddr[2] ;
1274
 
1275
assign st1_l2bnk_dest[0] =
1276
~stb1_rqaddr[2] & ~stb1_rqaddr[1] & ~stb1_rqaddr[0] ;
1277
assign st1_l2bnk_dest[1] =
1278
~stb1_rqaddr[2] & ~stb1_rqaddr[1] &  stb1_rqaddr[0] ;
1279
assign st1_l2bnk_dest[2] =
1280
~stb1_rqaddr[2] &  stb1_rqaddr[1] & ~stb1_rqaddr[0] ;
1281
assign st1_l2bnk_dest[3] =
1282
~stb1_rqaddr[2] &  stb1_rqaddr[1] &  stb1_rqaddr[0] ;
1283
assign st1_l2bnk_dest[4] =  stb1_rqaddr[2] ;
1284
 
1285
assign st2_l2bnk_dest[0] =
1286
~stb2_rqaddr[2] & ~stb2_rqaddr[1] & ~stb2_rqaddr[0] ;
1287
assign st2_l2bnk_dest[1] =
1288
~stb2_rqaddr[2] & ~stb2_rqaddr[1] &  stb2_rqaddr[0] ;
1289
assign st2_l2bnk_dest[2] =
1290
~stb2_rqaddr[2] &  stb2_rqaddr[1] & ~stb2_rqaddr[0] ;
1291
assign st2_l2bnk_dest[3] =
1292
~stb2_rqaddr[2] &  stb2_rqaddr[1] &  stb2_rqaddr[0] ;
1293
assign st2_l2bnk_dest[4] =  stb2_rqaddr[2] ;
1294
 
1295
assign st3_l2bnk_dest[0] =
1296
~stb3_rqaddr[2] & ~stb3_rqaddr[1] & ~stb3_rqaddr[0] ;
1297
assign st3_l2bnk_dest[1] =
1298
~stb3_rqaddr[2] & ~stb3_rqaddr[1] &  stb3_rqaddr[0] ;
1299
assign st3_l2bnk_dest[2] =
1300
~stb3_rqaddr[2] &  stb3_rqaddr[1] & ~stb3_rqaddr[0] ;
1301
assign st3_l2bnk_dest[3] =
1302
~stb3_rqaddr[2] &  stb3_rqaddr[1] &  stb3_rqaddr[0] ;
1303
assign st3_l2bnk_dest[4] =  stb3_rqaddr[2] ;
1304
 
1305
//=================================================================================================
1306
//      BLK-LOAD TRACKING
1307
//=================================================================================================
1308
 
1309
// The 64B load request is divided into 4 16B requests, i.e., 4 pcx pkts.
1310
// The last bld request to the pcx must be marked as so. 
1311
// Only one bld can be processed at any time.
1312
 
1313
   wire [1:0] bld_thrd_din;
1314
   wire [1:0] bld_thrd_dout;
1315
   wire [3:0] bld_dcd_thrd;
1316
   wire       ld_03_inst_vld_g;
1317
   wire       bld_pcx_rq_sel_d1;
1318
 
1319
dff_s  stgg_blkasi (
1320
        .din    (lsu_blk_asi_m),
1321
        .q      (blk_asi_g),
1322
        .clk    (clk),
1323
        .se     (1'b0),       .si (),          .so ()
1324
        );
1325
 
1326
assign  bld_helper_cmplt_e = lsu_fldd_vld_en & bld_dout & (
1327
                             bld_dcd_thrd[0] & lsu_dfill_dcd_thrd[0] |
1328
                             bld_dcd_thrd[1] & lsu_dfill_dcd_thrd[1] |
1329
                             bld_dcd_thrd[2] & lsu_dfill_dcd_thrd[2] |
1330
                             bld_dcd_thrd[3] & lsu_dfill_dcd_thrd[3] );
1331
 
1332
 
1333
dff_s #(1) stgm_bldhlpr (
1334
        .din    (bld_helper_cmplt_e),
1335
        .q      (bld_helper_cmplt_m),
1336
        .clk    (clk),
1337
        .se     (1'b0),       .si (),          .so ()
1338
        );
1339
 
1340
assign  lsu_bld_helper_cmplt_m = bld_helper_cmplt_m ;
1341
 
1342
dff_s #(1) stgg_bldhlpr (
1343
        .din    (bld_helper_cmplt_m),
1344
        .q      (bld_helper_cmplt_g),
1345
        .clk    (clk),
1346
        .se     (1'b0),       .si (),          .so ()
1347
        );
1348
 
1349
wire    alt_space_m, alt_space_g, alt_space_w2 ;
1350
dff_s stg_aspacem(
1351
        .din    (ifu_lsu_alt_space_e),
1352
        .q      (alt_space_m),
1353
        .clk    (clk),
1354
        .se     (1'b0),       .si (),          .so ()
1355
        );
1356
 
1357
dff_s stg_aspaceg(
1358
        .din    (alt_space_m),
1359
        .q      (alt_space_g),
1360
        .clk    (clk),
1361
        .se     (1'b0),       .si (),          .so ()
1362
        );
1363
 
1364
dff_s stg_aspacew2 (
1365
        .din    (alt_space_g),
1366
        .q      (alt_space_w2),
1367
        .clk    (clk),
1368
        .se     (1'b0),       .si (),          .so ()
1369
        );
1370
 
1371
 
1372
// PCX bld helper issue :
1373
// 00-1st->01-2nd->10-3rd->11-4th->00
1374
 
1375
   assign     bld_thrd_din[0] = ld1_inst_vld_unflushed | ld3_inst_vld_unflushed;
1376
   assign     bld_thrd_din[1] = ld2_inst_vld_unflushed | ld3_inst_vld_unflushed;
1377
 
1378
 
1379
   assign ld_03_inst_vld_g =  lsu_inst_vld_w & (
1380
                              ld0_inst_vld_unflushed | ld1_inst_vld_unflushed |
1381
                              ld2_inst_vld_unflushed | ld3_inst_vld_unflushed );
1382
 
1383
   assign       bld_g = blk_asi_g & ldst_fp_g & ldst_dbl_g & alt_space_g & ld_03_inst_vld_g ;
1384
                //~lsu_tlb_perr_ld_rq_kill_w ; // Bug 4645
1385
 
1386
wire    bld_w2 ;
1387
dff_s #(1) bldstg (
1388
        .din    (bld_g),
1389
        .q      (bld_w2),
1390
        .clk  (clk),
1391
        .se     (1'b0),       .si (),          .so ()
1392
        );
1393
 
1394
wire    perr_ld_rq_kill_w2 ;
1395
wire    bld_perr_kill_w2 ;
1396
assign  bld_perr_kill_w2 = bld_w2 & perr_ld_rq_kill_w2 ;
1397
 
1398
dffre_s #(2) bld_thrd (
1399
        .din  (bld_thrd_din[1:0] ),
1400
        .q    (bld_thrd_dout[1:0]),
1401
        .rst  (bld_reset), .en (bld_g),
1402
        .clk  (clk),
1403
        .se   (1'b0),       .si (),          .so ()
1404
        );
1405
   assign bld_dcd_thrd[0] = ~bld_thrd_dout[1] & ~bld_thrd_dout[0];
1406
   assign bld_dcd_thrd[1] = ~bld_thrd_dout[1] &  bld_thrd_dout[0];
1407
   assign bld_dcd_thrd[2] =  bld_thrd_dout[1] & ~bld_thrd_dout[0];
1408
   assign bld_dcd_thrd[3] =  bld_thrd_dout[1] &  bld_thrd_dout[0];
1409
 
1410
//bug 2757    
1411
   assign bld_pcx_rq_sel_d1 = ld0_pcx_rq_sel_d1 & bld_dcd_thrd[0] |
1412
                              ld1_pcx_rq_sel_d1 & bld_dcd_thrd[1] |
1413
                              ld2_pcx_rq_sel_d1 & bld_dcd_thrd[2] |
1414
                              ld3_pcx_rq_sel_d1 & bld_dcd_thrd[3];
1415
 
1416
   //wire   bld_pcx_rq_sel_d2, bld_pcx_rq_sel;
1417
   wire    bld_pcx_rq_sel;
1418
   //bug 3322
1419
//   assign bld_pcx_rq_sel = bld_pcx_rq_sel_d2 & ~pcx_req_squash_d1;
1420
 
1421
//dff #(1) ff_bld_pcx_rq_sel_d2 (
1422
//        .din  (bld_pcx_rq_sel_d1),
1423
//        .q    (bld_pcx_rq_sel_d2),
1424
//        .clk  (clk),
1425
//        .se   (1'b0),       .si (),          .so ()
1426
//        );                  
1427
 
1428
  assign bld_pcx_rq_sel = (ld0_pcx_rq_sel_d2 & bld_dcd_thrd[0] |
1429
                           ld1_pcx_rq_sel_d2 & bld_dcd_thrd[1] |
1430
                           ld2_pcx_rq_sel_d2 & bld_dcd_thrd[2] |
1431
                           ld3_pcx_rq_sel_d2 & bld_dcd_thrd[3] ) &
1432
                           ~pcx_req_squash_d1;
1433
 
1434
  assign        bld_en = bld_g |  (bld_pcx_rq_sel & bld_dout & ~(bld_cnt[1] & bld_cnt[0])) ;
1435
  assign        bld_din = bld_g | bld_dout ;
1436
  assign        bcnt_din[1:0] = bld_cnt[1:0] + {1'b0,(bld_pcx_rq_sel & bld_dout)} ;
1437
 
1438
// Reset by last completing bld helper.  
1439
  assign        bld_reset =
1440
        reset | bld_perr_kill_w2 |
1441
        (bld_rd_dout[2] & bld_rd_dout[1] & bld_rd_dout[0] & bld_helper_cmplt_g) ;
1442
 
1443
assign  lsu_bld_reset = bld_reset ;
1444
 
1445
wire    bld_dout_tmp ;
1446
dffre_s #(3)   bld_pcx_cnt (
1447
        .din  ({bcnt_din[1:0],bld_din}),
1448
        .q    ({bld_cnt[1:0], bld_dout_tmp}),
1449
        .rst  (bld_reset), .en (bld_en),
1450
        .clk  (clk),
1451
        .se   (1'b0),       .si (),          .so ()
1452
        );
1453
 
1454
assign  bld_dout = bld_dout_tmp & ~bld_perr_kill_w2 ;
1455
 
1456
// Last one allows ld-rq-vld to be reset.
1457
assign  bld_annul[0] =  bld_dcd_thrd[0] & (bld_dout & ~(bld_cnt[1] & bld_cnt[0])) ;
1458
assign  bld_annul[1] =  bld_dcd_thrd[1] & (bld_dout & ~(bld_cnt[1] & bld_cnt[0])) ;
1459
assign  bld_annul[2] =  bld_dcd_thrd[2] & (bld_dout & ~(bld_cnt[1] & bld_cnt[0])) ;
1460
assign  bld_annul[3] =  bld_dcd_thrd[3] & (bld_dout & ~(bld_cnt[1] & bld_cnt[0])) ;
1461
 
1462
dff_s #(4) bannul_d1 (
1463
        .din    (bld_annul[3:0]),
1464
        .q      (bld_annul_d1[3:0]),
1465
        .clk  (clk),
1466
        .se     (1'b0),       .si (),          .so ()
1467
        );
1468
 
1469
// Maintain rd (cpx return pkt counter). This is based on when the blk ld helper completes.
1470
// lower 3b of rd have to start out as zero.
1471
// Should be asserted 8 times for the entire bld.
1472
assign  bld_rd_en = (bld_helper_cmplt_m & bld_dout) ;
1473
assign  bld_rd_din[2:0] = bld_rd_dout_m[2:0] + {2'b00,(bld_helper_cmplt_m & bld_dout)} ;
1474
//assign        bld_rd_en = (bld_helper_cmplt_g & bld_dout) ;
1475
//assign        bld_rd_din[2:0] = bld_rd_dout[2:0] + {2'b00,(bld_helper_cmplt_g & bld_dout)} ;
1476
 
1477
dffre_s #(3)   bld_cpx_cnt (
1478
        .din  (bld_rd_din[2:0]),
1479
        .q    (bld_rd_dout_m[2:0]),
1480
            .rst  (bld_reset), .en   (bld_rd_en),
1481
        .clk  (clk),
1482
        .se   (1'b0),       .si (),          .so ()
1483
        );
1484
 
1485
dff_s #(3) bld_cnt_stg (
1486
        .din    (bld_rd_dout_m[2:0]),
1487
        .q      (bld_rd_dout[2:0]),
1488
        .clk  (clk),
1489
        .se     (1'b0),       .si (),          .so ()
1490
        );
1491
 
1492
// Select appr. rd. (cpx return pkt counter)
1493
assign  lsu_ffu_bld_cnt_w[2:0] = bld_rd_dout[2:0] ;
1494
assign  lsu_bld_cnt_m[2:0] = bld_rd_dout_m[2:0] ;
1495
 
1496
// pcx pkt address cntrl.
1497
wire    [1:0]    addr_b54 ;
1498
assign   addr_b54[1:0] = bld_cnt[1:0];
1499
 
1500
/*wire bld_rq_w2 ;
1501
assign bld_rq_w2 = bld_dout; */
1502
 
1503
dff_s #(2) blkrq_d1 (
1504
        .din    ({addr_b54[1:0]}),
1505
        .q      ({lsu_bld_rq_addr[1:0]}),
1506
        .clk  (clk),
1507
        .se     (1'b0),       .si (),          .so ()
1508
        );
1509
 
1510
assign  lsu_bld_pcx_rq = bld_pcx_rq_sel_d1 & bld_dout ;
1511
 
1512
/*dff #(3) blkrq_d1 (
1513
        .din    ({addr_b54[1:0],bld_rq_w2}),
1514
        .q      ({lsu_bld_rq_addr[1:0],lsu_bld_pcx_rq}),
1515
        .clk  (clk),
1516
        .se     (1'b0),       .si (),          .so ()
1517
        );*/
1518
 
1519
 
1520
//=================================================================================================
1521
//      LOAD PCX PKT REQ CONTROL
1522
//=================================================================================================
1523
 
1524
// Staging pref.
1525
wire pref_inst_m, pref_inst_g ;
1526
 
1527
dff_s  stgm_prf (
1528
        .din    (ifu_lsu_pref_inst_e),
1529
        .q      (pref_inst_m),
1530
        .clk  (clk),
1531
        .se     (1'b0),       .si (),          .so ()
1532
        );
1533
 
1534
dff_s  stgg_prf (
1535
        .din    (pref_inst_m),
1536
        .q      (pref_inst_g),
1537
        .clk  (clk),
1538
        .se     (1'b0),       .si (),          .so ()
1539
        );
1540
 
1541
// Performance Ctr Info
1542
dff_s #(4)  stgg_dmiss (
1543
        .din    ({ld3_l2cache_rq,ld2_l2cache_rq,ld1_l2cache_rq,ld0_l2cache_rq}),
1544
        .q      (lsu_tlu_dcache_miss_w2[3:0]),
1545
        .clk  (clk),
1546
        .se     (1'b0),       .si (),          .so ()
1547
        );
1548
 
1549
wire  ld0_l2cache_rq_w2, ld1_l2cache_rq_w2, ld2_l2cache_rq_w2, ld3_l2cache_rq_w2 ;
1550
 
1551
assign ld0_l2cache_rq_w2  =  lsu_tlu_dcache_miss_w2[0];
1552
assign ld1_l2cache_rq_w2  =  lsu_tlu_dcache_miss_w2[1];
1553
assign ld2_l2cache_rq_w2  =  lsu_tlu_dcache_miss_w2[2];
1554
assign ld3_l2cache_rq_w2  =  lsu_tlu_dcache_miss_w2[3];
1555
 
1556
wire    pref_vld0_g, pref_vld1_g, pref_vld2_g, pref_vld3_g ;
1557
wire    pref_rq_vld0_g, pref_rq_vld1_g, pref_rq_vld2_g, pref_rq_vld3_g ;
1558
wire    pref_vld_g ;
1559
assign  pref_vld_g = pref_inst_g & ~tlb_pgnum_g[39] & tlb_cam_hit_g ; // Bug 4318. 
1560
assign  pref_rq_vld0_g = pref_vld_g & thread0_g & lsu_inst_vld_w ;
1561
assign  pref_rq_vld1_g = pref_vld_g & thread1_g & lsu_inst_vld_w ;
1562
assign  pref_rq_vld2_g = pref_vld_g & thread2_g & lsu_inst_vld_w ;
1563
assign  pref_rq_vld3_g = pref_vld_g & thread3_g & lsu_inst_vld_w ;
1564
assign  pref_vld0_g = pref_inst_g & thread0_g ;
1565
assign  pref_vld1_g = pref_inst_g & thread1_g ;
1566
assign  pref_vld2_g = pref_inst_g & thread2_g ;
1567
assign  pref_vld3_g = pref_inst_g & thread3_g ;
1568
 
1569
//=========================================================================================
1570
// Shift full-raw/partial-raw logic from rw_ctl to qctl1
1571
 
1572
wire    ldquad_inst_g ;
1573
dff_s  ldq_stgg (
1574
  .din    (lsu_ldquad_inst_m), .q (ldquad_inst_g),
1575
  .clk    (clk),
1576
  .se   (1'b0), .si (), .so ()
1577
  );
1578
 
1579
wire    io_ld,io_ld_w2 ;
1580
assign  io_ld = tlb_pgnum_g[39] ; // Bug 4362
1581
//assign  io_ld = tlb_pgnum_g[39]  & ~(~tlb_pgnum_g[38]  & tlb_pgnum_g[37]) ;
1582
 
1583
wire    stb_not_empty ;
1584
assign  stb_not_empty  =
1585
  thread0_g ? ~lsu_stb_empty[0] :
1586
    thread1_g ? ~lsu_stb_empty[1] :
1587
      thread2_g ? ~lsu_stb_empty[2] :
1588
                        ~lsu_stb_empty[3] ;
1589
 
1590
wire    ldq_hit_g,ldq_hit_w2 ;
1591
wire    ldq_stb_cam_hit ;
1592
assign  ldq_stb_cam_hit = stb_cam_hit_bf & ldquad_inst_g ;
1593
// Terms can be made common.
1594
assign  ldq_hit_g = ldq_stb_cam_hit ;
1595
 
1596
wire    full_raw_g,partial_raw_g ;
1597
wire    full_raw_w2,partial_raw_w2 ;
1598
assign  full_raw_g = |stb_ld_full_raw[7:0] ;
1599
assign  partial_raw_g = |stb_ld_partial_raw[7:0] ;
1600
 
1601
wire    stb_cam_mhit_w2 ;
1602
wire    stb_not_empty_w2 ;
1603
dff_s #(6) stgw2_rawcond (
1604
        .din    ({full_raw_g,partial_raw_g,stb_cam_mhit,ldq_hit_g,io_ld,stb_not_empty}),
1605
        .q      ({full_raw_w2,partial_raw_w2,stb_cam_mhit_w2,ldq_hit_w2,io_ld_w2,
1606
                stb_not_empty_w2}),
1607
        .clk    (clk),
1608
        .se     (1'b0),       .si (),          .so ()
1609
        );
1610
 
1611
// BEGIN !!! ld_stb_full_raw_g for SAS support only !!!
1612
//wire  ld_stb_full_raw_g ;
1613
//wire  ld_stb_partial_raw_g ;
1614
 
1615
// END !!! ld_stb_full_raw_g for SAS support only !!!
1616
assign  ld_stb_full_raw_w2 =
1617
        (full_raw_w2 & ~(stb_cam_mhit_w2 | ldq_hit_w2 | io_ld_w2)) ;
1618
        //(full_raw_w2 & ~(stb_cam_mhit_w2 | ldq_hit_w2 | io_ld_w2)) ; // Bug 3624
1619
wire    ld_stb_partial_raw_w2 ;
1620
wire    stb_cam_hit_w2 ;
1621
assign  ld_stb_partial_raw_w2 =
1622
        (partial_raw_w2 | stb_cam_mhit_w2 | ldq_hit_w2 |
1623
        (io_ld_w2 & stb_not_empty_w2)) ;
1624
        //(partial_raw_w2 | stb_cam_mhit_w2 | ldq_hit_w2 | (io_ld_w2 & stb_not_empty_w2)) ;
1625
 
1626
//=========================================================================================
1627
 
1628
/*wire  ld_stb_full_raw_w2 ;
1629
dff_s #(1) stgw2_fraw (
1630
        .din    (ld_stb_full_raw_g),
1631
        .q      (ld_stb_full_raw_w2),
1632
        .clk  (clk),
1633
        .se     (1'b0),       .si (),          .so ()
1634
        ); */
1635
 
1636
// THREAD0 LOAD PCX REQUEST CONTROL
1637
 
1638
//=====
1639
// For delayed ld0,1,2,3_l2cache_rq, we need to delay certain
1640
// inputs to flops enabled by ld0,1,2,3_l2cache_rq.
1641
 
1642
wire    ld0_ldbl_rq_w2 ;
1643
wire    ld1_ldbl_rq_w2 ;
1644
wire    ld2_ldbl_rq_w2 ;
1645
wire    ld3_ldbl_rq_w2 ;
1646
// wire [1:0]   ld_pcx_pkt_wy_w2 ;
1647
 wire           pref_rq_vld0_w2,pref_rq_vld1_w2,pref_rq_vld2_w2,pref_rq_vld3_w2 ;
1648
 wire           non_l2bnk ;
1649
 wire           non_l2bnk_w2 ;
1650
 wire [7:6]     ldst_va_w2 ;
1651
 
1652
dff_s #(7) stgw2_l2crqmx (
1653
        .din    ({
1654
                //ld_pcx_pkt_wy_g[1:0],
1655
                pref_rq_vld0_g,pref_rq_vld1_g,pref_rq_vld2_g,pref_rq_vld3_g,
1656
                non_l2bnk,
1657
                ldst_va_g[7:6]}),
1658
        .q      ({
1659
                //ld_pcx_pkt_wy_w2[1:0],
1660
                pref_rq_vld0_w2,pref_rq_vld1_w2,pref_rq_vld2_w2,pref_rq_vld3_w2,
1661
                non_l2bnk_w2,
1662
                ldst_va_w2[7:6]}),
1663
        .clk  (clk),
1664
        .se     (1'b0),       .si (),          .so ()
1665
        );
1666
 
1667
// wire [1:0]   ld_pcx_pkt_wy_mx0,ld_pcx_pkt_wy_mx1,ld_pcx_pkt_wy_mx2,ld_pcx_pkt_wy_mx3 ;
1668
 wire           pref_rq_vld0_mx,pref_rq_vld1_mx,pref_rq_vld2_mx,pref_rq_vld3_mx ;
1669
 wire           non_l2bnk_mx0,non_l2bnk_mx1,non_l2bnk_mx2,non_l2bnk_mx3 ;
1670
 wire [7:6]     ldst_va_mx0,ldst_va_mx1,ldst_va_mx2,ldst_va_mx3 ;
1671
 
1672
// timing fix: 5/19/03: move secondary hit way generation to w2
1673
//                      remove ld_pcx_pkt_wy_mx[0-3] and replace w/ lsu_lmq_pkt_way_w2
1674
// assign       ld_pcx_pkt_wy_mx0[1:0] = 
1675
//      ld0_ldbl_rq_w2 ? ld_pcx_pkt_wy_w2[1:0] : ld_pcx_pkt_wy_g[1:0] ;
1676
// assign       ld_pcx_pkt_wy_mx1[1:0] = 
1677
//      ld1_ldbl_rq_w2 ? ld_pcx_pkt_wy_w2[1:0] : ld_pcx_pkt_wy_g[1:0] ;
1678
// assign       ld_pcx_pkt_wy_mx2[1:0] = 
1679
//      ld2_ldbl_rq_w2 ? ld_pcx_pkt_wy_w2[1:0] : ld_pcx_pkt_wy_g[1:0] ;
1680
// assign       ld_pcx_pkt_wy_mx3[1:0] = 
1681
//      ld3_ldbl_rq_w2 ? ld_pcx_pkt_wy_w2[1:0] : ld_pcx_pkt_wy_g[1:0] ;
1682
 
1683
 
1684
 assign pref_rq_vld0_mx =
1685
        ld0_ldbl_rq_w2 ? pref_rq_vld0_w2 : pref_rq_vld0_g ;
1686
 assign pref_rq_vld1_mx =
1687
        ld1_ldbl_rq_w2 ? pref_rq_vld1_w2 : pref_rq_vld1_g ;
1688
 assign pref_rq_vld2_mx =
1689
        ld2_ldbl_rq_w2 ? pref_rq_vld2_w2 : pref_rq_vld2_g ;
1690
 assign pref_rq_vld3_mx =
1691
        ld3_ldbl_rq_w2 ? pref_rq_vld3_w2 : pref_rq_vld3_g ;
1692
 assign non_l2bnk_mx0 =
1693
        ld0_ldbl_rq_w2 ? non_l2bnk_w2 : non_l2bnk ;
1694
 assign non_l2bnk_mx1 =
1695
        ld1_ldbl_rq_w2 ? non_l2bnk_w2 : non_l2bnk ;
1696
 assign non_l2bnk_mx2 =
1697
        ld2_ldbl_rq_w2 ? non_l2bnk_w2 : non_l2bnk ;
1698
 assign non_l2bnk_mx3 =
1699
        ld3_ldbl_rq_w2 ? non_l2bnk_w2 : non_l2bnk ;
1700
 
1701
//timing fix: 10/13/03 - ldst_va_mx[0-3] is used in the same cycle 'cos of perf bug fix-bug2705
1702
//            this delays the ld request valid which in turn delays pcx_rq_for_stb
1703
//            fix is to isolate this mux and the following l2bank addr mux from ld?_ldbl_rq_w2;
1704
//            use ld[0-3]_inst_vld_w2 instead of ld[0-3]_ldbl_rq_w2 as select
1705
 assign ldst_va_mx0[7:6] =
1706
        ld0_inst_vld_w2 ? ldst_va_w2[7:6] : ldst_va_g[7:6] ;
1707
 assign ldst_va_mx1[7:6] =
1708
        ld1_inst_vld_w2 ? ldst_va_w2[7:6] : ldst_va_g[7:6] ;
1709
 assign ldst_va_mx2[7:6] =
1710
        ld2_inst_vld_w2 ? ldst_va_w2[7:6] : ldst_va_g[7:6] ;
1711
 assign ldst_va_mx3[7:6] =
1712
        ld3_inst_vld_w2 ? ldst_va_w2[7:6] : ldst_va_g[7:6] ;
1713
 
1714
//=====
1715
 
1716
wire    atomic_g ;
1717
assign  atomic_g = casa_g | lsu_swap_g | lsu_ldstub_g ;
1718
 
1719
   wire dbl_force_l2access_g;
1720
   wire dbl_force_l2access_w2;
1721
   assign dbl_force_l2access_g = ldst_dbl_g & ~(ldst_fp_g & ~(alt_space_g & blk_asi_g));
1722
 
1723
dff_s #(2) stgw2_atm (
1724
        .din    ({atomic_g, dbl_force_l2access_g}),
1725
        .q      ({atomic_w2,dbl_force_l2access_w2}),
1726
        .clk  (clk),
1727
        .se     (1'b0),       .si (),          .so ()
1728
        );
1729
 
1730
dff_s #(1) stgw2_perrkill (
1731
        .din    (lsu_tlb_perr_ld_rq_kill_w),
1732
        .q      (perr_ld_rq_kill_w2),
1733
        .clk  (clk),
1734
        .se     (1'b0),       .si (),          .so ()
1735
        );
1736
 
1737
wire    asi_internal_g,asi_internal_w2;
1738
dff_s #(1) stgg_intasi (
1739
        .din    (asi_internal_m),
1740
        .q      (asi_internal_g),
1741
        .clk  (clk),
1742
        .se     (1'b0),       .si (),          .so ()
1743
        );
1744
 
1745
dff_s #(1) stgw2_intasi (
1746
        .din    (asi_internal_g),
1747
        .q      (asi_internal_w2),
1748
        .clk  (clk),
1749
        .se     (1'b0),       .si (),          .so ()
1750
        );
1751
 
1752
wire    ld0_l2cache_rq_kill ;
1753
assign  ld0_l2cache_rq_kill =
1754
        ld0_inst_vld_w2 & ((ld_stb_full_raw_w2 & ~dbl_force_l2access_w2) | perr_ld_rq_kill_w2) ;
1755
                                                // full-raw which looks like partial
1756
assign  ld0_ldbl_rq_w2 =
1757
                ((ld_stb_full_raw_w2 & dbl_force_l2access_w2) | ld_stb_partial_raw_w2)
1758
                        & ~atomic_w2 & ~perr_ld_rq_kill_w2 & ~(asi_internal_w2 & alt_space_w2)
1759
                        & ld0_inst_vld_w2 ;
1760
 
1761
//bug:2877 - dtag parity error 2nd packet request; dont reset if dtag parity error 2nd pkt valid
1762
//           dtag error is reset 1 cycle after 1st pkt sent
1763
//----------------------------------------------------------------------------------------------------------
1764
// |       1       |        2       |         3          |        4       |        5        |        6    |
1765
//  spc_pcx_rq_pq=1   ld_err-pkt1                                           spc_pcx_rq_pq=1   ld_err-pkt2
1766
//                                     ld0_vld_reset=0       pick 2nd pkt
1767
//                                     error_rst=1
1768
//----------------------------------------------------------------------------------------------------------
1769
 
1770
wire   [3:0]  dtag_perr_pkt2_vld_d1 ;
1771
assign ld0_vld_reset =
1772
  (reset | (ld0_pcx_rq_sel_d2 & ~(pcx_req_squash_d1 | ld0_inst_vld_g | bld_annul_d1[0] | dtag_perr_pkt2_vld_d1[0]))) |
1773
  ld0_l2cache_rq_kill ;
1774
  //(reset | (ld0_pcx_rq_sel_d2 & ~(pcx_req_squash_d1 | ld0_inst_vld_g | bld_annul_d1[0]))) |
1775
 
1776
// The equation for partial raw has redundancy !! Change it.
1777
// prefetch will not bypass from stb
1778
/* prim vs sec phase 2 change
1779
assign ld0_l2cache_rq =
1780
        (((lsu_ld_miss_g & ~ld_stb_full_raw_g  & ~ld_sec_hit_g & ~ldxa_internal) |
1781
        ((lsu_ld_hit_g | lsu_ld_miss_g) & (ld_stb_partial_raw_g | (ld_stb_full_raw_g & ldst_dbl_g))))
1782
        & ~atomic_g & ld0_inst_vld_g) |
1783
        | (pref_inst_g & tlb_cam_hit_g & thread0_g) ;
1784
*/
1785
 
1786
 
1787
wire  ld0_l2cache_rq_g;
1788
 
1789
assign ld0_l2cache_rq_g =
1790
        (((lsu_ld_miss_g & ~ldxa_internal))
1791
        //((lsu_ld_hit_g | lsu_ld_miss_g) & (ld_stb_partial_raw_g)))
1792
        & ~atomic_g & ld0_inst_vld_g)
1793
        | pref_rq_vld0_g;
1794
 
1795
assign ld0_l2cache_rq = ld0_l2cache_rq_g | ld0_ldbl_rq_w2 ;
1796
 
1797
wire  ld0_pkt_vld_unmasked ;
1798
wire  ld1_pkt_vld_unmasked ;
1799
wire  ld2_pkt_vld_unmasked ;
1800
wire  ld3_pkt_vld_unmasked ;
1801
 
1802
// ld valid until request made.
1803
wire pref_rq_vld0;
1804
dffre_s #(2)  ld0_vld (
1805
        .din    ({ld0_l2cache_rq, pref_rq_vld0_mx}    ),
1806
        .q      ({ld0_pkt_vld_unmasked, pref_rq_vld0}),
1807
  .rst  (ld0_vld_reset),  .en (ld0_l2cache_rq),
1808
        .clk  (clk),
1809
        .se     (1'b0),       .si (),          .so ()
1810
        );
1811
 
1812
// bug2705 - speculative pick in w-cycle -begin
1813
// dbl_force_l2access_g is set for ldd(f),std(f),ldq,stq
1814
//perf fix: 7/29/03 - kill spec vld if other thread non-spec valids are set
1815
//timing fix: 8/29/03 - flop atomic_m and ldxa_internal_m from dctl for spec req
1816
wire    atomic_or_ldxa_internal_rq_m ;
1817
assign  atomic_or_ldxa_internal_rq_m  =  atomic_m | lda_internal_m ;
1818
 
1819
dff_s #(1) ff_atomic_or_ldxa_internal_rq_g (
1820
        .din    (atomic_or_ldxa_internal_rq_m),
1821
        .q      (atomic_or_ldxa_internal_rq_g),
1822
        .clk  (clk),
1823
        .se     (1'b0),       .si (),          .so ()
1824
        );
1825
 
1826
wire    ld0_spec_vld_g ;
1827
assign  ld0_spec_vld_g  =  ld0_inst_vld_unflushed & lsu_inst_vld_tmp & ~dbl_force_l2access_g & tlb_cam_hit_g &
1828
                           ~atomic_or_ldxa_internal_rq_g &
1829
                           ~(ld1_pkt_vld_unmasked | ld2_pkt_vld_unmasked | ld3_pkt_vld_unmasked);
1830
//assign  ld0_spec_vld_g  =  ld0_inst_vld_unflushed & lsu_inst_vld_tmp & ~dbl_force_l2access_g & tlb_cam_hit_g ;
1831
 
1832
dff_s #(1) ff_ld0_spec_pick_vld_w2 (
1833
        .din    (ld0_spec_pick_vld_g),
1834
        .q      (ld0_spec_pick_vld_w2),
1835
        .clk  (clk),
1836
        .se     (1'b0),       .si (),          .so ()
1837
        );
1838
 
1839
// kill packet valid if spec req is picked in w and stb hits in w2
1840
// cannot use ld0_ldbl_rawp_en_w2 because it is late signal instead use ld0_ldbl_rq_w2
1841
//timing fix: 7/21/03 - kill pkt vld if spec pick in w-cycle was to non$ address
1842
//timing fix: 8/6/03 - kill pkt_vld if ld?_l2cache_rq_g=0 in w-cycle but spec_pick=1
1843
wire    ld0_pkt_vld_tmp ;
1844
//bug 3964 - replace ld0_pkt_vld_unmasked w/ ld0_l2cache_rq_w2
1845
//assign lsu_ld0_spec_vld_kill_w2  =  ld0_spec_pick_vld_w2 & (~ld0_pkt_vld_unmasked | ld0_l2cache_rq_kill | ld0_ldbl_rq_w2 | non_l2bnk_mx0_d1) ;
1846
assign lsu_ld0_spec_vld_kill_w2  =  ld0_spec_pick_vld_w2 & (~ld0_l2cache_rq_w2 | ld0_l2cache_rq_kill | ld0_ldbl_rq_w2 | non_l2bnk_mx0_d1) ;
1847
 
1848
assign  ld0_pkt_vld_tmp =  ld0_pkt_vld_unmasked & ~(ld0_pcx_rq_sel_d1 | ld0_pcx_rq_sel_d2) &
1849
                      ~(ld0_l2cache_rq_kill | ld0_ldbl_rq_w2) &
1850
                      ~(pref_rq_vld0 & lsu_no_spc_pref[0]) ;  // prefetch pending 
1851
 
1852
assign  ld0_pkt_vld = ld0_pkt_vld_tmp | ld0_spec_vld_g ;
1853
// bug2705 - speculative pick in w-cycle -end
1854
 
1855
//assign  ld0_pkt_vld = ld0_pkt_vld_unmasked & ~ld0_pcx_rq_sel_d1 ; 
1856
 
1857
assign  ld0_fill_reset = reset | (lsu_dfq_ld_vld & lsu_dcfill_active_e & dfq_byp_sel[0]) ;
1858
 
1859
 
1860
dff_s #(4) stgm_lduwyd1 (
1861
        .din    ({ld0_fill_reset,ld1_fill_reset,ld2_fill_reset,ld3_fill_reset}),
1862
        .q      ({ld0_fill_reset_d1,ld1_fill_reset_d1,ld2_fill_reset_d1,ld3_fill_reset_d1}),
1863
        .clk  (clk),
1864
        .se     (1'b0),       .si (),          .so ()
1865
        );
1866
 
1867
dff_s #(4) stgm_lduwyd2 (
1868
        .din    ({ld0_fill_reset_d1,ld1_fill_reset_d1,ld2_fill_reset_d1,ld3_fill_reset_d1}),
1869
        .q      ({ld0_fill_reset_d2_tmp,ld1_fill_reset_d2_tmp,ld2_fill_reset_d2_tmp,ld3_fill_reset_d2_tmp}),
1870
        .clk  (clk),
1871
        .se     (1'b0),       .si (),          .so ()
1872
        );
1873
 
1874
wire  ld0_l2cache_rq_w2_tmp;
1875
wire  ld0_l2cache_rq_g_tmp;
1876
 
1877
assign ld0_l2cache_rq_g_tmp  =  ld0_l2cache_rq_g & ~pref_inst_g ;
1878
 
1879
dff_s #(1) ff_ld0_l2cache_rq_w2 (
1880
        .din    (ld0_l2cache_rq_g_tmp),
1881
        .q      (ld0_l2cache_rq_w2_tmp),
1882
        .clk  (clk),
1883
        .se     (1'b0),       .si (),          .so ()
1884
        );
1885
 
1886
 
1887
//wire ld0_unfilled_en ;
1888
//assign        ld0_unfilled_en = ld0_l2cache_rq & ~pref_inst_g ;
1889
wire ld0_unfilled_wy_en ;
1890
assign  ld0_unfilled_wy_en = ld0_l2cache_rq_w2_tmp | ld0_ldbl_rq_w2 ;
1891
 
1892
wire  ld0_l2cache_rq_tmp;
1893
assign ld0_l2cache_rq_tmp  = ld0_unfilled_wy_en & ~ld0_l2cache_rq_kill;
1894
 
1895
// ld valid until fill occur.
1896
dffre_s #(1)  ld0out_state (
1897
        //.din    (ld0_l2cache_rq),
1898
        .din    (ld0_l2cache_rq_tmp),
1899
        .q      (ld0_unfilled_tmp),
1900
        .rst    (ld0_fill_reset_d2),  .en     (ld0_unfilled_wy_en),
1901
        .clk    (clk),
1902
        .se     (1'b0),       .si (),          .so ()
1903
        );
1904
 
1905
dffre_s #(2)  ld0out_state_way (
1906
        //.din    (ld_pcx_pkt_wy_mx0[1:0]}),
1907
        .din    (lsu_lmq_pkt_way_w2[1:0]),
1908
        .q      (ld0_unfilled_wy[1:0]),
1909
        .rst    (ld0_fill_reset_d2),  .en     (ld0_unfilled_wy_en),
1910
        .clk    (clk),
1911
        .se     (1'b0),       .si (),          .so ()
1912
        );
1913
 
1914
assign  ld0_fill_reset_d2 = ld0_fill_reset_d2_tmp | ld0_l2cache_rq_kill ;
1915
//assign        ld0_unfilled = ld0_unfilled_tmp & ~ld0_l2cache_rq_kill ;
1916
assign  ld0_unfilled = ld0_unfilled_tmp ;
1917
 
1918
//bug3516
1919
//assign  non_l2bnk = tlb_pgnum_g[39] & tlb_pgnum_g[38] ;
1920
assign  non_l2bnk = tlb_pgnum_g[39]  & ~(~tlb_pgnum_g[38]  & tlb_pgnum_g[37]) ;
1921
 
1922
// ld l2bank address
1923
dffe_s  #(3) ld0_l2bnka (
1924
        .din    ({non_l2bnk_mx0,ldst_va_mx0[7:6]}),
1925
        .q      (ld0_l2bnk_addr[2:0]),
1926
  .en (ld0_l2cache_rq),
1927
        .clk  (clk),
1928
        .se     (1'b0),       .si (),          .so ()
1929
        );
1930
 
1931
//bug2705 - add byp for address to be available in w-cycle
1932
//7/21/03: timing fix - non_l2bnk_mx0 (uses tlb_pgnum_g[39:37] which arrives in qctl1 ~400ps)
1933
//         this will cause timing paths in spec pick in w-cycle; hence assume $able access for
1934
//         spec pick and kill pkt vld in w2 if non_l2bnk_mx0=1 (non$ access)
1935
wire  [2:0]  ld0_l2bnk_addr_mx ;
1936
assign  ld0_l2bnk_addr_mx[2:0]  =  ld0_pkt_vld_unmasked ? ld0_l2bnk_addr[2:0] :
1937
                                                          {1'b0,ldst_va_mx0[7:6]} ;             // assume $able access for spec pick
1938
 
1939
//assign  ld0_l2bnk_addr_mx[2:0]  =  (ld0_inst_vld_unflushed  & lsu_inst_vld_tmp) ? 
1940
//                                        {1'b0,ldst_va_mx0[7:6]} :             // assume $able access for spec pick
1941
//                                        //{non_l2bnk_mx0,ldst_va_mx0[7:6]} : 
1942
//                                           ld0_l2bnk_addr[2:0] ;
1943
 
1944
//7/21/03: timing fix - non_l2bnk_mx0 (uses tlb_pgnum_g[39:37] which arrives in qctl1 ~400ps)
1945
//         this will cause timing paths in spec pick in w-cycle; hence assume $able access for
1946
//         spec pick and kill pkt vld in w2
1947
dff_s #(1) ff_non_l2bnk_mx0_d1 (
1948
        .din    (non_l2bnk_mx0),
1949
        .q      (non_l2bnk_mx0_d1),
1950
        .clk  (clk),
1951
        .se     (1'b0),       .si (),          .so ()
1952
        );
1953
 
1954
//bug2705 - change ld0_l2bnk_addr[2:0] to ld0_l2bnk_addr_mx[2:0]
1955
assign ld0_l2bnk_dest[0] = ~ld0_l2bnk_addr_mx[2] & ~ld0_l2bnk_addr_mx[1] & ~ld0_l2bnk_addr_mx[0] ;
1956
assign ld0_l2bnk_dest[1] = ~ld0_l2bnk_addr_mx[2] & ~ld0_l2bnk_addr_mx[1] &  ld0_l2bnk_addr_mx[0] ;
1957
assign ld0_l2bnk_dest[2] = ~ld0_l2bnk_addr_mx[2] &  ld0_l2bnk_addr_mx[1] & ~ld0_l2bnk_addr_mx[0] ;
1958
assign ld0_l2bnk_dest[3] = ~ld0_l2bnk_addr_mx[2] &  ld0_l2bnk_addr_mx[1] &  ld0_l2bnk_addr_mx[0] ;
1959
assign ld0_l2bnk_dest[4] =  ld0_l2bnk_addr_mx[2] ;
1960
 
1961
// THREAD1 LOAD PCX REQUEST CONTROL
1962
 
1963
wire    ld1_l2cache_rq_kill ;
1964
assign  ld1_l2cache_rq_kill =
1965
        ld1_inst_vld_w2 & ((ld_stb_full_raw_w2 & ~dbl_force_l2access_w2) | perr_ld_rq_kill_w2) ;
1966
                                        // full-raw which looks like partial
1967
assign  ld1_ldbl_rq_w2 =
1968
                ((ld_stb_full_raw_w2 & dbl_force_l2access_w2) | ld_stb_partial_raw_w2)
1969
                        & ~atomic_w2 & ~perr_ld_rq_kill_w2 & ~(asi_internal_w2 & alt_space_w2) &
1970
                        ld1_inst_vld_w2 ;
1971
 
1972
assign ld1_vld_reset =
1973
  (reset | (ld1_pcx_rq_sel_d2 & ~(pcx_req_squash_d1 | ld1_inst_vld_g | bld_annul_d1[1] | dtag_perr_pkt2_vld_d1[1]))) |
1974
  ld1_l2cache_rq_kill ;
1975
  //(reset | (ld1_pcx_rq_sel_d2 & ~(pcx_req_squash_d1 | ld1_inst_vld_g | bld_annul_d1[1]))) | // bug2877
1976
  //(reset | (ld1_pcx_rq_sel_d1 & ~(pcx_req_squash | ld1_inst_vld_g | bld_annul[1]))) ;
1977
 
1978
wire  ld1_l2cache_rq_g;
1979
assign ld1_l2cache_rq_g =
1980
        (((lsu_ld_miss_g & ~ldxa_internal))
1981
        //((lsu_ld_hit_g | lsu_ld_miss_g) & (ld_stb_partial_raw_g))) // ldst_dbl always rqs
1982
        & ~atomic_g & ld1_inst_vld_g)
1983
        | pref_rq_vld1_g ;
1984
 
1985
assign ld1_l2cache_rq =  ld1_l2cache_rq_g | ld1_ldbl_rq_w2 ;
1986
 
1987
 
1988
// ld valid
1989
wire pref_rq_vld1;
1990
dffre_s #(2)  ld1_vld (
1991
        .din    ({ld1_l2cache_rq, pref_rq_vld1_mx}),
1992
        .q      ({ld1_pkt_vld_unmasked, pref_rq_vld1}),
1993
  .rst  (ld1_vld_reset),  .en (ld1_l2cache_rq),
1994
        .clk  (clk),
1995
        .se     (1'b0),       .si (),          .so ()
1996
        );
1997
 
1998
// bug2705 - speculative pick in w-cycle-begin
1999
wire    ld1_spec_vld_g ;
2000
assign  ld1_spec_vld_g  =  ld1_inst_vld_unflushed & lsu_inst_vld_tmp & ~dbl_force_l2access_g & tlb_cam_hit_g  &
2001
                           ~atomic_or_ldxa_internal_rq_g &
2002
                           ~(ld0_pkt_vld_unmasked | ld2_pkt_vld_unmasked | ld3_pkt_vld_unmasked);
2003
//assign  ld1_spec_vld_g  =  ld1_inst_vld_unflushed & lsu_inst_vld_tmp & ~dbl_force_l2access_g & tlb_cam_hit_g ;
2004
 
2005
dff_s #(1) ff_ld1_spec_pick_vld_w2 (
2006
        .din    (ld1_spec_pick_vld_g),
2007
        .q      (ld1_spec_pick_vld_w2),
2008
        .clk  (clk),
2009
        .se     (1'b0),       .si (),          .so ()
2010
        );
2011
 
2012
// kill packet valid if spec req is picked in w and stb hits in w2
2013
wire    ld1_pkt_vld_tmp ;
2014
assign lsu_ld1_spec_vld_kill_w2  =  ld1_spec_pick_vld_w2 & (~ld1_l2cache_rq_w2 | ld1_l2cache_rq_kill | ld1_ldbl_rq_w2 | non_l2bnk_mx1_d1) ;
2015
 
2016
assign  ld1_pkt_vld_tmp =  ld1_pkt_vld_unmasked & ~(ld1_pcx_rq_sel_d1 | ld1_pcx_rq_sel_d2) &
2017
                      ~(ld1_l2cache_rq_kill | ld1_ldbl_rq_w2) &
2018
                      ~(pref_rq_vld1 & lsu_no_spc_pref[1]) ;
2019
 
2020
assign  ld1_pkt_vld = ld1_pkt_vld_tmp | ld1_spec_vld_g ;
2021
// bug2705 - speculative pick in w-cycle-end
2022
 
2023
//assign  ld1_pkt_vld = ld1_pkt_vld_unmasked & ~ld1_pcx_rq_sel_d1 ; 
2024
 
2025
 
2026
assign  ld1_fill_reset = reset | (lsu_dfq_ld_vld & lsu_dcfill_active_e & dfq_byp_sel[1]) ;
2027
 
2028
wire  ld1_l2cache_rq_g_tmp;
2029
wire  ld1_l2cache_rq_w2_tmp;
2030
 
2031
assign ld1_l2cache_rq_g_tmp  =  ld1_l2cache_rq_g & ~pref_inst_g ;
2032
 
2033
dff_s #(1) ff_ld1_l2cache_rq_w2 (
2034
         .din    (ld1_l2cache_rq_g_tmp),
2035
         .q      (ld1_l2cache_rq_w2_tmp),
2036
         .clk  (clk),
2037
         .se     (1'b0),       .si (),          .so ()
2038
         );
2039
 
2040
//wire ld1_unfilled_en ;
2041
//assign        ld1_unfilled_en = ld1_l2cache_rq & ~pref_inst_g ;
2042
wire ld1_unfilled_wy_en ;
2043
assign  ld1_unfilled_wy_en = ld1_l2cache_rq_w2_tmp | ld1_ldbl_rq_w2 ;
2044
 
2045
wire  ld1_l2cache_rq_tmp;
2046
assign ld1_l2cache_rq_tmp  = ld1_unfilled_wy_en & ~ld1_l2cache_rq_kill;
2047
 
2048
// ld valid until fill occur.
2049
dffre_s  #(1)  ld1out_state (
2050
        //.din    (ld1_l2cache_rq),
2051
        .din    (ld1_l2cache_rq_tmp),
2052
        .q      (ld1_unfilled_tmp),
2053
        .rst    (ld1_fill_reset_d2),  .en     (ld1_unfilled_wy_en),
2054
        .clk    (clk),
2055
        .se     (1'b0),       .si (),          .so ()
2056
  );
2057
dffre_s  #(2)  ld1out_state_way (
2058
        //.din    (ld_pcx_pkt_wy_mx1[1:0]),
2059
        .din    (lsu_lmq_pkt_way_w2[1:0]),
2060
        .q      (ld1_unfilled_wy[1:0]),
2061
        .rst    (ld1_fill_reset_d2),  .en     (ld1_unfilled_wy_en),
2062
        .clk    (clk),
2063
        .se     (1'b0),       .si (),          .so ()
2064
  );
2065
 
2066
 
2067
assign  ld1_fill_reset_d2 = ld1_fill_reset_d2_tmp | ld1_l2cache_rq_kill ;
2068
//assign        ld1_unfilled = ld1_unfilled_tmp & ~ld1_l2cache_rq_kill ;
2069
assign  ld1_unfilled = ld1_unfilled_tmp ;
2070
 
2071
// ld l2bank address
2072
dffe_s  #(3) ld1_l2bnka (
2073
        .din    ({non_l2bnk_mx1,ldst_va_mx1[7:6]}),
2074
        .q      (ld1_l2bnk_addr[2:0]),
2075
  .en (ld1_l2cache_rq),
2076
        .clk  (clk),
2077
        .se     (1'b0),       .si (),          .so ()
2078
        );
2079
 
2080
//bug2705 - add byp for address to be available in w-cycle
2081
//7/21/03: timing fix - non_l2bnk_mx0 (uses tlb_pgnum_g[39:37] which arrives in qctl1 ~400ps)
2082
//         this will cause timing paths in spec pick in w-cycle; hence assume $able access for
2083
//         spec pick and kill pkt vld in w2 if non_l2bnk_mx0=1 (non$ access)
2084
 
2085
wire  [2:0]  ld1_l2bnk_addr_mx ;
2086
assign  ld1_l2bnk_addr_mx[2:0]  =  ld1_pkt_vld_unmasked  ? ld1_l2bnk_addr[2:0] :
2087
                                           {1'b0,ldst_va_mx1[7:6]} ;
2088
 
2089
//assign  ld1_l2bnk_addr_mx[2:0]  =  (ld1_inst_vld_unflushed  & lsu_inst_vld_tmp) ? 
2090
//                                         {1'b0,ldst_va_mx1[7:6]} : 
2091
//                                         //{non_l2bnk_mx1,ldst_va_mx1[7:6]} : 
2092
//                                              ld1_l2bnk_addr[2:0] ;
2093
 
2094
//7/21/03: timing fix - non_l2bnk_mx0 (uses tlb_pgnum_g[39:37] which arrives in qctl1 ~400ps)
2095
//         this will cause timing paths in spec pick in w-cycle; hence assume $able access for
2096
//         spec pick and kill pkt vld in w2
2097
dff_s #(1) ff_non_l2bnk_mx1_d1 (
2098
        .din    (non_l2bnk_mx1),
2099
        .q      (non_l2bnk_mx1_d1),
2100
        .clk  (clk),
2101
        .se     (1'b0),       .si (),          .so ()
2102
        );
2103
 
2104
//bug2705 - change ld1_l2bnk_addr[2:0] to ld1_l2bnk_addr_mx[2:0]
2105
assign ld1_l2bnk_dest[0] = ~ld1_l2bnk_addr_mx[2] & ~ld1_l2bnk_addr_mx[1] & ~ld1_l2bnk_addr_mx[0] ;
2106
assign ld1_l2bnk_dest[1] = ~ld1_l2bnk_addr_mx[2] & ~ld1_l2bnk_addr_mx[1] &  ld1_l2bnk_addr_mx[0] ;
2107
assign ld1_l2bnk_dest[2] = ~ld1_l2bnk_addr_mx[2] &  ld1_l2bnk_addr_mx[1] & ~ld1_l2bnk_addr_mx[0] ;
2108
assign ld1_l2bnk_dest[3] = ~ld1_l2bnk_addr_mx[2] &  ld1_l2bnk_addr_mx[1] &  ld1_l2bnk_addr_mx[0] ;
2109
assign ld1_l2bnk_dest[4] =  ld1_l2bnk_addr_mx[2] ;
2110
 
2111
 
2112
// THREAD2 LOAD PCX REQUEST CONTROL
2113
 
2114
wire    ld2_l2cache_rq_kill ;
2115
assign  ld2_l2cache_rq_kill =
2116
        ld2_inst_vld_w2 & ((ld_stb_full_raw_w2 & ~dbl_force_l2access_w2) | perr_ld_rq_kill_w2) ;
2117
                                                // full-raw which looks like partial
2118
assign  ld2_ldbl_rq_w2 =
2119
                ((ld_stb_full_raw_w2 & dbl_force_l2access_w2) | ld_stb_partial_raw_w2)
2120
                        & ~atomic_w2 & ~perr_ld_rq_kill_w2 & ~(asi_internal_w2 & alt_space_w2) &
2121
                        ld2_inst_vld_w2 ;
2122
//assign        ld2_l2cache_rq_kill = ld2_inst_vld_w2 & ld_stb_full_raw_w2 & ~dbl_force_l2access_w2 ;
2123
//assign        ld2_ldbl_rq_w2 = ld_stb_full_raw_w2 & dbl_force_l2access_w2 & ~atomic_w2 & ld2_inst_vld_w2 ;
2124
 
2125
assign ld2_vld_reset =
2126
  (reset | (ld2_pcx_rq_sel_d2 & ~(pcx_req_squash_d1 | ld2_inst_vld_g | bld_annul_d1[2] | dtag_perr_pkt2_vld_d1[2]))) |
2127
  ld2_l2cache_rq_kill ;
2128
  //(reset | (ld2_pcx_rq_sel_d2 & ~(pcx_req_squash_d1 | ld2_inst_vld_g | bld_annul_d1[2]))) | // bug2877
2129
  //(reset | (ld2_pcx_rq_sel_d1 & ~(pcx_req_squash | ld2_inst_vld_g | bld_annul[2]))) ;
2130
 
2131
wire  ld2_l2cache_rq_g;
2132
 
2133
assign ld2_l2cache_rq_g =
2134
        (((lsu_ld_miss_g & ~ldxa_internal))
2135
        //((lsu_ld_hit_g | lsu_ld_miss_g) & (ld_stb_partial_raw_g))) // ldst_dbl always rqs
2136
        & ~atomic_g & ld2_inst_vld_g )
2137
        | pref_rq_vld2_g ;
2138
 
2139
assign ld2_l2cache_rq = ld2_l2cache_rq_g | ld2_ldbl_rq_w2 ;
2140
 
2141
 
2142
// ld valid
2143
wire pref_rq_vld2;
2144
dffre_s #(2) ld2_vld (
2145
        .din    ({ld2_l2cache_rq, pref_rq_vld2_mx}),
2146
        .q      ({ld2_pkt_vld_unmasked, pref_rq_vld2} ),
2147
  .rst  (ld2_vld_reset),  .en (ld2_l2cache_rq),
2148
        .clk  (clk),
2149
        .se     (1'b0),       .si (),          .so ()
2150
        );
2151
 
2152
// bug2705 - speculative pick in w-cycle - begin
2153
wire    ld2_spec_vld_g ;
2154
assign  ld2_spec_vld_g  =  ld2_inst_vld_unflushed & lsu_inst_vld_tmp & ~dbl_force_l2access_g & tlb_cam_hit_g  &
2155
                           ~atomic_or_ldxa_internal_rq_g &
2156
                           ~(ld0_pkt_vld_unmasked | ld1_pkt_vld_unmasked | ld3_pkt_vld_unmasked);
2157
//assign  ld2_spec_vld_g  =  ld2_inst_vld_unflushed & lsu_inst_vld_tmp & ~dbl_force_l2access_g & tlb_cam_hit_g ;
2158
 
2159
dff_s #(1) ff_ld2_spec_pick_vld_w2 (
2160
        .din    (ld2_spec_pick_vld_g),
2161
        .q      (ld2_spec_pick_vld_w2),
2162
        .clk  (clk),
2163
        .se     (1'b0),       .si (),          .so ()
2164
        );
2165
 
2166
// kill packet valid if spec req is picked in w and stb hits in w2
2167
wire    ld2_pkt_vld_tmp ;
2168
assign lsu_ld2_spec_vld_kill_w2  =  ld2_spec_pick_vld_w2 & (~ld2_l2cache_rq_w2 | ld2_l2cache_rq_kill | ld2_ldbl_rq_w2 | non_l2bnk_mx2_d1) ;
2169
 
2170
assign  ld2_pkt_vld_tmp = ld2_pkt_vld_unmasked & ~(ld2_pcx_rq_sel_d1 | ld2_pcx_rq_sel_d2) &
2171
                      ~(ld2_l2cache_rq_kill | ld2_ldbl_rq_w2) &
2172
                      ~(pref_rq_vld2 & lsu_no_spc_pref[2]) ;
2173
 
2174
assign  ld2_pkt_vld = ld2_pkt_vld_tmp | ld2_spec_vld_g ;
2175
// bug2705 - speculative pick in w-cycle - end
2176
 
2177
//assign  ld2_pkt_vld = ld2_pkt_vld_unmasked & ~ld2_pcx_rq_sel_d1 ; 
2178
 
2179
 
2180
assign  ld2_fill_reset = reset | (lsu_dfq_ld_vld & lsu_dcfill_active_e & dfq_byp_sel[2]) ;
2181
 
2182
wire  ld2_l2cache_rq_g_tmp;
2183
wire  ld2_l2cache_rq_w2_tmp;
2184
 
2185
assign ld2_l2cache_rq_g_tmp  =  ld2_l2cache_rq_g & ~pref_inst_g ;
2186
 
2187
dff_s #(1) ff_ld2_l2cache_rq_w2 (
2188
         .din    (ld2_l2cache_rq_g_tmp),
2189
         .q      (ld2_l2cache_rq_w2_tmp),
2190
         .clk  (clk),
2191
         .se     (1'b0),       .si (),          .so ()
2192
         );
2193
 
2194
//wire ld2_unfilled_en ;
2195
//assign        ld2_unfilled_en = ld2_l2cache_rq & ~pref_inst_g ;
2196
wire ld2_unfilled_wy_en ;
2197
assign  ld2_unfilled_wy_en = ld2_l2cache_rq_w2_tmp | ld2_ldbl_rq_w2 ;
2198
 
2199
wire  ld2_l2cache_rq_tmp;
2200
assign ld2_l2cache_rq_tmp  = ld2_unfilled_wy_en & ~ld2_l2cache_rq_kill;
2201
 
2202
// ld valid until fill occur.
2203
dffre_s  #(1) ld2out_state (
2204
        //.din    (ld2_l2cache_rq),
2205
        .din    (ld2_l2cache_rq_tmp),
2206
        .q      (ld2_unfilled_tmp),
2207
        .rst    (ld2_fill_reset_d2),  .en     (ld2_unfilled_wy_en),
2208
        .clk    (clk),
2209
        .se     (1'b0),       .si (),          .so ()
2210
        );
2211
dffre_s  #(2) ld2out_state_way (
2212
        .din    (lsu_lmq_pkt_way_w2[1:0]),
2213
        .q      (ld2_unfilled_wy[1:0]),
2214
        .rst    (ld2_fill_reset_d2),  .en     (ld2_unfilled_wy_en),
2215
        .clk    (clk),
2216
        .se     (1'b0),       .si (),          .so ()
2217
        );
2218
 
2219
 
2220
assign  ld2_fill_reset_d2 = ld2_fill_reset_d2_tmp | ld2_l2cache_rq_kill ;
2221
//assign        ld2_unfilled = ld2_unfilled_tmp & ~ld2_l2cache_rq_kill ;
2222
assign  ld2_unfilled = ld2_unfilled_tmp ;
2223
 
2224
// ld l2bank address
2225
dffe_s  #(3) ld2_l2bnka (
2226
        .din    ({non_l2bnk_mx2,ldst_va_mx2[7:6]}),
2227
        .q      (ld2_l2bnk_addr[2:0]),
2228
  .en (ld2_l2cache_rq),
2229
        .clk  (clk),
2230
        .se     (1'b0),       .si (),          .so ()
2231
        );
2232
 
2233
//bug2705 - add byp for address to be available in w-cycle
2234
//7/21/03: timing fix - non_l2bnk_mx0 (uses tlb_pgnum_g[39:37] which arrives in qctl1 ~400ps)
2235
//         this will cause timing paths in spec pick in w-cycle; hence assume $able access for
2236
//         spec pick and kill pkt vld in w2 if non_l2bnk_mx0=1 (non$ access)
2237
 
2238
wire  [2:0]  ld2_l2bnk_addr_mx ;
2239
assign  ld2_l2bnk_addr_mx[2:0]  =  ld2_pkt_vld_unmasked ? ld2_l2bnk_addr[2:0] :
2240
                                        {1'b0,ldst_va_mx2[7:6]} ;
2241
 
2242
//assign  ld2_l2bnk_addr_mx[2:0]  =  (ld2_inst_vld_unflushed  & lsu_inst_vld_tmp) ? 
2243
//                                      {1'b0,ldst_va_mx2[7:6]} : 
2244
//                                      //{non_l2bnk_mx2,ldst_va_mx2[7:6]} : 
2245
//                                              ld2_l2bnk_addr[2:0] ;
2246
 
2247
//7/21/03: timing fix - non_l2bnk_mx0 (uses tlb_pgnum_g[39:37] which arrives in qctl1 ~400ps)
2248
//         this will cause timing paths in spec pick in w-cycle; hence assume $able access for
2249
//         spec pick and kill pkt vld in w2
2250
dff_s #(1) ff_non_l2bnk_mx2_d1 (
2251
        .din    (non_l2bnk_mx2),
2252
        .q      (non_l2bnk_mx2_d1),
2253
        .clk  (clk),
2254
        .se     (1'b0),       .si (),          .so ()
2255
        );
2256
 
2257
//bug2705 - change ld2_l2bnk_addr[2:0] to ld2_l2bnk_addr_mx[2:0]
2258
assign ld2_l2bnk_dest[0] = ~ld2_l2bnk_addr_mx[2] & ~ld2_l2bnk_addr_mx[1] & ~ld2_l2bnk_addr_mx[0] ;
2259
assign ld2_l2bnk_dest[1] = ~ld2_l2bnk_addr_mx[2] & ~ld2_l2bnk_addr_mx[1] &  ld2_l2bnk_addr_mx[0] ;
2260
assign ld2_l2bnk_dest[2] = ~ld2_l2bnk_addr_mx[2] &  ld2_l2bnk_addr_mx[1] & ~ld2_l2bnk_addr_mx[0] ;
2261
assign ld2_l2bnk_dest[3] = ~ld2_l2bnk_addr_mx[2] &  ld2_l2bnk_addr_mx[1] &  ld2_l2bnk_addr_mx[0] ;
2262
assign ld2_l2bnk_dest[4] =  ld2_l2bnk_addr_mx[2] ;
2263
 
2264
// THREAD3 LOAD PCX REQUEST CONTROL
2265
 
2266
wire    ld3_l2cache_rq_kill ;
2267
assign  ld3_l2cache_rq_kill =
2268
        ld3_inst_vld_w2 & ((ld_stb_full_raw_w2 & ~dbl_force_l2access_w2) | perr_ld_rq_kill_w2) ;
2269
                                                // full-raw which looks like partial
2270
assign  ld3_ldbl_rq_w2 =
2271
                ((ld_stb_full_raw_w2 & dbl_force_l2access_w2) | ld_stb_partial_raw_w2)
2272
                        & ~atomic_w2 & ~perr_ld_rq_kill_w2 & ~(asi_internal_w2 & alt_space_w2) &
2273
                        ld3_inst_vld_w2 ;
2274
//assign        ld3_l2cache_rq_kill = ld3_inst_vld_w2 & ld_stb_full_raw_w2 & ~dbl_force_l2access_w2 ;
2275
//assign        ld3_ldbl_rq_w2 = ld_stb_full_raw_w2 & dbl_force_l2access_w2 & ~atomic_w2 & ld3_inst_vld_w2 ;
2276
 
2277
assign ld3_vld_reset =
2278
  (reset | (ld3_pcx_rq_sel_d2 & ~(pcx_req_squash_d1 | ld3_inst_vld_g | bld_annul_d1[3] | dtag_perr_pkt2_vld_d1[3]))) |
2279
  ld3_l2cache_rq_kill ;
2280
  //(reset | (ld3_pcx_rq_sel_d2 & ~(pcx_req_squash_d1 | ld3_inst_vld_g | bld_annul_d1[3]))) | // bug 2877
2281
  //(reset | (ld3_pcx_rq_sel_d1 & ~(pcx_req_squash | ld3_inst_vld_g | bld_annul[3]))) ;
2282
 
2283
wire  ld3_l2cache_rq_g;
2284
assign ld3_l2cache_rq_g =
2285
        (((lsu_ld_miss_g & ~ldxa_internal))
2286
        //((lsu_ld_hit_g | lsu_ld_miss_g) & (ld_stb_partial_raw_g))) // ldst_dbl always rqs
2287
        & ~atomic_g & ld3_inst_vld_g)
2288
        | pref_rq_vld3_g ;
2289
 
2290
assign  ld3_l2cache_rq =  ld3_l2cache_rq_g | ld3_ldbl_rq_w2 ;
2291
 
2292
 
2293
// ld valid
2294
wire pref_rq_vld3;
2295
dffre_s  #(2) ld3_vld (
2296
        .din    ({ld3_l2cache_rq, pref_rq_vld3_mx} ),
2297
        .q      ({ld3_pkt_vld_unmasked, pref_rq_vld3}),
2298
  .rst  (ld3_vld_reset),  .en (ld3_l2cache_rq),
2299
        .clk  (clk),
2300
        .se     (1'b0),       .si (),          .so ()
2301
        );
2302
 
2303
// bug2705 - speculative pick in w-cycle - begin
2304
wire    ld3_spec_vld_g ;
2305
assign  ld3_spec_vld_g  =  ld3_inst_vld_unflushed & lsu_inst_vld_tmp & ~dbl_force_l2access_g & tlb_cam_hit_g  &
2306
                           ~atomic_or_ldxa_internal_rq_g &
2307
                           ~(ld0_pkt_vld_unmasked | ld1_pkt_vld_unmasked | ld2_pkt_vld_unmasked);
2308
//assign  ld3_spec_vld_g  =  ld3_inst_vld_unflushed & lsu_inst_vld_tmp & ~dbl_force_l2access_g & tlb_cam_hit_g ;
2309
 
2310
 
2311
dff_s #(1) ff_ld3_spec_pick_vld_w2 (
2312
        .din    (ld3_spec_pick_vld_g),
2313
        .q      (ld3_spec_pick_vld_w2),
2314
        .clk  (clk),
2315
        .se     (1'b0),       .si (),          .so ()
2316
        );
2317
 
2318
// kill packet valid if spec req is picked in w and stb hits in w2
2319
wire    ld3_pkt_vld_tmp ;
2320
assign lsu_ld3_spec_vld_kill_w2  =  ld3_spec_pick_vld_w2 & (~ld3_l2cache_rq_w2 | ld3_l2cache_rq_kill | ld3_ldbl_rq_w2 | non_l2bnk_mx3_d1) ;
2321
 
2322
assign  ld3_pkt_vld_tmp = ld3_pkt_vld_unmasked & ~(ld3_pcx_rq_sel_d1 | ld3_pcx_rq_sel_d2) &
2323
                      ~(ld3_l2cache_rq_kill | ld3_ldbl_rq_w2) &
2324
                      ~(pref_rq_vld3 & lsu_no_spc_pref[3]) ;
2325
 
2326
assign  ld3_pkt_vld = ld3_pkt_vld_tmp | ld3_spec_vld_g ;
2327
// bug2705 - speculative pick in w-cycle - end
2328
 
2329
//assign  ld3_pkt_vld = ld3_pkt_vld_unmasked & ~ld3_pcx_rq_sel_d1 ; 
2330
 
2331
assign  ld3_fill_reset = reset | (lsu_dfq_ld_vld & lsu_dcfill_active_e & dfq_byp_sel[3]) ;
2332
 
2333
wire  ld3_l2cache_rq_g_tmp;
2334
wire  ld3_l2cache_rq_w2_tmp;
2335
 
2336
assign ld3_l2cache_rq_g_tmp  =  ld3_l2cache_rq_g & ~pref_inst_g ;
2337
 
2338
dff_s #(1) ff_ld3_l2cache_rq_w2 (
2339
         .din    (ld3_l2cache_rq_g_tmp),
2340
         .q      (ld3_l2cache_rq_w2_tmp),
2341
         .clk  (clk),
2342
         .se     (1'b0),       .si (),          .so ()
2343
         );
2344
 
2345
//wire ld3_unfilled_en ;
2346
//assign        ld3_unfilled_en = ld3_l2cache_rq & ~pref_inst_g ;
2347
wire ld3_unfilled_wy_en ;
2348
assign  ld3_unfilled_wy_en = ld3_l2cache_rq_w2_tmp | ld3_ldbl_rq_w2 ;
2349
 
2350
wire  ld3_l2cache_rq_tmp;
2351
assign ld3_l2cache_rq_tmp  = ld3_unfilled_wy_en & ~ld3_l2cache_rq_kill;
2352
 
2353
// ld valid until fill occur.
2354
dffre_s #(1)  ld3out_state (
2355
        //.din    (ld3_l2cache_rq),
2356
        .din    (ld3_l2cache_rq_tmp),
2357
        .q      (ld3_unfilled_tmp),
2358
        .rst    (ld3_fill_reset_d2),  .en     (ld3_unfilled_wy_en),
2359
        .clk    (clk),
2360
        .se     (1'b0),       .si (),          .so ()
2361
        );
2362
dffre_s #(2)  ld3out_state_way (
2363
        .din    (lsu_lmq_pkt_way_w2[1:0]),
2364
        .q      (ld3_unfilled_wy[1:0]),
2365
        .rst    (ld3_fill_reset_d2),  .en     (ld3_unfilled_wy_en),
2366
        .clk    (clk),
2367
        .se     (1'b0),       .si (),          .so ()
2368
        );
2369
 
2370
 
2371
assign  ld3_fill_reset_d2 = ld3_fill_reset_d2_tmp | ld3_l2cache_rq_kill ;
2372
//assign        ld3_unfilled = ld3_unfilled_tmp & ~ld3_l2cache_rq_kill ;
2373
assign  ld3_unfilled = ld3_unfilled_tmp;
2374
 
2375
// ld l2bank address
2376
dffe_s  #(3) ld3_l2bnka (
2377
        .din    ({non_l2bnk_mx3,ldst_va_mx3[7:6]}),
2378
        .q      (ld3_l2bnk_addr[2:0]),
2379
  .en (ld3_l2cache_rq),
2380
        .clk  (clk),
2381
        .se     (1'b0),       .si (),          .so ()
2382
        );
2383
 
2384
//bug2705 - add byp for address to be available in w-cycle
2385
//7/21/03: timing fix - non_l2bnk_mx0 (uses tlb_pgnum_g[39:37] which arrives in qctl1 ~400ps)
2386
//         this will cause timing paths in spec pick in w-cycle; hence assume $able access for
2387
//         spec pick and kill pkt vld in w2 if non_l2bnk_mx0=1 (non$ access)
2388
 
2389
wire  [2:0]  ld3_l2bnk_addr_mx ;
2390
assign  ld3_l2bnk_addr_mx[2:0]  =  ld3_pkt_vld_unmasked ? ld3_l2bnk_addr[2:0] :
2391
                                        {1'b0,ldst_va_mx3[7:6]} ;
2392
 
2393
//assign  ld3_l2bnk_addr_mx[2:0]  =  (ld3_inst_vld_unflushed  & lsu_inst_vld_tmp) ? 
2394
//                                      {1'b0,ldst_va_mx3[7:6]} : 
2395
//                                      //{non_l2bnk_mx3,ldst_va_mx3[7:6]} : 
2396
//                                              ld3_l2bnk_addr[2:0] ;
2397
 
2398
//7/21/03: timing fix - non_l2bnk_mx0 (uses tlb_pgnum_g[39:37] which arrives in qctl1 ~400ps)
2399
//         this will cause timing paths in spec pick in w-cycle; hence assume $able access for
2400
//         spec pick and kill pkt vld in w2
2401
dff_s #(1) ff_non_l2bnk_mx3_d1 (
2402
        .din    (non_l2bnk_mx3),
2403
        .q      (non_l2bnk_mx3_d1),
2404
        .clk  (clk),
2405
        .se     (1'b0),       .si (),          .so ()
2406
        );
2407
 
2408
 
2409
//bug2705 - change ld3_l2bnk_addr[2:0] to ld3_l2bnk_addr_mx[2:0]
2410
assign ld3_l2bnk_dest[0] = ~ld3_l2bnk_addr_mx[2] & ~ld3_l2bnk_addr_mx[1] & ~ld3_l2bnk_addr_mx[0] ;
2411
assign ld3_l2bnk_dest[1] = ~ld3_l2bnk_addr_mx[2] & ~ld3_l2bnk_addr_mx[1] &  ld3_l2bnk_addr_mx[0] ;
2412
assign ld3_l2bnk_dest[2] = ~ld3_l2bnk_addr_mx[2] &  ld3_l2bnk_addr_mx[1] & ~ld3_l2bnk_addr_mx[0] ;
2413
assign ld3_l2bnk_dest[3] = ~ld3_l2bnk_addr_mx[2] &  ld3_l2bnk_addr_mx[1] &  ld3_l2bnk_addr_mx[0] ;
2414
assign ld3_l2bnk_dest[4] =  ld3_l2bnk_addr_mx[2] ;
2415
 
2416
//=================================================================================================
2417
//  LMQ Miscellaneous Control
2418
//=================================================================================================
2419
 
2420
dff_s #(1) stgm_cas (
2421
        .din    (ifu_lsu_casa_e),
2422
        .q      (casa_m),
2423
        .clk  (clk),
2424
        .se     (1'b0),       .si (),          .so ()
2425
        );
2426
 
2427
dff_s  #(1) stgg_cas (
2428
        .din    (casa_m),
2429
        .q      (casa_g),
2430
        .clk  (clk),
2431
        .se     (1'b0),       .si (),          .so ()
2432
        );
2433
 
2434
//assign  casa0_g = casa_g & thread0_g ;
2435
//assign  casa1_g = casa_g & thread1_g ;
2436
//assign  casa2_g = casa_g & thread2_g ;
2437
//assign  casa3_g = casa_g & thread3_g ;
2438
 
2439
// PARTIAL RAW BYPASSING.
2440
 
2441
// Partial raw of load in stb. Even if the load hits in the dcache, it must follow
2442
// the st to the pcx, obtain merged data to bypass to the pipeline. This load will 
2443
// also fill the dcache. i.e., once the store is received it looks like a normal load.
2444
 
2445
// This path is also used for 2nd cas pkt. rs1(addr) and rs2(cmp data) are in 1st
2446
// pkt which is written to stb. rd(swap value) is written to lmq as 2nd pkt. The
2447
// 2nd pkt will wait in the lmq until the 1st pkt is sent.
2448
 
2449
// *** Atomics need to switch out the thread ***
2450
 
2451
// THREAD0
2452
 
2453
// timing fix: 9/15/03 - reduce loading on pcx_rq_for_stb[3:0] to stb_clt[0-3]. it had FO2 (stb_ctl,qdp2 - cap=0.5-0.8)
2454
//             move the flop from qdp2 to qctl1
2455
 
2456
dff_s #(4)  ff_pcx_rq_for_stb_d1 (
2457
        .din    (pcx_rq_for_stb[3:0]),
2458
        .q      (pcx_rq_for_stb_d1[3:0]),
2459
        .clk    (clk),
2460
        .se     (1'b0),       .si (),          .so ()
2461
        );
2462
 
2463
dff_s #(4)  srqsel_d1 (
2464
        .din    (pcx_rq_for_stb[3:0]),
2465
        //.q      ({st3_pcx_rq_tmp, st2_pcx_rq_tmp,st1_pcx_rq_tmp, st0_pcx_rq_tmp}),
2466
        .q      ({st3_pcx_rq_sel_d1, st2_pcx_rq_sel_d1,st1_pcx_rq_sel_d1, st0_pcx_rq_sel_d1}),
2467
        .clk    (clk),
2468
        .se     (1'b0),       .si (),          .so ()
2469
        );
2470
 
2471
dff_s #(4)  srqsel_d2 (
2472
        .din      ({st3_pcx_rq_sel_d1, st2_pcx_rq_sel_d1,st1_pcx_rq_sel_d1, st0_pcx_rq_sel_d1}),
2473
        .q      ({st3_pcx_rq_sel_d2, st2_pcx_rq_sel_d2,st1_pcx_rq_sel_d2, st0_pcx_rq_sel_d2}),
2474
        .clk    (clk),
2475
        .se     (1'b0),       .si (),          .so ()
2476
        );
2477
 
2478
dff_s #(4)  srqsel_d3 (
2479
        .din    ({st3_pcx_rq_sel_d2, st2_pcx_rq_sel_d2,st1_pcx_rq_sel_d2, st0_pcx_rq_sel_d2}),
2480
        .q      ({st3_pcx_rq_sel_d3, st2_pcx_rq_sel_d3,st1_pcx_rq_sel_d3, st0_pcx_rq_sel_d3}),
2481
        .clk    (clk),
2482
        .se     (1'b0),       .si (),          .so ()
2483
        );
2484
 
2485
wire    ld0_ldbl_rawp_en_w2 ;
2486
assign  ld0_ldbl_rawp_en_w2 = ld0_ldbl_rq_w2 & ~ld_rawp_st_ced_w2 & ~ld0_rawp_reset ;
2487
 
2488
/*assign        st3_pcx_rq_sel_d1 = st3_pcx_rq_tmp & ~pcx_req_squash ;
2489
assign  st2_pcx_rq_sel_d1 = st2_pcx_rq_tmp & ~pcx_req_squash ;
2490
assign  st1_pcx_rq_sel_d1 = st1_pcx_rq_tmp & ~pcx_req_squash ;
2491
assign  st0_pcx_rq_sel_d1 = st0_pcx_rq_tmp & ~pcx_req_squash ;*/
2492
 
2493
assign ld0_rawp_reset =
2494
        (reset | (st0_pcx_rq_sel_d3 & ~pcx_req_squash_d2 & ld0_rawp_disabled & (ld0_rawp_ackid[2:0] == stb0_crnt_ack_id[2:0])));
2495
        //(reset | (st0_pcx_rq_sel_d2 & ~pcx_req_squash_d1 & ld0_rawp_disabled & (ld0_rawp_ackid[2:0] == stb0_crnt_ack_id[2:0])));
2496
 
2497
// TO BE REMOVED ALONG WITH defines !!!
2498
//wire  ld_rawp_st_ced_g ;
2499
//assign        ld_rawp_st_ced_g = 1'b0 ;
2500
 
2501
// reset needs to be dominant in case ack comes on fly.
2502
// atomics will not set rawp_disabled
2503
assign ld0_rawp_en =
2504
        //(((ld_stb_partial_raw_g) & ~ld_rawp_st_ced_g & ~ld0_rawp_reset)     // partial_raw
2505
        //& ~atomic_g & ld0_inst_vld_g) |          // cas inst - 2nd pkt
2506
        ld0_ldbl_rawp_en_w2 ;
2507
 
2508
// ack-id and wait-for-ack disable - Thread 0
2509
dffre_s #(1)  ldrawp0_dis (
2510
        .din    (ld0_rawp_en),
2511
        .q      (ld0_rawp_disabled),
2512
        .rst    (ld0_rawp_reset),  .en     (ld0_rawp_en),
2513
        .clk    (clk),
2514
        .se     (1'b0),       .si (),          .so ()
2515
        );
2516
 
2517
dffe_s #(3)  ldrawp0_ackid (
2518
        .din    (ld_rawp_st_ackid_w2[2:0]),
2519
        .q      (ld0_rawp_ackid[2:0]),
2520
        .en     (ld0_inst_vld_w2),
2521
        .clk    (clk),
2522
        .se     (1'b0),       .si (),          .so ()
2523
        );
2524
 
2525
// THREAD1
2526
 
2527
wire    ld1_ldbl_rawp_en_w2 ;
2528
assign  ld1_ldbl_rawp_en_w2 = ld1_ldbl_rq_w2 & ~ld_rawp_st_ced_w2 & ~ld1_rawp_reset ;
2529
 
2530
// 1st st ack for st-quad will not cause ack.
2531
 
2532
assign ld1_rawp_reset =
2533
        (reset | (st1_pcx_rq_sel_d3 & ~pcx_req_squash_d2 & ld1_rawp_disabled &
2534
        //(reset | (st1_pcx_rq_sel_d2 & ~pcx_req_squash_d1 & ld1_rawp_disabled & 
2535
                        (ld1_rawp_ackid[2:0] == stb1_crnt_ack_id[2:0])));
2536
 
2537
// reset needs to be dominant in case ack comes on fly.
2538
// atomics will not set rawp_disabled
2539
assign ld1_rawp_en =
2540
        //(((ld_stb_partial_raw_g) & ~ld_rawp_st_ced_g & ~ld1_rawp_reset) // partial raw
2541
        //(((ld_stb_partial_raw_g | (ld_stb_full_raw_g & ldst_dbl_g)) & ~ld_rawp_st_ced_g & ~ld1_rawp_reset) // partial raw
2542
        //& ~atomic_g  & ld1_inst_vld_g)  |                // cas inst - 2nd pkt
2543
        ld1_ldbl_rawp_en_w2 ;
2544
 
2545
// ack-id and wait-for-ack disable - Thread 0
2546
dffre_s #(1)  ldrawp1_dis (
2547
        .din    (ld1_rawp_en),
2548
        .q      (ld1_rawp_disabled),
2549
        .rst    (ld1_rawp_reset),  .en     (ld1_rawp_en),
2550
        .clk    (clk),
2551
        .se     (1'b0),       .si (),          .so ()
2552
        );
2553
 
2554
dffe_s #(3)  ldrawp1_ackid (
2555
        .din    (ld_rawp_st_ackid_w2[2:0]),
2556
        .q      (ld1_rawp_ackid[2:0]),
2557
        .en     (ld1_inst_vld_w2),
2558
        .clk    (clk),
2559
        .se     (1'b0),       .si (),          .so ()
2560
        );
2561
 
2562
// THREAD2
2563
 
2564
wire    ld2_ldbl_rawp_en_w2 ;
2565
assign  ld2_ldbl_rawp_en_w2 = ld2_ldbl_rq_w2 & ~ld_rawp_st_ced_w2 & ~ld2_rawp_reset ;
2566
 
2567
assign ld2_rawp_reset =
2568
        (reset | (st2_pcx_rq_sel_d3 & ~pcx_req_squash_d2 & ld2_rawp_disabled &
2569
        //(reset | (st2_pcx_rq_sel_d2 & ~pcx_req_squash_d1 & ld2_rawp_disabled & 
2570
                        (ld2_rawp_ackid[2:0] == stb2_crnt_ack_id[2:0])));
2571
 
2572
// reset needs to be dominant in case ack comes on fly.
2573
// atomics will not set rawp_disabled
2574
assign ld2_rawp_en =
2575
        //(((ld_stb_partial_raw_g) & ~ld_rawp_st_ced_g & ~ld2_rawp_reset) // partial raw
2576
        //& ~atomic_g & ld2_inst_vld_g) |          // cas inst - 2nd pkt
2577
        ld2_ldbl_rawp_en_w2 ;
2578
 
2579
// ack-id and wait-for-ack disable - Thread 0
2580
dffre_s #(1)  ldrawp2_dis (
2581
        .din    (ld2_rawp_en),
2582
        .q      (ld2_rawp_disabled),
2583
        .rst    (ld2_rawp_reset),  .en     (ld2_rawp_en),
2584
        .clk    (clk),
2585
        .se     (1'b0),       .si (),          .so ()
2586
        );
2587
 
2588
dffe_s #(3)  ldrawp2_ackid (
2589
        .din    (ld_rawp_st_ackid_w2[2:0]),
2590
        .q      (ld2_rawp_ackid[2:0]),
2591
        .en     (ld2_inst_vld_w2),
2592
        .clk    (clk),
2593
        .se     (1'b0),       .si (),          .so ()
2594
        );
2595
 
2596
// THREAD3
2597
 
2598
wire    ld3_ldbl_rawp_en_w2 ;
2599
assign  ld3_ldbl_rawp_en_w2 = ld3_ldbl_rq_w2 & ~ld_rawp_st_ced_w2 & ~ld3_rawp_reset ;
2600
 
2601
assign ld3_rawp_reset =
2602
        (reset | (st3_pcx_rq_sel_d3 & ~pcx_req_squash_d2 & ld3_rawp_disabled &
2603
        //(reset | (st3_pcx_rq_sel_d2 & ~pcx_req_squash_d1 & ld3_rawp_disabled & 
2604
                                (ld3_rawp_ackid[2:0] == stb3_crnt_ack_id[2:0])));
2605
 
2606
// reset needs to be dominant in case ack comes on fly.
2607
// atomics will not set rawp_disabled
2608
assign ld3_rawp_en =
2609
        //(((ld_stb_partial_raw_g) & ~ld_rawp_st_ced_g & ~ld3_rawp_reset) // partial raw
2610
        //& ~atomic_g & ld3_inst_vld_g) |          // cas inst - 2nd pkt
2611
        ld3_ldbl_rawp_en_w2 ;
2612
 
2613
// ack-id and wait-for-ack disable - Thread 0
2614
dffre_s #(1)  ldrawp3_dis (
2615
        .din    (ld3_rawp_en),
2616
        .q      (ld3_rawp_disabled),
2617
        .rst    (ld3_rawp_reset),  .en     (ld3_rawp_en),
2618
        .clk    (clk),
2619
        .se     (1'b0),       .si (),          .so ()
2620
        );
2621
 
2622
dffe_s #(3)  ldrawp3_ackid (
2623
        .din    (ld_rawp_st_ackid_w2[2:0]),
2624
        .q      (ld3_rawp_ackid[2:0]),
2625
        .en     (ld3_inst_vld_w2),
2626
        .clk    (clk),
2627
        .se     (1'b0),       .si (),          .so ()
2628
        );
2629
 
2630
 
2631
 
2632
//=================================================================================================
2633
//  INTERRUPT PCX PKT REQ CTL
2634
//=================================================================================================
2635
 
2636
wire    intrpt_pcx_rq_sel_d2 ;
2637
wire    intrpt_vld_reset;
2638
wire    intrpt_vld_en ;
2639
wire  [3:0] intrpt_thread ;
2640
wire    intrpt_clr ;
2641
 
2642
 
2643
assign  lsu_tlu_pcxpkt_ack = intrpt_pcx_rq_sel_d2 & ~pcx_req_squash_d1 ;
2644
 
2645
assign intrpt_vld_reset =
2646
        reset | lsu_tlu_pcxpkt_ack ;
2647
        //reset | (intrpt_pcx_rq_sel_d1 & ~pcx_req_squash);
2648
wire    intrpt_pkt_vld_unmasked ;
2649
// assumption is that pkt vld cannot be turned around in same cycle
2650
assign intrpt_vld_en = ~intrpt_pkt_vld_unmasked ;
2651
//assign intrpt_vld_en = ~lsu_intrpt_pkt_vld ;
2652
 
2653
dff_s #(1) intpkt_stgd2 (
2654
        .din    (intrpt_pcx_rq_sel_d1),
2655
        .q      (intrpt_pcx_rq_sel_d2),
2656
        .clk    (clk),
2657
        .se     (1'b0),       .si (),          .so ()
2658
        );
2659
 
2660
// intrpt valid
2661
dffre_s  intrpt_vld (
2662
        .din    (tlu_lsu_pcxpkt_vld),
2663
        .q      (intrpt_pkt_vld_unmasked),
2664
        .rst    (intrpt_vld_reset),     .en     (intrpt_vld_en),
2665
        .clk    (clk),
2666
        .se     (1'b0),       .si (),          .so ()
2667
        );
2668
 
2669
assign  intrpt_thread[0] = ~tlu_lsu_pcxpkt_tid[19] & ~tlu_lsu_pcxpkt_tid[18] ;
2670
assign  intrpt_thread[1] = ~tlu_lsu_pcxpkt_tid[19] &  tlu_lsu_pcxpkt_tid[18] ;
2671
assign  intrpt_thread[2] =  tlu_lsu_pcxpkt_tid[19] & ~tlu_lsu_pcxpkt_tid[18] ;
2672
assign  intrpt_thread[3] =  tlu_lsu_pcxpkt_tid[19] &  tlu_lsu_pcxpkt_tid[18] ;
2673
 
2674
assign  intrpt_clr =
2675
  (intrpt_thread[0] & lsu_stb_empty[0]) |
2676
  (intrpt_thread[1] & lsu_stb_empty[1]) |
2677
  (intrpt_thread[2] & lsu_stb_empty[2]) |
2678
  (intrpt_thread[3] & lsu_stb_empty[3]) ;
2679
 
2680
wire    intrpt_clr_d1 ;
2681
dff_s #(1) intclr_stgd1 (
2682
        .din    (intrpt_clr),
2683
        .q      (intrpt_clr_d1),
2684
        .clk    (clk),
2685
        .se     (1'b0),       .si (),          .so ()
2686
        );
2687
 
2688
wire    [3:0]    intrpt_cmplt ;
2689
 
2690
assign  intrpt_cmplt[0] = lsu_tlu_pcxpkt_ack & intrpt_thread[0] ;
2691
assign  intrpt_cmplt[1] = lsu_tlu_pcxpkt_ack & intrpt_thread[1] ;
2692
assign  intrpt_cmplt[2] = lsu_tlu_pcxpkt_ack & intrpt_thread[2] ;
2693
assign  intrpt_cmplt[3] = lsu_tlu_pcxpkt_ack & intrpt_thread[3] ;
2694
 
2695
dff_s #(4) intrpt_stg (
2696
        .din    (intrpt_cmplt[3:0]),
2697
        .q      (lsu_intrpt_cmplt[3:0]),
2698
        .clk    (clk),
2699
        .se     (1'b0),       .si (),          .so ()
2700
        );
2701
 
2702
assign  intrpt_pkt_vld =
2703
intrpt_pkt_vld_unmasked & ~(intrpt_pcx_rq_sel_d1 | intrpt_pcx_rq_sel_d2) & intrpt_clr_d1 ;
2704
 
2705
// ** enabled flop should not be required !!
2706
// intrpt l2bank address
2707
// ?? Can interrupt requests go to io-bridge ??
2708
// Using upper 3b of 5b thread field of INTR_W to address 4 l2 banks
2709
dffe_s #(3) intrpt_l2bnka (
2710
        .din    ({1'b0,tlu_lsu_pcxpkt_l2baddr[11:10]}),
2711
        .q      (intrpt_l2bnk_addr[2:0]),
2712
        .en     (intrpt_vld_en),
2713
        .clk    (clk),
2714
        .se     (1'b0),       .si (),          .so ()
2715
        );
2716
 
2717
// IO Requests should not go to iobrdge.
2718
assign intrpt_l2bnk_dest[0] =
2719
~intrpt_l2bnk_addr[2] & ~intrpt_l2bnk_addr[1] & ~intrpt_l2bnk_addr[0] ;
2720
assign intrpt_l2bnk_dest[1] =
2721
~intrpt_l2bnk_addr[2] & ~intrpt_l2bnk_addr[1] &  intrpt_l2bnk_addr[0] ;
2722
assign intrpt_l2bnk_dest[2] =
2723
~intrpt_l2bnk_addr[2] & intrpt_l2bnk_addr[1] & ~intrpt_l2bnk_addr[0] ;
2724
assign intrpt_l2bnk_dest[3] =
2725
~intrpt_l2bnk_addr[2] & intrpt_l2bnk_addr[1] &  intrpt_l2bnk_addr[0] ;
2726
assign intrpt_l2bnk_dest[4] = intrpt_l2bnk_addr[2] ;
2727
 
2728
//=================================================================================================
2729
//
2730
// QDP Specific Control
2731
//
2732
//=================================================================================================
2733
 
2734
 
2735
// Qualify with thread.
2736
// Write cas pckt 2 to lmq
2737
// Timing Change : ld0_l2cache_rq guarantees validity.
2738
//assign lmq_enable[0] = lsu_ld_miss_g & thread0_g ;
2739
//assign lmq_enable[0] = ld0_inst_vld_g | pref_vld0_g ;
2740
 
2741
//assign lmq_enable[0] = (ld0_inst_vld_unflushed & lsu_inst_vld_w) | pref_vld0_g ;
2742
//assign lmq_enable[1] = (ld1_inst_vld_unflushed & lsu_inst_vld_w) | pref_vld1_g ;
2743
//assign lmq_enable[2] = (ld2_inst_vld_unflushed & lsu_inst_vld_w) | pref_vld2_g ;
2744
//assign lmq_enable[3] = (ld3_inst_vld_unflushed & lsu_inst_vld_w) | pref_vld3_g ;
2745
 
2746
//bug 2771; timing path - remove flush-pipe, add ifu's flush signal
2747
//assign lmq_enable[0] = (ld0_inst_vld_unflushed | pref_vld0_g) & lsu_inst_vld_w ;
2748
assign lmq_enable[0] = (ld0_inst_vld_unflushed | pref_vld0_g) & lsu_inst_vld_tmp & ~ifu_lsu_flush_w ;
2749
assign lmq_enable[1] = (ld1_inst_vld_unflushed | pref_vld1_g) & lsu_inst_vld_tmp & ~ifu_lsu_flush_w ;
2750
assign lmq_enable[2] = (ld2_inst_vld_unflushed | pref_vld2_g) & lsu_inst_vld_tmp & ~ifu_lsu_flush_w ;
2751
assign lmq_enable[3] = (ld3_inst_vld_unflushed | pref_vld3_g) & lsu_inst_vld_tmp & ~ifu_lsu_flush_w ;
2752
 
2753
// timing fix: 5/19/03: move secondary hit way generation to w2
2754
dff_s #(4) ff_lmq_enable_w2 (
2755
        .din    (lmq_enable[3:0]),
2756
        .q      (lmq_enable_w2[3:0]),
2757
        .clk    (clk),
2758
        .se     (1'b0),       .si (),          .so ()
2759
        );
2760
 
2761
 
2762
// needs to be 1-hot always.
2763
assign imiss_pcx_mx_sel = imiss_pcx_rq_sel_d1 ;
2764
//assign imiss_pcx_mx_sel[1] = strm_pcx_rq_sel_d1 ;
2765
//assign imiss_pcx_mx_sel[2] = intrpt_pcx_rq_sel_d1 ;
2766
//assign imiss_pcx_mx_sel[3] = fpop_pcx_rq_sel_d1 ;
2767
 
2768
//11/7/03: add rst_tri_en
2769
wire  [2:0]  fwd_int_fp_pcx_mx_sel_tmp ;
2770
 
2771
assign fwd_int_fp_pcx_mx_sel_tmp[0]= ~fwd_int_fp_pcx_mx_sel[1] & ~fwd_int_fp_pcx_mx_sel[2];
2772
assign fwd_int_fp_pcx_mx_sel_tmp[1]=  intrpt_pcx_rq_sel_d1 ;
2773
assign fwd_int_fp_pcx_mx_sel_tmp[2]=  fpop_pcx_rq_sel_d1 | fpop_pcx_rq_sel_d2 ;
2774
 
2775
assign fwd_int_fp_pcx_mx_sel[1:0] = fwd_int_fp_pcx_mx_sel_tmp[1:0] & ~{2{rst_tri_en}} ;
2776
assign fwd_int_fp_pcx_mx_sel[2]   = fwd_int_fp_pcx_mx_sel_tmp[2] | rst_tri_en ;
2777
 
2778
 
2779
//*************************************************************************************************
2780
//                      PCX REQUEST GENERATION (BEGIN)
2781
 
2782
//=================================================================================================
2783
//  PCX REQUEST SELECTION CONTROL
2784
//=================================================================================================
2785
 
2786
// LOAD
2787
// fpops have to squash other rqs in the 2nd cycle also.
2788
//timing fix: 05/20/03 - move mycle_squash_d1 after pick instead of before pick
2789
assign ld0_pcx_rq_vld =
2790
  (|(queue_write[4:0] & ld0_l2bnk_dest[4:0])) &
2791
    ld0_pkt_vld & ~ld0_rawp_disabled;
2792
    //ld0_pkt_vld & ~ld0_rawp_disabled & ~mcycle_squash_d1;
2793
    //ld0_pkt_vld & ~ld0_rawp_disabled & ~st_atom_rq_d1 ;
2794
assign ld1_pcx_rq_vld =
2795
  (|(queue_write[4:0] & ld1_l2bnk_dest[4:0])) &
2796
    ld1_pkt_vld & ~ld1_rawp_disabled;
2797
    //ld1_pkt_vld & ~ld1_rawp_disabled & ~mcycle_squash_d1;
2798
    //ld1_pkt_vld & ~ld1_rawp_disabled & ~st_atom_rq_d1 ;
2799
assign ld2_pcx_rq_vld =
2800
  (|(queue_write[4:0] & ld2_l2bnk_dest[4:0])) &
2801
    ld2_pkt_vld & ~ld2_rawp_disabled ;
2802
    //ld2_pkt_vld & ~ld2_rawp_disabled & ~mcycle_squash_d1;
2803
    //ld2_pkt_vld & ~ld2_rawp_disabled & ~st_atom_rq_d1 ;
2804
assign ld3_pcx_rq_vld =
2805
  (|(queue_write[4:0] & ld3_l2bnk_dest[4:0])) &
2806
    ld3_pkt_vld & ~ld3_rawp_disabled;
2807
    //ld3_pkt_vld & ~ld3_rawp_disabled & ~mcycle_squash_d1;
2808
    //ld3_pkt_vld & ~ld3_rawp_disabled & ~st_atom_rq_d1 ;
2809
 
2810
//assign  ld_pcx_rq_vld = ld0_pcx_rq_vld | ld1_pcx_rq_vld 
2811
//      | ld2_pcx_rq_vld | ld3_pcx_rq_vld ;
2812
 
2813
wire    st0_atomic_pend_d1, st1_atomic_pend_d1, st2_atomic_pend_d1, st3_atomic_pend_d1 ;
2814
 
2815
assign  st0_q_wr[4:0] = st0_atomic_pend_d1 ? pre_qwr[4:0] : queue_write[4:0] ;
2816
assign  st1_q_wr[4:0] = st1_atomic_pend_d1 ? pre_qwr[4:0] : queue_write[4:0] ;
2817
assign  st2_q_wr[4:0] = st2_atomic_pend_d1 ? pre_qwr[4:0] : queue_write[4:0] ;
2818
assign  st3_q_wr[4:0] = st3_atomic_pend_d1 ? pre_qwr[4:0] : queue_write[4:0] ;
2819
 
2820
assign  st0_atom_rq = (st0_pcx_rq_sel & st0_atomic_vld) ;
2821
assign  st1_atom_rq = (st1_pcx_rq_sel & st1_atomic_vld) ;
2822
assign  st2_atom_rq = (st2_pcx_rq_sel & st2_atomic_vld) ;
2823
assign  st3_atom_rq = (st3_pcx_rq_sel & st3_atomic_vld) ;
2824
 
2825
dff_s #(8)  avlds_d1 (
2826
        .din    ({st0_atom_rq,st1_atom_rq,st2_atom_rq,st3_atom_rq,
2827
    st0_cas_vld,st1_cas_vld,st2_cas_vld,st3_cas_vld}),
2828
        .q      ({st0_atom_rq_d1,st1_atom_rq_d1,st2_atom_rq_d1,st3_atom_rq_d1,
2829
    st0_cas_vld_d1,st1_cas_vld_d1,st2_cas_vld_d1,st3_cas_vld_d1}),
2830
        .clk  (clk),
2831
        .se     (1'b0),       .si (),          .so ()
2832
        );
2833
 
2834
dff_s #(8)  avlds_d2 (
2835
        .din    ({st0_atom_rq_d1,st1_atom_rq_d1,st2_atom_rq_d1,st3_atom_rq_d1,
2836
    st0_cas_vld_d1,st1_cas_vld_d1,st2_cas_vld_d1,st3_cas_vld_d1}),
2837
        .q      ({st0_atom_rq_d2,st1_atom_rq_d2,st2_atom_rq_d2,st3_atom_rq_d2,
2838
    st0_cas_vld_d2,st1_cas_vld_d2,st2_cas_vld_d2,st3_cas_vld_d2}),
2839
        .clk  (clk),
2840
        .se     (1'b0),       .si (),          .so ()
2841
        );
2842
 
2843
//timing fix : 7/28/03 - move the OR before flop
2844
assign st_atom_rq = st0_atom_rq | st1_atom_rq | st2_atom_rq | st3_atom_rq ;
2845
//assign st_atom_rq_d1 = st0_atom_rq_d1 | st1_atom_rq_d1 | st2_atom_rq_d1 | st3_atom_rq_d1 ; 
2846
 
2847
// timing fix: 7/28/03 - move the OR before flop
2848
dff_s #(1)  ff_st_atom_pq (
2849
  .din (st_atom_rq),
2850
  .q   (st_atom_rq_d1),
2851
  .clk (clk),
2852
  .se  (1'b0), .si (), .so ()
2853
  );
2854
 
2855
 
2856
assign st_cas_rq_d2 =
2857
  (st0_atom_rq_d2 & st0_cas_vld_d2)  |
2858
  (st1_atom_rq_d2 & st1_cas_vld_d2)  |
2859
  (st2_atom_rq_d2 & st2_cas_vld_d2)  |
2860
  (st3_atom_rq_d2 & st3_cas_vld_d2)  ;
2861
//assign st_quad_rq_d2 = 
2862
//  (st0_atom_rq_d2 & ~st0_cas_vld_d2)  | 
2863
//  (st1_atom_rq_d2 & ~st1_cas_vld_d2)  | 
2864
//  (st2_atom_rq_d2 & ~st2_cas_vld_d2)  | 
2865
//  (st3_atom_rq_d2 & ~st3_cas_vld_d2)  ; 
2866
 
2867
//timing fix: 9/17/03 - move the OR to previous cycle and add flop for spc_pcx_atom_pq
2868
//                      instantiate buf30 for flop output
2869
//assign  spc_pcx_atom_pq = 
2870
//    st_atom_rq_d1 |  
2871
//    fpop_atom_rq_pq ;
2872
 
2873
wire  spc_pcx_atom_w, spc_pcx_atom_pq_tmp ;
2874
assign spc_pcx_atom_w  =  st_atom_rq | fpop_atom_req ;
2875
 
2876
dff_s #(1)  ff_spc_pcx_atom_pq (
2877
  .din (spc_pcx_atom_w),
2878
  .q   (spc_pcx_atom_pq_tmp),
2879
  .clk (clk),
2880
  .se  (1'b0), .si (), .so ()
2881
  );
2882
 
2883
bw_u1_buf_30x UZfix_spc_pcx_atom_pq_buf1 ( .a(spc_pcx_atom_pq_tmp), .z(spc_pcx_atom_pq) );
2884
bw_u1_buf_30x UZsize_spc_pcx_atom_pq_buf2 ( .a(spc_pcx_atom_pq_tmp), .z(spc_pcx_atom_pq_buf2) );
2885
 
2886
// STORE
2887
// st will wait in pcx bypass until previous st in chain is acked !!!!
2888
//timing fix: 05/20/03 - move mycle_squash_d1 after pick instead of before pick
2889
assign st0_pcx_rq_vld =
2890
  (|(st0_q_wr[4:0] & st0_l2bnk_dest[4:0])) & st0_pkt_vld ;
2891
  //(|(st0_q_wr[4:0] & st0_l2bnk_dest[4:0])) & st0_pkt_vld & ~mcycle_squash_d1;
2892
  //(|(st0_q_wr[4:0] & st0_l2bnk_dest[4:0])) & st0_pkt_vld & ~st_atom_rq_d1 ;
2893
assign st1_pcx_rq_vld =
2894
  (|(st1_q_wr[4:0] & st1_l2bnk_dest[4:0])) & st1_pkt_vld ;
2895
  //(|(st1_q_wr[4:0] & st1_l2bnk_dest[4:0])) & st1_pkt_vld & ~mcycle_squash_d1;
2896
  //(|(st1_q_wr[4:0] & st1_l2bnk_dest[4:0])) & st1_pkt_vld & ~st_atom_rq_d1 ;
2897
assign st2_pcx_rq_vld =
2898
  (|(st2_q_wr[4:0] & st2_l2bnk_dest[4:0])) & st2_pkt_vld ;
2899
  //(|(st2_q_wr[4:0] & st2_l2bnk_dest[4:0])) & st2_pkt_vld & ~mcycle_squash_d1;
2900
  //(|(st2_q_wr[4:0] & st2_l2bnk_dest[4:0])) & st2_pkt_vld & ~st_atom_rq_d1 ;
2901
assign st3_pcx_rq_vld =
2902
  (|(st3_q_wr[4:0] & st3_l2bnk_dest[4:0])) & st3_pkt_vld ;
2903
  //(|(st3_q_wr[4:0] & st3_l2bnk_dest[4:0])) & st3_pkt_vld & ~mcycle_squash_d1;
2904
  //(|(st3_q_wr[4:0] & st3_l2bnk_dest[4:0])) & st3_pkt_vld & ~st_atom_rq_d1 ;
2905
 
2906
// IMISS
2907
// imiss requests will not speculate - ** change !!!
2908
//timing fix: 05/20/03 - move mycle_squash_d1 after pick instead of before pick
2909
assign imiss_pcx_rq_vld =
2910
  (|(queue_write[4:0] & imiss_l2bnk_dest[4:0])) & imiss_pkt_vld ;
2911
  //(|(queue_write[4:0] & imiss_l2bnk_dest[4:0])) & imiss_pkt_vld & ~mcycle_squash_d1;
2912
  //(|((queue_write[4:0] & (sel_qentry0[4:0] | (~sel_qentry0[4:0] & ~spc_pcx_req_update_w2[4:0]))) & imiss_l2bnk_dest[4:0])) & imiss_pkt_vld & ~mcycle_squash_d1;
2913
 
2914
// SPU
2915
//timing fix: 05/20/03 - move mycle_squash_d1 after pick instead of before pick
2916
assign strm_pcx_rq_vld =
2917
  (|(queue_write[4:0] & strm_l2bnk_dest[4:0])) & strm_pkt_vld ;
2918
  //(|(queue_write[4:0] & strm_l2bnk_dest[4:0])) & strm_pkt_vld & ~mcycle_squash_d1;
2919
 
2920
wire lsu_fwdpkt_vld_d1 ;
2921
wire    [4:0]    fwdpkt_dest_d1 ;
2922
// This delay is to compensate for the 1-cycle delay for internal rd/wr.
2923
dff_s #(6)  fvld_stgd1 (
2924
  .din ({lsu_fwdpkt_vld,lsu_fwdpkt_dest[4:0]}),
2925
  .q   ({lsu_fwdpkt_vld_d1,fwdpkt_dest_d1[4:0]}),
2926
  .clk (clk),
2927
  .se  (1'b0), .si (), .so ()
2928
  );
2929
 
2930
// FWD PKT
2931
//timing fix: 05/20/03 - move mycle_squash_d1 after pick instead of before pick
2932
assign fwdpkt_rq_vld =
2933
  (|(queue_write[4:0] & fwdpkt_dest_d1[4:0])) &
2934
        lsu_fwdpkt_vld_d1 &
2935
        ~(fwdpkt_pcx_rq_sel_d1 | fwdpkt_pcx_rq_sel_d2 |  // screen vld until reset can be sent.
2936
        fwdpkt_pcx_rq_sel_d3) ; // extra cycle since fwdpkt_vld is now flop delayed.
2937
        //~mcycle_squash_d1;
2938
 
2939
// This to reset state. It must thus take into account speculative requests.
2940
assign lsu_fwdpkt_pcx_rq_sel =  fwdpkt_pcx_rq_sel_d2 & ~pcx_req_squash_d1 ;
2941
 
2942
// INTERRUPT
2943
//timing fix: 05/20/03 - move mycle_squash_d1 after pick instead of before pick
2944
assign intrpt_pcx_rq_vld =
2945
  (|(queue_write[4:0] & intrpt_l2bnk_dest[4:0])) & intrpt_pkt_vld ;
2946
  //(|(queue_write[4:0] & intrpt_l2bnk_dest[4:0])) & intrpt_pkt_vld & ~mcycle_squash_d1;
2947
 
2948
// FFU
2949
// fpop will never get squashed.
2950
// ** Should be able to simplify equation.
2951
//timing fix: 05/20/03 - move mycle_squash_d1 after pick instead of before pick
2952
//for fpop pre_qwr is good enough to qual 'cos there are no ld/st atomics to IOB
2953
wire [4:0]  fpop_q_wr ;
2954
assign fpop_pcx_rq_vld =
2955
  //sel_qentry0[4] & fpop_l2bnk_dest[4] & fpop_pkt_vld ;
2956
  //(|(queue_write[4:0] & fpop_l2bnk_dest[4:0])) & 
2957
  //(|(pre_qwr[4:0] & fpop_l2bnk_dest[4:0])) &
2958
  (|(fpop_q_wr[4:0] & fpop_l2bnk_dest[4:0])) &
2959
        // change sel_qentry0[5] to sel_qentry0[4] for fpio merge
2960
      fpop_pkt_vld ;
2961
      //fpop_pkt_vld & ((sel_qentry0[4] & fpop_pkt1) | ~fpop_pkt1) ;
2962
        //~mcycle_squash_d1 ;
2963
 
2964
 
2965
//=================================================================================================
2966
// HIERARCHICAL PICKER FOR PCX REQ GENERATION
2967
//=================================================================================================
2968
 
2969
// 13 requests to choose from :
2970
// - imiss, 4 ld, 4 st, (intrpt,strm,fpop,fwdpkt).
2971
// - 4 categories are thus formed, each with equal weight.
2972
// - As a consequence, imiss has the highest priority (because it is one vs. 4 in others)
2973
// - Fair scheduling thru round-robin is ensured between and within categories.
2974
// - Starvation for 2-cycle b2b ops (cas/fpop) is prevented.
2975
// - strm requests, even though they lie in the misc category, will get good 
2976
// thruput as the other misc requests will be infrequent.
2977
 
2978
// LEVEL ONE - PICK WITHIN CATEGORIES
2979
 
2980
// Note : picker defaults to 1-hot.
2981
 
2982
wire    [3:0]    all_pcx_rq_pick ;
2983
wire    [3:0]    ld_events_raw ;
2984
//wire  [3:0]   ld_events_final ;
2985
wire    ld3_pcx_rq_pick,ld2_pcx_rq_pick,ld1_pcx_rq_pick,ld0_pcx_rq_pick ;
2986
 
2987
//bug6807 - kill load events raw when partial raw is detected.
2988
assign ld_events_raw[0]  =  (ld0_pkt_vld_unmasked & ~ld0_rawp_disabled) | ld0_pcx_rq_sel_d1 | ld0_pcx_rq_sel_d2 ;
2989
assign ld_events_raw[1]  =  (ld1_pkt_vld_unmasked & ~ld1_rawp_disabled) | ld1_pcx_rq_sel_d1 | ld1_pcx_rq_sel_d2 ;
2990
assign ld_events_raw[2]  =  (ld2_pkt_vld_unmasked & ~ld2_rawp_disabled) | ld2_pcx_rq_sel_d1 | ld2_pcx_rq_sel_d2 ;
2991
assign ld_events_raw[3]  =  (ld3_pkt_vld_unmasked & ~ld3_rawp_disabled) | ld3_pcx_rq_sel_d1 | ld3_pcx_rq_sel_d2 ;
2992
 
2993
//bug4814 - change rrobin_picker1 to rrobin_picker2
2994
// Choose one among 4 loads.
2995
//lsu_rrobin_picker1 ld4_rrobin  (
2996
//    .events             ({ld3_pcx_rq_vld,ld2_pcx_rq_vld,
2997
//                  ld1_pcx_rq_vld,ld0_pcx_rq_vld}),
2998
//    .events_raw   ({ld3_pkt_vld_unmasked,ld2_pkt_vld_unmasked,
2999
//                  ld1_pkt_vld_unmasked,ld0_pkt_vld_unmasked}),
3000
//    .pick_one_hot ({ld3_pcx_rq_pick,ld2_pcx_rq_pick,
3001
//                  ld1_pcx_rq_pick,ld0_pcx_rq_pick}),
3002
//    .events_final (ld_events_final[3:0]),
3003
//    .rclk         (rclk),
3004
//    .grst_l       (grst_l),
3005
//    .arst_l       (arst_l),
3006
//    .si(),
3007
//    .se(se),
3008
//    .so()
3009
//  );
3010
 
3011
lsu_rrobin_picker2 ld4_rrobin  (
3012
    .events       ({ld3_pcx_rq_vld,ld2_pcx_rq_vld,ld1_pcx_rq_vld,ld0_pcx_rq_vld}),
3013
    .thread_force (ld_thrd_force_vld[3:0]),
3014
    .pick_one_hot ({ld3_pcx_rq_pick,ld2_pcx_rq_pick,ld1_pcx_rq_pick,ld0_pcx_rq_pick}),
3015
    .events_picked({ld3_pcx_rq_sel,ld2_pcx_rq_sel,ld1_pcx_rq_sel,ld0_pcx_rq_sel}),
3016
    .rclk         (rclk),
3017
    .grst_l       (grst_l),
3018
    .arst_l       (arst_l),
3019
    .si(),
3020
    .se(se),
3021
    .so()
3022
  );
3023
 
3024
 
3025
 
3026
 
3027
//timing fix: 05/20/03 - move mcycle_squash_d1 after pick instead of before pick
3028
//assign        ld3_pcx_rq_sel = ld3_pcx_rq_pick & ld3_pcx_rq_vld & all_pcx_rq_pick[1] ;
3029
//assign        ld2_pcx_rq_sel = ld2_pcx_rq_pick & ld2_pcx_rq_vld & all_pcx_rq_pick[1] ;
3030
//assign        ld1_pcx_rq_sel = ld1_pcx_rq_pick & ld1_pcx_rq_vld & all_pcx_rq_pick[1] ;
3031
//assign        ld0_pcx_rq_sel = ld0_pcx_rq_pick & ld0_pcx_rq_vld & all_pcx_rq_pick[1] ;
3032
//bug2705 - add spec valid qualification
3033
//assign        ld3_pcx_rq_sel = ld3_pcx_rq_pick & ld3_pcx_rq_vld & all_pcx_rq_pick[1] & ~mcycle_squash_d1 ;
3034
//timing fix: 08/06/03 - tag_rdata->gen tag_parity_err->lsu_ld_miss_g arrives @625 in qctl1
3035
//                       cache_way_hit ->lsu_ld_miss_g arrives @525 in qctl1
3036
//                       cache_way_hit ->lsu_way_hit_or arrives @510 in qctl1
3037
//                       625ps + ld?_l2cache_rq_g (130ps) + urq_stgpq flop logic(100ps) (slack=-100ps)
3038
//assign  ld0_spec_pick_vld_g  =   ld0_spec_vld_g & ld0_l2cache_rq_g & ld0_pcx_rq_pick & ld0_pcx_rq_vld & all_pcx_rq_pick[1] & ~mcycle_squash_d1 ;
3039
wire    ld0_nspec_pick_vld ,
3040
        ld1_nspec_pick_vld ,
3041
        ld2_nspec_pick_vld ,
3042
        ld3_nspec_pick_vld ;
3043
 
3044
assign  ld0_spec_pick_vld_g  =   ld0_spec_vld_g & ~lsu_way_hit_or & ld0_pcx_rq_pick & ld0_pcx_rq_vld & all_pcx_rq_pick[1] & ~mcycle_squash_d1 ;
3045
assign  ld0_nspec_pick_vld   =  ~ld0_spec_vld_g &                   ld0_pcx_rq_pick & ld0_pcx_rq_vld & all_pcx_rq_pick[1] & ~mcycle_squash_d1 ;
3046
 
3047
assign  ld1_spec_pick_vld_g  =   ld1_spec_vld_g & ~lsu_way_hit_or & ld1_pcx_rq_pick & ld1_pcx_rq_vld & all_pcx_rq_pick[1] & ~mcycle_squash_d1 ;
3048
assign  ld1_nspec_pick_vld   =  ~ld1_spec_vld_g &                   ld1_pcx_rq_pick & ld1_pcx_rq_vld & all_pcx_rq_pick[1] & ~mcycle_squash_d1 ;
3049
 
3050
assign  ld2_spec_pick_vld_g  =   ld2_spec_vld_g & ~lsu_way_hit_or & ld2_pcx_rq_pick & ld2_pcx_rq_vld & all_pcx_rq_pick[1] & ~mcycle_squash_d1 ;
3051
assign  ld2_nspec_pick_vld   =  ~ld2_spec_vld_g &                   ld2_pcx_rq_pick & ld2_pcx_rq_vld & all_pcx_rq_pick[1] & ~mcycle_squash_d1 ;
3052
 
3053
assign  ld3_spec_pick_vld_g  =   ld3_spec_vld_g & ~lsu_way_hit_or & ld3_pcx_rq_pick & ld3_pcx_rq_vld & all_pcx_rq_pick[1] & ~mcycle_squash_d1 ;
3054
assign  ld3_nspec_pick_vld   =  ~ld3_spec_vld_g &                   ld3_pcx_rq_pick & ld3_pcx_rq_vld & all_pcx_rq_pick[1] & ~mcycle_squash_d1 ;
3055
 
3056
 
3057
assign  ld0_pcx_rq_sel = (ld0_spec_pick_vld_g | ld0_nspec_pick_vld) ;
3058
assign  ld1_pcx_rq_sel = (ld1_spec_pick_vld_g | ld1_nspec_pick_vld) ;
3059
assign  ld2_pcx_rq_sel = (ld2_spec_pick_vld_g | ld2_nspec_pick_vld) ;
3060
assign  ld3_pcx_rq_sel = (ld3_spec_pick_vld_g | ld3_nspec_pick_vld) ;
3061
 
3062
//bug3506: set mask in the level1 pick in w3-cycle if picked by pcx
3063
//assign  ld_events_final[3] = ld3_pcx_rq_sel_d2 & ~pcx_req_squash_d1 ;
3064
//assign  ld_events_final[2] = ld2_pcx_rq_sel_d2 & ~pcx_req_squash_d1 ;
3065
//assign  ld_events_final[1] = ld1_pcx_rq_sel_d2 & ~pcx_req_squash_d1 ;
3066
//assign  ld_events_final[0] = ld0_pcx_rq_sel_d2 & ~pcx_req_squash_d1 ;
3067
 
3068
 
3069
 
3070
wire    st3_pcx_rq_pick,st2_pcx_rq_pick,st1_pcx_rq_pick,st0_pcx_rq_pick ;
3071
 
3072
// Choose one among 4 st.
3073
 
3074
wire   pcx_rq_for_stb_en;
3075
//wire [3:0]  st_events_final ;
3076
wire [3:0]  st_events_raw ;
3077
 
3078
//8/20/03: bug3506 fix is incomplete - vld may not be held until d2 cycle
3079
assign st_events_raw[0]  =  stb0_rd_for_pcx | st0_pcx_rq_sel_d1 | st0_pcx_rq_sel_d2 ;
3080
assign st_events_raw[1]  =  stb1_rd_for_pcx | st1_pcx_rq_sel_d1 | st1_pcx_rq_sel_d2 ;
3081
assign st_events_raw[2]  =  stb2_rd_for_pcx | st2_pcx_rq_sel_d1 | st2_pcx_rq_sel_d2 ;
3082
assign st_events_raw[3]  =  stb3_rd_for_pcx | st3_pcx_rq_sel_d1 | st3_pcx_rq_sel_d2 ;
3083
 
3084
//bug4814 - change rrobin_picker1 to rrobin_picker2
3085
//lsu_rrobin_picker1 st4_rrobin  (
3086
//    .events             ({st3_pcx_rq_vld,st2_pcx_rq_vld,
3087
//                              st1_pcx_rq_vld,st0_pcx_rq_vld}),
3088
//    .events_raw         (st_events_raw[3:0]),
3089
//    .pick_one_hot ({st3_pcx_rq_pick,st2_pcx_rq_pick,
3090
//                              st1_pcx_rq_pick,st0_pcx_rq_pick}),
3091
//    //.en           (pcx_rq_for_stb_en),                                                                
3092
//    .events_final (st_events_final[3:0]),
3093
//    .rclk         (rclk),
3094
//    .grst_l       (grst_l),
3095
//    .arst_l       (arst_l),
3096
//    .si(),
3097
//    .se(se),
3098
//    .so()
3099
//
3100
//  );
3101
 
3102
lsu_rrobin_picker2 st4_rrobin  (
3103
    .events       ({st3_pcx_rq_vld,st2_pcx_rq_vld,st1_pcx_rq_vld,st0_pcx_rq_vld}),
3104
    .thread_force(st_thrd_force_vld[3:0]),
3105
    .pick_one_hot ({st3_pcx_rq_pick,st2_pcx_rq_pick,st1_pcx_rq_pick,st0_pcx_rq_pick}),
3106
 
3107
    .events_picked(pcx_rq_for_stb[3:0]),
3108
    .rclk         (rclk),
3109
    .grst_l       (grst_l),
3110
    .arst_l       (arst_l),
3111
    .si(),
3112
    .se(se),
3113
    .so()
3114
  );
3115
 
3116
 
3117
 
3118
assign lsu_st_pcx_rq_pick[3:0]  =  {st3_pcx_rq_pick,st2_pcx_rq_pick,st1_pcx_rq_pick,st0_pcx_rq_pick};
3119
//timing fix: 9/2/03 - reduce fanout in stb_rwctl for lsu_st_pcx_rq_pick - gen separate signal for
3120
//                     stb_cam_rptr_vld and stb_data_rptr_vld
3121
assign lsu_st_pcx_rq_vld  =  st0_pcx_rq_vld | st1_pcx_rq_vld | st2_pcx_rq_vld | st3_pcx_rq_vld ;
3122
 
3123
//wire        st0_pcx_rq_sel_tmp, st1_pcx_rq_sel_tmp;
3124
//wire        st2_pcx_rq_sel_tmp, st3_pcx_rq_sel_tmp;
3125
 
3126
 
3127
   wire stb_cam_hit_w;
3128
 
3129
//bug3503
3130
assign stb_cam_hit_w  =  stb_cam_hit_bf & lsu_inst_vld_w ;
3131
 
3132
dff_s #(1)  stb_cam_hit_stg_w2  (
3133
  .din (stb_cam_hit_w),
3134
  .q   (stb_cam_hit_w2),
3135
  .clk (clk),
3136
  .se  (1'b0), .si (), .so ()
3137
  );
3138
 
3139
 
3140
//RAW read STB at W3 (not W2), so stb_cam_hit_w2 isn't critical   
3141
//assign pcx_rq_for_stb_en = ~(|lsu_st_ack_rq_stb[3:0]) &   ~stb_cam_hit_w2 & ~stb_cam_wptr_vld;
3142
//timing fix: 05/20/03 - move mycle_squash_d1 after pick instead of before pick
3143
assign pcx_rq_for_stb_en = ~stb_cam_hit_w2 & ~stb_cam_wr_no_ivld_m & ~mcycle_squash_d1 ;
3144
 
3145
//timing fix : 5/6 - move kill_w2 after store pick
3146
//assign        pcx_rq_for_stb[3] = st3_pcx_rq_pick & st3_pcx_rq_vld & all_pcx_rq_pick[2] & pcx_rq_for_stb_en;
3147
//assign        pcx_rq_for_stb[2] = st2_pcx_rq_pick & st2_pcx_rq_vld & all_pcx_rq_pick[2] & pcx_rq_for_stb_en;
3148
//assign        pcx_rq_for_stb[1] = st1_pcx_rq_pick & st1_pcx_rq_vld & all_pcx_rq_pick[2] & pcx_rq_for_stb_en;
3149
//assign        pcx_rq_for_stb[0] = st0_pcx_rq_pick & st0_pcx_rq_vld & all_pcx_rq_pick[2] & pcx_rq_for_stb_en;
3150
 
3151
//timing fix: 05/20/03 - move mcycle_squash_d1 after pick instead of before pick
3152
//bug4513 - kill pcx_rq_for_stb if atomic request is picked and 2 entries to the l2bank are not available
3153
 
3154
wire  [3:0]  pcx_rq_for_stb_tmp ;
3155
wire   st0_qmon_2entry_avail,st1_qmon_2entry_avail,st2_qmon_2entry_avail,st3_qmon_2entry_avail ;
3156
 
3157
assign  pcx_rq_for_stb_tmp[3] =
3158
        st3_pcx_rq_pick & st3_pcx_rq_vld & all_pcx_rq_pick[2] & pcx_rq_for_stb_en & ~lsu_st_pcx_rq_kill_w2[3] & ~mcycle_squash_d1 ;
3159
        //st3_pcx_rq_pick & st3_pcx_rq_vld & all_pcx_rq_pick[2] & pcx_rq_for_stb_en & ~lsu_st_pcx_rq_kill_w2[3];
3160
 
3161
assign  pcx_rq_for_stb_tmp[2] =
3162
        st2_pcx_rq_pick & st2_pcx_rq_vld & all_pcx_rq_pick[2] & pcx_rq_for_stb_en & ~lsu_st_pcx_rq_kill_w2[2] & ~mcycle_squash_d1 ;
3163
        //st2_pcx_rq_pick & st2_pcx_rq_vld & all_pcx_rq_pick[2] & pcx_rq_for_stb_en & ~lsu_st_pcx_rq_kill_w2[2];
3164
 
3165
assign  pcx_rq_for_stb_tmp[1] =
3166
        st1_pcx_rq_pick & st1_pcx_rq_vld & all_pcx_rq_pick[2] & pcx_rq_for_stb_en & ~lsu_st_pcx_rq_kill_w2[1] & ~mcycle_squash_d1 ;
3167
        //st1_pcx_rq_pick & st1_pcx_rq_vld & all_pcx_rq_pick[2] & pcx_rq_for_stb_en & ~lsu_st_pcx_rq_kill_w2[1];
3168
 
3169
assign  pcx_rq_for_stb_tmp[0] =
3170
        st0_pcx_rq_pick & st0_pcx_rq_vld & all_pcx_rq_pick[2] & pcx_rq_for_stb_en & ~lsu_st_pcx_rq_kill_w2[0] & ~mcycle_squash_d1 ;
3171
        //st0_pcx_rq_pick & st0_pcx_rq_vld & all_pcx_rq_pick[2] & pcx_rq_for_stb_en & ~lsu_st_pcx_rq_kill_w2[0];
3172
 
3173
//bug4513 - kill pcx_rq_for_stb if atomic request is picked and 2 entries to the l2bank are not available
3174
assign  pcx_rq_for_stb[3] = ((st3_atomic_vld & st3_qmon_2entry_avail) | ~st3_atomic_vld) & pcx_rq_for_stb_tmp[3] ;
3175
assign  pcx_rq_for_stb[2] = ((st2_atomic_vld & st2_qmon_2entry_avail) | ~st2_atomic_vld) & pcx_rq_for_stb_tmp[2] ;
3176
assign  pcx_rq_for_stb[1] = ((st1_atomic_vld & st1_qmon_2entry_avail) | ~st1_atomic_vld) & pcx_rq_for_stb_tmp[1] ;
3177
assign  pcx_rq_for_stb[0] = ((st0_atomic_vld & st0_qmon_2entry_avail) | ~st0_atomic_vld) & pcx_rq_for_stb_tmp[0] ;
3178
 
3179
//assign        st3_pcx_rq_sel_tmp = st3_pcx_rq_pick & st3_pcx_rq_vld & all_pcx_rq_pick[2] ;
3180
//assign        st2_pcx_rq_sel_tmp = st2_pcx_rq_pick & st2_pcx_rq_vld & all_pcx_rq_pick[2] ;
3181
//assign        st1_pcx_rq_sel_tmp = st1_pcx_rq_pick & st1_pcx_rq_vld & all_pcx_rq_pick[2] ;
3182
//assign        st0_pcx_rq_sel_tmp = st0_pcx_rq_pick & st0_pcx_rq_vld & all_pcx_rq_pick[2] ;
3183
 
3184
//bug3506: set mask in the level1 pick in w3-cycle if picked by pcx
3185
//assign  st_events_final[3] = st3_pcx_rq_sel_d2 & ~pcx_req_squash_d1 ;
3186
//assign  st_events_final[2] = st2_pcx_rq_sel_d2 & ~pcx_req_squash_d1 ;
3187
//assign  st_events_final[1] = st1_pcx_rq_sel_d2 & ~pcx_req_squash_d1 ;
3188
//assign  st_events_final[0] = st0_pcx_rq_sel_d2 & ~pcx_req_squash_d1 ;
3189
 
3190
 
3191
 
3192
wire    strm_pcx_rq_pick,fpop_pcx_rq_pick,intrpt_pcx_rq_pick,fwdpkt_pcx_rq_pick;
3193
//wire [3:0]  misc_events_final ;
3194
wire [3:0]  misc_events_raw ;
3195
 
3196
//8/20/03: bug3506 fix is incomplete - vld may not be held until d2 cycle
3197
assign  misc_events_raw[0]   =  lsu_fwdpkt_vld_d1 | fwdpkt_pcx_rq_sel_d1 | fwdpkt_pcx_rq_sel_d2 ;
3198
//bug6807 - kill interrupt events raw when store buffer is not empty i.e. interrupt clear=0
3199
assign  misc_events_raw[1]   =  (intrpt_pkt_vld_unmasked & intrpt_clr_d1) | intrpt_pcx_rq_sel_d1 | intrpt_pcx_rq_sel_d2 ;
3200
assign  misc_events_raw[2]   =  fpop_pkt_vld_unmasked | fpop_pcx_rq_sel_d1 | fpop_pcx_rq_sel_d2 ;
3201
assign  misc_events_raw[3]   =  strm_pkt_vld_unmasked | strm_pcx_rq_sel_d1 | strm_pcx_rq_sel_d2 ;
3202
 
3203
 
3204
//bug4814 - change rrobin_picker1 to rrobin_picker2
3205
//lsu_rrobin_picker1 misc4_rrobin  (
3206
//    .events             ({strm_pcx_rq_vld,fpop_pcx_rq_vld,
3207
//                  intrpt_pcx_rq_vld,fwdpkt_rq_vld}),
3208
//    .events_raw   (misc_events_raw[3:0]),
3209
//    .pick_one_hot ({strm_pcx_rq_pick,fpop_pcx_rq_pick,
3210
//                  intrpt_pcx_rq_pick,fwdpkt_pcx_rq_pick}),
3211
//    .events_final (misc_events_final[3:0]),
3212
//    .rclk         (rclk),
3213
//    .grst_l       (grst_l),
3214
//    .arst_l       (arst_l),
3215
//    .si(),
3216
//    .se(se),
3217
//    .so()
3218
//  );
3219
 
3220
lsu_rrobin_picker2 misc4_rrobin  (
3221
    .events       ({strm_pcx_rq_vld,fpop_pcx_rq_vld,intrpt_pcx_rq_vld,fwdpkt_rq_vld}),
3222
    .thread_force(misc_thrd_force_vld[3:0]),
3223
    .pick_one_hot ({strm_pcx_rq_pick,fpop_pcx_rq_pick,intrpt_pcx_rq_pick,fwdpkt_pcx_rq_pick}),
3224
 
3225
    .events_picked({strm_pcx_rq_sel,fpop_pcx_rq_sel,intrpt_pcx_rq_sel,fwdpkt_pcx_rq_sel}),
3226
    .rclk         (rclk),
3227
    .grst_l       (grst_l),
3228
    .arst_l       (arst_l),
3229
    .si(),
3230
    .se(se),
3231
    .so()
3232
  );
3233
 
3234
 
3235
//timing fix: 05/20/03 - move mcycle_squash_d1 after pick instead of before pick
3236
//assign        strm_pcx_rq_sel = strm_pcx_rq_pick & strm_pcx_rq_vld & all_pcx_rq_pick[3] ;
3237
//assign        fpop_pcx_rq_sel = fpop_pcx_rq_pick & fpop_pcx_rq_vld & all_pcx_rq_pick[3] ;
3238
//assign        intrpt_pcx_rq_sel = intrpt_pcx_rq_pick & intrpt_pcx_rq_vld & all_pcx_rq_pick[3] ;
3239
//assign        fwdpkt_pcx_rq_sel = fwdpkt_pcx_rq_pick & fwdpkt_rq_vld & all_pcx_rq_pick[3] ;
3240
assign  strm_pcx_rq_sel = strm_pcx_rq_pick & strm_pcx_rq_vld & all_pcx_rq_pick[3] & ~mcycle_squash_d1 ;
3241
 
3242
//11/15/03 - change fpop atomic to be same as store atomic (bug4513)
3243
//assign        fpop_pcx_rq_sel = fpop_pcx_rq_pick & fpop_pcx_rq_vld & all_pcx_rq_pick[3] & ~mcycle_squash_d1 ;
3244
wire    fpop_qmon_2entry_avail ;
3245
assign  fpop_pcx_rq_sel_tmp = fpop_pcx_rq_pick & fpop_pcx_rq_vld & all_pcx_rq_pick[3] & ~mcycle_squash_d1 ;
3246
assign  fpop_pcx_rq_sel = fpop_pcx_rq_sel_tmp & fpop_qmon_2entry_avail ;
3247
 
3248
assign  intrpt_pcx_rq_sel = intrpt_pcx_rq_pick & intrpt_pcx_rq_vld & all_pcx_rq_pick[3] & ~mcycle_squash_d1 ;
3249
assign  fwdpkt_pcx_rq_sel = fwdpkt_pcx_rq_pick & fwdpkt_rq_vld & all_pcx_rq_pick[3] & ~mcycle_squash_d1 ;
3250
 
3251
 
3252
//bug3506: set mask in the level1 pick in w3-cycle if picked by pcx
3253
//assign  misc_events_final[3] = lsu_spu_ldst_ack ;
3254
//assign  misc_events_final[2] = lsu_tlu_pcxpkt_ack ;
3255
//assign  misc_events_final[1] = lsu_fwdpkt_pcx_rq_sel ;
3256
//assign  misc_events_final[0] = fpop_pcx_rq_sel_d2 & ~pcx_req_squash_d1 ;
3257
 
3258
 
3259
 
3260
 
3261
// LEVEL TWO - PICK AMONG CATEGORIES
3262
// In parallel with level one
3263
 
3264
wire    ld_pcx_rq_all, st_pcx_rq_all, misc_pcx_rq_all ;
3265
assign  ld_pcx_rq_all = ld3_pcx_rq_vld | ld2_pcx_rq_vld | ld1_pcx_rq_vld | ld0_pcx_rq_vld ;
3266
assign  st_pcx_rq_all = st3_pcx_rq_vld | st2_pcx_rq_vld | st1_pcx_rq_vld | st0_pcx_rq_vld ;
3267
assign  misc_pcx_rq_all = strm_pcx_rq_vld | fpop_pcx_rq_vld | intrpt_pcx_rq_vld | fwdpkt_rq_vld ;
3268
 
3269
//bug3506- raw valid used in resetting pick status
3270
//8/20/03: bug3506 fix is incomplete - vld may not be held until d2 cycle
3271
 
3272
//wire all4_rrobin_en;
3273
//timing fix: 5/20/03 - pcx_rq_for_stb will be independent of ifu_lsu_pcxreq_d
3274
//assign all4_rrobin_en = ~(all_pcx_rq_pick[2] & ~pcx_rq_for_stb_en) ;
3275
//timing fix: 05/20/03 - move mycle_squash_d1 after pick instead of before pick
3276
//assign all4_rrobin_en = ~((all_pcx_rq_pick[2] & ~pcx_rq_for_stb_en) | imiss_pcx_rq_vld );
3277
//bug3348 - setting history moved from w-stage to w3-stage(1-cycle after spc_pcx_req_pq)
3278
//          and hence there are no cases to disable logging of history
3279
//assign all4_rrobin_en = ~((all_pcx_rq_pick[2] & ~pcx_rq_for_stb_en) | imiss_pcx_rq_vld | mcycle_squash_d1);
3280
//wire   spc_pcx_req_vld_pq1 ;
3281
//assign all4_rrobin_en =  spc_pcx_req_vld_pq1 ;
3282
 
3283
//wire  [3:1]  all_pcx_rq_pick_no_iqual;
3284
wire  [3:0]  all_pcx_rq_pick_no_iqual;
3285
//wire  [3:0]  all_pcx_pick_status_d2;  // bug 3348
3286
//wire  [3:0]  all_pick_status_rst_d2;    //bug 3506
3287
wire  [3:0]  all_pick_status_set;
3288
 
3289
//bug3506: set pick status in the same cycle
3290
assign  all_pick_status_set[3]  =  |{ strm_pcx_rq_sel, intrpt_pcx_rq_sel,fpop_pcx_rq_sel, fwdpkt_pcx_rq_sel} ;
3291
assign  all_pick_status_set[2]  =  |pcx_rq_for_stb[3:0] ;
3292
assign  all_pick_status_set[1]  =  |{ld0_pcx_rq_sel,ld1_pcx_rq_sel,ld2_pcx_rq_sel,ld3_pcx_rq_sel} ;
3293
assign  all_pick_status_set[0]  =  1'b0 ;
3294
 
3295
 
3296
 
3297
lsu_rrobin_picker2 all4_rrobin  (
3298
    .events       ({misc_pcx_rq_all,st_pcx_rq_all,ld_pcx_rq_all,1'b0}),
3299
    .thread_force(all_thrd_force_vld[3:0]),
3300
    .pick_one_hot (all_pcx_rq_pick_no_iqual[3:0]),
3301
 
3302
    .events_picked(all_pick_status_set[3:0]),
3303
    //.en           (all4_rrobin_en),      // bug 3348
3304
    .rclk         (rclk),
3305
    .grst_l       (grst_l),
3306
    .arst_l       (arst_l),
3307
    .si(),
3308
    .se(se),
3309
    .so()
3310
  );
3311
 
3312
 
3313
// 5/22/03: cmp1_regr fail - qual all pick w/  ~mcycle_squash_d1; not doing this causes multi-hot select to
3314
//          pcx_pkt mux
3315
assign all_pcx_rq_pick[0]    =  imiss_pcx_rq_vld & ~mcycle_squash_d1;
3316
assign all_pcx_rq_pick[3:1]  =  all_pcx_rq_pick_no_iqual[3:1] & ~{3{imiss_pcx_rq_vld | mcycle_squash_d1}};
3317
 
3318
wire   all_pcx_rq_dest_sel3 ;
3319
assign all_pcx_rq_dest_sel3  =  ~|all_pcx_rq_pick[2:0];
3320
 
3321
//timing fix: 5/20/03 - pcx_rq_for_stb will be independent of ifu_lsu_pcxreq_d
3322
//assign        imiss_pcx_rq_sel = imiss_pcx_rq_vld & all_pcx_rq_pick[0] ;
3323
//timing fix: 05/20/03 - move mcycle_squash_d1 after pick instead of before pick
3324
//assign        imiss_pcx_rq_sel = imiss_pcx_rq_vld;
3325
assign  imiss_pcx_rq_sel = imiss_pcx_rq_vld & ~mcycle_squash_d1 ;
3326
 
3327
//=================================================================================================
3328
 
3329
// Select appr. load. Need a scheme which allows threads to
3330
// make fwd progress.
3331
/*assign  ld0_pcx_rq_sel = ld0_pcx_rq_vld ;
3332
assign  ld1_pcx_rq_sel = ld1_pcx_rq_vld & ~ld0_pcx_rq_vld ;
3333
assign  ld2_pcx_rq_sel = ld2_pcx_rq_vld & ~(ld0_pcx_rq_vld | ld1_pcx_rq_vld);
3334
assign  ld3_pcx_rq_sel = ld3_pcx_rq_vld & ~(ld0_pcx_rq_vld | ld1_pcx_rq_vld | ld2_pcx_rq_vld)   ; */
3335
 
3336
dff_s #(4)  lrsel_stgd1 (
3337
        .din    ({ld0_pcx_rq_sel, ld1_pcx_rq_sel, ld2_pcx_rq_sel, ld3_pcx_rq_sel}),
3338
        .q      ({ld0_pcx_rq_sel_d1, ld1_pcx_rq_sel_d1, ld2_pcx_rq_sel_d1, ld3_pcx_rq_sel_d1}),
3339
        .clk  (clk),
3340
        .se     (1'b0),       .si (),          .so ()
3341
        );
3342
 
3343
//bug2705- kill pcx pick if spec vld kill is set
3344
assign  lsu_ld0_pcx_rq_sel_d1  =  ld0_pcx_rq_sel_d1 & ~lsu_ld0_spec_vld_kill_w2 ;
3345
assign  lsu_ld1_pcx_rq_sel_d1  =  ld1_pcx_rq_sel_d1 & ~lsu_ld1_spec_vld_kill_w2 ;
3346
assign  lsu_ld2_pcx_rq_sel_d1  =  ld2_pcx_rq_sel_d1 & ~lsu_ld2_spec_vld_kill_w2 ;
3347
assign  lsu_ld3_pcx_rq_sel_d1  =  ld3_pcx_rq_sel_d1 & ~lsu_ld3_spec_vld_kill_w2 ;
3348
 
3349
 
3350
dff_s #(4)  lrsel_stgd2 (
3351
        .din    ({lsu_ld0_pcx_rq_sel_d1, lsu_ld1_pcx_rq_sel_d1, lsu_ld2_pcx_rq_sel_d1, lsu_ld3_pcx_rq_sel_d1}),
3352
        .q      ({ld0_pcx_rq_sel_d2, ld1_pcx_rq_sel_d2, ld2_pcx_rq_sel_d2, ld3_pcx_rq_sel_d2}),
3353
        .clk  (clk),
3354
        .se     (1'b0),       .si (),          .so ()
3355
        );
3356
 
3357
// Used to complete prefetch. Be careful ! ld could be squashed. Add pcx_req_squash.
3358
assign  lsu_ld_pcx_rq_sel_d2[3] = ld3_pcx_rq_sel_d2 ;
3359
assign  lsu_ld_pcx_rq_sel_d2[2] = ld2_pcx_rq_sel_d2 ;
3360
assign  lsu_ld_pcx_rq_sel_d2[1] = ld1_pcx_rq_sel_d2 ;
3361
assign  lsu_ld_pcx_rq_sel_d2[0] = ld0_pcx_rq_sel_d2 ;
3362
 
3363
//bug2705- kill pcx pick if spec vld kill is set
3364
wire    ld_pcxpkt_vld ;
3365
assign  ld_pcxpkt_vld =
3366
  lsu_ld0_pcx_rq_sel_d1 | lsu_ld1_pcx_rq_sel_d1 | lsu_ld2_pcx_rq_sel_d1 | lsu_ld3_pcx_rq_sel_d1 ;
3367
  //ld0_pcx_rq_sel_d1 | ld1_pcx_rq_sel_d1 | ld2_pcx_rq_sel_d1 | ld3_pcx_rq_sel_d1 ;
3368
 
3369
dff_s #(1)  icindx_stgd1 (
3370
        .din    (ld_pcxpkt_vld),
3371
        .q      (lsu_ifu_ld_pcxpkt_vld),
3372
        .clk    (clk),
3373
        .se     (1'b0),       .si (),          .so ()
3374
        );
3375
 
3376
wire  [3:0]           ld_pcx_rq_sel ;
3377
 
3378
assign  ld_pcx_rq_sel[0] =  ld0_pcx_rq_sel_d1 | st0_atom_rq_d2 ;
3379
assign  ld_pcx_rq_sel[1] =  ld1_pcx_rq_sel_d1 | st1_atom_rq_d2 ;
3380
assign  ld_pcx_rq_sel[2] =  ld2_pcx_rq_sel_d1 | st2_atom_rq_d2 ;
3381
assign  ld_pcx_rq_sel[3] =  ld3_pcx_rq_sel_d1 | st3_atom_rq_d2 ;
3382
 
3383
//11/7/03: add rst_tri_en
3384
assign  lsu_ld_pcx_rq_mxsel[2:0]  =    ld_pcx_rq_sel[2:0] & {3{~rst_tri_en}} ;
3385
assign  lsu_ld_pcx_rq_mxsel[3]    =  (~|ld_pcx_rq_sel[2:0]) | rst_tri_en ;
3386
 
3387
assign ld_pcx_thrd[0] = ld_pcx_rq_sel[1] | ld_pcx_rq_sel[3] ;
3388
assign ld_pcx_thrd[1] = ld_pcx_rq_sel[2] | ld_pcx_rq_sel[3] ;
3389
 
3390
// Assume a simple priority based scheme for now.
3391
// This should not be prioritized at this point. 
3392
//assign st_pcx_rq_mhot_sel[0] = st0_pcx_rq_sel_tmp ;
3393
//assign st_pcx_rq_mhot_sel[1] = st1_pcx_rq_sel_tmp ;
3394
//assign st_pcx_rq_mhot_sel[2] = st2_pcx_rq_sel_tmp ;
3395
//assign st_pcx_rq_mhot_sel[3] = st3_pcx_rq_sel_tmp ;
3396
 
3397
/*assign st_pcx_rq_mhot_sel[0] =
3398
  ~ld_pcx_rq_vld  & st0_pcx_rq_vld ;
3399
assign st_pcx_rq_mhot_sel[1] =
3400
  ~ld_pcx_rq_vld  & st1_pcx_rq_vld ;
3401
assign st_pcx_rq_mhot_sel[2] =
3402
  ~ld_pcx_rq_vld  & st2_pcx_rq_vld ;
3403
assign st_pcx_rq_mhot_sel[3] =
3404
  ~ld_pcx_rq_vld  & st3_pcx_rq_vld ;*/
3405
 
3406
 
3407
assign  st0_pcx_rq_sel = pcx_rq_for_stb[0] ;
3408
assign  st1_pcx_rq_sel = pcx_rq_for_stb[1] ;
3409
assign  st2_pcx_rq_sel = pcx_rq_for_stb[2] ;
3410
assign  st3_pcx_rq_sel = pcx_rq_for_stb[3] ;
3411
 
3412
//assign  st_pcx_rq_vld =  (|pcx_rq_for_stb[3:0]);
3413
 
3414
// Temporary.
3415
//assign  st0_pcx_rq_sel = stb_rd_for_pcx_sel[0] ;
3416
//assign  st1_pcx_rq_sel = stb_rd_for_pcx_sel[1] ;
3417
//assign  st2_pcx_rq_sel = stb_rd_for_pcx_sel[2] ;
3418
//assign  st3_pcx_rq_sel = stb_rd_for_pcx_sel[3] ;
3419
 
3420
// This will be on a critical path. Massage !!!
3421
// Allows for speculative requests.
3422
//assign  st_pcx_rq_vld = 
3423
//    (st0_pcx_rq_sel & stb_rd_for_pcx_sel[0]) | 
3424
//    (st1_pcx_rq_sel & stb_rd_for_pcx_sel[1]) | 
3425
//    (st2_pcx_rq_sel & stb_rd_for_pcx_sel[2]) | 
3426
//    (st3_pcx_rq_sel & stb_rd_for_pcx_sel[3])  ;
3427
 
3428
 
3429
 
3430
/*assign imiss_pcx_rq_sel =
3431
  imiss_pcx_rq_vld & ~(ld_pcx_rq_vld | st_pcx_rq_vld) ;
3432
assign strm_pcx_rq_sel =
3433
  strm_pcx_rq_vld & ~(ld_pcx_rq_vld | st_pcx_rq_vld | imiss_pcx_rq_sel) ;
3434
assign fpop_pcx_rq_sel =
3435
  fpop_pcx_rq_vld & ~(ld_pcx_rq_vld | st_pcx_rq_vld | imiss_pcx_rq_vld | strm_pcx_rq_vld) ;
3436
assign intrpt_pcx_rq_sel =
3437
  intrpt_pcx_rq_vld & ~(ld_pcx_rq_vld | st_pcx_rq_vld | imiss_pcx_rq_vld | strm_pcx_rq_vld | fpop_pcx_rq_sel) ;
3438
assign fwdpkt_pcx_rq_sel =
3439
  fwdpkt_rq_vld & ~(ld_pcx_rq_vld | st_pcx_rq_vld | imiss_pcx_rq_vld | strm_pcx_rq_vld | intrpt_pcx_rq_vld
3440
                        | fpop_pcx_rq_sel) ; */
3441
 
3442
 
3443
//assign imiss_strm_pcx_rq_sel = imiss_pcx_rq_sel | strm_pcx_rq_sel ;
3444
 
3445
// request was made with the queues full but not grant. 
3446
assign  pcx_req_squash =
3447
  (|(spc_pcx_req_pq_buf2[4:0] & ~pre_qwr[4:0] & ~pcx_spc_grant_px[4:0])) ;
3448
//(|(spc_pcx_req_pq[4:0] & ~queue_write[4:0] & ~pcx_spc_grant_px[4:0])) ;
3449
//  (|lsu_error_rst[3:0]) | // dtag parity error requires two ld pkts
3450
//  (st_atom_rq_d1) ; // cas,stq - 2 pkt requests
3451
 
3452
//bug:2877 - dtag parity error 2nd packet request;
3453
//wire  error_rst ;
3454
 
3455
//assign        error_rst =
3456
//      (ld0_pcx_rq_sel_d1 & lsu_dtag_perror_w2[0]) |
3457
//      (ld1_pcx_rq_sel_d1 & lsu_dtag_perror_w2[1]) |
3458
//      (ld2_pcx_rq_sel_d1 & lsu_dtag_perror_w2[2]) |
3459
//      (ld3_pcx_rq_sel_d1 & lsu_dtag_perror_w2[3]) ;
3460
 
3461
//wire  error_rst_d1 ;
3462
//dff #(1)  erst_stgd1 (
3463
//        .din    (error_rst), 
3464
//      .q      (error_rst_d1),
3465
//        .clk          (clk),
3466
//        .se     (1'b0),       .si (),          .so ()
3467
//        ); 
3468
 
3469
wire   [3:0]  dtag_perr_pkt2_vld ;
3470
assign  dtag_perr_pkt2_vld[0] =  lsu_ld0_pcx_rq_sel_d1 & lsu_dtag_perror_w2[0];
3471
assign  dtag_perr_pkt2_vld[1] =  lsu_ld1_pcx_rq_sel_d1 & lsu_dtag_perror_w2[1];
3472
assign  dtag_perr_pkt2_vld[2] =  lsu_ld2_pcx_rq_sel_d1 & lsu_dtag_perror_w2[2];
3473
assign  dtag_perr_pkt2_vld[3] =  lsu_ld3_pcx_rq_sel_d1 & lsu_dtag_perror_w2[3];
3474
 
3475
//bug:2877 - dtag parity error 2nd packet request; flop to sync w/ ld?_pcx_rq_sel_d2
3476
dff_s #(4) ff_dtag_perr_pkt2_vld_d1 (
3477
        .din    (dtag_perr_pkt2_vld[3:0]),
3478
        .q      (dtag_perr_pkt2_vld_d1[3:0]),
3479
        .clk    (clk),
3480
        .se     (1'b0),       .si (),          .so ()
3481
        );
3482
 
3483
 
3484
 
3485
//bug:2877 - dtag parity error 2nd packet request; error_rst can be removed from mcycle_mask_d1 since
3486
//           it does not behave like an atomic i.e. it is sent as 2 separate packets.
3487
assign  mcycle_squash_d1 =
3488
 // error_rst | // dtag parity error requires two ld pkts
3489
  //(|lsu_error_rst[3:0]) | // dtag parity error requires two ld pkts
3490
  spc_pcx_atom_pq_buf2 ;   // cas/fpop
3491
 
3492
dff_s #(1)  sqsh_stgd1 (
3493
        .din    (pcx_req_squash),
3494
        .q      (pcx_req_squash_d1),
3495
        .clk    (clk),
3496
        .se     (1'b0),       .si (),          .so ()
3497
        );
3498
 
3499
dff_s #(1)  sqsh_stgd2 (
3500
        .din    (pcx_req_squash_d1),
3501
        .q      (pcx_req_squash_d2),
3502
        .clk    (clk),
3503
        .se     (1'b0),       .si (),          .so ()
3504
        );
3505
//timing fix: 9/19/03 - split the lsu_pcx_req_squash to 4 signals to stb_ctl[0-3] to reduce loading
3506
assign  lsu_pcx_req_squash = pcx_req_squash & ~st_atom_rq_d1 ;
3507
assign  lsu_pcx_req_squash0 = lsu_pcx_req_squash ;
3508
assign  lsu_pcx_req_squash1 = lsu_pcx_req_squash ;
3509
assign  lsu_pcx_req_squash2 = lsu_pcx_req_squash ;
3510
assign  lsu_pcx_req_squash3 = lsu_pcx_req_squash ;
3511
 
3512
assign  lsu_pcx_req_squash_d1 = pcx_req_squash_d1 ;
3513
 
3514
dff_s #(5)  rsel_stgd1 (
3515
        //.din    ({imiss_strm_pcx_rq_sel,
3516
        .din    ({
3517
    imiss_pcx_rq_sel, strm_pcx_rq_sel, intrpt_pcx_rq_sel, fpop_pcx_rq_sel,
3518
    fwdpkt_pcx_rq_sel}),
3519
        //.q      ({imiss_strm_pcx_rq_sel_d1,
3520
        .q      ({
3521
    imiss_pcx_rq_sel_d1, strm_pcx_rq_sel_d1, intrpt_pcx_rq_sel_d1,fpop_pcx_rq_sel_d1,
3522
    fwdpkt_pcx_rq_sel_d1}),
3523
        .clk  (clk),
3524
        .se     (1'b0),       .si (),          .so ()
3525
        );
3526
 
3527
assign  lsu_imiss_pcx_rq_sel_d1  =  imiss_pcx_rq_sel_d1;
3528
 
3529
dff_s  imrqs_stgd2 (
3530
        .din    (imiss_pcx_rq_sel_d1),
3531
        .q      (imiss_pcx_rq_sel_d2),
3532
        .clk    (clk),
3533
        .se     (1'b0),       .si (),          .so ()
3534
        );
3535
 
3536
dff_s  fwdrqs_stgd2 (
3537
        .din    (fwdpkt_pcx_rq_sel_d1),
3538
        .q      (fwdpkt_pcx_rq_sel_d2),
3539
        .clk    (clk),
3540
        .se     (1'b0),       .si (),          .so ()
3541
        );
3542
 
3543
dff_s  fwdrqs_stgd3 (
3544
        .din    (fwdpkt_pcx_rq_sel_d2),
3545
        .q      (fwdpkt_pcx_rq_sel_d3),
3546
        .clk    (clk),
3547
        .se     (1'b0),       .si (),          .so ()
3548
        );
3549
 
3550
dff_s  fpop_stgd2 (
3551
        .din    (fpop_pcx_rq_sel_d1), .q  (fpop_pcx_rq_sel_d2),
3552
        .clk    (clk),
3553
        .se     (1'b0),       .si (),          .so ()
3554
        );
3555
 
3556
//bug4665: add sehold to pcx_pkt_src_sel[1]
3557
//wire  ld_pcx_rq_sel_d1,st_pcx_rq_sel_d1,misc_pcx_rq_sel_d1;
3558
wire    ld_pcx_rq_sel_d1,st_pcx_rq_sel_d1;
3559
wire    all_pcx_rq_pick_b2 ;
3560
assign  all_pcx_rq_pick_b2  =  sehold ? st_pcx_rq_sel_d1 : all_pcx_rq_pick[2] ;
3561
 
3562
dff_s #(2)  pick_stgd1 (
3563
        .din    ({all_pcx_rq_pick_b2, all_pcx_rq_pick[1]}),
3564
        .q      ({st_pcx_rq_sel_d1,ld_pcx_rq_sel_d1}),
3565
        //.din    ({all_pcx_rq_pick[3], all_pcx_rq_pick_b2, all_pcx_rq_pick[1]}), 
3566
        //.q      ({misc_pcx_rq_sel_d1,st_pcx_rq_sel_d1,ld_pcx_rq_sel_d1}),
3567
        //.din    (all_pcx_rq_pick[2:1]), .q      ({st_pcx_rq_sel_d1,ld_pcx_rq_sel_d1}),
3568
        .clk  (clk),
3569
        .se     (1'b0),       .si (),          .so ()
3570
        );
3571
 
3572
// add other sources in such as interrupt and fpop.
3573
//bug:2877 - dtag parity error 2nd packet request; remove error_rst_d1 since dtag parity error does not
3574
//           behave as an atomic
3575
//assign pcx_pkt_src_sel[0] = ld_pcx_rq_sel_d1 | st_cas_rq_d2 | error_rst_d1 ;
3576
 
3577
//11/7/03 - add rst_tri_en
3578
wire  [3:0]  pcx_pkt_src_sel_tmp ;
3579
assign pcx_pkt_src_sel_tmp[0] = ld_pcx_rq_sel_d1 | st_cas_rq_d2 ;
3580
assign pcx_pkt_src_sel_tmp[1] = st_pcx_rq_sel_d1 ;
3581
assign pcx_pkt_src_sel_tmp[2] = ~|{pcx_pkt_src_sel[3],pcx_pkt_src_sel[1:0]};
3582
                                //imiss_strm_pcx_rq_sel_d1  ;
3583
assign pcx_pkt_src_sel_tmp[3] = fpop_pcx_rq_sel_d1 | fpop_pcx_rq_sel_d2 |
3584
                                fwdpkt_pcx_rq_sel_d1 | intrpt_pcx_rq_sel_d1 ;
3585
 
3586
//bug4888 -  change rst_tri_en to select b[1] instead of b[3]
3587
 
3588
assign pcx_pkt_src_sel[3:2]  =  pcx_pkt_src_sel_tmp[3:2] & {2{~rst_tri_en}} ;
3589
assign pcx_pkt_src_sel[1]    =  pcx_pkt_src_sel_tmp[1] | rst_tri_en ;
3590
assign pcx_pkt_src_sel[0]    =  pcx_pkt_src_sel_tmp[0] & ~rst_tri_en ;
3591
 
3592
//assign  dest_pkt_sel[0] = ld_pcx_rq_vld ;
3593
//assign  dest_pkt_sel[1] = st_pcx_rq_vld ;
3594
//assign  dest_pkt_sel[2] = ~(ld_pcx_rq_vld | st_pcx_rq_vld);
3595
 
3596
//=================================================================================================
3597
//              SELECT DESTINATION
3598
//=================================================================================================
3599
 
3600
// Select dest for load.
3601
mux4ds  #(5) ldsel_dest (
3602
  .in0  (ld0_l2bnk_dest[4:0]),
3603
  .in1  (ld1_l2bnk_dest[4:0]),
3604
  .in2  (ld2_l2bnk_dest[4:0]),
3605
  .in3  (ld3_l2bnk_dest[4:0]),
3606
  .sel0 (ld0_pcx_rq_pick),
3607
  .sel1 (ld1_pcx_rq_pick),
3608
  .sel2 (ld2_pcx_rq_pick),
3609
  .sel3 (ld3_pcx_rq_pick),
3610
  .dout (ld_pkt_dest[4:0])
3611
);
3612
 
3613
// Select dest for store
3614
mux4ds  #(5) stsel_dest (
3615
  .in0  (st0_l2bnk_dest[4:0]),
3616
  .in1  (st1_l2bnk_dest[4:0]),
3617
  .in2  (st2_l2bnk_dest[4:0]),
3618
  .in3  (st3_l2bnk_dest[4:0]),
3619
  .sel0 (st0_pcx_rq_pick),
3620
  .sel1 (st1_pcx_rq_pick),
3621
  .sel2 (st2_pcx_rq_pick),
3622
  .sel3 (st3_pcx_rq_pick),
3623
  .dout (st_pkt_dest[4:0])
3624
);
3625
 
3626
wire    [4:0]    misc_pkt_dest ;
3627
mux4ds  #(5) miscsel_dest (
3628
  .in0  (strm_l2bnk_dest[4:0]),
3629
  .in1  (fpop_l2bnk_dest[4:0]),
3630
  .in2  (intrpt_l2bnk_dest[4:0]),
3631
  .in3  (fwdpkt_dest_d1[4:0]),
3632
  .sel0 (strm_pcx_rq_pick),
3633
  .sel1 (fpop_pcx_rq_pick),
3634
  .sel2 (intrpt_pcx_rq_pick),
3635
  .sel3 (fwdpkt_pcx_rq_pick),
3636
  .dout (misc_pkt_dest[4:0])
3637
);
3638
 
3639
// This is temporary until the req/ack path is restructured
3640
/*assign  imiss_strm_pkt_dest[4:0] =
3641
  imiss_pcx_rq_sel ? imiss_l2bnk_dest[4:0] :
3642
    strm_pcx_rq_sel ? strm_l2bnk_dest[4:0] :
3643
      fpop_pcx_rq_sel ? fpop_l2bnk_dest[4:0] :
3644
        intrpt_pcx_rq_sel ? intrpt_l2bnk_dest[4:0] :
3645
                lsu_fwdpkt_dest[4:0] ;  */
3646
 
3647
/*
3648
// This needs to be replaced with structural mux once rq/ack resolved.
3649
mux4ds  #(5) istrmsel_dest (
3650
  .in0  (imiss_l2bnk_dest[4:0]),
3651
  .in1  (strm_l2bnk_dest[4:0]),
3652
  .in2  (fpop_l2bnk_dest[4:0]),
3653
  .in3  (intrpt_l2bnk_dest[4:0]),
3654
  .sel0 (imiss_pcx_rq_sel),
3655
  .sel1   (strm_pcx_rq_sel),
3656
  .sel2   (fpop_pcx_rq_sel),
3657
  .sel3   (intrpt_pcx_rq_sel),
3658
  .dout (imiss_strm_pkt_dest[4:0])
3659
);
3660
*/
3661
 
3662
mux4ds  #(5) sel_final_dest (
3663
  .in0  (imiss_l2bnk_dest[4:0]),
3664
  .in1  (ld_pkt_dest[4:0]),
3665
  .in2  (st_pkt_dest[4:0]),
3666
  .in3  (misc_pkt_dest[4:0]),
3667
  .sel0 (all_pcx_rq_pick[0]),
3668
  .sel1 (all_pcx_rq_pick[1]),
3669
  .sel2 (all_pcx_rq_pick[2]),
3670
  .sel3 (all_pcx_rq_dest_sel3),
3671
  //.sel3 (all_pcx_rq_pick[3]), 
3672
  .dout (current_pkt_dest[4:0])
3673
);
3674
 
3675
/*mux3ds  #(5) sel_dest (
3676
  .in0  (ld_pkt_dest[4:0]),
3677
  .in1  (st_pkt_dest[4:0]),
3678
  .in2    (imiss_strm_pkt_dest[4:0]),
3679
  .sel0 (dest_pkt_sel[0]),
3680
  .sel1   (dest_pkt_sel[1]),
3681
  .sel2   (dest_pkt_sel[2]),
3682
  .dout (current_pkt_dest[4:0])
3683
);*/
3684
 
3685
wire    pcx_rq_sel ;
3686
assign  pcx_rq_sel =
3687
  ld0_pcx_rq_sel | ld1_pcx_rq_sel | ld2_pcx_rq_sel | ld3_pcx_rq_sel |
3688
  st0_pcx_rq_sel | st1_pcx_rq_sel | st2_pcx_rq_sel | st3_pcx_rq_sel |
3689
  imiss_pcx_rq_sel | strm_pcx_rq_sel | fpop_pcx_rq_sel | intrpt_pcx_rq_sel |
3690
  fwdpkt_pcx_rq_sel ;
3691
 
3692
assign spc_pcx_req_g[4:0] =
3693
  (current_pkt_dest[4:0] & {5{pcx_rq_sel}}) ;
3694
  //(current_pkt_dest[4:0] & 
3695
  //{5{(ld_pcx_rq_vld | st_pcx_rq_vld | imiss_pcx_rq_vld | strm_pcx_rq_vld | intrpt_pcx_rq_vld | fpop_atom_req | fwdpkt_rq_vld)}}) ;
3696
 
3697
//timing fix: 9/19/03 - instantiate buffer for spc_pcx_req_pq
3698
wire  [4:0]  spc_pcx_req_pq_tmp ;
3699
dff_s #(5)  rq_stgpq (
3700
        .din    (spc_pcx_req_g[4:0]), .q  (spc_pcx_req_pq_tmp[4:0]),
3701
        .clk  (clk),
3702
        .se     (1'b0),       .si (),          .so ()
3703
        );
3704
 
3705
 
3706
bw_u1_buf_30x UZfix_spc_pcx_req_pq0_buf1 ( .a(spc_pcx_req_pq_tmp[0]), .z(spc_pcx_req_pq[0]) );
3707
bw_u1_buf_30x UZfix_spc_pcx_req_pq1_buf1 ( .a(spc_pcx_req_pq_tmp[1]), .z(spc_pcx_req_pq[1]) );
3708
bw_u1_buf_30x UZfix_spc_pcx_req_pq2_buf1 ( .a(spc_pcx_req_pq_tmp[2]), .z(spc_pcx_req_pq[2]) );
3709
bw_u1_buf_30x UZfix_spc_pcx_req_pq3_buf1 ( .a(spc_pcx_req_pq_tmp[3]), .z(spc_pcx_req_pq[3]) );
3710
bw_u1_buf_30x UZfix_spc_pcx_req_pq4_buf1 ( .a(spc_pcx_req_pq_tmp[4]), .z(spc_pcx_req_pq[4]) );
3711
 
3712
bw_u1_buf_30x UZsize_spc_pcx_req_pq0_buf2 ( .a(spc_pcx_req_pq_tmp[0]), .z(spc_pcx_req_pq_buf2[0]) );
3713
bw_u1_buf_30x UZsize_spc_pcx_req_pq1_buf2 ( .a(spc_pcx_req_pq_tmp[1]), .z(spc_pcx_req_pq_buf2[1]) );
3714
bw_u1_buf_30x UZsize_spc_pcx_req_pq2_buf2 ( .a(spc_pcx_req_pq_tmp[2]), .z(spc_pcx_req_pq_buf2[2]) );
3715
bw_u1_buf_30x UZsize_spc_pcx_req_pq3_buf2 ( .a(spc_pcx_req_pq_tmp[3]), .z(spc_pcx_req_pq_buf2[3]) );
3716
bw_u1_buf_30x UZsize_spc_pcx_req_pq4_buf2 ( .a(spc_pcx_req_pq_tmp[4]), .z(spc_pcx_req_pq_buf2[4]) );
3717
 
3718
//bug3348 - not needed
3719
//wire   spc_pcx_req_vld_pq ;
3720
//assign spc_pcx_req_vld_pq =  |spc_pcx_req_pq[4:0];
3721
//
3722
//dff #(1)  rq_stgpq1 (
3723
//        .din    (spc_pcx_req_vld_pq), .q  (spc_pcx_req_vld_pq1),
3724
//        .clk  (clk),
3725
//        .se     (1'b0),       .si (),          .so ()
3726
//        ); 
3727
 
3728
assign spc_pcx_req_update_g[4:0] =
3729
        (st_atom_rq_d1 | fpop_atom_rq_pq) ?
3730
        spc_pcx_req_pq_buf2[4:0] :           // Recirculate same request if back to back case - stda, cas etc
3731
        (current_pkt_dest[4:0] &
3732
        {5{pcx_rq_sel}}) ;
3733
        //{5{(ld_pcx_rq_vld | st_pcx_rq_vld | imiss_pcx_rq_vld | strm_pcx_rq_vld | intrpt_pcx_rq_vld | fpop_pcx_rq_vld | fwdpkt_rq_vld)}}) ;
3734
                                        // Standard request
3735
 
3736
dff_s #(5)  urq_stgpq (
3737
        .din    (spc_pcx_req_update_g[4:0]), .q  (spc_pcx_req_update_w2[4:0]),
3738
        .clk  (clk),
3739
        .se     (1'b0),       .si (),          .so ()
3740
        );
3741
 
3742
//=================================================================================================
3743
//      2-CYCLE OP HANDLING
3744
//=================================================================================================
3745
 
3746
// cas,fpop,dtag-error pkt. dtag-error pkt does not have to be b2b.
3747
// prevent starvation, ensure requests are b2b.
3748
// fpop can only request to fpu.(bit4) cas can only request to L2 (b3:0) 
3749
// ** error rst needs to be handled correctly.
3750
 
3751
// ** This needs to be massaged for timing.
3752
// timing fix: 5/7/03 - delay the mask 1 cycle for stores.
3753
wire    [3:0]    mcycle_mask_qwr ;
3754
wire    [4:0]    mcycle_mask_qwr_d1 ;
3755
//assign        mcycle_mask_qwr[3:0] =
3756
//      ({4{(stb0_rd_for_pcx & st0_atomic_vld)}} & st0_l2bnk_dest[3:0]) |
3757
//      ({4{(stb1_rd_for_pcx & st1_atomic_vld)}} & st1_l2bnk_dest[3:0]) |
3758
//      ({4{(stb2_rd_for_pcx & st2_atomic_vld)}} & st2_l2bnk_dest[3:0]) |
3759
//      ({4{(stb3_rd_for_pcx & st3_atomic_vld)}} & st3_l2bnk_dest[3:0]) ;
3760
 
3761
 
3762
//bug4513- kill the atomic store pcx req in this cycle if only 1 entry is available -
3763
//         atomic packets have to be sent b2bto pcx.
3764
//
3765
// ex. thread0 to l2 bank0 atomic store - w/ only 1 bank0 entry available
3766
//---------------------------------------------------------------------------------
3767
//                              1       2       3       4       5       6       7
3768
//---------------------------------------------------------------------------------
3769
// st0_atomic_vld-------------->1
3770
// pcx_rq_for_stb_tmp[0]------->1
3771
// pcx_rq_for_stb[0]----------->0                               1
3772
// st0_qmon_2entry_avail------->0                               1
3773
//---------------------------------------------------------------------------------
3774
// st0_atomic_pend------------->1                               0
3775
// st0_atomic_pend_d1------------------>1                               0
3776
// mcycle_mask_qwr_d1[0]--------------->1                               0
3777
//---------------------------------------------------------------------------------
3778
 
3779
 
3780
assign  st0_qmon_2entry_avail =  |(st0_l2bnk_dest[3:0] & sel_qentry0[3:0]) ;
3781
assign  st1_qmon_2entry_avail =  |(st1_l2bnk_dest[3:0] & sel_qentry0[3:0]) ;
3782
assign  st2_qmon_2entry_avail =  |(st2_l2bnk_dest[3:0] & sel_qentry0[3:0]) ;
3783
assign  st3_qmon_2entry_avail =  |(st3_l2bnk_dest[3:0] & sel_qentry0[3:0]) ;
3784
assign  fpop_qmon_2entry_avail =  fpop_l2bnk_dest[4] & sel_qentry0[4] ;
3785
 
3786
 
3787
//bug4513 - when atomic is picked, if 2 entries are not free, kill all requests until 2entries are free
3788
wire    st0_atomic_pend, st1_atomic_pend, st2_atomic_pend, st3_atomic_pend ;
3789
 
3790
assign  st0_atomic_pend  =  (pcx_rq_for_stb_tmp[0] & st0_atomic_vld & ~st0_qmon_2entry_avail) |  //set
3791
                            (st0_atomic_pend_d1 & ~st0_qmon_2entry_avail) ;                  //recycle/reset
3792
 
3793
assign  st1_atomic_pend  =  (pcx_rq_for_stb_tmp[1] & st1_atomic_vld & ~st1_qmon_2entry_avail) |  //set
3794
                            (st1_atomic_pend_d1 & ~st1_qmon_2entry_avail) ;                  //recycle/reset
3795
 
3796
assign  st2_atomic_pend  =  (pcx_rq_for_stb_tmp[2] & st2_atomic_vld & ~st2_qmon_2entry_avail) |  //set
3797
                            (st2_atomic_pend_d1 & ~st2_qmon_2entry_avail) ;                  //recycle/reset
3798
 
3799
assign  st3_atomic_pend  =  (pcx_rq_for_stb_tmp[3] & st3_atomic_vld & ~st3_qmon_2entry_avail) |  //set
3800
                            (st3_atomic_pend_d1 & ~st3_qmon_2entry_avail) ;                  //recycle/reset
3801
 
3802
dff_s #(4)  ff_st0to3_atomic_pend_d1 (
3803
        .din ({st3_atomic_pend,st2_atomic_pend,st1_atomic_pend,st0_atomic_pend}),
3804
        .q   ({st3_atomic_pend_d1,st2_atomic_pend_d1,st1_atomic_pend_d1,st0_atomic_pend_d1}),
3805
        .clk  (clk),
3806
        .se     (1'b0),       .si (),          .so ()
3807
        );
3808
 
3809
//bug4513 - kill all requests after atomic if 2 entries to the bank are not available
3810
assign  mcycle_mask_qwr[3:0] =
3811
        ({4{st0_atomic_pend}} & st0_l2bnk_dest[3:0]) |
3812
        ({4{st1_atomic_pend}} & st1_l2bnk_dest[3:0]) |
3813
        ({4{st2_atomic_pend}} & st2_l2bnk_dest[3:0]) |
3814
        ({4{st3_atomic_pend}} & st3_l2bnk_dest[3:0]) ;
3815
 
3816
//11/15/03 - change fpop atomic to be same as store atomic (bug4513)
3817
//assign        mcycle_mask_qwr[4] = fpop_pkt_vld | fpop_pcx_rq_sel_d1 ;
3818
 
3819
wire    fpop_atomic_pend, fpop_atomic_pend_d1 ;
3820
 
3821
 
3822
assign fpop_atomic_pend = (fpop_pcx_rq_sel_tmp & ~fpop_qmon_2entry_avail) |
3823
                          (fpop_atomic_pend_d1 & ~fpop_qmon_2entry_avail) ;
3824
 
3825
assign  fpop_q_wr[4:0] = fpop_atomic_pend_d1 ? pre_qwr[4:0] : queue_write[4:0] ;
3826
 
3827
dff_s #(1)  ff_fpop_atomic_pend_d1 (
3828
        .din (fpop_atomic_pend),
3829
        .q   (fpop_atomic_pend_d1),
3830
        .clk  (clk),
3831
        .se     (1'b0),       .si (),          .so ()
3832
        );
3833
 
3834
 
3835
dff_s #(5)  ff_mcycle_mask_qwr_b4to0 (
3836
        .din ({fpop_atomic_pend,mcycle_mask_qwr[3:0]}),
3837
        .q   (mcycle_mask_qwr_d1[4:0]),
3838
        .clk  (clk),
3839
        .se     (1'b0),       .si (),          .so ()
3840
        );
3841
 
3842
 
3843
//                      PCX REQUEST GENERATION (END)
3844
//*************************************************************************************************
3845
 
3846
//=================================================================================================
3847
//
3848
// CPX Packet Processing
3849
//
3850
//=================================================================================================
3851
 
3852
 
3853
// D-SIDE PROCESSING
3854
 
3855
/*input  [3:0]   lsu_cpx_pkt_rqtype ;
3856
input          lsu_cpx_pkt_vld ;*/
3857
 
3858
// non-cacheables are processed at the head of the dfq.
3859
// cpx_ld_type may not have to factor in strm load.
3860
 
3861
//=================================================================================================
3862
//
3863
// PCX Queue Control
3864
//
3865
//=================================================================================================
3866
 
3867
//timing fix: 5/7/03 - delay mask 1 cycle for stores
3868
//11/15/03 - change fpop atomic to be same as store atomic (bug4513)
3869
//assign        queue_write[4:0] = pre_qwr[4:0] & ~{mcycle_mask_qwr[4],mcycle_mask_qwr_d1[3:0]} ;
3870
assign  queue_write[4:0] = pre_qwr[4:0] & ~mcycle_mask_qwr_d1[4:0] ;
3871
 
3872
//bug4513 - mcycle_mask_qwr will kill all requests other than stores. stores can be killed
3873
//          by fpop atomics
3874
//11/14/03- fox for bug4513 was incorrect ; st_queue_write[3:0] not needed 'cos st[0-3]_q_wr 
3875
//          has been changed to use st0_atomic_pend instead of st0_atomic_vld
3876
//assign        st_queue_write[4] = pre_qwr[4] & ~mcycle_mask_qwr[4] ;
3877
//assign        st_queue_write[3:0] = pre_qwr[3:0] ;
3878
 
3879
//assign        queue_write[4:0] = pre_qwr[4:0] & ~mcycle_mask_qwr[4:0] ; // timing fix
3880
// assign       queue_write[4:0] = pre_qwr[4:0] ;
3881
 
3882
// PCX Queue Control
3883
// - qctl tracks 2-input queue state for each of 6 destinations
3884
// through grant signals available from pcx.
3885
 
3886
// L2 Bank0 Queue Monitor
3887
lsu_pcx_qmon  l2bank0_qmon (
3888
    .rclk         (rclk),
3889
    .grst_l       (grst_l),
3890
    .arst_l       (arst_l),
3891
    .si(),
3892
    .se(se),
3893
    .so(),
3894
  .send_by_pcx  (pcx_spc_grant_px[0]),
3895
  .send_to_pcx  (spc_pcx_req_update_w2[0]),
3896
  //.qwrite   (queue_write[0]),
3897
  .qwrite   (pre_qwr[0]),
3898
  .sel_qentry0  (sel_qentry0[0])
3899
);
3900
 
3901
// L2 Bank1 Queue Monitor
3902
lsu_pcx_qmon  l2bank1_qmon (
3903
    .rclk         (rclk),
3904
    .grst_l       (grst_l),
3905
    .arst_l       (arst_l),
3906
    .si(),
3907
    .se(se),
3908
    .so(),
3909
  .send_by_pcx  (pcx_spc_grant_px[1]),
3910
  .send_to_pcx  (spc_pcx_req_update_w2[1]),
3911
  //.qwrite   (queue_write[1]),
3912
  .qwrite   (pre_qwr[1]),
3913
  .sel_qentry0  (sel_qentry0[1])
3914
);
3915
 
3916
// L2 Bank2 Queue Monitor
3917
lsu_pcx_qmon  l2bank2_qmon (
3918
    .rclk         (rclk),
3919
    .grst_l       (grst_l),
3920
    .arst_l       (arst_l),
3921
    .si(),
3922
    .se(se),
3923
    .so(),
3924
  .send_by_pcx  (pcx_spc_grant_px[2]),
3925
  .send_to_pcx  (spc_pcx_req_update_w2[2]),
3926
  //.qwrite   (queue_write[2]),
3927
  .qwrite   (pre_qwr[2]),
3928
  .sel_qentry0  (sel_qentry0[2])
3929
);
3930
 
3931
// L2 Bank3 Queue Monitor
3932
lsu_pcx_qmon  l2bank3_qmon (
3933
    .rclk         (rclk),
3934
    .grst_l       (grst_l),
3935
    .arst_l       (arst_l),
3936
    .si(),
3937
    .se(se),
3938
    .so(),
3939
  .send_by_pcx  (pcx_spc_grant_px[3]),
3940
  .send_to_pcx  (spc_pcx_req_update_w2[3]),
3941
  //.qwrite   (queue_write[3]),
3942
  .qwrite   (pre_qwr[3]),
3943
  .sel_qentry0  (sel_qentry0[3])
3944
);
3945
 
3946
// FP/IO Bridge Queue Monitor
3947
lsu_pcx_qmon  fpiobridge_qmon (
3948
    .rclk         (rclk),
3949
    .grst_l       (grst_l),
3950
    .arst_l       (arst_l),
3951
    .si(),
3952
    .se(se),
3953
    .so(),
3954
  .send_by_pcx  (pcx_spc_grant_px[4]),
3955
  .send_to_pcx  (spc_pcx_req_update_w2[4]),
3956
  //.qwrite   (queue_write[4]),
3957
  .qwrite   (pre_qwr[4]),
3958
  .sel_qentry0  (sel_qentry0[4])
3959
);
3960
 
3961
 
3962
 
3963
 
3964
// 5/13/03: timing fix for lsu_dtag_perror_w2 thru st_pick
3965
wire  [3:0]  error_en;
3966
wire  [3:0]  error_rst_thrd;
3967
 
3968
//assign  error_en[0] = lmq_enable[0] | (lsu_cpx_pkt_atm_st_cmplt & dcfill_active_e & dfq_byp_sel[0]);
3969
assign  error_en[0] = lsu_ld_inst_vld_g[0];
3970
assign  error_en[1] = lsu_ld_inst_vld_g[1];
3971
assign  error_en[2] = lsu_ld_inst_vld_g[2];
3972
assign  error_en[3] = lsu_ld_inst_vld_g[3];
3973
 
3974
//assign  error_rst_thrd[0] = reset | (lsu_ld0_pcx_rq_sel_d1 & lsu_pcx_ld_dtag_perror_w2) ;
3975
//assign  error_rst_thrd[1] = reset | (lsu_ld1_pcx_rq_sel_d1 & lsu_pcx_ld_dtag_perror_w2) ;
3976
//assign  error_rst_thrd[2] = reset | (lsu_ld2_pcx_rq_sel_d1 & lsu_pcx_ld_dtag_perror_w2) ;
3977
//assign  error_rst_thrd[3] = reset | (lsu_ld3_pcx_rq_sel_d1 & lsu_pcx_ld_dtag_perror_w2) ;
3978
 
3979
// reset moved to d2 'cos if 1st pkt is speculative and grant=0, error should not be reset.
3980
//bug4512 - stb_full_raw has to be qual w/ ld[0-3] inst_vld_w2
3981
//          also, need to qualify stb_full_raw w/ fp loads i.e. dont reset error if full raw is for fp double loads
3982
assign  error_rst_thrd[0] = reset | (ld0_pcx_rq_sel_d2 & ~pcx_req_squash_d1)
3983
                                | (ld0_inst_vld_w2 & ld_stb_full_raw_w2 & ~dbl_force_l2access_w2 & thread0_w2) ; // Bug4512
3984
                                //| (ld_stb_full_raw_w2 & thread0_w2) ; // Bug 4361
3985
 
3986
assign  error_rst_thrd[1] = reset | (ld1_pcx_rq_sel_d2 & ~pcx_req_squash_d1)
3987
                                | (ld1_inst_vld_w2 & ld_stb_full_raw_w2 & ~dbl_force_l2access_w2 & thread1_w2) ;
3988
 
3989
assign  error_rst_thrd[2] = reset | (ld2_pcx_rq_sel_d2 & ~pcx_req_squash_d1)
3990
                                | (ld2_inst_vld_w2 & ld_stb_full_raw_w2 & ~dbl_force_l2access_w2 & thread2_w2) ;
3991
 
3992
assign  error_rst_thrd[3] = reset | (ld3_pcx_rq_sel_d2 & ~pcx_req_squash_d1)
3993
                                | (ld3_inst_vld_w2 & ld_stb_full_raw_w2 & ~dbl_force_l2access_w2 & thread3_w2) ;
3994
 
3995
//assign  lsu_error_rst[3:0]  =  error_rst[3:0];
3996
 
3997
wire    dtag_perror3,dtag_perror2,dtag_perror1,dtag_perror0;
3998
 
3999
// Thread 0
4000
dffre_s  #(1) error_t0 (
4001
        .din    (lsu_dcache_tag_perror_g),
4002
        .q      (dtag_perror0),
4003
        .rst  (error_rst_thrd[0]), .en     (error_en[0]),
4004
        .clk    (clk),
4005
        .se     (1'b0),       .si (),          .so ()
4006
        );
4007
 
4008
// Thread 1
4009
dffre_s  #(1) error_t1 (
4010
        .din    (lsu_dcache_tag_perror_g),
4011
        .q      (dtag_perror1),
4012
        .rst  (error_rst_thrd[1]), .en     (error_en[1]),
4013
        .clk    (clk),
4014
        .se     (1'b0),       .si (),          .so ()
4015
        );
4016
 
4017
// Thread 2
4018
dffre_s  #(1) error_t2 (
4019
        .din    (lsu_dcache_tag_perror_g),
4020
        .q      (dtag_perror2),
4021
        .rst  (error_rst_thrd[2]), .en     (error_en[2]),
4022
        .clk    (clk),
4023
        .se     (1'b0),       .si (),          .so ()
4024
        );
4025
 
4026
// Thread 3
4027
dffre_s  #(1) error_t3 (
4028
        .din    (lsu_dcache_tag_perror_g),
4029
        .q      (dtag_perror3),
4030
        .rst  (error_rst_thrd[3]), .en     (error_en[3]),
4031
        .clk    (clk),
4032
        .se     (1'b0),       .si (),          .so ()
4033
        );
4034
 
4035
assign  lsu_dtag_perror_w2[3] = dtag_perror3 ;
4036
assign  lsu_dtag_perror_w2[2] = dtag_perror2 ;
4037
assign  lsu_dtag_perror_w2[1] = dtag_perror1 ;
4038
assign  lsu_dtag_perror_w2[0] = dtag_perror0 ;
4039
 
4040
// Determine if ld pkt requires correction due to dtag parity error.
4041
assign  lsu_pcx_ld_dtag_perror_w2 =
4042
  ld_pcx_rq_sel[0] ? dtag_perror0 :
4043
    ld_pcx_rq_sel[1] ? dtag_perror1 :
4044
      ld_pcx_rq_sel[2] ? dtag_perror2 : dtag_perror3 ;
4045
 
4046
 
4047
//=================================================================================================
4048
//
4049
// THREAD RETRY DETECTION (picker related logic)
4050
//
4051
//=================================================================================================
4052
 
4053
//bug4814 - move pick_staus out of picker and reset pick status when all 12 valid requests have
4054
//          is picked and not squashed.
4055
 
4056
assign  ld_thrd_pick_din[0]  =  ld_thrd_pick_status[0] | (ld0_pcx_rq_sel_d2 & ~pcx_req_squash_d1) ;
4057
assign  ld_thrd_pick_din[1]  =  ld_thrd_pick_status[1] | (ld1_pcx_rq_sel_d2 & ~pcx_req_squash_d1) ;
4058
assign  ld_thrd_pick_din[2]  =  ld_thrd_pick_status[2] | (ld2_pcx_rq_sel_d2 & ~pcx_req_squash_d1) ;
4059
assign  ld_thrd_pick_din[3]  =  ld_thrd_pick_status[3] | (ld3_pcx_rq_sel_d2 & ~pcx_req_squash_d1) ;
4060
 
4061
assign  ld_thrd_pick_rst  =  ~|(ld_events_raw[3:0] & ~ld_thrd_pick_din[3:0]) ;
4062
 
4063
assign  ld_thrd_pick_status_din[3:0] =  ld_thrd_pick_din[3:0] & ~{4{all_thrd_pick_rst}} ;
4064
//assign  ld_thrd_pick_status_din[3:0]  =  ld_thrd_pick_din[3:0] & ~{4{ld_thrd_pick_rst}} ;
4065
 
4066
assign  st_thrd_pick_din[0] = st_thrd_pick_status[0] | (st0_pcx_rq_sel_d2 & ~pcx_req_squash_d1) ;
4067
assign  st_thrd_pick_din[1] = st_thrd_pick_status[1] | (st1_pcx_rq_sel_d2 & ~pcx_req_squash_d1) ;
4068
assign  st_thrd_pick_din[2] = st_thrd_pick_status[2] | (st2_pcx_rq_sel_d2 & ~pcx_req_squash_d1) ;
4069
assign  st_thrd_pick_din[3] = st_thrd_pick_status[3] | (st3_pcx_rq_sel_d2 & ~pcx_req_squash_d1) ;
4070
 
4071
assign  st_thrd_pick_rst  =  ~|(st_events_raw[3:0] & ~st_thrd_pick_din[3:0]) ;
4072
assign  st_thrd_pick_status_din[3:0]  =  st_thrd_pick_din[3:0] & ~{4{all_thrd_pick_rst}} ;
4073
//assign  st_thrd_pick_status_din[3:0]  =  st_thrd_pick_din[3:0] & ~{4{st_thrd_pick_rst}} ;
4074
 
4075
assign  misc_thrd_pick_din[3] = misc_thrd_pick_status[3] | lsu_spu_ldst_ack ;
4076
assign  misc_thrd_pick_din[2] = misc_thrd_pick_status[2] | (fpop_pcx_rq_sel_d2 & ~pcx_req_squash_d1) ;
4077
assign  misc_thrd_pick_din[1] = misc_thrd_pick_status[1] | lsu_tlu_pcxpkt_ack ;
4078
assign  misc_thrd_pick_din[0] = misc_thrd_pick_status[0] | lsu_fwdpkt_pcx_rq_sel ;
4079
 
4080
assign  misc_thrd_pick_rst  =  ~|(misc_events_raw[3:0] & ~misc_thrd_pick_din[3:0]) ;
4081
 
4082
assign  misc_thrd_pick_status_din[3:0]  =  misc_thrd_pick_din[3:0] & ~{4{all_thrd_pick_rst}} ;
4083
//assign  misc_thrd_pick_status_din[3:0]  =  misc_thrd_pick_din[3:0] & ~{4{misc_thrd_pick_rst}} ;
4084
 
4085
assign  all_thrd_pick_rst  =  ld_thrd_pick_rst & st_thrd_pick_rst & misc_thrd_pick_rst ;
4086
 
4087
 
4088
dff_s    #(4) ff_ld_thrd_force(
4089
        .din    (ld_thrd_pick_status_din[3:0]),
4090
        .q      (ld_thrd_pick_status[3:0]),
4091
        .clk    (clk),
4092
        .se     (1'b0),       .si (),          .so ()
4093
        );
4094
 
4095
dff_s    #(4) ff_st_thrd_force(
4096
        .din    (st_thrd_pick_status_din[3:0]),
4097
        .q      (st_thrd_pick_status[3:0]),
4098
        .clk    (clk),
4099
        .se     (1'b0),       .si (),          .so ()
4100
        );
4101
 
4102
dff_s    #(4) ff_misc_thrd_force(
4103
        .din    (misc_thrd_pick_status_din[3:0]),
4104
        .q      (misc_thrd_pick_status[3:0]),
4105
        .clk    (clk),
4106
        .se     (1'b0),       .si (),          .so ()
4107
        );
4108
 
4109
assign  ld_thrd_force_d1[3:0]  =  ~ld_thrd_pick_status[3:0] ;
4110
assign  st_thrd_force_d1[3:0]  =  ~st_thrd_pick_status[3:0] ;
4111
assign  misc_thrd_force_d1[3:0]  =  ~misc_thrd_pick_status[3:0] ;
4112
 
4113
assign ld_thrd_force_vld[0]  =  ld_thrd_force_d1[0] &
4114
                               ~(ld0_pcx_rq_sel_d1 | ld0_pcx_rq_sel_d2) ;
4115
 
4116
assign ld_thrd_force_vld[1]  =  ld_thrd_force_d1[1] &
4117
                               ~(ld1_pcx_rq_sel_d1 | ld1_pcx_rq_sel_d2) ;
4118
 
4119
assign ld_thrd_force_vld[2]  =  ld_thrd_force_d1[2] &
4120
                               ~(ld2_pcx_rq_sel_d1 | ld2_pcx_rq_sel_d2) ;
4121
 
4122
assign ld_thrd_force_vld[3]  =  ld_thrd_force_d1[3] &
4123
                               ~(ld3_pcx_rq_sel_d1 | ld3_pcx_rq_sel_d2) ;
4124
 
4125
 
4126
// force valid to store picker if 1 entry is free and if it not picked in d1/d2
4127
assign st_thrd_force_vld[0]  =  st_thrd_force_d1[0] &
4128
                               ~(st0_pcx_rq_sel_d1 | st0_pcx_rq_sel_d2) ;
4129
 
4130
assign st_thrd_force_vld[1]  =  st_thrd_force_d1[1] &
4131
                               ~(st1_pcx_rq_sel_d1 | st1_pcx_rq_sel_d2) ;
4132
 
4133
assign st_thrd_force_vld[2]  =  st_thrd_force_d1[2] &
4134
                               ~(st2_pcx_rq_sel_d1 | st2_pcx_rq_sel_d2) ;
4135
 
4136
assign st_thrd_force_vld[3]  =  st_thrd_force_d1[3] &
4137
                               ~(st3_pcx_rq_sel_d1 | st3_pcx_rq_sel_d2) ;
4138
 
4139
 
4140
 
4141
// force valid to misc picker if 1 entry is free and if it is not picked in d1/d2
4142
assign misc_thrd_force_vld[0]  =  misc_thrd_force_d1[0] &
4143
                                 ~(fwdpkt_pcx_rq_sel_d1 | fwdpkt_pcx_rq_sel_d2) ;
4144
 
4145
assign misc_thrd_force_vld[1]  =  misc_thrd_force_d1[1] &
4146
                                 ~(intrpt_pcx_rq_sel_d1 | intrpt_pcx_rq_sel_d2);
4147
 
4148
assign misc_thrd_force_vld[2]  =  misc_thrd_force_d1[2] &
4149
                                 ~(fpop_pcx_rq_sel_d1 | fpop_pcx_rq_sel_d2) ;
4150
 
4151
assign misc_thrd_force_vld[3]  =  misc_thrd_force_d1[3] &
4152
                                 ~(strm_pcx_rq_sel_d1 | strm_pcx_rq_sel_d2) ;
4153
 
4154
//2nd level pick thread force - force only req are valid and l2bnk is free
4155
assign all_thrd_force_vld[0]  =  1'b0 ;
4156
 
4157
assign all_thrd_force_vld[1]  =
4158
                    |(ld_thrd_force_vld[3:0] &
4159
                     {ld3_pcx_rq_vld,ld2_pcx_rq_vld,ld1_pcx_rq_vld,ld0_pcx_rq_vld}) ;
4160
 
4161
assign all_thrd_force_vld[2]  =
4162
                    |(st_thrd_force_vld[3:0] &
4163
                     {st3_pcx_rq_vld,st2_pcx_rq_vld,st1_pcx_rq_vld,st0_pcx_rq_vld}) ;
4164
 
4165
assign all_thrd_force_vld[3]  =
4166
                    |(misc_thrd_force_vld[3:0] &
4167
                     {strm_pcx_rq_vld,fpop_pcx_rq_vld,intrpt_pcx_rq_vld,fwdpkt_rq_vld}) ;
4168
 
4169
 
4170
endmodule

powered by: WebSVN 2.1.0

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