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

Subversion Repositories s1_core

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 95 fafa1971
// ========== Copyright Header Begin ==========================================
2
// 
3
// OpenSPARC T1 Processor File: sparc_ifu_dcl.v
4
// Copyright (c) 2006 Sun Microsystems, Inc.  All Rights Reserved.
5
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES.
6
// 
7
// The above named program is free software; you can redistribute it and/or
8
// modify it under the terms of the GNU General Public
9
// License version 2 as published by the Free Software Foundation.
10
// 
11
// The above named program is distributed in the hope that it will be 
12
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
// General Public License for more details.
15
// 
16
// You should have received a copy of the GNU General Public
17
// License along with this work; if not, write to the Free Software
18
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
19
// 
20
// ========== Copyright Header End ============================================
21 113 albert.wat
`ifdef SIMPLY_RISC_TWEAKS
22
`define SIMPLY_RISC_SCANIN .si(0)
23
`define SIMPLY_RISC_SCANDATA .sd(0)
24
`else
25
`define SIMPLY_RISC_SCANIN .si()
26
`define SIMPLY_RISC_SCANDATA .sd()
27
`endif
28 95 fafa1971
////////////////////////////////////////////////////////////////////////
29
/*
30
//  Module Name: sparc_ifu_dcl
31
//  Description:
32
//   The decode control logic block does branch condition evaluation,
33
//   delay slot management, and appropriate condition code
34
//   selection.  It also executes the tcc instruction and kills the E
35
//   stage instruction if a move did not succeed.  The DCL block is
36
//   also responsible for generating the correct select signals to
37
//   choose the branch offset and immediate operand.
38
//
39
*/
40
////////////////////////////////////////////////////////////////////////
41
 
42 113 albert.wat
`define CC_N  3
43
`define CC_Z  2
44
`define CC_V  1
45
`define CC_C  0
46 95 fafa1971
 
47 113 albert.wat
`define FP_U  3
48
`define FP_G  2
49
`define FP_L  1
50
`define FP_E  0
51 95 fafa1971
 
52 113 albert.wat
`define FSR_FCC0_HI 11
53
`define FSR_FCC0_LO 10
54
`define FSR_FCC1_HI 33
55
`define FSR_FCC1_LO 32
56
`define FSR_FCC2_HI 35
57
`define FSR_FCC2_LO 34
58
`define FSR_FCC3_HI 37
59
`define FSR_FCC3_LO 36
60 95 fafa1971
 
61
 
62
module sparc_ifu_dcl(/*AUTOARG*/
63
   // Outputs
64
   ifu_exu_kill_e, ifu_exu_dontmv_regz0_e, ifu_exu_dontmv_regz1_e,
65
   ifu_exu_tcc_e, ifu_exu_dbrinst_d, ifu_ffu_mvcnd_m,
66
   dcl_fcl_bcregz0_e, dcl_fcl_bcregz1_e, dtu_inst_anull_e,
67
   dcl_swl_tcc_done_m, dcl_imd_immdata_sel_simm13_d_l,
68
   dcl_imd_immdata_sel_movcc_d_l, dcl_imd_immdata_sel_sethi_d_l,
69
   dcl_imd_immdata_sel_movr_d_l, dcl_imd_broff_sel_call_d_l,
70
   dcl_imd_broff_sel_br_d_l, dcl_imd_broff_sel_bcc_d_l,
71
   dcl_imd_broff_sel_bpcc_d_l, dcl_imd_immbr_sel_br_d, so,
72
   // Inputs
73
   rclk, se, si, dtu_reset, exu_ifu_cc_d, fcl_dcl_regz_e,
74
   exu_ifu_regn_e, ffu_ifu_cc_w2, ffu_ifu_cc_vld_w2,
75
   tlu_ifu_flush_pipe_w, swl_dcl_thr_d, swl_dcl_thr_w2,
76
   imd_dcl_brcond_d, imd_dcl_mvcond_d, fdp_dcl_op_s, fdp_dcl_op3_s,
77
   imd_dcl_abit_d, dec_dcl_cctype_d, dtu_dcl_opf2_d,
78
   fcl_dtu_inst_vld_e, fcl_dtu_intr_vld_e, ifu_tlu_flush_w
79
   );
80
 
81
   input    rclk,
82
            se,
83
            si,
84
            dtu_reset;
85
 
86
   input [7:0] exu_ifu_cc_d;         // latest CCs from EXU
87
 
88
   input       fcl_dcl_regz_e,        // rs1=0
89
                     exu_ifu_regn_e;        // rs1<0
90
 
91
   input [7:0] ffu_ifu_cc_w2;
92
   input [3:0] ffu_ifu_cc_vld_w2;
93
 
94
   input       tlu_ifu_flush_pipe_w;
95
 
96
   input [3:0] swl_dcl_thr_d,
97
                     swl_dcl_thr_w2;
98
 
99
   input [3:0] imd_dcl_brcond_d;     // branch condition type
100
   input [7:0] imd_dcl_mvcond_d;     // mov condition type
101
 
102
   input [1:0] fdp_dcl_op_s;
103
   input [5:0] fdp_dcl_op3_s;
104
   input       imd_dcl_abit_d;        // anull bit for cond branch
105
   input [2:0] dec_dcl_cctype_d;     // which cond codes to use
106
   input       dtu_dcl_opf2_d;
107
 
108
   input       fcl_dtu_inst_vld_e;
109
   input       fcl_dtu_intr_vld_e;
110
   input       ifu_tlu_flush_w;
111
 
112
   output      ifu_exu_kill_e,
113
                           ifu_exu_dontmv_regz0_e,
114
                           ifu_exu_dontmv_regz1_e,
115
                           ifu_exu_tcc_e;
116
   output      ifu_exu_dbrinst_d;
117
 
118
   output      ifu_ffu_mvcnd_m;
119
 
120
   output      dcl_fcl_bcregz0_e,
121
               dcl_fcl_bcregz1_e;
122
 
123
   output      dtu_inst_anull_e;
124
   output      dcl_swl_tcc_done_m;
125
 
126
   output      dcl_imd_immdata_sel_simm13_d_l,      // imm data select
127
                     dcl_imd_immdata_sel_movcc_d_l,
128
                     dcl_imd_immdata_sel_sethi_d_l,
129
                     dcl_imd_immdata_sel_movr_d_l;
130
 
131
   output      dcl_imd_broff_sel_call_d_l,      // dir branch offset select
132
                     dcl_imd_broff_sel_br_d_l,
133
                     dcl_imd_broff_sel_bcc_d_l,
134
                     dcl_imd_broff_sel_bpcc_d_l;
135
 
136
   output      dcl_imd_immbr_sel_br_d;
137
 
138
   output      so;
139
 
140
//----------------------------------------------------------------------
141
// Declarations
142
//----------------------------------------------------------------------
143
 
144
   wire [7:0]  cc_breval_e,
145
                     fp_breval_d;
146
 
147
   wire        abit_e;
148
 
149
   wire        cond_brtaken_e,
150
                     anull_all,
151
                     anull_ubr,
152
                     anull_cbr;
153
 
154
   wire [3:0]  anull_next_e,
155
               anull_e,
156
               thr_anull_d;
157
 
158
   wire        inst_anull_d,
159
               inst_anull_e;
160
 
161
   wire [3:0]  flush_abit;
162
   wire        all_flush_w,
163
               all_flush_w2;
164
 
165
   wire        br_always_e;
166
 
167
   wire        sel_movcc,
168
                     sel_movr;
169
 
170
   wire [3:0]  br_cond_e,
171
                     br_cond_d;
172
   wire [3:0]  thr_vld_e;
173
 
174
   wire [3:0]  ls_brcond_d,
175
               ls_brcond_e;
176
   wire [1:0]  ccfp_sel;
177
 
178
   wire [3:0]  cc_e;
179
 
180
   wire [1:0]  curr_fcc_d;
181
 
182
   wire [7:0]  fcc_d;
183
 
184
   wire [7:0]  t0_fcc_d,
185
                     t1_fcc_d,
186
                     t2_fcc_d,
187
                     t3_fcc_d,
188
                     t0_fcc_nxt,
189
                     t1_fcc_nxt,
190
                     t2_fcc_nxt,
191
                     t3_fcc_nxt;
192
 
193
   wire        use_fcc0_d,
194
                     use_fcc1_d,
195
                     use_fcc2_d,
196
                     use_fcc3_d;
197
 
198
   wire [3:0]  thr_e,
199
                     thr_dec_d;
200
//                   fcc_dec_d,
201
//                   fcc_dec_e;
202
 
203
   wire [1:0]  op_d;
204
   wire [5:0]  op3_d;
205
 
206
   wire        use_xcc_d,
207
                     ltz_e,
208
                     cc_eval0,
209
                     cc_eval1,
210
                     fp_eval0_d,
211
                     fp_eval1_d,
212
                     fp_eval_d,
213
                     fp_eval_e,
214
                     r_eval1,
215
                     r_eval0,
216
                     ccfp_eval,
217
                     ccbr_taken_e,
218
                     mvbr_sel_br_d,
219
                     cc_mvbr_d,
220
                     cc_mvbr_e,
221
                     fpcond_mvbr_d,
222
                     fpcond_mvbr_e;
223
 
224
   wire        call_inst_e,
225
               call_inst_d,
226
                     dbr_inst_d,
227
                     dbr_inst_e,
228
                     ibr_inst_d,
229
                     ibr_inst_e,
230
                     mov_inst_d,
231
                     mov_inst_e,
232
               tcc_done_e,
233
                     tcc_inst_d,
234
                     tcc_inst_e;
235
 
236
   wire        clk;
237
 
238
 
239
 
240
//----------------------------------------------------------------------
241
// Code start here 
242
//----------------------------------------------------------------------
243
   assign      clk = rclk;
244
 
245
 
246
   // S Stage Operands
247 113 albert.wat
   dff_s #(2) opreg(.din  (fdp_dcl_op_s),
248 95 fafa1971
                              .clk  (clk),
249
                              .q    (op_d),
250 113 albert.wat
                              .se   (se), `SIMPLY_RISC_SCANIN, .so());
