1 | // ========== Copyright Header Begin ========================================== |
---|
2 | // |
---|
3 | // OpenSPARC T1 Processor File: lsu_stb_rwctl.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: Control for Unified STB CAM/DATA of LSU |
---|
24 | */ |
---|
25 | //////////////////////////////////////////////////////////////////////// |
---|
26 | // Global header file includes |
---|
27 | //////////////////////////////////////////////////////////////////////// |
---|
28 | `include "sys.h" // system level definition file which contains the |
---|
29 | // time scale definition |
---|
30 | |
---|
31 | `include "iop.h" |
---|
32 | |
---|
33 | //////////////////////////////////////////////////////////////////////// |
---|
34 | // Local header file includes / local defines |
---|
35 | //////////////////////////////////////////////////////////////////////// |
---|
36 | |
---|
37 | module lsu_stb_rwctl (/*AUTOARG*/ |
---|
38 | // Outputs |
---|
39 | so, lsu_stbctl_flush_pipe_w, stb_cam_wr_no_ivld_m, |
---|
40 | ld_rawp_st_ced_w2, stb_data_wr_ptr, stb_data_wptr_vld, |
---|
41 | stb_data_rd_ptr, stb_data_rptr_vld, stb_wdata_ramd_b75_b64, |
---|
42 | stb_cam_cm_tid, stb_ldst_byte_msk, stb_ldst_byte_msk_min, |
---|
43 | stb_cam_rw_ptr, stb_cam_wptr_vld, stb_cam_rptr_vld, |
---|
44 | lsu_st_sz_bhww_m, lsu_st_sz_dw_m, lsu_st_sz_bhw_m, |
---|
45 | lsu_st_sz_wdw_m, lsu_st_sz_b_m, lsu_st_sz_w_m, lsu_st_sz_hw_m, |
---|
46 | lsu_st_sz_hww_m, ld_rawp_st_ackid_w2, stb_flush_st_g, |
---|
47 | stb_cam_wvld_m, lsu_st_rq_type_m, lsu_stb_data_early_sel_e, |
---|
48 | lsu_stb_data_final_sel_m, lsu_ldquad_inst_m, stb_thrd_en_g, |
---|
49 | flsh_inst_m, lsu_stb_va_m, lsu_stb_empty_buf, lsu_spu_stb_empty, |
---|
50 | ifu_tlu_inst_vld_m_bf1, ifu_tlu_inst_vld_m_bf2, lsu_ifu_stbcnt0, |
---|
51 | lsu_ifu_stbcnt1, lsu_ifu_stbcnt2, lsu_ifu_stbcnt3, |
---|
52 | lsu_ffu_stb_full0, lsu_ffu_stb_full1, lsu_ffu_stb_full2, |
---|
53 | lsu_ffu_stb_full3, |
---|
54 | // Inputs |
---|
55 | rclk, rst_tri_en, si, se, ld_inst_vld_e, ldst_sz_e, st_inst_vld_e, |
---|
56 | stb_pcx_rptr0, stb_wrptr0, stb_pcx_rptr1, stb_wrptr1, |
---|
57 | stb_pcx_rptr2, stb_wrptr2, stb_pcx_rptr3, stb_wrptr3, |
---|
58 | stb_cam_hit_ptr, stb_cam_hit, lsu_ldst_va_m, sta_internal_m, |
---|
59 | ifu_tlu_thrid_e, tlu_exu_early_flush_pipe_w, lsu_ttype_vld_m2, |
---|
60 | ifu_lsu_flush_w, lsu_defr_trp_taken_g, ifu_lsu_casa_e, |
---|
61 | ifu_lsu_ldstub_e, ifu_lsu_swap_e, ifu_lsu_ldst_dbl_e, |
---|
62 | stb_state_ced0, stb_state_ced1, stb_state_ced2, stb_state_ced3, |
---|
63 | stb_ld_full_raw, stb_ld_partial_raw, stb_wrptr0_prev, |
---|
64 | stb_wrptr1_prev, stb_wrptr2_prev, stb_wrptr3_prev, |
---|
65 | ifu_lsu_alt_space_e, ifu_lsu_ldst_fp_e, lsu_quad_asi_e, |
---|
66 | lsu_st_rmo_m, lsu_bst_in_pipe_m, ffu_lsu_kill_fst_w, |
---|
67 | ffu_lsu_blk_st_e, ffu_lsu_blk_st_tid_m, ffu_lsu_blk_st_va_e, |
---|
68 | lsu_snap_blk_st_m, tlb_pgnum_b39_g, lsu_stb_empty, |
---|
69 | ifu_tlu_flsh_inst_e, stb_cam_mhit, ifu_tlu_inst_vld_m, |
---|
70 | lsu_st_pcx_rq_pick, lsu_st_pcx_rq_vld, stb_rdata_ramc_b8t0, |
---|
71 | lsu_stbcnt0, lsu_stbcnt1, lsu_stbcnt2, lsu_stbcnt3 |
---|
72 | ) ; |
---|
73 | |
---|
74 | input rclk ; |
---|
75 | //input grst_l ; |
---|
76 | //input arst_l ; |
---|
77 | input rst_tri_en; |
---|
78 | |
---|
79 | input si; |
---|
80 | input se; |
---|
81 | output so; |
---|
82 | |
---|
83 | |
---|
84 | input ld_inst_vld_e ; // load in pipe. |
---|
85 | input [1:0] ldst_sz_e ; // size of load. |
---|
86 | input st_inst_vld_e ; // store in pipe. |
---|
87 | // Currently bypass flop make request |
---|
88 | //input [3:0] pcx_rq_for_stb ; // pcx request rd of dfq - threaded |
---|
89 | //input [2:0] stb_dfq_rptr0 ; // dfq rptr for stb0 |
---|
90 | input [2:0] stb_pcx_rptr0 ; // pcx rptr for stb0 |
---|
91 | input [2:0] stb_wrptr0 ; // wrt ptr - stb0 |
---|
92 | //input [2:0] stb_dfq_rptr1 ; // dfq rptr for stb1 |
---|
93 | input [2:0] stb_pcx_rptr1 ; // pcx rptr for stb1 |
---|
94 | input [2:0] stb_wrptr1 ; // wrt ptr - stb1 |
---|
95 | //input [2:0] stb_dfq_rptr2 ; // dfq rptr for stb2 |
---|
96 | input [2:0] stb_pcx_rptr2 ; // pcx rptr for stb2 |
---|
97 | input [2:0] stb_wrptr2 ; // wrt ptr - stb2 |
---|
98 | //input [2:0] stb_dfq_rptr3 ; // dfq rptr for stb3 |
---|
99 | input [2:0] stb_pcx_rptr3 ; // pcx rptr for stb3 |
---|
100 | input [2:0] stb_wrptr3 ; // wrt ptr - stb3 |
---|
101 | input [2:0] stb_cam_hit_ptr ; // entry which hit |
---|
102 | input stb_cam_hit ; // hit has occurred |
---|
103 | //input [7:0] stb_state_vld0 ; // valid bits - stb0 |
---|
104 | //input [7:0] stb_state_vld1 ; // valid bits - stb1 |
---|
105 | //input [7:0] stb_state_vld2 ; // valid bits - stb2 |
---|
106 | //input [7:0] stb_state_vld3 ; // valid bits - stb3 |
---|
107 | input [9:0] lsu_ldst_va_m ; |
---|
108 | input sta_internal_m ; // internal stxa |
---|
109 | input [1:0] ifu_tlu_thrid_e ; // thread-id. |
---|
110 | |
---|
111 | // output lsu_stbrwctl_flush_pipe_w ; // tmp for tso_mon |
---|
112 | input tlu_exu_early_flush_pipe_w; |
---|
113 | input lsu_ttype_vld_m2; |
---|
114 | |
---|
115 | input ifu_lsu_flush_w; |
---|
116 | input lsu_defr_trp_taken_g; |
---|
117 | output lsu_stbctl_flush_pipe_w; |
---|
118 | |
---|
119 | |
---|
120 | input ifu_lsu_casa_e ; // compare-swap instr |
---|
121 | input ifu_lsu_ldstub_e ; // ldstub |
---|
122 | input ifu_lsu_swap_e ; // swap |
---|
123 | input ifu_lsu_ldst_dbl_e; // ldst dbl, specifically for stquad. |
---|
124 | //input [63:0] lsu_stb_st_data_g ; // data to be written to stb |
---|
125 | input [7:0] stb_state_ced0 ; |
---|
126 | input [7:0] stb_state_ced1 ; |
---|
127 | input [7:0] stb_state_ced2 ; |
---|
128 | input [7:0] stb_state_ced3 ; |
---|
129 | input [7:0] stb_ld_full_raw ; |
---|
130 | input [7:0] stb_ld_partial_raw ; |
---|
131 | input [2:0] stb_wrptr0_prev ; |
---|
132 | input [2:0] stb_wrptr1_prev ; |
---|
133 | input [2:0] stb_wrptr2_prev ; |
---|
134 | input [2:0] stb_wrptr3_prev ; |
---|
135 | input ifu_lsu_alt_space_e ; // alt_space inst |
---|
136 | input ifu_lsu_ldst_fp_e ; |
---|
137 | //input tlb_cam_hit ; // tlb cam hit - mstage |
---|
138 | input lsu_quad_asi_e ; // quad ldst asi |
---|
139 | //input [3:0] lsu_st_ack_rq_stb ; |
---|
140 | //input lsu_dtlb_bypass_e ; |
---|
141 | input lsu_st_rmo_m ; // rmo st in m cycle. |
---|
142 | input lsu_bst_in_pipe_m ; // 1st helper for bst. |
---|
143 | input ffu_lsu_kill_fst_w ; // ecc error on st. |
---|
144 | input ffu_lsu_blk_st_e ; // blk st helper signalled by ffu |
---|
145 | input [1:0] ffu_lsu_blk_st_tid_m ; // blk st tid - from ffu_lsu_data |
---|
146 | input [5:3] ffu_lsu_blk_st_va_e ; // bits 5:3 of va from increment |
---|
147 | input lsu_snap_blk_st_m ; // snap blk st state |
---|
148 | input tlb_pgnum_b39_g ; |
---|
149 | |
---|
150 | input [3:0] lsu_stb_empty ; // thread's stb is empty |
---|
151 | input ifu_tlu_flsh_inst_e; |
---|
152 | input stb_cam_mhit ; |
---|
153 | input ifu_tlu_inst_vld_m ; |
---|
154 | //input [3:0] lsu_st_pcx_rq_kill_w2 ; |
---|
155 | |
---|
156 | input [3:0] lsu_st_pcx_rq_pick ; |
---|
157 | |
---|
158 | input lsu_st_pcx_rq_vld ; |
---|
159 | |
---|
160 | input [8:0] stb_rdata_ramc_b8t0 ; // scan-only |
---|
161 | |
---|
162 | output stb_cam_wr_no_ivld_m ; |
---|
163 | |
---|
164 | //output ld_rawp_st_ced_g ; |
---|
165 | output ld_rawp_st_ced_w2 ; |
---|
166 | output [4:0] stb_data_wr_ptr ; // write ptr - stb data |
---|
167 | output stb_data_wptr_vld ; // wr vld for stb data |
---|
168 | output [4:0] stb_data_rd_ptr ; // rd ptr for stb data |
---|
169 | output stb_data_rptr_vld ; // rptr vld for stb data |
---|
170 | output [75:64] stb_wdata_ramd_b75_b64 ; // write data for DATA RAM. |
---|
171 | |
---|
172 | // partial or full raw required |
---|
173 | output [1:0] stb_cam_cm_tid ; // cam tid - stb cam |
---|
174 | //output [7:0] stb_cam_sqsh_msk ; // squash spurious hits |
---|
175 | //output stb_cam_vld ; |
---|
176 | output [7:0] stb_ldst_byte_msk ; // byte mask for write/cam |
---|
177 | output [7:0] stb_ldst_byte_msk_min ; // byte mask for write/cam for min path |
---|
178 | |
---|
179 | //output [3:0] stb_rd_for_pcx_sel ; // stb's st selected for read for pcx |
---|
180 | output [4:0] stb_cam_rw_ptr ; // rw ptr for shared stb cam port |
---|
181 | output stb_cam_wptr_vld ; // wr vld for stb write |
---|
182 | output stb_cam_rptr_vld ; // rd vld for stb write |
---|
183 | |
---|
184 | |
---|
185 | //output lsu_stb_pcx_rvld_d1 ; // stb has been read-delayby1cycle |
---|
186 | //output lsu_stb_dfq_rvld ; // wr to dfq stb bypass ff |
---|
187 | |
---|
188 | output lsu_st_sz_bhww_m ; // byte or hword or word |
---|
189 | output lsu_st_sz_dw_m ; // double word |
---|
190 | output lsu_st_sz_bhw_m ; // byte or hword |
---|
191 | output lsu_st_sz_wdw_m ; // word or dword |
---|
192 | output lsu_st_sz_b_m ; // byte |
---|
193 | output lsu_st_sz_w_m ; // word |
---|
194 | output lsu_st_sz_hw_m ; // hword |
---|
195 | output lsu_st_sz_hww_m ; // hword or word |
---|
196 | |
---|
197 | //output ld_stb_full_raw_g ; |
---|
198 | //output ld_stb_partial_raw_g ; |
---|
199 | //output [3:0] ld_stb_full_raw_g ; |
---|
200 | //output [3:0] ld_stb_partial_raw_g ; |
---|
201 | |
---|
202 | output [2:0] ld_rawp_st_ackid_w2 ; |
---|
203 | |
---|
204 | //output [2:0] stb_dfq_rd_id ; // stb entry being read for current thread for current thread |
---|
205 | |
---|
206 | output [3:0] stb_flush_st_g ; // st is flushed in cycle g |
---|
207 | output [3:0] stb_cam_wvld_m ; |
---|
208 | |
---|
209 | output [2:1] lsu_st_rq_type_m ; |
---|
210 | |
---|
211 | output [3:0] lsu_stb_data_early_sel_e ;// select source of stb data. |
---|
212 | output lsu_stb_data_final_sel_m ;// select source of stb data. |
---|
213 | |
---|
214 | output lsu_ldquad_inst_m ; // stquad inst |
---|
215 | //output lsu_stdbl_inst_m ; // stdbl inst |
---|
216 | |
---|
217 | //output [1:0] lsu_stb_rd_tid ; // thread for which stb read occurs |
---|
218 | |
---|
219 | output [3:0] stb_thrd_en_g ; // thread id for current stb access |
---|
220 | |
---|
221 | output flsh_inst_m; |
---|
222 | |
---|
223 | output [9:3] lsu_stb_va_m; |
---|
224 | |
---|
225 | output [3:0] lsu_stb_empty_buf ; |
---|
226 | output [3:0] lsu_spu_stb_empty ; |
---|
227 | |
---|
228 | output ifu_tlu_inst_vld_m_bf1; |
---|
229 | output ifu_tlu_inst_vld_m_bf2; |
---|
230 | |
---|
231 | input [3:0] lsu_stbcnt0; |
---|
232 | input [3:0] lsu_stbcnt1; |
---|
233 | input [3:0] lsu_stbcnt2; |
---|
234 | input [3:0] lsu_stbcnt3; |
---|
235 | |
---|
236 | output [3:0] lsu_ifu_stbcnt0; |
---|
237 | output [3:0] lsu_ifu_stbcnt1; |
---|
238 | output [3:0] lsu_ifu_stbcnt2; |
---|
239 | output [3:0] lsu_ifu_stbcnt3; |
---|
240 | |
---|
241 | output lsu_ffu_stb_full0; |
---|
242 | output lsu_ffu_stb_full1; |
---|
243 | output lsu_ffu_stb_full2; |
---|
244 | output lsu_ffu_stb_full3; |
---|
245 | |
---|
246 | /*AUTOWIRE*/ |
---|
247 | // Beginning of automatic wires (for undeclared instantiated-module outputs) |
---|
248 | // End of automatics |
---|
249 | // Beginning of automatic wires (for undeclared instantiated-module outputs) |
---|
250 | // End of automatics |
---|
251 | //wire [4:0] stb_dequeue_ptr ; |
---|
252 | wire [2:0] stb_wptr_prev ; |
---|
253 | wire [1:0] st_thrid_m,st_thrid_g ; |
---|
254 | wire [7:0] ld_any_raw_vld ; |
---|
255 | wire [7:0] ld_any_raw_vld_d1 ; |
---|
256 | //wire ld_raw_mhit ; |
---|
257 | wire [2:0] st_rq_type_m,st_rq_type_g ; |
---|
258 | |
---|
259 | wire [1:0] ldst_sz_m,ldst_sz_g, pipe_ldst_sz_m ; |
---|
260 | wire ldst_byte, ldst_hwrd, ldst_word, ldst_dwrd ; |
---|
261 | wire [7:0] ldst_byte_mask ; |
---|
262 | wire [2:0] stb_wptr ; |
---|
263 | wire [1:0] thrid_m,thrid_g ; |
---|
264 | wire ld_inst_vld_m, st_inst_vld_m ; |
---|
265 | |
---|
266 | wire ldst_dbl_m; |
---|
267 | wire atomic_m ; |
---|
268 | wire ldstub_m ; |
---|
269 | wire casa_m, casa_g ; |
---|
270 | wire swap_m; |
---|
271 | wire flush_st_g ; |
---|
272 | wire cam_wptr_vld_g ; |
---|
273 | wire [2:0] cam_wptr_d1 ; |
---|
274 | |
---|
275 | wire [2:0] stb_rdptr0,stb_rdptr1 ; |
---|
276 | wire [2:0] stb_rdptr2,stb_rdptr3 ; |
---|
277 | |
---|
278 | //wire [3:0] stb_rd_mask ; |
---|
279 | wire [3:0] stb_select_rptr ; |
---|
280 | wire [1:0] stb_rd_thrid ; |
---|
281 | //wire cam_vld_g ; |
---|
282 | wire [9:0] ldst_va_m, pipe_ldst_va_m ; |
---|
283 | wire [3:0] ldst_va_g ; |
---|
284 | wire [2:0] cam_wr_ptr ; |
---|
285 | wire thread0_m, thread1_m, thread2_m, thread3_m ; |
---|
286 | wire thread0_g, thread1_g, thread2_g, thread3_g ; |
---|
287 | wire [2:0] ld_rawp_stb_id ; |
---|
288 | |
---|
289 | //wire rd_for_dfq_granted ; |
---|
290 | wire [7:0] stb_state_ced,stb_state_ced_d1 ; |
---|
291 | //wire stq_wr_en ; |
---|
292 | //wire [3:0] stq_wr_en_g ; |
---|
293 | //wire [3:0] stquad_vld ; |
---|
294 | //wire [2:0] stquad_ptr0,stquad_ptr1,stquad_ptr2,stquad_ptr3 ; |
---|
295 | //wire [3:0] ld_stq_hit_g ; |
---|
296 | //wire ldq_hit_g ; |
---|
297 | //wire [3:0] ldq_hit_g ; |
---|
298 | wire ldst_fp_m; |
---|
299 | wire ldstub_e,casa_e,ldst_dbl_e; |
---|
300 | //wire stb_data_final_sel_e ; |
---|
301 | wire alt_space_e,alt_space_m ; |
---|
302 | wire quad_asi_m ; |
---|
303 | //wire stquad_e, stquad_m ; |
---|
304 | wire stdbl_e ; |
---|
305 | //wire dfq_any_rq_for_stb ; |
---|
306 | //wire [3:0] stb_rd_for_dfq ; // read rq for dfq - threaded |
---|
307 | wire blkst_m,blkst_g ; |
---|
308 | wire stb_not_empty ; |
---|
309 | |
---|
310 | wire clk; |
---|
311 | assign clk = rclk; |
---|
312 | |
---|
313 | // wire rst_l; |
---|
314 | // wire stb_rwctl_rst_l; |
---|
315 | |
---|
316 | // dffrl_async rstff(.din (grst_l), |
---|
317 | // .q (stb_rwctl_rst_l), |
---|
318 | // .clk (clk), .se(se), .si(), .so(), |
---|
319 | // .rst_l (arst_l)); |
---|
320 | |
---|
321 | //========================================================================================= |
---|
322 | // MISC |
---|
323 | //========================================================================================= |
---|
324 | |
---|
325 | // Scan-only flops. |
---|
326 | |
---|
327 | wire [8:0] stb_rdata_ramc_b8t0_so ; |
---|
328 | dff_s #(9) scmscan_ff ( |
---|
329 | .din (stb_rdata_ramc_b8t0[8:0]), |
---|
330 | .q (stb_rdata_ramc_b8t0_so[8:0]), |
---|
331 | .clk (clk), |
---|
332 | .se (se), .si (), .so () |
---|
333 | ); |
---|
334 | |
---|
335 | //========================================================================================= |
---|
336 | // INST_VLD_W GENERATION |
---|
337 | //========================================================================================= |
---|
338 | |
---|
339 | wire flush_w_inst_vld_m ; |
---|
340 | wire lsu_inst_vld_w ; |
---|
341 | wire lsu_stbrwctl_flush_pipe_w; |
---|
342 | |
---|
343 | //======================================= |
---|
344 | //instaniate buffers |
---|
345 | //====================================== |
---|
346 | |
---|
347 | wire ifu_tlu_inst_vld_m_bf0; |
---|
348 | |
---|
349 | bw_u1_buf_10x UZfix_ifu_tlu_inst_vld_m_bf0 ( .a(ifu_tlu_inst_vld_m), .z(ifu_tlu_inst_vld_m_bf0) ); |
---|
350 | bw_u1_buf_30x UZfix_ifu_tlu_inst_vld_m_bf1 ( .a(ifu_tlu_inst_vld_m_bf0), .z(ifu_tlu_inst_vld_m_bf1) ); |
---|
351 | bw_u1_buf_20x UZfix_ifu_tlu_inst_vld_m_bf2 ( .a(ifu_tlu_inst_vld_m_bf0), .z(ifu_tlu_inst_vld_m_bf2) ); |
---|
352 | |
---|
353 | assign flush_w_inst_vld_m = |
---|
354 | ifu_tlu_inst_vld_m_bf0 & |
---|
355 | ~(lsu_stbrwctl_flush_pipe_w & (thrid_m[1:0] == thrid_g[1:0])) ; // really lsu_flush_pipe_w |
---|
356 | |
---|
357 | dff_s stgw_ivld ( |
---|
358 | .din (flush_w_inst_vld_m), |
---|
359 | .q (lsu_inst_vld_w), |
---|
360 | .clk (clk), |
---|
361 | .se (se), .si (), .so () |
---|
362 | ); |
---|
363 | |
---|
364 | wire other_flush_pipe_w; |
---|
365 | wire tlu_early_flush_pipe_w; |
---|
366 | assign tlu_early_flush_pipe_w = tlu_exu_early_flush_pipe_w; |
---|
367 | |
---|
368 | assign other_flush_pipe_w = |
---|
369 | tlu_early_flush_pipe_w | (lsu_ttype_vld_m2 & lsu_inst_vld_w) | |
---|
370 | lsu_defr_trp_taken_g ; |
---|
371 | |
---|
372 | wire lsu_flush_pipe_w; |
---|
373 | |
---|
374 | assign lsu_flush_pipe_w = other_flush_pipe_w | ifu_lsu_flush_w ; |
---|
375 | assign lsu_stbctl_flush_pipe_w = lsu_flush_pipe_w ; |
---|
376 | assign lsu_stbrwctl_flush_pipe_w = lsu_flush_pipe_w ; |
---|
377 | |
---|
378 | //========================================================================================= |
---|
379 | // STB Array Addr/Ctl Generation |
---|
380 | //========================================================================================= |
---|
381 | |
---|
382 | assign ldstub_e = ifu_lsu_ldstub_e ; |
---|
383 | assign casa_e = ifu_lsu_casa_e ; |
---|
384 | assign ldst_dbl_e = ifu_lsu_ldst_dbl_e ; |
---|
385 | |
---|
386 | assign alt_space_e = ifu_lsu_alt_space_e ; |
---|
387 | |
---|
388 | //assign stdbl_e = ldst_dbl_e & (~alt_space_e | (alt_space_e & ~lsu_quad_asi_e)) ; |
---|
389 | assign stdbl_e = ldst_dbl_e ; |
---|
390 | |
---|
391 | // wire lsu_stdbl_inst_m; |
---|
392 | |
---|
393 | //dff stq_stgm ( |
---|
394 | // .din (stdbl_e), |
---|
395 | // .q (lsu_stdbl_inst_m), |
---|
396 | // .clk (clk), |
---|
397 | // .se (se), .si (), .so () |
---|
398 | // ); |
---|
399 | |
---|
400 | // This path can probably be eased. |
---|
401 | assign lsu_stb_data_early_sel_e[0] = ldstub_e & ~rst_tri_en; |
---|
402 | assign lsu_stb_data_early_sel_e[1] = casa_e & ~rst_tri_en; |
---|
403 | assign lsu_stb_data_early_sel_e[2] = ~(ldstub_e | casa_e | stdbl_e) | rst_tri_en; |
---|
404 | assign lsu_stb_data_early_sel_e[3] = stdbl_e & ~rst_tri_en ; |
---|
405 | |
---|
406 | // modify for accepting bst data out of pipe. |
---|
407 | //assign stb_data_final_sel_e = ~(ldst_fp_e | ffu_lsu_blk_st_e) ; |
---|
408 | |
---|
409 | /*dff lsel_g ( |
---|
410 | .din (stb_data_final_sel_e), |
---|
411 | .q (lsu_stb_data_final_sel_m), |
---|
412 | .clk (clk), |
---|
413 | .se (se), .si (), .so () |
---|
414 | );*/ |
---|
415 | |
---|
416 | assign lsu_stb_data_final_sel_m = ~(ldst_fp_m | blkst_m) ; |
---|
417 | |
---|
418 | wire real_st_m ; |
---|
419 | wire flsh_inst_m, flsh_inst_g ; |
---|
420 | // !!! could qualify st_inst_vld_e with stxa_internal !!! |
---|
421 | dff_s #(13) stgm_vld ( |
---|
422 | .din ({ld_inst_vld_e,st_inst_vld_e,ldst_sz_e[1:0], |
---|
423 | ifu_lsu_swap_e, ifu_lsu_ldstub_e, ifu_lsu_casa_e,ifu_lsu_ldst_dbl_e, |
---|
424 | ifu_tlu_thrid_e[1:0],ifu_lsu_ldst_fp_e,lsu_quad_asi_e,ifu_tlu_flsh_inst_e}), |
---|
425 | .q ({ld_inst_vld_m,real_st_m,pipe_ldst_sz_m[1:0], |
---|
426 | swap_m,ldstub_m,casa_m,ldst_dbl_m,thrid_m[1:0],ldst_fp_m,quad_asi_m,flsh_inst_m}), |
---|
427 | .clk (clk), |
---|
428 | .se (se), .si (), .so () |
---|
429 | ); |
---|
430 | |
---|
431 | assign st_inst_vld_m = real_st_m | flsh_inst_m ; |
---|
432 | |
---|
433 | // do we need ld/st unflushed ? |
---|
434 | wire sta_internal_g; |
---|
435 | |
---|
436 | dff_s #(7) stgw_vld ( |
---|
437 | .din ({sta_internal_m, |
---|
438 | casa_m, thrid_m[1:0],ldst_sz_m[1:0], flsh_inst_m}), |
---|
439 | .q ({sta_internal_g, |
---|
440 | casa_g, thrid_g[1:0],ldst_sz_g[1:0], flsh_inst_g}), |
---|
441 | .clk (clk), |
---|
442 | .se (se), .si (), .so () |
---|
443 | ); |
---|
444 | |
---|
445 | |
---|
446 | // stb-cam will be written by st at rising edge of g-stage. |
---|
447 | // However, st can be flushed after write. To keep, the stb state consistent, |
---|
448 | // The valid and write ptr will not be updated until the rising edge of w2. |
---|
449 | |
---|
450 | wire early_flush_cond_g,partial_flush_st_g ; |
---|
451 | assign early_flush_cond_g = |
---|
452 | (sta_internal_g | ~(lsu_inst_vld_w | blkst_g) | ffu_lsu_kill_fst_w) ; |
---|
453 | assign flush_st_g = (early_flush_cond_g | lsu_stbrwctl_flush_pipe_w) & cam_wptr_vld_g ; |
---|
454 | |
---|
455 | //timing, send to stb_ctl and qualified by stb_cam_wvld_g (thread version of cam_wptr_vld_g) |
---|
456 | //assign partial_flush_st_g = early_flush_cond_g & cam_wptr_vld_g ; |
---|
457 | assign partial_flush_st_g = early_flush_cond_g ; |
---|
458 | |
---|
459 | assign atomic_m = (casa_m | ldstub_m | swap_m) & st_inst_vld_m ; |
---|
460 | |
---|
461 | // WRITE PTR VALID GENERATION. |
---|
462 | |
---|
463 | // meant specifically to squash pcx_rq_for_stb. |
---|
464 | assign stb_cam_wr_no_ivld_m |
---|
465 | = (st_inst_vld_m | casa_m | ldstub_m | swap_m | blkst_m) ; |
---|
466 | |
---|
467 | //bug3610 - kill cam write vld(==stb data write vld next cycle) to avoid datat read and write same cycle |
---|
468 | // to the same entry |
---|
469 | wire b2b_st_detect ; |
---|
470 | |
---|
471 | assign stb_cam_wptr_vld |
---|
472 | = (((st_inst_vld_m | atomic_m) & ifu_tlu_inst_vld_m_bf0) | blkst_m) & ~(flush_st_g & b2b_st_detect) ; |
---|
473 | //= ((st_inst_vld_m | atomic_m) & ifu_tlu_inst_vld_m_bf0) | blkst_m ; // bug3610 |
---|
474 | //= (st_inst_vld_m | atomic_m | (ldst_dbl_m & st_inst_vld_m) | blkst_m) ; |
---|
475 | |
---|
476 | dff_s wptr_g ( |
---|
477 | .din (stb_cam_wptr_vld), .q (cam_wptr_vld_g), |
---|
478 | .clk (clk), |
---|
479 | .se (se), .si (), .so () |
---|
480 | ); |
---|
481 | |
---|
482 | //flop move into mem cell (roll back) |
---|
483 | assign stb_data_wptr_vld = cam_wptr_vld_g ; |
---|
484 | |
---|
485 | // WRITE PTR GENERATION |
---|
486 | |
---|
487 | // It is assumed that if there is a store in the pipe, there is a |
---|
488 | // free entry in the corresponding stb. Otherwise, the pipe would've |
---|
489 | // stalled for the thread. |
---|
490 | |
---|
491 | // If a store-like inst has been flushed, then the old ptr has to be restored |
---|
492 | // and used. This is done within thread specific stb control |
---|
493 | |
---|
494 | assign thread0_m = ~st_thrid_m[1] & ~st_thrid_m[0] ; |
---|
495 | assign thread1_m = ~st_thrid_m[1] & st_thrid_m[0] ; |
---|
496 | assign thread2_m = st_thrid_m[1] & ~st_thrid_m[0] ; |
---|
497 | assign thread3_m = st_thrid_m[1] & st_thrid_m[0] ; |
---|
498 | |
---|
499 | dff_s #(4) stgg_thrd ( |
---|
500 | .din ({thread0_m,thread1_m,thread2_m,thread3_m}), |
---|
501 | .q ({thread0_g,thread1_g,thread2_g,thread3_g}), |
---|
502 | .clk (clk), |
---|
503 | .se (se), .si (), .so () |
---|
504 | ); |
---|
505 | |
---|
506 | assign stb_thrd_en_g[0] = thread0_g ; |
---|
507 | assign stb_thrd_en_g[1] = thread1_g ; |
---|
508 | assign stb_thrd_en_g[2] = thread2_g ; |
---|
509 | assign stb_thrd_en_g[3] = thread3_g ; |
---|
510 | |
---|
511 | //assign stb_wptr[2:0] = |
---|
512 | // thread0_m ? stb_wrptr0[2:0] : |
---|
513 | // thread1_m ? stb_wrptr1[2:0] : |
---|
514 | // thread2_m ? stb_wrptr2[2:0] : |
---|
515 | // thread3_m ? stb_wrptr3[2:0] : 3'bxxx ; |
---|
516 | |
---|
517 | assign stb_wptr[2:0] = |
---|
518 | (thread0_m ? stb_wrptr0[2:0] : 3'b000) | |
---|
519 | (thread1_m ? stb_wrptr1[2:0] : 3'b000) | |
---|
520 | (thread2_m ? stb_wrptr2[2:0] : 3'b000) | |
---|
521 | (thread3_m ? stb_wrptr3[2:0] : 3'b000) ; |
---|
522 | |
---|
523 | assign b2b_st_detect = // detect back-to-back store |
---|
524 | (thread0_m & thread0_g) | |
---|
525 | (thread1_m & thread1_g) | |
---|
526 | (thread2_m & thread2_g) | |
---|
527 | (thread3_m & thread3_g) ; |
---|
528 | |
---|
529 | assign cam_wr_ptr[2:0] = (flush_st_g & b2b_st_detect) ? cam_wptr_d1[2:0] : stb_wptr[2:0] ; |
---|
530 | |
---|
531 | dff_s #(3) wptr_d1 ( |
---|
532 | .din (cam_wr_ptr[2:0]), .q (cam_wptr_d1[2:0]), |
---|
533 | .clk (clk), |
---|
534 | .se (se), .si (), .so () |
---|
535 | ); |
---|
536 | |
---|
537 | assign stb_cam_wvld_m[0] = stb_cam_wptr_vld & thread0_m ; |
---|
538 | assign stb_cam_wvld_m[1] = stb_cam_wptr_vld & thread1_m ; |
---|
539 | assign stb_cam_wvld_m[2] = stb_cam_wptr_vld & thread2_m ; |
---|
540 | assign stb_cam_wvld_m[3] = stb_cam_wptr_vld & thread3_m ; |
---|
541 | |
---|
542 | // contains potential flush conditions. |
---|
543 | assign stb_flush_st_g[0] = partial_flush_st_g ; |
---|
544 | assign stb_flush_st_g[1] = partial_flush_st_g ; |
---|
545 | assign stb_flush_st_g[2] = partial_flush_st_g ; |
---|
546 | assign stb_flush_st_g[3] = partial_flush_st_g ; |
---|
547 | |
---|
548 | // stb-data has a delayed write in w2. Alignment of stb data will be done on write |
---|
549 | // of 64b into stb. This allows write of stb cam and data to be done in the |
---|
550 | // same cycle, and thus read can occur simultaneously for pcx. |
---|
551 | |
---|
552 | //mem cell change to bw_r_rf32x80, flop move into mem cell (roll back) |
---|
553 | //flop outside mem cell |
---|
554 | assign stb_data_wr_ptr[4:0] = {st_thrid_g[1:0],cam_wptr_d1[2:0]}; |
---|
555 | |
---|
556 | // RD PTR/VLD GENERATION |
---|
557 | |
---|
558 | // stb read for dfq dumps data into a bypass flop. Thus a read for the dfq can occur |
---|
559 | // if a thread's stb has an acked entry and the bypass flop is empty. |
---|
560 | // stb read for pcx occurs on availability of queue entry. |
---|
561 | |
---|
562 | // Both dfq and pcx require a read of the cam and data. The reads |
---|
563 | // can thus not happen when load that hits in the stb is in the w2 (change to W3) |
---|
564 | // stage and a store is in the g-stage of the pipe. Both |
---|
565 | // probabilities are low. |
---|
566 | |
---|
567 | // ??Read for pcx takes priority over dfq. No deadlock can occur |
---|
568 | // ??as at some point the pcx reads will be exhausted and the stb |
---|
569 | // ??will have to drain itself. The stb is self-regulating in this regard. |
---|
570 | |
---|
571 | // priority of stb read: ld_cam_hit (full raw bypass) > dfq > pcx |
---|
572 | |
---|
573 | //==================================================================================== |
---|
574 | //raw bypass timing |
---|
575 | //G/WB W2 W3 W4 |
---|
576 | //cam_hit(from stb_cam output) flop stb_data rd_ptr/rd_vld read STB_DATA/BYP |
---|
577 | //==================================================================================== |
---|
578 | |
---|
579 | wire [1:0] thrid_w2; |
---|
580 | wire [2:0] stb_cam_hit_ptr_w2; |
---|
581 | wire stb_cam_hit_w2; |
---|
582 | wire stb_cam_hit_w; |
---|
583 | |
---|
584 | //bug3503 |
---|
585 | assign stb_cam_hit_w = stb_cam_hit & lsu_inst_vld_w & ~lsu_stbrwctl_flush_pipe_w; |
---|
586 | |
---|
587 | dff_s #(6) stb_cam_hit_stg_w2 ( |
---|
588 | .din ({thrid_g[1:0], stb_cam_hit_ptr[2:0], stb_cam_hit_w }), |
---|
589 | .q ({thrid_w2[1:0], stb_cam_hit_ptr_w2[2:0], stb_cam_hit_w2}), |
---|
590 | .clk (clk), |
---|
591 | .se (se), .si (), .so () |
---|
592 | ); |
---|
593 | |
---|
594 | // logic moved to qctl1 |
---|
595 | // pcx is making request for data in current cycle. Can be multi-hot. |
---|
596 | //assign pcx_any_rq_for_stb = |pcx_rq_for_stb[3:0] ; |
---|
597 | //assign pcx_any_rq_for_stb = |
---|
598 | // (pcx_rq_for_stb[0] & ~lsu_st_pcx_rq_kill_w2[0]) | |
---|
599 | // (pcx_rq_for_stb[1] & ~lsu_st_pcx_rq_kill_w2[1]) | |
---|
600 | // (pcx_rq_for_stb[2] & ~lsu_st_pcx_rq_kill_w2[2]) | |
---|
601 | // (pcx_rq_for_stb[3] & ~lsu_st_pcx_rq_kill_w2[3]) ; |
---|
602 | |
---|
603 | // ??ld-cam hit based read takes precedence |
---|
604 | // ??Timing : This could be made pessimistic by using ld_inst_vld_g |
---|
605 | |
---|
606 | //assign stb_select_rptr[3:0] = pcx_rq_for_stb[3:0] ; // timing fix |
---|
607 | assign stb_select_rptr[3:0] = lsu_st_pcx_rq_pick[3:0] ; |
---|
608 | |
---|
609 | // This could be a critical path. Be careful ! |
---|
610 | //assign stb_rdptr0[2:0] = ~dfq_any_rq_for_stb ? stb_pcx_rptr0[2:0] : stb_dfq_rptr0[2:0] ; |
---|
611 | assign stb_rdptr0[2:0] = stb_pcx_rptr0[2:0] ; |
---|
612 | assign stb_rdptr1[2:0] = stb_pcx_rptr1[2:0] ; |
---|
613 | assign stb_rdptr2[2:0] = stb_pcx_rptr2[2:0] ; |
---|
614 | assign stb_rdptr3[2:0] = stb_pcx_rptr3[2:0] ; |
---|
615 | |
---|
616 | // logic moved to qctl1 |
---|
617 | //wire [1:0] stb_rd_tid ; |
---|
618 | // |
---|
619 | //assign stb_rd_tid[0] = pcx_rq_for_stb[1] | pcx_rq_for_stb[3] ; |
---|
620 | //assign stb_rd_tid[1] = pcx_rq_for_stb[2] | pcx_rq_for_stb[3] ; |
---|
621 | // |
---|
622 | //dff #(2) stbtid_stgd1 ( |
---|
623 | // .din (stb_rd_tid[1:0]), .q (lsu_stb_rd_tid[1:0]), |
---|
624 | // .clk (clk), |
---|
625 | // .se (se), .si (), .so () |
---|
626 | // ); |
---|
627 | |
---|
628 | //assign stb_dfq_rd_id[2:0] = stb_data_rd_ptr[2:0] ; // or cam rd ptr |
---|
629 | |
---|
630 | //timing fix:5/6/03 |
---|
631 | //bug4988 - change the prirority from 0->3 to 3->0; the reason is when select_rptr=0, the |
---|
632 | // default thread id(rptr[4:3])=thread0 but the default rptr[2:0]=thread3. If |
---|
633 | // thread0 and thread3 rptr are the same and the thread0 write is occuring, the |
---|
634 | // rptr[4:0] is same as wptr[4:0] |
---|
635 | wire [2:0] stb_rdptr ; |
---|
636 | //assign stb_rdptr[2:0] = |
---|
637 | // stb_select_rptr[0] ? stb_rdptr0[2:0] : |
---|
638 | // stb_select_rptr[1] ? stb_rdptr1[2:0] : |
---|
639 | // stb_select_rptr[2] ? stb_rdptr2[2:0] : |
---|
640 | // stb_rdptr3[2:0] ; |
---|
641 | |
---|
642 | //assign stb_rdptr[2:0] = |
---|
643 | // stb_select_rptr[3] ? stb_rdptr3[2:0] : |
---|
644 | // stb_select_rptr[2] ? stb_rdptr2[2:0] : |
---|
645 | // stb_select_rptr[1] ? stb_rdptr1[2:0] : |
---|
646 | // stb_rdptr0[2:0] ; |
---|
647 | |
---|
648 | assign stb_rdptr[2:0] = |
---|
649 | (stb_select_rptr[3] ? stb_rdptr3[2:0] : 3'b0) | |
---|
650 | (stb_select_rptr[2] ? stb_rdptr2[2:0] : 3'b0) | |
---|
651 | (stb_select_rptr[1] ? stb_rdptr1[2:0] : 3'b0) | |
---|
652 | (stb_select_rptr[0] ? stb_rdptr0[2:0] : 3'b0) ; |
---|
653 | |
---|
654 | //timing fix: 8/29/03 - remove the default select logic for stb_select_rptr since synthesis is forced to replace |
---|
655 | // 4to1 mux w/ and-or mux or 2to1 mux |
---|
656 | //wire stb_select_rptr_b3; |
---|
657 | //assign stb_select_rptr_b3 = ~|stb_select_rptr[2:0]; |
---|
658 | |
---|
659 | wire [2:0] stb_rdptr_l; |
---|
660 | |
---|
661 | assign stb_rdptr_l[2:0] = ~stb_rdptr[2:0] ; |
---|
662 | //bw_u1_muxi41d_2x UZsize_stb_rdptr_b0_mux( |
---|
663 | // .z(stb_rdptr_l[0]), |
---|
664 | // .d0(stb_rdptr0[0]), |
---|
665 | // .d1(stb_rdptr1[0]), |
---|
666 | // .d2(stb_rdptr2[0]), |
---|
667 | // .d3(stb_rdptr3[0]), |
---|
668 | // .s0(stb_select_rptr[0]), |
---|
669 | // .s1(stb_select_rptr[1]), |
---|
670 | // .s2(stb_select_rptr[2]), |
---|
671 | // .s3(stb_select_rptr[3])); |
---|
672 | // |
---|
673 | //bw_u1_muxi41d_2x UZsize_stb_rdptr_b1_mux( |
---|
674 | // .z(stb_rdptr_l[1]), |
---|
675 | // .d0(stb_rdptr0[1]), |
---|
676 | // .d1(stb_rdptr1[1]), |
---|
677 | // .d2(stb_rdptr2[1]), |
---|
678 | // .d3(stb_rdptr3[1]), |
---|
679 | // .s0(stb_select_rptr[0]), |
---|
680 | // .s1(stb_select_rptr[1]), |
---|
681 | // .s2(stb_select_rptr[2]), |
---|
682 | // .s3(stb_select_rptr[3])); |
---|
683 | // |
---|
684 | //bw_u1_muxi41d_2x UZsize_stb_rdptr_b2_mux( |
---|
685 | // .z(stb_rdptr_l[2]), |
---|
686 | // .d0(stb_rdptr0[2]), |
---|
687 | // .d1(stb_rdptr1[2]), |
---|
688 | // .d2(stb_rdptr2[2]), |
---|
689 | // .d3(stb_rdptr3[2]), |
---|
690 | // .s0(stb_select_rptr[0]), |
---|
691 | // .s1(stb_select_rptr[1]), |
---|
692 | // .s2(stb_select_rptr[2]), |
---|
693 | // .s3(stb_select_rptr[3])); |
---|
694 | // |
---|
695 | |
---|
696 | assign stb_rd_thrid[0] = stb_select_rptr[1] | stb_select_rptr[3] ; |
---|
697 | assign stb_rd_thrid[1] = stb_select_rptr[2] | stb_select_rptr[3] ; |
---|
698 | |
---|
699 | // read |
---|
700 | // this mux will have to be accommodated in path !!! Talk to Satya. |
---|
701 | // Timing : This could be made pessimistic by using ld_inst_vld_g |
---|
702 | |
---|
703 | // raw read STB at W3 (changed from W2) |
---|
704 | assign stb_data_rd_ptr[4:0] = stb_cam_hit_w2 ? |
---|
705 | {thrid_w2[1:0],stb_cam_hit_ptr_w2[2:0]} : // rd based on ld hit |
---|
706 | {stb_rd_thrid[1:0],~stb_rdptr_l[2:0]} ; // rd for pcx or dfq |
---|
707 | |
---|
708 | // Blk-st modification for thread. |
---|
709 | assign st_thrid_m[1:0] = blkst_m ? ffu_lsu_blk_st_tid_m[1:0] : thrid_m[1:0] ; |
---|
710 | dff_s #(2) stid_stgg ( |
---|
711 | .din (st_thrid_m[1:0]), |
---|
712 | .q (st_thrid_g[1:0]), |
---|
713 | .clk (clk), |
---|
714 | .se (se), .si (), .so () |
---|
715 | ); |
---|
716 | |
---|
717 | //timing fix: 5/6/03 |
---|
718 | //assign stb_cam_rw_ptr[4:0] = stb_cam_wptr_vld ? |
---|
719 | // {st_thrid_m[1:0],cam_wr_ptr[2:0]} : // write |
---|
720 | // {stb_rd_thrid[1:0],stb_rdptr[2:0]} ; // read |
---|
721 | |
---|
722 | wire [2:0] cam_wr_ptr_l; |
---|
723 | wire [1:0] stb_rd_thrid_l; |
---|
724 | wire [1:0] st_thrid_m_l; |
---|
725 | |
---|
726 | assign cam_wr_ptr_l[2:0] = ~cam_wr_ptr[2:0]; |
---|
727 | assign stb_rd_thrid_l[1:0] = ~stb_rd_thrid[1:0]; |
---|
728 | assign st_thrid_m_l[1:0] = ~st_thrid_m[1:0]; |
---|
729 | |
---|
730 | bw_u1_muxi21_2x UZsize_stb_cam_rw_ptr_b0_mux( |
---|
731 | .z(stb_cam_rw_ptr[0]), |
---|
732 | .d0(stb_rdptr_l[0]), |
---|
733 | .d1(cam_wr_ptr_l[0]), |
---|
734 | .s(stb_cam_wptr_vld)); |
---|
735 | |
---|
736 | bw_u1_muxi21_2x UZsize_stb_cam_rw_ptr_b1_mux( |
---|
737 | .z(stb_cam_rw_ptr[1]), |
---|
738 | .d0(stb_rdptr_l[1]), |
---|
739 | .d1(cam_wr_ptr_l[1]), |
---|
740 | .s(stb_cam_wptr_vld)); |
---|
741 | |
---|
742 | bw_u1_muxi21_2x UZsize_stb_cam_rw_ptr_b2_mux( |
---|
743 | .z(stb_cam_rw_ptr[2]), |
---|
744 | .d0(stb_rdptr_l[2]), |
---|
745 | .d1(cam_wr_ptr_l[2]), |
---|
746 | .s(stb_cam_wptr_vld)); |
---|
747 | |
---|
748 | bw_u1_muxi21_2x UZsize_stb_cam_rw_ptr_b3_mux( |
---|
749 | .z(stb_cam_rw_ptr[3]), |
---|
750 | .d0(stb_rd_thrid_l[0]), |
---|
751 | .d1(st_thrid_m_l[0]), |
---|
752 | .s(stb_cam_wptr_vld)); |
---|
753 | |
---|
754 | bw_u1_muxi21_2x UZsize_stb_cam_rw_ptr_b4_mux( |
---|
755 | .z(stb_cam_rw_ptr[4]), |
---|
756 | .d0(stb_rd_thrid_l[1]), |
---|
757 | .d1(st_thrid_m_l[1]), |
---|
758 | .s(stb_cam_wptr_vld)); |
---|
759 | |
---|
760 | |
---|
761 | |
---|
762 | //raw read STB at W3 (not W2) |
---|
763 | //timing fix: 9/2/03 - reduce fanout in stb_rwctl for lsu_st_pcx_rq_pick - gen separate signal for |
---|
764 | // stb_cam_rptr_vld and stb_data_rptr_vld |
---|
765 | |
---|
766 | //bug4988 - qual lsu_st_pcx_rq_vld w/ no write vld to stb_data. use stb_cam_wr_no_ivld_m instead of write vld. |
---|
767 | // this is the same signal used to kill pcx_rq_for_stb |
---|
768 | // stb_cam_rptr_vld is not set if stb_cam_wptr_vld=1 |
---|
769 | |
---|
770 | assign stb_data_rptr_vld = |
---|
771 | //(|stb_select_rptr[3:0]) | // pcx/dfq rd - timing fix |
---|
772 | //lsu_st_pcx_rq_vld | // pcx/dfq rd // bug4988 |
---|
773 | (lsu_st_pcx_rq_vld & ~stb_cam_wr_no_ivld_m) | // pcx/dfq rd |
---|
774 | stb_cam_hit_w2 ; // cam hit requires read whether single or multiple |
---|
775 | |
---|
776 | //raw read STB at W3 (not W2) |
---|
777 | //timing fix: 9/2/03 - reduce fanout in stb_rwctl for lsu_st_pcx_rq_pick - gen separate signal for |
---|
778 | // stb_cam_rptr_vld and stb_data_rptr_vld |
---|
779 | assign stb_cam_rptr_vld = |
---|
780 | //((|stb_select_rptr[3:0]) & ~(stb_cam_hit_w2)) & // only pcx read - timing fix |
---|
781 | (lsu_st_pcx_rq_vld & ~(stb_cam_hit_w2)) & // only pcx read |
---|
782 | ~stb_cam_wptr_vld ; // st,st-like write does not block |
---|
783 | |
---|
784 | // lsu_stb_rd_vld_d1 - not used |
---|
785 | //dff stbrd_stgd1 ( |
---|
786 | // .din (stb_cam_rptr_vld), .q (lsu_stb_rd_vld_d1), |
---|
787 | // .clk (clk), |
---|
788 | // .se (se), .si (), .so () |
---|
789 | // ); |
---|
790 | |
---|
791 | // logic moved to qctl1 |
---|
792 | //dff #(1) prvld_stgd1 ( |
---|
793 | // .din (pcx_any_rq_for_stb), |
---|
794 | // .q (lsu_stb_pcx_rvld_d1), |
---|
795 | // .clk (clk), |
---|
796 | // .se (se), .si (), .so () |
---|
797 | // ); |
---|
798 | |
---|
799 | assign stb_cam_cm_tid[1:0] = thrid_m[1:0] ; |
---|
800 | |
---|
801 | |
---|
802 | //========================================================================================= |
---|
803 | // BYTE MASK FORMATTING |
---|
804 | //========================================================================================= |
---|
805 | |
---|
806 | |
---|
807 | // Write/CAM Data for CAM RAM. |
---|
808 | // Physical dword aligned addr - PA[39:3] (37b) |
---|
809 | // Byte Mask - (8b) |
---|
810 | // Total - 45b |
---|
811 | |
---|
812 | // | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | |
---|
813 | // | hw3 | hw2 | hw1 | hw0 | |
---|
814 | // | w1 | w0 | |
---|
815 | // | dw | |
---|
816 | |
---|
817 | |
---|
818 | |
---|
819 | //dff #(11) va_m ( |
---|
820 | // .din (exu_lsu_ldst_va_e[10:0]), .q (pipe_ldst_va_m[10:0]), |
---|
821 | // .clk (clk), |
---|
822 | // .se (se), .si (), .so () |
---|
823 | // ); |
---|
824 | |
---|
825 | assign pipe_ldst_va_m[9:0] = lsu_ldst_va_m[9:0]; |
---|
826 | |
---|
827 | // ldst_byte may not be needed |
---|
828 | assign ldst_byte = ~ldst_sz_m[1] & ~ldst_sz_m[0] ; // 00 |
---|
829 | assign ldst_hwrd = ~ldst_sz_m[1] & ldst_sz_m[0] ; // 01 |
---|
830 | assign ldst_word = ldst_sz_m[1] & ~ldst_sz_m[0] ; // 10 |
---|
831 | assign ldst_dwrd = ldst_sz_m[1] & ldst_sz_m[0] ; // 11 |
---|
832 | |
---|
833 | // Note : dword term is common. |
---|
834 | assign ldst_byte_mask[0] = |
---|
835 | ( ldst_va_m[2] & ldst_va_m[1] & ldst_va_m[0] ) | |
---|
836 | ( ldst_va_m[2] & ldst_va_m[1] & ~ldst_va_m[0] & (ldst_hwrd)) | |
---|
837 | ( ldst_va_m[2] & ~ldst_va_m[1] & ~ldst_va_m[0] & (ldst_word)) | |
---|
838 | (~ldst_va_m[2] & ~ldst_va_m[1] & ~ldst_va_m[0] & (ldst_dwrd)) ; |
---|
839 | assign ldst_byte_mask[1] = |
---|
840 | ( ldst_va_m[2] & ldst_va_m[1] & ~ldst_va_m[0]) | |
---|
841 | ( ldst_va_m[2] & ~ldst_va_m[1] & ~ldst_va_m[0] & (ldst_word)) | |
---|
842 | (~ldst_va_m[2] & ~ldst_va_m[1] & ~ldst_va_m[0] & (ldst_dwrd)) ; |
---|
843 | assign ldst_byte_mask[2] = |
---|
844 | ( ldst_va_m[2] & ~ldst_va_m[1] & ldst_va_m[0]) | |
---|
845 | ( ldst_va_m[2] & ~ldst_va_m[1] & ~ldst_va_m[0] & (ldst_hwrd | ldst_word)) | |
---|
846 | (~ldst_va_m[2] & ~ldst_va_m[1] & ~ldst_va_m[0] & (ldst_dwrd)) ; |
---|
847 | assign ldst_byte_mask[3] = |
---|
848 | ( ldst_va_m[2] & ~ldst_va_m[1] & ~ldst_va_m[0]) | |
---|
849 | (~ldst_va_m[2] & ~ldst_va_m[1] & ~ldst_va_m[0] & (ldst_dwrd)) ; |
---|
850 | assign ldst_byte_mask[4] = |
---|
851 | (~ldst_va_m[2] & ldst_va_m[1] & ldst_va_m[0]) | |
---|
852 | (~ldst_va_m[2] & ldst_va_m[1] & ~ldst_va_m[0] & (ldst_hwrd)) | |
---|
853 | (~ldst_va_m[2] & ~ldst_va_m[1] & ~ldst_va_m[0] & (ldst_dwrd | ldst_word)) ; |
---|
854 | assign ldst_byte_mask[5] = |
---|
855 | (~ldst_va_m[2] & ldst_va_m[1] & ~ldst_va_m[0]) | |
---|
856 | (~ldst_va_m[2] & ~ldst_va_m[1] & ~ldst_va_m[0] & (ldst_dwrd | ldst_word)) ; |
---|
857 | assign ldst_byte_mask[6] = |
---|
858 | (~ldst_va_m[2] & ~ldst_va_m[1] & ldst_va_m[0]) | |
---|
859 | (~ldst_va_m[2] & ~ldst_va_m[1] & ~ldst_va_m[0] & (ldst_dwrd | ldst_word | ldst_hwrd)) ; |
---|
860 | assign ldst_byte_mask[7] = |
---|
861 | (~ldst_va_m[2] & ~ldst_va_m[1] & ~ldst_va_m[0]) ; |
---|
862 | |
---|
863 | assign stb_ldst_byte_msk[7:0] = ldst_byte_mask[7:0]; |
---|
864 | |
---|
865 | bw_u1_minbuf_5x UZfix_stb_ldst_byte_msk_min_b0 (.a(ldst_byte_mask[0]), .z(stb_ldst_byte_msk_min[0])); |
---|
866 | bw_u1_minbuf_5x UZfix_stb_ldst_byte_msk_min_b1 (.a(ldst_byte_mask[1]), .z(stb_ldst_byte_msk_min[1])); |
---|
867 | bw_u1_minbuf_5x UZfix_stb_ldst_byte_msk_min_b2 (.a(ldst_byte_mask[2]), .z(stb_ldst_byte_msk_min[2])); |
---|
868 | bw_u1_minbuf_5x UZfix_stb_ldst_byte_msk_min_b3 (.a(ldst_byte_mask[3]), .z(stb_ldst_byte_msk_min[3])); |
---|
869 | bw_u1_minbuf_5x UZfix_stb_ldst_byte_msk_min_b4 (.a(ldst_byte_mask[4]), .z(stb_ldst_byte_msk_min[4])); |
---|
870 | bw_u1_minbuf_5x UZfix_stb_ldst_byte_msk_min_b5 (.a(ldst_byte_mask[5]), .z(stb_ldst_byte_msk_min[5])); |
---|
871 | bw_u1_minbuf_5x UZfix_stb_ldst_byte_msk_min_b6 (.a(ldst_byte_mask[6]), .z(stb_ldst_byte_msk_min[6])); |
---|
872 | bw_u1_minbuf_5x UZfix_stb_ldst_byte_msk_min_b7 (.a(ldst_byte_mask[7]), .z(stb_ldst_byte_msk_min[7])); |
---|
873 | |
---|
874 | |
---|
875 | // Generate selects to format st data |
---|
876 | assign lsu_st_sz_bhww_m = ldst_byte | ldst_hwrd | ldst_word ; // byte or hword or word |
---|
877 | assign lsu_st_sz_dw_m = ldst_dwrd ; // double word |
---|
878 | assign lsu_st_sz_bhw_m = ldst_byte | ldst_hwrd ; // byte or hword |
---|
879 | assign lsu_st_sz_wdw_m = ldst_word | ldst_dwrd ; // word or dword |
---|
880 | assign lsu_st_sz_b_m = ldst_byte ; // byte |
---|
881 | assign lsu_st_sz_w_m = ldst_word ; // word |
---|
882 | assign lsu_st_sz_hw_m = ldst_hwrd ; // hword |
---|
883 | assign lsu_st_sz_hww_m = ldst_hwrd | ldst_word ; // hword or word |
---|
884 | |
---|
885 | //========================================================================================= |
---|
886 | // BLK-ST HANDLING |
---|
887 | //========================================================================================= |
---|
888 | |
---|
889 | wire blkst_m_tmp ; |
---|
890 | dff_s stgm_bst ( |
---|
891 | .din (ffu_lsu_blk_st_e), |
---|
892 | .q (blkst_m_tmp), |
---|
893 | .clk (clk), |
---|
894 | .se (se), .si (), .so () |
---|
895 | ); |
---|
896 | |
---|
897 | assign blkst_m = blkst_m_tmp & ~(real_st_m | flsh_inst_m | |
---|
898 | ld_inst_vld_m) ; // Bug 3444 |
---|
899 | |
---|
900 | dff_s stgg_bst ( |
---|
901 | .din (blkst_m), |
---|
902 | .q (blkst_g), |
---|
903 | .clk (clk), |
---|
904 | .se (se), .si (), .so () |
---|
905 | ); |
---|
906 | |
---|
907 | wire snap_blk_st_local_m ; |
---|
908 | assign snap_blk_st_local_m = lsu_snap_blk_st_m & ifu_tlu_inst_vld_m_bf0 ; |
---|
909 | |
---|
910 | wire [1:0] bst_sz_m ; |
---|
911 | wire [9:0] bst_va_m ; |
---|
912 | // output to be used in m-stage. |
---|
913 | dffe_s #(9) bst_state_m ( |
---|
914 | .din ({ldst_sz_m[1:0],ldst_va_m[9:6],ldst_va_m[2:0]}), |
---|
915 | .q ({bst_sz_m[1:0],bst_va_m[9:6],bst_va_m[2:0]}), |
---|
916 | .en (snap_blk_st_local_m), |
---|
917 | .clk (clk), |
---|
918 | .se (se), .si (), .so () |
---|
919 | ); |
---|
920 | |
---|
921 | dff_s #(3) bsva_stgm ( |
---|
922 | .din (ffu_lsu_blk_st_va_e[5:3]), .q (bst_va_m[5:3]), |
---|
923 | .clk (clk), |
---|
924 | .se (se), .si (), .so () |
---|
925 | ); |
---|
926 | |
---|
927 | //assign bst_va_m[5:3] = ffu_lsu_blk_st_va_e[5:3] ; |
---|
928 | |
---|
929 | //assign ldst_va_m[10] = pipe_ldst_va_m[10] ; |
---|
930 | assign ldst_va_m[9:0] = blkst_m ? bst_va_m[9:0] : pipe_ldst_va_m[9:0] ; |
---|
931 | |
---|
932 | assign lsu_stb_va_m[9:3] = ldst_va_m[9:3] ; |
---|
933 | |
---|
934 | assign ldst_sz_m[1:0] = blkst_m ? bst_sz_m[1:0] : pipe_ldst_sz_m[1:0] ; |
---|
935 | |
---|
936 | //========================================================================================= |
---|
937 | // WRITE DATA FOR DATA RAM |
---|
938 | //========================================================================================= |
---|
939 | |
---|
940 | // Write Data for DATA RAM. |
---|
941 | // Data - (64b) |
---|
942 | // (8b parity is generated on read) |
---|
943 | // Rqtype - (3b) |
---|
944 | // Size - (3b). |
---|
945 | // Addr - (3b). Lower 3b of 40b addr. |
---|
946 | // (set index and way available from ctl state. |
---|
947 | // Total - 73b. |
---|
948 | |
---|
949 | // st-quad requires own encoding. |
---|
950 | // assume does not have to be changed for blk-st |
---|
951 | assign st_rq_type_m[2:0] = |
---|
952 | casa_m ? 3'b010 : // cas pkt 1 |
---|
953 | (ldstub_m | swap_m) ? 3'b110 : // ldstub/swap |
---|
954 | //(stquad_m) ? 3'b111 : // stquad-pkt1 |
---|
955 | 3'b001 ; // normal store or partial interrupt rq type |
---|
956 | |
---|
957 | //assign lsu_st_rq_type_m[2:0] = st_rq_type_m[2:0] ; |
---|
958 | assign lsu_st_rq_type_m[2:1] = st_rq_type_m[2:1] ; |
---|
959 | |
---|
960 | // Need ASI decode |
---|
961 | /*wire lsu_stquad_inst_m ; |
---|
962 | assign lsu_stquad_inst_m = ldst_dbl_m & st_inst_vld_m & quad_asi_m ; |
---|
963 | */ |
---|
964 | |
---|
965 | wire st_rmo_m,st_rmo_g ; |
---|
966 | assign st_rmo_m = lsu_st_rmo_m | blkst_m ; // binit and blk rmo stores. |
---|
967 | dff_s #(9) stgg_etc ( |
---|
968 | .din ({ldst_va_m[3:0],st_rq_type_m[2:0],st_rmo_m,lsu_bst_in_pipe_m}), |
---|
969 | .q ({ldst_va_g[3:0],st_rq_type_g[2:0],st_rmo_g,bst_in_pipe_g}), |
---|
970 | .clk (clk), |
---|
971 | .se (se), .si (), .so () |
---|
972 | ); |
---|
973 | |
---|
974 | wire bst_any_helper ; |
---|
975 | assign bst_any_helper = blkst_g | bst_in_pipe_g ; // Bug 3934 |
---|
976 | |
---|
977 | // Size will have to be changed to 2bits. |
---|
978 | // 7 more bits could be added to data ram to save read of cam in providing dfq pkt !!! |
---|
979 | assign stb_wdata_ramd_b75_b64[75:64] = |
---|
980 | {st_rmo_g,st_rq_type_g[2:0],flsh_inst_g,bst_any_helper,ldst_sz_g[1:0],ldst_va_g[3:0]}; |
---|
981 | // Bug3395, 3934 |
---|
982 | |
---|
983 | //========================================================================================= |
---|
984 | // FULL/PARTIAL RAW CALCULATION |
---|
985 | //========================================================================================= |
---|
986 | |
---|
987 | // io load cannot bypass from stb. A stb hit results in an io-ld being treated |
---|
988 | // as a partial-raw. (OR should it be serialized behind any io store ??) |
---|
989 | wire io_ld,io_ld_w2 ; |
---|
990 | assign io_ld = tlb_pgnum_b39_g ; // Bug 4362 |
---|
991 | |
---|
992 | // full-raw is squashed on multiple hits in stb. Treated like partial raw. |
---|
993 | // Ensure that all ld and ld-like instructions signal ld_inst_vld. We can then |
---|
994 | // remove qualification with ld_inst_vld_g. |
---|
995 | /*assign ld_stb_full_raw_g = |
---|
996 | (|stb_ld_full_raw[7:0]) & ~(stb_cam_mhit | ldq_hit_g | io_ld) ; |
---|
997 | assign ld_stb_full_raw_g[0] = (|stb_ld_full_raw[7:0]) & ld_inst_vld_g & |
---|
998 | ~(stb_cam_mhit | ldq_hit_g[0] | io_ld) & thread0_g ; |
---|
999 | //~(ld_raw_mhit | ld_stq_hit_g[0] | io_ld) & thread0_g ; |
---|
1000 | assign ld_stb_full_raw_g[1] = (|stb_ld_full_raw[7:0]) & ld_inst_vld_g & |
---|
1001 | ~(stb_cam_mhit | ldq_hit_g[1] | io_ld) & thread1_g ; |
---|
1002 | assign ld_stb_full_raw_g[2] = (|stb_ld_full_raw[7:0]) & ld_inst_vld_g & |
---|
1003 | ~(stb_cam_mhit | ldq_hit_g[2] | io_ld) & thread2_g ; |
---|
1004 | assign ld_stb_full_raw_g[3] = (|stb_ld_full_raw[7:0]) & ld_inst_vld_g & |
---|
1005 | ~(stb_cam_mhit | ldq_hit_g[3] | io_ld) & thread3_g ; */ |
---|
1006 | // Multiple full raws are also treated like a partial. |
---|
1007 | /*assign ld_stb_partial_raw_g = |
---|
1008 | ((|stb_ld_partial_raw[7:0]) | stb_cam_mhit | ldq_hit_g | (io_ld & stb_not_empty)) ; |
---|
1009 | assign ld_stb_partial_raw_g[0] = |
---|
1010 | ((|stb_ld_partial_raw[7:0]) | stb_cam_mhit | ldq_hit_g[0] | (io_ld & stb_not_empty)) |
---|
1011 | & ld_inst_vld_g & thread0_g ; |
---|
1012 | assign ld_stb_partial_raw_g[1] = |
---|
1013 | ((|stb_ld_partial_raw[7:0]) | stb_cam_mhit | ldq_hit_g[1] | (io_ld & stb_not_empty)) |
---|
1014 | & ld_inst_vld_g & thread1_g ; |
---|
1015 | assign ld_stb_partial_raw_g[2] = |
---|
1016 | ((|stb_ld_partial_raw[7:0]) | stb_cam_mhit | ldq_hit_g[2] | (io_ld & stb_not_empty)) |
---|
1017 | & ld_inst_vld_g & thread2_g ; |
---|
1018 | assign ld_stb_partial_raw_g[3] = |
---|
1019 | ((|stb_ld_partial_raw[7:0]) | stb_cam_mhit | ldq_hit_g[3] | (io_ld & stb_not_empty)) |
---|
1020 | & ld_inst_vld_g & thread3_g; */ |
---|
1021 | |
---|
1022 | //========================================================================================= |
---|
1023 | // STQ HANDLING |
---|
1024 | //========================================================================================= |
---|
1025 | |
---|
1026 | /* REMOVE STQUAD */ |
---|
1027 | |
---|
1028 | //========================================================================================= |
---|
1029 | // LD QUAD HANDLING |
---|
1030 | //========================================================================================= |
---|
1031 | |
---|
1032 | dff_s altsp_stgm ( |
---|
1033 | .din (alt_space_e), .q (alt_space_m), |
---|
1034 | .clk (clk), |
---|
1035 | .se (se), .si (), .so () |
---|
1036 | ); |
---|
1037 | |
---|
1038 | assign lsu_ldquad_inst_m = ldst_dbl_m & ld_inst_vld_m & quad_asi_m & alt_space_m ; |
---|
1039 | |
---|
1040 | /*wire ldquad_inst_g ; |
---|
1041 | dff_s ldq_stgg ( |
---|
1042 | .din (lsu_ldquad_inst_m), .q (ldquad_inst_g), |
---|
1043 | .clk (clk), |
---|
1044 | .se (se), .si (), .so () |
---|
1045 | ); |
---|
1046 | |
---|
1047 | wire ldq_stb_cam_hit ; |
---|
1048 | assign ldq_stb_cam_hit = stb_cam_hit & ldquad_inst_g ; |
---|
1049 | // Terms can be made common. |
---|
1050 | assign ldq_hit_g = ldq_stb_cam_hit ; */ |
---|
1051 | /*assign ldq_hit_g[0] = thread0_g & ldq_stb_cam_hit ; |
---|
1052 | assign ldq_hit_g[1] = thread1_g & ldq_stb_cam_hit ; |
---|
1053 | assign ldq_hit_g[2] = thread2_g & ldq_stb_cam_hit ; |
---|
1054 | assign ldq_hit_g[3] = thread3_g & ldq_stb_cam_hit ; */ |
---|
1055 | |
---|
1056 | //========================================================================================= |
---|
1057 | // STB MULTIPLE HIT GENERATION |
---|
1058 | //========================================================================================= |
---|
1059 | |
---|
1060 | // Multiple hits in stb is to be treated as a partial raw case. The ld however must wait |
---|
1061 | // until the youngest store which hit exits the stb. A ptr needs to be calculated for this case. |
---|
1062 | // A version of stb_wptr is used instead because it is easily available. (Would this have |
---|
1063 | // any significant performance impact ? - No) |
---|
1064 | |
---|
1065 | assign ld_any_raw_vld[7:0] = stb_ld_full_raw[7:0] | stb_ld_partial_raw[7:0] ; |
---|
1066 | |
---|
1067 | dff_s #(16) stgw2_rvld ( |
---|
1068 | .din ({ld_any_raw_vld[7:0],stb_state_ced[7:0]}), |
---|
1069 | .q ({ld_any_raw_vld_d1[7:0],stb_state_ced_d1[7:0]}), |
---|
1070 | .clk (clk), |
---|
1071 | .se (se), .si (), .so () |
---|
1072 | ); |
---|
1073 | |
---|
1074 | |
---|
1075 | // This equation can be optimized for the grape flow. |
---|
1076 | // This can be obtained from stb. |
---|
1077 | /*assign ld_raw_mhit = |
---|
1078 | (ld_any_raw_vld[7] & |(ld_any_raw_vld[6:0])) | |
---|
1079 | (ld_any_raw_vld[6] & |(ld_any_raw_vld[5:0])) | |
---|
1080 | (ld_any_raw_vld[5] & |(ld_any_raw_vld[4:0])) | |
---|
1081 | (ld_any_raw_vld[4] & |(ld_any_raw_vld[3:0])) | |
---|
1082 | (ld_any_raw_vld[3] & |(ld_any_raw_vld[2:0])) | |
---|
1083 | (ld_any_raw_vld[2] & |(ld_any_raw_vld[1:0])) | |
---|
1084 | (ld_any_raw_vld[1] & ld_any_raw_vld[0]) ; */ |
---|
1085 | |
---|
1086 | //========================================================================================= |
---|
1087 | // STB Partial Raw ptr generation |
---|
1088 | //========================================================================================= |
---|
1089 | |
---|
1090 | // The loading on the raw output of the stb cam will be significant if the signal |
---|
1091 | // has to fan out to all 4 ctl blocks. That's why the control has to be localized. |
---|
1092 | |
---|
1093 | // Using the ack bit may result in pessimistic issue of partial raw loads. |
---|
1094 | // For a single partial raw or multiple hit case, detecting whether there is any |
---|
1095 | // unacked store is sufficient. Calculation is for no unacked store. |
---|
1096 | // Can we use cam_hit ptr instead !!! |
---|
1097 | |
---|
1098 | //assign ld_rawp_st_ced_w2 = (~(|(ld_any_raw_vld_d1[7:0] & ~stb_state_ced_d1[7:0]))) ; |
---|
1099 | wire [2:0] wptr_prev ; |
---|
1100 | assign wptr_prev[2:0] = stb_wptr_prev[2:0] ; |
---|
1101 | wire [7:0] wptr_dcd ; // Bug 4294 |
---|
1102 | assign wptr_dcd[0] = ~wptr_prev[2] & ~wptr_prev[1] & ~wptr_prev[0] ; |
---|
1103 | assign wptr_dcd[1] = ~wptr_prev[2] & ~wptr_prev[1] & wptr_prev[0] ; |
---|
1104 | assign wptr_dcd[2] = ~wptr_prev[2] & wptr_prev[1] & ~wptr_prev[0] ; |
---|
1105 | assign wptr_dcd[3] = ~wptr_prev[2] & wptr_prev[1] & wptr_prev[0] ; |
---|
1106 | assign wptr_dcd[4] = wptr_prev[2] & ~wptr_prev[1] & ~wptr_prev[0] ; |
---|
1107 | assign wptr_dcd[5] = wptr_prev[2] & ~wptr_prev[1] & wptr_prev[0] ; |
---|
1108 | assign wptr_dcd[6] = wptr_prev[2] & wptr_prev[1] & ~wptr_prev[0] ; |
---|
1109 | assign wptr_dcd[7] = wptr_prev[2] & wptr_prev[1] & wptr_prev[0] ; |
---|
1110 | |
---|
1111 | wire iold_st_ced_g,iold_st_ced_w2 ; |
---|
1112 | assign iold_st_ced_g = |(wptr_dcd[7:0] & stb_state_ced[7:0]) ; |
---|
1113 | |
---|
1114 | dff_s #(2) ioldced_stgw2 ( |
---|
1115 | .din ({iold_st_ced_g,io_ld}), |
---|
1116 | .q ({iold_st_ced_w2,io_ld_w2}), |
---|
1117 | .clk (clk), |
---|
1118 | .se (se), .si (), .so () |
---|
1119 | ); |
---|
1120 | |
---|
1121 | assign ld_rawp_st_ced_w2 = |
---|
1122 | io_ld_w2 ? iold_st_ced_w2 : |
---|
1123 | (~(|(ld_any_raw_vld_d1[7:0] & ~stb_state_ced_d1[7:0]))) ; |
---|
1124 | |
---|
1125 | // For the case of a single partial raw. |
---|
1126 | assign ld_rawp_stb_id[0] = stb_cam_hit_ptr[0] ; |
---|
1127 | assign ld_rawp_stb_id[1] = stb_cam_hit_ptr[1] ; |
---|
1128 | assign ld_rawp_stb_id[2] = stb_cam_hit_ptr[2] ; |
---|
1129 | /*assign ld_rawp_stb_id[0] = stb_ld_partial_raw[1] | stb_ld_partial_raw[3] | |
---|
1130 | stb_ld_partial_raw[5] | stb_ld_partial_raw[7] ; |
---|
1131 | assign ld_rawp_stb_id[1] = stb_ld_partial_raw[2] | stb_ld_partial_raw[3] | |
---|
1132 | stb_ld_partial_raw[6] | stb_ld_partial_raw[7] ; |
---|
1133 | assign ld_rawp_stb_id[2] = stb_ld_partial_raw[4] | stb_ld_partial_raw[5] | |
---|
1134 | stb_ld_partial_raw[6] | stb_ld_partial_raw[7] ; */ |
---|
1135 | |
---|
1136 | wire [3:0] pipe_thread_g; |
---|
1137 | assign pipe_thread_g[0] = ~thrid_g[1] & ~thrid_g[0]; |
---|
1138 | assign pipe_thread_g[1] = ~thrid_g[1] & thrid_g[0]; |
---|
1139 | assign pipe_thread_g[2] = thrid_g[1] & ~thrid_g[0]; |
---|
1140 | assign pipe_thread_g[3] = thrid_g[1] & thrid_g[0]; |
---|
1141 | |
---|
1142 | assign stb_state_ced[7:0] = |
---|
1143 | ( pipe_thread_g[0] ? stb_state_ced0[7:0] : 8'b0 ) | |
---|
1144 | ( pipe_thread_g[1] ? stb_state_ced1[7:0] : 8'b0 ) | |
---|
1145 | ( pipe_thread_g[2] ? stb_state_ced2[7:0] : 8'b0 ) | |
---|
1146 | ( pipe_thread_g[3] ? stb_state_ced3[7:0] : 8'b0 ); |
---|
1147 | |
---|
1148 | assign stb_wptr_prev[2:0] = |
---|
1149 | (pipe_thread_g[0] ? stb_wrptr0_prev[2:0] : 3'b0) | |
---|
1150 | (pipe_thread_g[1] ? stb_wrptr1_prev[2:0] : 3'b0) | |
---|
1151 | (pipe_thread_g[2] ? stb_wrptr2_prev[2:0] : 3'b0) | |
---|
1152 | (pipe_thread_g[3] ? stb_wrptr3_prev[2:0] : 3'b0); |
---|
1153 | |
---|
1154 | assign stb_not_empty = |
---|
1155 | (pipe_thread_g[0] & ~lsu_stb_empty[0] ) | |
---|
1156 | (pipe_thread_g[1] & ~lsu_stb_empty[1] ) | |
---|
1157 | (pipe_thread_g[2] & ~lsu_stb_empty[2] ) | |
---|
1158 | (pipe_thread_g[3] & ~lsu_stb_empty[3] ) ; |
---|
1159 | |
---|
1160 | assign lsu_stb_empty_buf[3:0] = lsu_stb_empty[3:0] ; |
---|
1161 | assign lsu_spu_stb_empty[3:0] = lsu_stb_empty[3:0] ; |
---|
1162 | |
---|
1163 | //wire ldstdbl_g ; |
---|
1164 | // stdbl should be qualified with quad_asi_g !!! |
---|
1165 | //assign ldstdbl_g = ldst_dbl_g & (ld_inst_vld_g | st_inst_vld_g) & ~ldst_fp_g ; |
---|
1166 | |
---|
1167 | // casa_g and stdbl_g may not be required. |
---|
1168 | //assign ld_rawp_st_ackid_g[2:0] = |
---|
1169 | // (casa_g | ldstdbl_g | stb_cam_mhit | (io_ld & stb_not_empty)) |
---|
1170 | // ? stb_wptr_prev[2:0] : ld_rawp_stb_id[2:0] ; |
---|
1171 | |
---|
1172 | //=================================================== |
---|
1173 | //casa: need st-st order |
---|
1174 | //st cam mhit: cannot figure out the youngest |
---|
1175 | //io: side effect |
---|
1176 | //remove int ldd and quad ldd, why need ldstdbl? |
---|
1177 | //=================================================== |
---|
1178 | wire [2:0] ld_rawp_st_ackid_g ; |
---|
1179 | |
---|
1180 | assign ld_rawp_st_ackid_g[2:0] = |
---|
1181 | (casa_g | stb_cam_mhit | (io_ld & stb_not_empty))? |
---|
1182 | stb_wptr_prev[2:0] : ld_rawp_stb_id[2:0] ; |
---|
1183 | |
---|
1184 | dff_s #(3) rawpackid_w2 ( |
---|
1185 | .din (ld_rawp_st_ackid_g[2:0]), |
---|
1186 | .q (ld_rawp_st_ackid_w2[2:0]), |
---|
1187 | .clk (clk), |
---|
1188 | .se (se), .si (), .so () |
---|
1189 | ); |
---|
1190 | |
---|
1191 | |
---|
1192 | assign lsu_ifu_stbcnt0[3:0] = lsu_stbcnt0[3:0] ; |
---|
1193 | assign lsu_ifu_stbcnt1[3:0] = lsu_stbcnt1[3:0] ; |
---|
1194 | assign lsu_ifu_stbcnt2[3:0] = lsu_stbcnt2[3:0] ; |
---|
1195 | assign lsu_ifu_stbcnt3[3:0] = lsu_stbcnt3[3:0] ; |
---|
1196 | |
---|
1197 | assign lsu_ffu_stb_full0 = lsu_stbcnt0[3]; |
---|
1198 | assign lsu_ffu_stb_full1 = lsu_stbcnt1[3]; |
---|
1199 | assign lsu_ffu_stb_full2 = lsu_stbcnt2[3]; |
---|
1200 | assign lsu_ffu_stb_full3 = lsu_stbcnt3[3]; |
---|
1201 | |
---|
1202 | endmodule |
---|
1203 | |
---|