1 | // ========== 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 |
---|