251 95 fafa1971
 
252 113 albert.wat
   dff_s #(6) op3_reg(.din  (fdp_dcl_op3_s),
253 95 fafa1971
                                .clk  (clk),
254
                                .q    (op3_d),
255 113 albert.wat
                                .se   (se), `SIMPLY_RISC_SCANIN, .so());
256 95 fafa1971
 
257 113 albert.wat
   dff_s abite_reg(.din  (imd_dcl_abit_d),
258 95 fafa1971
                             .clk  (clk),
259
                             .q    (abit_e),
260 113 albert.wat
                             .se   (se), `SIMPLY_RISC_SCANIN, .so());
261 95 fafa1971
 
262
   // need to protect from scan contention
263 113 albert.wat
   dff_s #(4) thre_reg(.din (swl_dcl_thr_d),
264 95 fafa1971
                     .q   (thr_e),
265 113 albert.wat
                     .clk (clk), .se(se), `SIMPLY_RISC_SCANIN, .so());
266 95 fafa1971
 
267
   //------------------------------
268
   // Choose correct immediate data
269
   //------------------------------
270
   // movcc if op3 = 101100
271
   assign dcl_imd_immdata_sel_movcc_d_l = ~(op_d[1] &
272
                                                                          op3_d[5] & ~op3_d[4] &
273
                                            op3_d[3] & ~op3_d[0]);
274
 
275
   // movr if op3 = 101111
276
   //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
277
   // Reduced the number of terms in the eqn to help with timing 
278
   // path, the result of which is that the immediate data sent to the
279
   // exu for a FLUSH instruction is INCORRECT!  (It is decoded as a
280
   // MOVR).  However, since our architecture completely ignores the
281
   // address of the flush, this should be ok.  Confirmed with Sanjay
282
   // 03/31/03. (v1.29 -> 1.30)
283
   // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
284
   assign dcl_imd_immdata_sel_movr_d_l = ~(op_d[1] &
285
                                                                   op3_d[5] & op3_d[3] &
286
                                                                   op3_d[1] & op3_d[0]);
287
 
288
   // sethi if op3 = 100xx
289
   assign dcl_imd_immdata_sel_sethi_d_l = ~(~op_d[1]);
290
 
291
   // everything else
292
   assign dcl_imd_immdata_sel_simm13_d_l =
293
                                ~(dcl_imd_immdata_sel_movcc_d_l &
294
                              dcl_imd_immdata_sel_movr_d_l  &
295
                                    dcl_imd_immdata_sel_sethi_d_l);
296
 
297
   //------------------------------
298
   // Choose correct branch offset
299
   //------------------------------
300
   // call or ld/store
301
   assign dcl_imd_broff_sel_call_d_l = ~(op_d[0]);
302
 
303
   // branch on register
304
   assign dcl_imd_broff_sel_br_d_l = ~(~op_d[0] &
305
                                                               op3_d[4] & op3_d[3]);
306
   // branch w/o prediction
307
   assign dcl_imd_broff_sel_bcc_d_l = ~(~op_d[0] &
308
                                                                      op3_d[4] & ~op3_d[3]);
309
   // everything else
310
   assign dcl_imd_broff_sel_bpcc_d_l = ~(~op_d[0] &
311
                                                                       ~op3_d[4]);
312
 
313
   //------------------------------------
314
   // mark branch/conditional instrctions
315
   //------------------------------------
316
   // call
317
   assign call_inst_d = ~op_d[1] & op_d[0];
318 113 albert.wat
   dff_s #(1) call_inste_reg(.din  (call_inst_d),
319 95 fafa1971
                                             .clk  (clk),
320
                                             .q    (call_inst_e),
321 113 albert.wat
                                             .se   (se), `SIMPLY_RISC_SCANIN, .so());
