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