322 95 fafa1971
 
323
   // call or branch but not nop/sethi
324
   assign dbr_inst_d = ~op_d[1] & (op_d[0] | op3_d[4] | op3_d[3]);
325
 
326
   // Choose between branch offset and immediate operand
327
   assign dcl_imd_immbr_sel_br_d = dbr_inst_d;
328
 
329
   // tell exu to use pc instead of rs1
330
   assign ifu_exu_dbrinst_d = ~op_d[1];
331
 
332 113 albert.wat
   dff_s #(1) dbr_inste_reg(.din  (dbr_inst_d),
333 95 fafa1971
                                            .clk  (clk),
334
                                            .q    (dbr_inst_e),
335 113 albert.wat
                                            .se   (se), `SIMPLY_RISC_SCANIN, .so());
336 95 fafa1971
 
337
   // jmpl + return
338
   assign ibr_inst_d = op_d[1] & ~op_d[0] &
339
                                    op3_d[5] &  op3_d[4] &  op3_d[3] &
340
                        ~op3_d[2] & ~op3_d[1];
341 113 albert.wat
   dff_s #(1) ibr_inste_reg(.din  (ibr_inst_d),
342 95 fafa1971
                                            .clk  (clk),
343
                                            .q    (ibr_inst_e),
344 113 albert.wat
                                            .se   (se), `SIMPLY_RISC_SCANIN, .so());
345 95 fafa1971
   // mov
346
   assign mov_inst_d = (op_d[1] & ~op_d[0] &
347
                                          op3_d[5] & ~op3_d[4] & op3_d[3] & op3_d[2] &
348
                                          (~op3_d[1] & ~op3_d[0] | op3_d[1] & op3_d[0]));
349
 
350 113 albert.wat
   dff_s #(1) mov_inste_reg(.din  (mov_inst_d),
351 95 fafa1971
                                            .clk  (clk),
352
                                            .q    (mov_inst_e),
353 113 albert.wat
                                            .se   (se), `SIMPLY_RISC_SCANIN, .so());
354 95 fafa1971
   // tcc
355
   assign tcc_inst_d = op_d[1] & ~op_d[0] &
356
                                   op3_d[5] &  op3_d[4] &  op3_d[3] &
357
                                   ~op3_d[2] &  op3_d[1] & ~op3_d[0];
358 113 albert.wat
   dff_s #(1) tcc_inste_reg(.din  (tcc_inst_d),
359 95 fafa1971
                                            .clk  (clk),
360
                                            .q    (tcc_inst_e),
361 113 albert.wat
                                            .se   (se), `SIMPLY_RISC_SCANIN, .so());
362 95 fafa1971
 
363
   assign mvbr_sel_br_d = ~op_d[1] & ~op_d[0] |          // br
364
                                 op3_d[3] & ~op3_d[2] & op3_d[1] & ~op3_d[0]; // tcc
365
 
366
   assign cc_mvbr_d = ~(~op_d[1] & ~op_d[0] & op3_d[4] & op3_d[3] |  // bpr
367
                                          op_d[1] & ~op_d[0] & op3_d[5] & ~op3_d[4] &
368
                                          op3_d[3] & op3_d[2] & op3_d[1] & op3_d[0] |  // movr
369
                                          op_d[1] & ~op_d[0] & op3_d[5] & op3_d[4] &
370
                                          ~op3_d[3] & op3_d[2] & ~op3_d[1] & op3_d[0] &
371
                                          dtu_dcl_opf2_d);                             // fmovr
372
 
373
 
374
   //---------------------------
375
   // FCC Logic
376
   //--------------------------
377
   // choose current fcc
378
   assign use_fcc0_d = ~dec_dcl_cctype_d[1] & ~dec_dcl_cctype_d[0];
379
   assign use_fcc1_d = ~dec_dcl_cctype_d[1] &  dec_dcl_cctype_d[0];
380
   assign use_fcc2_d =  dec_dcl_cctype_d[1] & ~dec_dcl_cctype_d[0];
381
   assign use_fcc3_d =  dec_dcl_cctype_d[1] &  dec_dcl_cctype_d[0];
382
 
383
   mux4ds #(2) fcc_mux(.dout (curr_fcc_d[1:0]),
384
                                   .in0  (fcc_d[1:0]),
385
                                   .in1  (fcc_d[3:2]),
386
                                   .in2  (fcc_d[5:4]),
387
                                   .in3  (fcc_d[7:6]),
388
                                   .sel0 (use_fcc0_d),
389
                                   .sel1 (use_fcc1_d),
390
                                   .sel2 (use_fcc2_d),
391
                                   .sel3 (use_fcc3_d));
392
 
393
   // decode to make next step easier
394
//   assign fcc_dec_d[0] = ~curr_fcc_d[1] & ~curr_fcc_d[0];
395
//   assign fcc_dec_d[1] = ~curr_fcc_d[1] &  curr_fcc_d[0];
396
//   assign fcc_dec_d[2] =  curr_fcc_d[1] & ~curr_fcc_d[0];
397
//   assign fcc_dec_d[3] =  curr_fcc_d[1] &  curr_fcc_d[0];
398
 
399
//   dff #(4) fcce_reg(.din (fcc_dec_d),
400
//                               .q   (fcc_dec_e),
401
//                               .clk (clk),
402 113 albert.wat
//                               .se  (se), `SIMPLY_RISC_SCANIN, .so());
403 95 fafa1971
 
404
 
405
   //------------------
406
   // CC Logic for BCC
407
   //------------------
408
   // Choose appropriate CCs
409
   //
410
   // dec_cctype is 3 bits
411
   // 10X  icc
412
   // 11X  xcc
413
   // 000  fcc0
414
   // 001  fcc1
415
   // 010  fcc2
416
   // 011  fcc3
417
//   assign use_xcc_d = (dec_dcl_cctype_d[2] | op3_d[3]) & dec_dcl_cctype_d[1];
418
   assign use_xcc_d = dec_dcl_cctype_d[1];
419
   assign fpcond_mvbr_d = ~dec_dcl_cctype_d[2] & ~tcc_inst_d;
420
 
421 113 albert.wat
   dff_s fpbr_reg(.din  (fpcond_mvbr_d),
422 95 fafa1971
                            .clk  (clk),
423
                            .q    (fpcond_mvbr_e),
424 113 albert.wat
                            .se   (se), `SIMPLY_RISC_SCANIN, .so());
425 95 fafa1971
 
426
   // mux between xcc and icc
427
//   assign cc_d =  use_xcc_d ?  exu_ifu_cc_d[7:4] :      // xcc
428
//                                               exu_ifu_cc_d[3:0];       // icc
429
//   dff #(4)  ccreg_e(.din  (cc_d),
430
//                               .clk  (clk),
431
//                               .q    (cc_e),
432 113 albert.wat
//                               .se   (se),  `SIMPLY_RISC_SCANIN, .so());
433 95 fafa1971
 
434
   bw_u1_soffm2_4x UZsize_ccreg0_e(.d0 (exu_ifu_cc_d[0]),
435
                                   .d1 (exu_ifu_cc_d[4]),
436
                                   .s  (use_xcc_d),
437
                                   .q  (cc_e[0]),
438 113 albert.wat
                                   .ck (clk), .se(se), `SIMPLY_RISC_SCANDATA, .so());
439 95 fafa1971
   bw_u1_soffm2_4x UZsize_ccreg1_e(.d0 (exu_ifu_cc_d[1]),
440
                                   .d1 (exu_ifu_cc_d[5]),
441
                                   .s  (use_xcc_d),
442
                                   .q  (cc_e[1]),
443 113 albert.wat
                                   .ck (clk), .se(se), `SIMPLY_RISC_SCANDATA, .so());
444 95 fafa1971
   bw_u1_soffm2_4x UZsize_ccreg2_e(.d0 (exu_ifu_cc_d[2]),
445
                                   .d1 (exu_ifu_cc_d[6]),
446
                                   .s  (use_xcc_d),
447
                                   .q  (cc_e[2]),
448 113 albert.wat
                                   .ck (clk), .se(se), `SIMPLY_RISC_SCANDATA, .so());
449 95 fafa1971
   bw_u1_soffm2_4x UZsize_ccreg3_e(.d0 (exu_ifu_cc_d[3]),
450
                                   .d1 (exu_ifu_cc_d[7]),
451
                                   .s  (use_xcc_d),
452
                                   .q  (cc_e[3]),
453 113 albert.wat
                                   .ck (clk), .se(se), `SIMPLY_RISC_SCANDATA, .so());
454 95 fafa1971
 
455
 
456
   //------------------------------
457
   // Evaluate Branch
458
   //------------------------------
459
   // Select correct branch condition
460
   assign sel_movcc = ~mvbr_sel_br_d & cc_mvbr_d;
461
   assign sel_movr = ~mvbr_sel_br_d & ~cc_mvbr_d;
462
 
463
   // br_cond is the same as the "cond" field = inst[28:25] for bcc
464
   mux3ds #(4)  brcond_mux(.dout   (br_cond_d),
465
                                             .in0    (imd_dcl_brcond_d),  // br or tcc
466
                                             .in1    (imd_dcl_mvcond_d[7:4]),  // movcc
467
                                             .in2    (imd_dcl_mvcond_d[3:0]),  // movr
468
                                             .sel0   (mvbr_sel_br_d),
469
                                             .sel1   (sel_movcc),
470
                                             .sel2   (sel_movr));
471
 
472 113 albert.wat
   dff_s #(4)  brcond_e_reg(.din  (br_cond_d),
473 95 fafa1971
                                            .clk  (clk),
474
                                            .q    (br_cond_e),
475 113 albert.wat
                                            .se   (se), `SIMPLY_RISC_SCANIN, .so());
476 95 fafa1971
 
477
   // Branch Type Decode
478
   assign ls_brcond_d[0]  =  ~br_cond_d[1] & ~br_cond_d[0];
479
   assign ls_brcond_d[1]  =  ~br_cond_d[1] &  br_cond_d[0];
480
   assign ls_brcond_d[2]  =   br_cond_d[1] & ~br_cond_d[0];
481
   assign ls_brcond_d[3]  =   br_cond_d[1] &  br_cond_d[0];
482
 
483 113 albert.wat
   dff_s #(4)  lsbrc_e_reg(.din  (ls_brcond_d),
484 95 fafa1971
                                           .clk  (clk),
485
                                           .q    (ls_brcond_e),
486 113 albert.wat
                                           .se   (se), `SIMPLY_RISC_SCANIN, .so());
487 95 fafa1971
 
488
   // Evaluate potential integer CC branches
489 113 albert.wat
   assign ltz_e = (cc_e[`CC_N] ^ cc_e[`CC_V]);
490 95 fafa1971
 
491
   assign cc_breval_e[0] = 1'b0;                       // BPN
492 113 albert.wat
   assign cc_breval_e[1] = cc_e[`CC_Z];                // BPE
493
   assign cc_breval_e[2] = cc_e[`CC_Z] | ltz_e;        // BPLE
494 95 fafa1971
   assign cc_breval_e[3] = ltz_e;                      // BPL
495 113 albert.wat
   assign cc_breval_e[4] = cc_e[`CC_Z] | cc_e[`CC_C];  // BPLEU
496
   assign cc_breval_e[5] = cc_e[`CC_C];                // BPCS
497
   assign cc_breval_e[6] = cc_e[`CC_N];                // BPNEG
498
   assign cc_breval_e[7] = cc_e[`CC_V];                // BPVS 
499 95 fafa1971
 
500
   // mux to choose right condition
501
   assign cc_eval0 = cc_breval_e[0] & ls_brcond_e[0] |
502
                                 cc_breval_e[1] & ls_brcond_e[1] |
503
                                 cc_breval_e[2] & ls_brcond_e[2] |
504
                                 cc_breval_e[3] & ls_brcond_e[3];
505
 
506
   assign cc_eval1 = cc_breval_e[4] & ls_brcond_e[0] |
507
                                 cc_breval_e[5] & ls_brcond_e[1] |
508
                                 cc_breval_e[6] & ls_brcond_e[2] |
509
                                 cc_breval_e[7] & ls_brcond_e[3];
510
 
511
   // Evaluate FP CC branches in D stage
512
   assign fp_breval_d[0] = 1'b0;                            // FBN / A
513
   assign fp_breval_d[1] = (curr_fcc_d[1] | curr_fcc_d[0]); // FBNE / E
514
   assign fp_breval_d[2] = curr_fcc_d[1] ^ curr_fcc_d[0];   // FBLG / UE
515
   assign fp_breval_d[3] = curr_fcc_d[0];                   // FBUL / GE
516
   assign fp_breval_d[4] = ~curr_fcc_d[1] & curr_fcc_d[0];  // FBL / UGE
517
   assign fp_breval_d[5] = curr_fcc_d[1];                   // FBUG / LE
518
   assign fp_breval_d[6] = curr_fcc_d[1] & ~curr_fcc_d[0];  // FBG / ULE
519
   assign fp_breval_d[7] = curr_fcc_d[1] & curr_fcc_d[0];   // FBU / O
520
 
521
   assign fp_eval0_d = fp_breval_d[0] & ls_brcond_d[0] |
522
                                 fp_breval_d[1] & ls_brcond_d[1] |
523
                                 fp_breval_d[2] & ls_brcond_d[2] |
524
                                 fp_breval_d[3] & ls_brcond_d[3];
525
 
526
   assign fp_eval1_d = fp_breval_d[4] & ls_brcond_d[0] |
527
                                 fp_breval_d[5] & ls_brcond_d[1] |
528
                                 fp_breval_d[6] & ls_brcond_d[2] |
529
                                 fp_breval_d[7] & ls_brcond_d[3];
530
 
531
   assign fp_eval_d = br_cond_d[2] ? fp_eval1_d :
532
                                     fp_eval0_d;
533
 
534 113 albert.wat
   dff_s #(1) fpev_ff(.din (fp_eval_d),
535 95 fafa1971
                                .q   (fp_eval_e),
536
                                .clk (clk),
537 113 albert.wat
                                .se  (se), `SIMPLY_RISC_SCANIN, .so());
538 95 fafa1971
 
539
   // merge eval0, eval1 and fp condition codes
540
   assign ccfp_sel[0] = ~fpcond_mvbr_e & ~br_cond_e[2];
541
   assign ccfp_sel[1] = ~fpcond_mvbr_e &  br_cond_e[2];
542
//   assign ccfp_sel[2] =  fpcond_mvbr_e & ~br_cond_e[2];
543
//   assign ccfp_sel[3] =  fpcond_mvbr_e &  br_cond_e[2];
544
 
545
   assign ccfp_eval = ccfp_sel[0] & cc_eval0 |
546
                                  ccfp_sel[1] & cc_eval1 |
547
                                  fpcond_mvbr_e & fp_eval_e;
548
 
549
   // invert branch condition if this is an inverted br type
550
//   assign ccbr_taken_e = (ccfp_eval ^ br_cond_e[3]) & cc_mvbr_e;
551
   assign ccbr_taken_e = ccfp_eval ? (cc_mvbr_e & ~br_cond_e[3]) :
552
                                       (cc_mvbr_e & br_cond_e[3]);
553
 
554
   assign br_always_e = (~br_cond_e[0] & ~br_cond_e[1] & ~br_cond_e[2] &
555
                               br_cond_e[3] & cc_mvbr_e);
556
 
557
   //--------------
558
   // For BRZ
559
   // -------------
560
   // Calculate Cond Assuming Z=1 And Z=0.  Then Mux
561
//   assign r_eval1 = ((exu_ifu_regn_e | ~br_cond_e[1] | ~br_cond_e[0]) ^
562
//                                br_cond_e[2]) & ~cc_mvbr_e;
563
   assign r_eval1 = exu_ifu_regn_e ? (~br_cond_e[2] & ~cc_mvbr_e) :
564
                                       (((br_cond_e[1] & br_cond_e[0]) ^
565
                                         ~br_cond_e[2]) & ~cc_mvbr_e);
566
 
567
//   assign r_eval0 = ((exu_ifu_regn_e & br_cond_e[1]) ^
568
//                      br_cond_e[2]) & ~cc_mvbr_e;
569
   assign r_eval0 = exu_ifu_regn_e ? ((br_cond_e[1] ^ br_cond_e[2]) &
570
                                       ~cc_mvbr_e) :
571
                                       (br_cond_e[2] & ~cc_mvbr_e);
572
 
573 113 albert.wat
   dff_s #(1) regcc_ff(.din  (cc_mvbr_d),
574 95 fafa1971
                                 .clk  (clk),
575
                                 .q    (cc_mvbr_e),
576 113 albert.wat
                                 .se   (se), `SIMPLY_RISC_SCANIN, .so());
577 95 fafa1971
 
578
   // Evaluate Final Branch condition
579
   // 3:1 mux
580
//   assign cond_brtaken_e = cc_mvbr_e      ?  ccbr_taken_e :
581
//                                     exu_ifu_regz_e ?       r_eval1 :
582
//                                                            r_eval0;
583
   // 2:1 mux
584
//   assign cond_brtaken_e = exu_ifu_regz_e ? (r_eval1 | ccbr_taken_e) :
585
//                                              (r_eval0 | ccbr_taken_e);
586
 
587
   //////// Chandra ////////
588
 
589
   wire   temp0, temp1, cond_brtaken_e_l;
590
 
591
   // limit loading on this signal
592
//   wire   regz_buf_e;
593
//   bw_u1_buf_5x UZfix_regz_bf(.a (exu_ifu_regz_e),
594
//                              .z (regz_buf_e));
595
 
596
   assign temp0 = (r_eval0 | ccbr_taken_e);
597
   assign temp1 = (r_eval1 | ccbr_taken_e);
598
 
599
   bw_u1_muxi21_6x UZsize_cbtmux(.z(cond_brtaken_e_l),
600
                                  .d0(temp0),
601
                                  .d1(temp1),
602
                                  .s(fcl_dcl_regz_e));
603
 
604
   bw_u1_inv_20x UZsize_cbtinv(.z(cond_brtaken_e),
605
                                .a(cond_brtaken_e_l));
606
 
607
   ////////////////////////
608
 
609
   assign dcl_fcl_bcregz0_e = (temp0 & dbr_inst_e | ibr_inst_e |
610
                               call_inst_e) & ~dtu_inst_anull_e;
611
   assign dcl_fcl_bcregz1_e = (temp1 & dbr_inst_e | ibr_inst_e |
612
                               call_inst_e) & ~dtu_inst_anull_e;
613
 
614
//   assign ifu_exu_dontmove_e = mov_inst_e & ~cond_brtaken_e;
615
   assign ifu_exu_dontmv_regz0_e = ~temp0 & mov_inst_e;
616
   assign ifu_exu_dontmv_regz1_e = ~temp1 & mov_inst_e;
617
 
618
   // branch condition to FPU
619 113 albert.wat
   dff_s #(1) fpcond_ff(.din  (cond_brtaken_e),
620 95 fafa1971
                                  .q    (ifu_ffu_mvcnd_m),
621
                                  .clk  (clk),
622 113 albert.wat
                                  .se   (se), `SIMPLY_RISC_SCANIN, .so());
623 95 fafa1971
 
624
   // branch / move completion and anull signals
625
//   assign dtu_fcl_brtaken_e = ~dtu_inst_anull_e & 
626
//                                  (ibr_inst_e | call_inst_e |
627
//                                               dbr_inst_e & cond_brtaken_e);
628
 
629
   // if mov didn't succeed kill write back and bypass
630
   // need to check thread as well
631
//   assign ifu_exu_kill_e = dtu_inst_anull_e | 
632
//                         ~fcl_dtu_inst_vld_e;  // don't need this anymore
633
   assign ifu_exu_kill_e = dtu_inst_anull_e;
634
 
635
 
636
   // signal trap if tcc succeeds
637
   assign ifu_exu_tcc_e = ~dtu_inst_anull_e & tcc_inst_e & ccbr_taken_e &
638
                          fcl_dtu_inst_vld_e;
639
 
640
   assign tcc_done_e = ~dtu_inst_anull_e & tcc_inst_e & ~ccbr_taken_e &
641
                       fcl_dtu_inst_vld_e;
642
 
643 113 albert.wat
   dff_s #(1) tccm_ff(.din (tcc_done_e),
644 95 fafa1971
                    .q   (dcl_swl_tcc_done_m),
645
                    .clk (clk),
646 113 albert.wat
                    .se  (se), `SIMPLY_RISC_SCANIN, .so());
647 95 fafa1971
 
648
   // logic to anull delay slot, if this branch itsel is not anulled
649
   assign anull_cbr  =  abit_e & dbr_inst_e & ~br_always_e & ~call_inst_e;
650
   assign anull_ubr  =  abit_e & dbr_inst_e & br_always_e & ~call_inst_e;
651
 
652
   assign anull_all =  anull_ubr  | anull_cbr & ~cond_brtaken_e;
653
 
654
   // check which thread to anull
655
   assign thr_vld_e = thr_e & {4{fcl_dtu_inst_vld_e}};
656
 
657
   assign all_flush_w = tlu_ifu_flush_pipe_w | ifu_tlu_flush_w;
658 113 albert.wat
   dff_s #(1) flshw2_ff(.din (all_flush_w),
659 95 fafa1971
                      .q   (all_flush_w2),
660 113 albert.wat
                      .clk (clk), .se(se), `SIMPLY_RISC_SCANIN, .so());
661 95 fafa1971
 
662
   assign flush_abit = swl_dcl_thr_w2 & {4{all_flush_w2}};
663
 
664
   assign anull_next_e = ((~anull_e & {4{anull_all}} & thr_vld_e) |
665
                                (anull_e & ~(thr_e & {4{fcl_dtu_inst_vld_e |
666
                                                  fcl_dtu_intr_vld_e}}))) &
667
                           ~flush_abit;
668
 
669
   // anull_e needs to be per thread
670 113 albert.wat
   dffr_s #(4) anull_ff(.din  (anull_next_e),
671 95 fafa1971
                                  .clk  (clk),
672
                                  .rst  (dtu_reset),
673
                                  .q    (anull_e),
674 113 albert.wat
                                  .se   (se), `SIMPLY_RISC_SCANIN, .so());
675 95 fafa1971
 
676
   // 
677
//   assign thr_dec_e[0] = swl_dcl_thr_e[0] | rst_tri_enable;
678
//   assign thr_dec_e[3:1] = swl_dcl_thr_e[3:1] & {3{~rst_tri_enable}};
679
 
680
   assign thr_anull_d = swl_dcl_thr_d & anull_next_e;
681
   assign inst_anull_d =  (|thr_anull_d[3:0]);
682 113 albert.wat
   dff_s #(1) ina_ff(.din (inst_anull_d),
683 95 fafa1971
                   .q   (inst_anull_e),
684 113 albert.wat
                   .clk (clk), .se (se), `SIMPLY_RISC_SCANIN, .so());
685 95 fafa1971
 
686
   assign dtu_inst_anull_e = inst_anull_e;
687
 
688
//   mux4ds dcla_mux(.dout (this_inst_anull_e),  
689
//                             .in0  (anull_e[0]),
690
//                             .in1  (anull_e[1]),
691
//                             .in2  (anull_e[2]),
692
//                             .in3  (anull_e[3]),
693
//                             .sel0 (thr_dec_e[0]),
694
//                             .sel1 (thr_dec_e[1]),
695
//                             .sel2 (thr_dec_e[2]),
696
//                             .sel3 (thr_dec_e[3]));
697
//   assign dtu_inst_anull_e = this_inst_anull_e & fcl_dtu_inst_vld_e;
698
 
699
 
700
//--------------------
701
// Copy of FCC
702
//--------------------
703
   // FCC's are maintained in the ffu.  A copy is kept here to run the
704
   // FP branch instructions.
705
 
706
   // load FCC from FFU
707
   mux2ds #(8)  t0_fcc_mux(.dout (t0_fcc_nxt[7:0]),
708
                                             .in0  (t0_fcc_d[7:0]),
709
                                             .in1  (ffu_ifu_cc_w2[7:0]),
710
                                             .sel0  (~ffu_ifu_cc_vld_w2[0]),
711
                                             .sel1  (ffu_ifu_cc_vld_w2[0]));
712
 
713 113 albert.wat
   dffr_s #(8) t0_fcc_reg(.din (t0_fcc_nxt[7:0]),
714 95 fafa1971
                                    .q   (t0_fcc_d[7:0]),
715
                                    .rst (dtu_reset),
716 113 albert.wat
                                    .clk (clk),  .se  (se), `SIMPLY_RISC_SCANIN, .so());
717
`ifdef FPGA_SYN_1THREAD
718
   assign fcc_d[7:0] = t0_fcc_d[7:0];
719
`else
720 95 fafa1971
 
721
   mux2ds #(8)  t1_fcc_mux(.dout (t1_fcc_nxt[7:0]),
722
                                             .in0  (t1_fcc_d[7:0]),
723
                                             .in1  (ffu_ifu_cc_w2[7:0]),
724
                                             .sel0  (~ffu_ifu_cc_vld_w2[1]),
725
                                             .sel1  (ffu_ifu_cc_vld_w2[1]));
726
 
727
   mux2ds #(8)  t2_fcc_mux(.dout (t2_fcc_nxt[7:0]),
728
                                             .in0  (t2_fcc_d[7:0]),
729
                                             .in1  (ffu_ifu_cc_w2[7:0]),
730
                                             .sel0  (~ffu_ifu_cc_vld_w2[2]),
731
                                             .sel1  (ffu_ifu_cc_vld_w2[2]));
732
 
733
   mux2ds #(8)  t3_fcc_mux(.dout (t3_fcc_nxt[7:0]),
734
                                             .in0  (t3_fcc_d[7:0]),
735
                                             .in1  (ffu_ifu_cc_w2[7:0]),
736
                                             .sel0  (~ffu_ifu_cc_vld_w2[3]),
737
                                             .sel1  (ffu_ifu_cc_vld_w2[3]));
738
 
739
   // thread0 fcc registers
740
 
741 113 albert.wat
   dffr_s #(8) t1_fcc_reg(.din (t1_fcc_nxt[7:0]),
742 95 fafa1971
                                    .q   (t1_fcc_d[7:0]),
743
                                    .rst (dtu_reset),
744 113 albert.wat
                                    .clk (clk),  .se  (se), `SIMPLY_RISC_SCANIN, .so());
745
   dffr_s #(8) t2_fcc_reg(.din (t2_fcc_nxt[7:0]),
746 95 fafa1971
                                    .q   (t2_fcc_d[7:0]),
747
                                    .rst (dtu_reset),
748 113 albert.wat
                                    .clk (clk),  .se  (se), `SIMPLY_RISC_SCANIN, .so());
749
   dffr_s #(8) t3_fcc_reg(.din (t3_fcc_nxt[7:0]),
750 95 fafa1971
                                    .q   (t3_fcc_d[7:0]),
751
                                    .rst (dtu_reset),
752 113 albert.wat
                                    .clk (clk),  .se  (se), `SIMPLY_RISC_SCANIN, .so());
753 95 fafa1971
 
754
   // choose thread
755
   assign thr_dec_d[0] = swl_dcl_thr_d[0];
756
   assign thr_dec_d[3:1] = swl_dcl_thr_d[3:1];
757
 
758
   mux4ds #(8) fcc0d_mx(.dout (fcc_d[7:0]),
759
                                    .in0  (t0_fcc_d[7:0]),
760
                                    .in1  (t1_fcc_d[7:0]),
761
                                    .in2  (t2_fcc_d[7:0]),
762
                                    .in3  (t3_fcc_d[7:0]),
763
                                    .sel0 (thr_dec_d[0]),
764
                                    .sel1 (thr_dec_d[1]),
765
                                    .sel2 (thr_dec_d[2]),
766
                                    .sel3 (thr_dec_d[3]));
767
 
768 113 albert.wat
`endif // !`ifdef FPGA_SYN_1THREAD
769 95 fafa1971
 
770
endmodule // sparc_ifu_dcl
771
 

powered by: WebSVN 2.1.0

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