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

Subversion Repositories sparc64soc

[/] [sparc64soc/] [trunk/] [T1-CPU/] [ifu/] [sparc_ifu_dec.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dmitryr
// ========== Copyright Header Begin ==========================================
2
// 
3
// OpenSPARC T1 Processor File: sparc_ifu_dec.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
//  Module Name: sparc_ifu_dec
24
//  Description:
25
//  The decode block implements the sparc instruction decode ROM
26
//  It has a purely combinational part and some staging flops
27
*/
28
////////////////////////////////////////////////////////////////////////
29
 
30
module sparc_ifu_dec(/*AUTOARG*/
31
   // Outputs
32
   so, ifu_exu_aluop_d, ifu_exu_invert_d, ifu_exu_useimm_d,
33
   ifu_exu_usecin_d, ifu_exu_enshift_d, ifu_exu_tagop_d,
34
   ifu_exu_tv_d, ifu_exu_muls_d, ifu_exu_ialign_d,
35
   ifu_exu_range_check_jlret_d, ifu_exu_range_check_other_d,
36
   ifu_exu_shiftop_d, ifu_exu_muldivop_d, ifu_exu_wen_d,
37
   ifu_exu_setcc_d, ifu_exu_rd_ifusr_e, ifu_exu_rd_exusr_e,
38
   ifu_exu_rd_ffusr_e, ifu_exu_rs1_vld_d, ifu_exu_rs2_vld_d,
39
   ifu_exu_rs3e_vld_d, ifu_exu_rs3o_vld_d, ifu_exu_use_rsr_e_l,
40
   ifu_exu_save_d, ifu_exu_restore_d, ifu_exu_return_d,
41
   ifu_exu_flushw_e, ifu_exu_saved_e, ifu_exu_restored_e,
42
   ifu_tlu_rsr_inst_d, ifu_lsu_wsr_inst_d, ifu_exu_wsr_inst_d,
43
   ifu_tlu_done_inst_d, ifu_tlu_retry_inst_d, ifu_lsu_ld_inst_e,
44
   ifu_lsu_st_inst_e, ifu_lsu_pref_inst_e, ifu_lsu_alt_space_e,
45
   ifu_lsu_alt_space_d, ifu_tlu_alt_space_d, ifu_lsu_memref_d,
46
   ifu_lsu_sign_ext_e, ifu_lsu_ldstub_e, ifu_lsu_casa_e,
47
   ifu_exu_casa_d, ifu_lsu_swap_e, ifu_tlu_mb_inst_e,
48
   ifu_tlu_sir_inst_m, ifu_tlu_flsh_inst_e, ifu_lsu_ldst_dbl_e,
49
   ifu_lsu_ldst_fp_e, ifu_lsu_ldst_size_e, ifu_ffu_fpop1_d,
50
   ifu_ffu_visop_d, ifu_ffu_fpop2_d, ifu_ffu_fld_d, ifu_ffu_fst_d,
51
   ifu_ffu_ldst_size_d, ifu_ffu_ldfsr_d, ifu_ffu_ldxfsr_d,
52
   ifu_ffu_stfsr_d, ifu_ffu_quad_op_e, dec_fcl_rdsr_sel_pc_d,
53
   dec_fcl_rdsr_sel_thr_d, dec_imd_call_inst_d,
54
   dtu_fcl_flush_sonly_e, dtu_fcl_illinst_e, dtu_fcl_fpdis_e,
55
   dtu_fcl_privop_e, dtu_fcl_imask_hit_e, dtu_fcl_br_inst_d,
56
   dtu_fcl_sir_inst_e, dtu_ifq_kill_latest_d, dec_swl_wrt_tcr_w,
57
   dec_swl_wrtfprs_w, dec_swl_ll_done_d, dec_swl_br_done_d,
58
   dec_swl_rdsr_sel_thr_d, dec_swl_ld_inst_d, dec_swl_sta_inst_e,
59
   dec_swl_std_inst_d, dec_swl_st_inst_d, dec_swl_fpop_d,
60
   dec_swl_allfp_d, dec_swl_frf_upper_d, dec_swl_frf_lower_d,
61
   dec_swl_div_inst_d, dec_swl_mul_inst_d, wsr_fixed_inst_w,
62
   ifu_exu_sethi_inst_d, dec_dcl_cctype_d,
63
   // Inputs
64
   rclk, se, si, dtu_inst_d, erb_dtu_imask, swl_dec_ibe_e,
65
   dtu_inst_anull_e, lsu_ifu_ldsta_internal_e, fcl_dtu_tlzero_d,
66
   fcl_dtu_privmode_d, fcl_dtu_hprivmode_d, fcl_dtu_inst_vld_d,
67
   fcl_dtu_ely_inst_vld_d, fcl_dec_intr_vld_d, fcl_dtu_inst_vld_e,
68
   fcl_dec_dslot_s, swl_dec_mulbusy_e, swl_dec_fpbusy_e,
69
   swl_dec_divbusy_e, swl_dec_fp_enable_d
70
   );
71
 
72
   input          rclk,
73
                  se,
74
                  si;
75
   input [31:0]   dtu_inst_d;    // fed in at Switch (S) stage.
76
   input [38:0]   erb_dtu_imask;
77
   input          swl_dec_ibe_e;
78
   input          dtu_inst_anull_e;
79
   input          lsu_ifu_ldsta_internal_e;
80
   input          fcl_dtu_tlzero_d;
81
   input          fcl_dtu_privmode_d;
82
   input          fcl_dtu_hprivmode_d;
83
   input          fcl_dtu_inst_vld_d,
84
                  fcl_dtu_ely_inst_vld_d,
85
                  fcl_dec_intr_vld_d,
86
                              fcl_dtu_inst_vld_e;  // qual with this is not necessary
87
 
88
   input          fcl_dec_dslot_s;
89
 
90
   input          swl_dec_mulbusy_e;
91
   input          swl_dec_fpbusy_e;
92
   input          swl_dec_divbusy_e;
93
   input          swl_dec_fp_enable_d;
94
 
95
 
96
   output         so;
97
 
98
   // to EXU
99
   output [2:0]   ifu_exu_aluop_d;// 000 - add/sub
100
                                  // 001 - and
101
                                  // 010 - or
102
                                  // 011 - xor
103
                                  // 1X0 - movcc
104
                                  // 1x1 - movr
105
   output         ifu_exu_invert_d;   // invert rs2 operand
106
   output         ifu_exu_useimm_d;
107
   output         ifu_exu_usecin_d;   // use c from icc
108
   output         ifu_exu_enshift_d;  // turn on shifter
109
 
110
   output         ifu_exu_tagop_d,
111
                              ifu_exu_tv_d,
112
                              ifu_exu_muls_d,
113
                  ifu_exu_ialign_d,
114
                              ifu_exu_range_check_jlret_d,
115
                              ifu_exu_range_check_other_d;
116
 
117
   output [2:0] ifu_exu_shiftop_d;  // b2 - 32b(0) or 64b(1)
118
                                    // b1 - unsigned(0)  or signed(1)
119
                                    // b0 - left(0) or right(1) shift
120
 
121
   output [4:0] ifu_exu_muldivop_d; // b4 - is_mul
122
                                    // b3 - is_div
123
                                    // b2 - 64b if 1, 32b if 0
124
                                    // b1 - signed if 1, unsigned if 0
125
                                    // b0 - set cc's
126
 
127
   output       ifu_exu_wen_d;      // write to rd
128
   output       ifu_exu_setcc_d;    // b0 - write to icc/xcc
129
 
130
   output       ifu_exu_rd_ifusr_e,
131
                            ifu_exu_rd_exusr_e,
132
                            ifu_exu_rd_ffusr_e;
133
 
134
   output       ifu_exu_rs1_vld_d,
135
                            ifu_exu_rs2_vld_d,
136
                            ifu_exu_rs3e_vld_d,
137
                            ifu_exu_rs3o_vld_d;
138
 
139
   output       ifu_exu_use_rsr_e_l;
140
 
141
   output       ifu_exu_save_d,
142
                            ifu_exu_restore_d,
143
                            ifu_exu_return_d,
144
                            ifu_exu_flushw_e,
145
                            ifu_exu_saved_e,
146
                            ifu_exu_restored_e;
147
 
148
   // to TLU
149
   output       ifu_tlu_rsr_inst_d,
150
                            ifu_lsu_wsr_inst_d,
151
                            ifu_exu_wsr_inst_d,
152
                            ifu_tlu_done_inst_d,
153
                            ifu_tlu_retry_inst_d;
154
 
155
   // to LSU 
156
   output       ifu_lsu_ld_inst_e,   // ld inst or atomic
157
                            ifu_lsu_st_inst_e,   // store or atomic
158
                ifu_lsu_pref_inst_e,
159
                            ifu_lsu_alt_space_e, // alt space -- to be removed
160
                            ifu_lsu_alt_space_d, // never x -- to be removed
161
                            ifu_tlu_alt_space_d, // sometimes x but faster
162
                            ifu_lsu_memref_d;    // alerts lsu of upcoming ldst
163
//                          ifu_lsu_imm_asi_vld_d;
164
 
165
   output       ifu_lsu_sign_ext_e,
166
                            ifu_lsu_ldstub_e,
167
                            ifu_lsu_casa_e,
168
                            ifu_exu_casa_d,
169
                            ifu_lsu_swap_e;
170
 
171
   output       ifu_tlu_mb_inst_e,
172
                            ifu_tlu_sir_inst_m,
173
                            ifu_tlu_flsh_inst_e;
174
 
175
   output       ifu_lsu_ldst_dbl_e,
176
                            ifu_lsu_ldst_fp_e;
177
 
178
   output [1:0] ifu_lsu_ldst_size_e;
179
 
180
   // to SPU
181
//   output     ifu_spu_scpy_inst_e,
182
//              ifu_spu_scmp_inst_e;
183
 
184
   // to FFU
185
   output       ifu_ffu_fpop1_d;
186
   output       ifu_ffu_visop_d;
187
   output       ifu_ffu_fpop2_d;
188
   output       ifu_ffu_fld_d;
189
   output       ifu_ffu_fst_d;
190
   output       ifu_ffu_ldst_size_d;
191
 
192
   output       ifu_ffu_ldfsr_d,
193
                            ifu_ffu_ldxfsr_d,
194
                            ifu_ffu_stfsr_d;
195
   output       ifu_ffu_quad_op_e;
196
 
197
   // within IFU
198
   output       dec_fcl_rdsr_sel_pc_d,
199
                            dec_fcl_rdsr_sel_thr_d;
200
 
201
   output       dec_imd_call_inst_d;
202
 
203
   output       dtu_fcl_flush_sonly_e,
204
//                dec_fcl_kill4sta_e,
205
                            dtu_fcl_illinst_e,
206
                            dtu_fcl_fpdis_e,
207
                            dtu_fcl_privop_e,
208
                            dtu_fcl_imask_hit_e,
209
                            dtu_fcl_br_inst_d,
210
                            dtu_fcl_sir_inst_e;
211
 
212
   output       dtu_ifq_kill_latest_d;
213
 
214
   // within DTU
215
   output       dec_swl_wrt_tcr_w,
216
                            dec_swl_wrtfprs_w,
217
                            dec_swl_ll_done_d,
218
                dec_swl_br_done_d,
219
                            dec_swl_rdsr_sel_thr_d,
220
                            dec_swl_ld_inst_d,
221
                            dec_swl_sta_inst_e,
222
                            dec_swl_std_inst_d,
223
                            dec_swl_st_inst_d,
224
                            dec_swl_fpop_d,
225
                            dec_swl_allfp_d,
226
                            dec_swl_frf_upper_d,
227
                            dec_swl_frf_lower_d,
228
                            dec_swl_div_inst_d,
229
                            dec_swl_mul_inst_d,
230
                            wsr_fixed_inst_w,
231
                            ifu_exu_sethi_inst_d;   // can be sethi or no-op
232
 
233
   output [2:0] dec_dcl_cctype_d;       // 0yy - fcc(yy)
234
                                        // 100 - icc
235
                                        // 110 - xcc
236
                                        // 1X1 - illegal inst!
237
 
238
   //------------------------------------------------------------
239
   // Declarations
240
   //------------------------------------------------------------
241
   // Internal Signals
242
   wire [1:0]   op;
243
   wire [2:0]   op2;
244
   wire [5:0]   op3;
245
   wire [8:0]   opf;
246
 
247
   wire         brsethi_inst,  // op types
248
                            call_inst,
249
                            arith_inst,
250
                            mem_inst;
251
   wire         sethi_or_nop;
252
   wire [15:0]  op3_lo;        // decode op3[3:0]
253
   wire [3:0]   op3_hi;        // decode op3[5:4]
254
 
255
   wire         dbr_inst_d,
256
                            ibr_inst_d,    // jmpl or return
257
                            jmpl_inst_d,
258
                            retn_inst_d,
259
                            sethi_inst_d;
260
 
261
   wire         rdsr_done_d,
262
                rdpr_done_d;
263
   wire         dslot_d;
264
 
265
   wire         use_rsr_d_l;
266
 
267
   wire         flushw_d,
268
                            saved_d,
269
                            restored_d;
270
   wire         save_retn_done_d;
271
   wire         privop_d,
272
                            privop_e,
273
                hprivop_d,
274
                hprivop_e,
275
                valid_hp_rs_d,
276
                valid_hp_rd_d,
277
                            inv_reg_access_d,
278
                rsvchk_fail_d,
279
                            ill_inst_d,
280
                            ill_inst_e;
281
 
282
   wire         inst12_5_nonzero_d,
283
                inst11_8_nonzero_d,
284
                inst9_5_nonzero_d,
285
                rs2_nonzero_d;
286
 
287
   wire         state_chg_inst_d,
288
                            state_chg_inst_e,
289
                            flush_inst_d;
290
 
291
   wire         cctype_sel_imov,   // select which CC's to use
292
                            cctype_sel_fmov,
293
                            cctype_sel_bcc,
294
                            cctype_sel_bpcc;
295
 
296
   wire         rs1_vld_d,
297
                            rs2_vld_d,
298
                            rs3_vld_d,
299
                            rs4_vld_d;
300
 
301
   wire [4:0]   rs1,
302
                            rd;
303
 
304
   wire         rs1_00,           // decoded rs1
305
                            rs1_01,
306
                            rs1_02,
307
                            rs1_05,
308
                            rs1_06,
309
                            rs1_07,
310
                            rs1_09_0e,
311
                            rs1_0f,
312
                rs1_10,
313
                            rs1_12,
314
                            rs1_13,
315
                            rs1_14_15,
316
                            rs1_16_17,
317
                rs1_19,
318
                            rs1_1a,
319
                            rs1_1b,
320
                            rs1_1c_1f,
321
                            rd_00,
322
                            rd_01,
323
                            rd_04,
324
                            rd_05,
325
                            rd_06,
326
                            rd_07,
327
                            rd_09,
328
                            rd_0f,
329
                rd_10,
330
                            rd_11,
331
                            rd_12,
332
                rd_13,
333
                rd_18,
334
                            rd_1a,
335
                            rd_1b,
336
                            rd_1c_1f,
337
                rd_1f,
338
                            rs1_1f;
339
 
340
   wire         fcn0;
341
 
342
   wire         rd_ifusr_d,
343
                            rd_ifusr_e,
344
                rd_ffusr_d,
345
                            rd_ffusr_e,
346
                            rd_exusr_d,
347
                            rd_exusr_e;
348
   wire         wsr_fixed_inst_e,
349
                            wsr_fixed_inst_m,
350
                            wsr_inst_next_e,
351
                            wsr_fixed_inst_d;
352
 
353
   wire         wrt_tcr_d,
354
                            wrt_tcr_e,
355
                            wrt_tcr_qual_e,
356
                            wrt_tcr_m;
357
 
358
   wire         wrt_fprs_d,
359
                            wrt_fprs_e,
360
                            wrt_fprs_qual_e,
361
                            wrt_fprs_m;
362
 
363
   wire         prefetch,
364
                impl_prefetch,
365
                illegal_prefetch,
366
                noop_prefetch,
367
                pref_done_d,
368
                prefetch_d,
369
                prefetch_e;
370
 
371
   wire [2:0]   lstype_d,
372
                            lstype_e;
373
   wire [1:0]   lssize_d;
374
   wire         ldst_dbl_d,
375
                            ldst_fp_d,
376
                            sta_inst_d,
377
//                kill_for_sta_d,
378
                sta_nostf_d,
379
                            sta_inst_e,
380
                sta_nostf_e,
381
                            sext_d,
382
                            ldstub_d,
383
                            casa_d,
384
                casa_e,
385
                            swap_d;
386
 
387
   wire         mb_mask_d,
388
                            mb_inst_d,
389
                            mb_inst_e;
390
 
391
   wire         sir_inst_d,
392
                            sir_inst_e,
393
//                          kill_sir_d,
394
                            flag_sir_d,
395
                            flag_sir_e;
396
 
397
   wire         fpld_d,
398
                            fpop1_d,
399
                visop_d,
400
                int_align_d,
401
                            fpop2_d;
402
   wire         quad_ffuop_d;
403
 
404
   wire         allfp_d,
405
                            any_fpinst_d,
406
                            fpdis_trap_d,
407
                            fpdis_trap_e,
408
                            fcc_mov_d,
409
                            fcc_branch_d;
410
 
411
   wire         rs2_hit,
412
                            opf_hit,
413
                            ibit_hit,
414
                            rs1_hit,
415
                            op3_hit,
416
                            rd_hit,
417
                            op_hit,
418
                            imask_hit,
419
                            imask_hit_e;
420
 
421
   wire         clk;
422
 
423
 
424
//----------------------------------------------------------------------
425
// Code Begins Here
426
//----------------------------------------------------------------------
427
   assign       clk = rclk;
428
 
429
 
430
   assign   op  = dtu_inst_d[31:30];
431
   assign   op2 = dtu_inst_d[24:22];
432
   assign   op3 = dtu_inst_d[24:19];
433
   assign   opf = dtu_inst_d[13:5];
434
 
435
   // decode op
436
   assign   brsethi_inst = ~op[1] & ~op[0];
437
   assign   call_inst    = ~op[1] &  op[0];
438
   assign   arith_inst   =  op[1] & ~op[0];
439
   assign   mem_inst     =  op[1] &  op[0];
440
 
441
   // partial decode op2
442
   assign   sethi_or_nop = op2[2] & ~op2[1] & ~op2[0];
443
 
444
   // decode op3
445
   assign   op3_hi[0] = ~op3[5] & ~op3[4];
446
   assign   op3_hi[1] = ~op3[5] &  op3[4];
447
   assign   op3_hi[2] =  op3[5] & ~op3[4];
448
   assign   op3_hi[3] =  op3[5] &  op3[4];
449
 
450
   assign   op3_lo[0]  = ~op3[3] & ~op3[2] & ~op3[1] & ~op3[0];
451
   assign   op3_lo[1]  = ~op3[3] & ~op3[2] & ~op3[1] &  op3[0];
452
   assign   op3_lo[2]  = ~op3[3] & ~op3[2] &  op3[1] & ~op3[0];
453
   assign   op3_lo[3]  = ~op3[3] & ~op3[2] &  op3[1] &  op3[0];
454
   assign   op3_lo[4]  = ~op3[3] &  op3[2] & ~op3[1] & ~op3[0];
455
   assign   op3_lo[5]  = ~op3[3] &  op3[2] & ~op3[1] &  op3[0];
456
   assign   op3_lo[6]  = ~op3[3] &  op3[2] &  op3[1] & ~op3[0];
457
   assign   op3_lo[7]  = ~op3[3] &  op3[2] &  op3[1] &  op3[0];
458
   assign   op3_lo[8]  =  op3[3] & ~op3[2] & ~op3[1] & ~op3[0];
459
   assign   op3_lo[9]  =  op3[3] & ~op3[2] & ~op3[1] &  op3[0];
460
   assign   op3_lo[10] =  op3[3] & ~op3[2] &  op3[1] & ~op3[0];
461
   assign   op3_lo[11] =  op3[3] & ~op3[2] &  op3[1] &  op3[0];
462
   assign   op3_lo[12] =  op3[3] &  op3[2] & ~op3[1] & ~op3[0];
463
   assign   op3_lo[13] =  op3[3] &  op3[2] & ~op3[1] &  op3[0];
464
   assign   op3_lo[14] =  op3[3] &  op3[2] &  op3[1] & ~op3[0];
465
   assign   op3_lo[15] =  op3[3] &  op3[2] &  op3[1] &  op3[0];
466
 
467
   //-------------------------
468
   // Branch and Move Controls
469
   //-------------------------
470
   // brtype
471
   assign dbr_inst_d = brsethi_inst & (op2[1] | op2[0]) |   // regular branch
472
                             call_inst;
473
   assign jmpl_inst_d = arith_inst & op3_hi[3] & op3_lo[8];  // jmpl
474
   assign retn_inst_d = arith_inst & op3_hi[3] & op3_lo[9];  // retn
475
   assign ibr_inst_d = jmpl_inst_d | retn_inst_d;
476
   assign sethi_inst_d = brsethi_inst & sethi_or_nop;
477
   assign ifu_exu_sethi_inst_d = sethi_inst_d;
478
 
479
   assign dec_swl_br_done_d = (dbr_inst_d | jmpl_inst_d); // br compl.
480
                                                  // retn has separate
481
                                                  // completion signal
482
   assign dtu_fcl_br_inst_d = dbr_inst_d | ibr_inst_d;
483
   assign dec_imd_call_inst_d = call_inst;
484
 
485
   // MV-BR Condition
486
   assign   cctype_sel_imov  =  op[1] & ~op3[4];
487
   assign   cctype_sel_fmov  =  op[1] & op3[4];
488
   assign   cctype_sel_bcc  = ~op[1] &  op2[1];
489
   assign   cctype_sel_bpcc = ~op[1] & ~op2[1];
490
 
491
   mux4ds  #(3) cctype_mux(.dout  (dec_dcl_cctype_d),
492
                                           .in0   ({dtu_inst_d[18], dtu_inst_d[12:11]}),
493
                                           .in1   (dtu_inst_d[13:11]),
494
                                           // op2[2]=1 for fp branch
495
                                           .in2   ({~op2[2], 2'b00}),
496
                                           .in3   ({~op2[2], dtu_inst_d[21:20]}),
497
                                           .sel0  (cctype_sel_imov),
498
                                           .sel1  (cctype_sel_fmov),
499
                                           .sel2  (cctype_sel_bcc),
500
                                           .sel3  (cctype_sel_bpcc));
501
 
502
   //-------------
503
   // ALU Controls
504
   //-------------
505
   // mov bit
506
   assign ifu_exu_aluop_d[2] = brsethi_inst & sethi_or_nop |   // sethi
507
                            arith_inst & op3_hi[2] & op3[3];   // mov, rd
508
 
509
   // aluop
510
   assign ifu_exu_aluop_d[1] = (arith_inst &
511
                                      ((op3_hi[3] & (op3_lo[0] |   // wr
512
                                               op3_lo[2] |   // wrpr
513
                                               op3_lo[3])) | // wrhpr
514
                                                         (~op3[5] & op3[1]))         // xor, or
515
                                );
516
 
517
   // aluop/mov type
518
   assign ifu_exu_aluop_d[0] = (arith_inst &
519
                                      ((op3_hi[3] & (op3_lo[0] |
520
                                               op3_lo[2] |
521
                                               op3_lo[3])) | // wr
522
                                                         (~op3[5] & op3[0])        | // xor, and
523
                                                         (op3_hi[2] & op3_lo[15]))   // movr
524
                                );
525
 
526
   // invert rs2
527
   assign ifu_exu_invert_d  = arith_inst &
528
                              (~op3[5] & op3[2]  |   // sub, andn, orn, xorn
529
                               op3_hi[2] & (op3_lo[3] | op3_lo[1])); // tag sub
530
 
531
   assign ifu_exu_usecin_d   = arith_inst & ~op3[5] & op3[3];   // addc, subc
532
 
533
   // tagged ops
534
   assign ifu_exu_tagop_d = arith_inst & op3_hi[2] & ~op3[3] & ~op3[2] &
535
                                  fcl_dtu_inst_vld_d;
536
   assign ifu_exu_tv_d = ifu_exu_tagop_d & op3[1];
537
   assign ifu_exu_muls_d  = arith_inst & op3_hi[2] & op3_lo[4] &
538
                                  ~swl_dec_divbusy_e & fcl_dtu_ely_inst_vld_d;
539
 
540
   // memory for ibr and ldst address range check
541
   assign ifu_exu_range_check_other_d = mem_inst & ~prefetch; // ld, st, atom
542
   assign ifu_exu_range_check_jlret_d = arith_inst & op3_hi[3] &
543
                                        (op3_lo[8] | op3_lo[9]); // jmpl, retn
544
 
545
   //--------------
546
   // SHFT Controls
547
   //--------------
548
   // enable shifter and choose shift output
549
   // This can be simplified a great deal if MULScc could also be
550
   // decoded as a shift instruction.
551
   // 9/26/01: No can do! Mulscc is implemented now
552
   assign ifu_exu_enshift_d = arith_inst & op3_hi[2] &
553
                               (op3_lo[5] | op3_lo[6] | op3_lo[7]);
554
   // unsigned or signed (1 => signed)
555
   assign ifu_exu_shiftop_d[0] = op3[0];
556
   // left or right (1 => right)
557
   assign ifu_exu_shiftop_d[1] = op3[1];
558
   // shift 32b or 64b (1 => 64)
559
   assign ifu_exu_shiftop_d[2] = dtu_inst_d[12];   // was sh32_64
560
 
561
 
562
   //-------------------
563
   // Writeback Controls
564
   //-------------------
565
   //  write to icc/xcc
566
   assign ifu_exu_setcc_d = arith_inst &
567
                             (op3_hi[1] & (~op3[3] | ~op3[1] & ~op3[0]) |
568
                              op3_hi[2] & (~op3[3] & ~op3[2])); // tagged op
569
   //  write to rd
570
   assign ifu_exu_wen_d = ((~rd_00) & brsethi_inst & sethi_or_nop | // sethi
571
                                 (~rd_00) & arith_inst &  // all single cycle insts
572
                                 (~op3[5] & ~op3[3]    |     // alu ops
573
                                              ~op3[5] & op3_lo[8]  |     // addC
574
                                              ~op3[5] & op3_lo[12] |     // subC
575
                                              op3_hi[2] &
576
                                              (~op3[3] & ~op3_lo[4] |    // shft, tag, ~muls
577
                                               // need to kill if rd to invalid reg
578
                                               // all vld regs will retn in W stage
579
                                               op3_lo[8] & ~rs1_0f | op3_lo[10]  | // rd
580
                             op3_lo[9] | // rdhpr
581
                                               op3_lo[12] | op3_lo[15])| // mov
582
                                              op3_hi[3] &
583
                                              (op3_lo[8]  |    // jmpl
584
                                               op3_lo[12] |    // save
585
                                               op3_lo[13] |    // restore
586
                             op3_lo[6] & int_align_d)  // vis int align
587
                                              )           |
588
                                 call_inst);
589
 
590
   //-----------------
591
   // MUL/DIV Controls
592
   //-----------------
593
   // is mul
594
   assign dec_swl_mul_inst_d = (arith_inst &
595
                                                        ((op3_hi[0] &
596
                                                          (op3_lo[9]  |      // mulx
597
                                                           op3_lo[10] |      // umul
598
                                                           op3_lo[11])) |    // smul
599
                                                         (op3_hi[1] &
600
                                                          (op3_lo[10] |      // umulcc
601
                                                           op3_lo[11])))     // smulcc
602
                                                        );
603
 
604
   assign ifu_exu_muldivop_d[4] = dec_swl_mul_inst_d & ~swl_dec_mulbusy_e &
605
                                  fcl_dtu_ely_inst_vld_d;
606
 
607
   // is div
608
   assign dec_swl_div_inst_d = (arith_inst &
609
                                                        ((op3_hi[0] &
610
                                                          (op3_lo[13]  |     // udivx
611
                                                           op3_lo[14]  |     // udiv
612
                                                           op3_lo[15]))  |   // sdiv
613
                                                         (op3_hi[2] &
614
                                                          (op3_lo[13]   |    // sdivx
615
                                                           op3_lo[4]))  |    // muls
616
                                                         (op3_hi[1] &
617
                                                          (op3_lo[14] |      // udivcc
618
                                                           op3_lo[15])))     // sdivcc
619
                                                        );
620
 
621
   assign ifu_exu_muldivop_d[3] = dec_swl_div_inst_d & ~swl_dec_divbusy_e &
622
                                                          op3[3] & fcl_dtu_ely_inst_vld_d; // not muls
623
 
624
   // 64b or 32b (1 => 64b)
625
   assign ifu_exu_muldivop_d[2] = ~op3[1];
626
 
627
   // signed or unsigned (1 => signed)
628
   assign ifu_exu_muldivop_d[1] = op3_hi[2] |          // sdivx
629
                                        (op3[1] & op3[0]);   // smul, sdiv
630
   // set cc as well?
631
   assign ifu_exu_muldivop_d[0] = op3[4];
632
 
633
   //-------------------------
634
   // FP controls
635
   //-------------------------
636
 
637
   // portion of vis that is actually an int instruction
638
   assign int_align_d = (~opf[8] & ~opf[7] & ~opf[6] & ~opf[5] &
639
                         opf[4] & opf[3] & ~opf[2] & ~opf[0]);
640
   assign ifu_exu_ialign_d = arith_inst & op3_hi[3] & op3_lo[6] &
641
                             int_align_d & fcl_dtu_inst_vld_d;
642
 
643
 
644
   assign fpop1_d = arith_inst & op3_hi[3] & op3_lo[4];
645
   assign fpop2_d = arith_inst & op3_hi[3] & op3_lo[5];
646
   assign visop_d = arith_inst & op3_hi[3] & op3_lo[6];
647
   assign fpld_d = mem_inst & op3[5] & ~op3[3] & ~op3[2];
648
 
649
   // FP stores don't switch out and don't block the fpu
650
   assign dec_swl_fpop_d = (fpop1_d | fpop2_d | fpld_d | visop_d);
651
   assign allfp_d = (fpop1_d | fpop2_d | fpld_d | visop_d |
652
                           mem_inst & op3[5] & ~op3[3] & op3[2]);
653
   assign dec_swl_allfp_d = allfp_d;
654
 
655
   assign ifu_ffu_ldfsr_d = op3_lo[1] & op3_hi[2] & ~rd[0];
656
   assign ifu_ffu_ldxfsr_d = op3_lo[1] & op3_hi[2] & rd[0];
657
   assign ifu_ffu_stfsr_d = op3_lo[5] & op3_hi[2];
658
 
659
   assign ifu_ffu_fpop1_d = fpop1_d & ~swl_dec_fpbusy_e &
660
                            fcl_dtu_ely_inst_vld_d;
661
   assign ifu_ffu_fpop2_d = fpop2_d & ~swl_dec_fpbusy_e &
662
                            fcl_dtu_ely_inst_vld_d;
663
   assign ifu_ffu_visop_d = visop_d & ~swl_dec_fpbusy_e &
664
                            fcl_dtu_ely_inst_vld_d;
665
 
666
   assign ifu_ffu_fld_d =  mem_inst & op3[5] & ~op3[3] & ~op3[2] &
667
                                             fcl_dtu_ely_inst_vld_d & ~swl_dec_fpbusy_e;
668
 
669
   assign ifu_ffu_fst_d =  mem_inst & op3[5] & ~op3[3] & op3[2] &
670
                                       fcl_dtu_ely_inst_vld_d & ~swl_dec_fpbusy_e;
671
 
672
   // ldqf and stqf are not fpops
673
   assign quad_ffuop_d = (opf[1] & opf[0] & (fpop1_d | fpop2_d) |
674
                                fpop1_d & opf[3] & opf[2] & // exc div
675
                                ~(~opf[7] & opf[6] & ~opf[5])) &
676
                                 swl_dec_fp_enable_d & fcl_dtu_inst_vld_d;
677
 
678
   dff_s #(1) qope_ff(.din  (quad_ffuop_d),
679
                              .q    (ifu_ffu_quad_op_e),
680
                              .clk  (clk), .se(se), .si(), .so());
681
 
682
   // quiet traps -- flush the pipe but don't take a trap till later
683
//   assign dec_swl_qtrap_d = mem_inst & op3[5] & op3_lo[6] & fcl_dtu_inst_vld_d;  // stq
684
//   dff #(1) qtrpe_ff(.din  (dec_swl_qtrap_d),
685
//                 .q    (dtu_fcl_qtrap_e),
686
//                 .clk  (clk), .se(se), .si(), .so());
687
 
688
   // FP Enabled check
689
   assign fcc_branch_d = ~op[1] & ~op[0] & op3[5] & (op3[4] | op3[3]);
690
   assign fcc_mov_d = op[1] & ~op[0] & op3_hi[2] & op3_lo[12] &
691
                            ~dtu_inst_d[18];
692
 
693
   assign any_fpinst_d = allfp_d | fcc_branch_d | fcc_mov_d |
694
                         arith_inst & op3_hi[2] & op3_lo[8] & rs1_13 | // rd gsr
695
                         arith_inst & op3_hi[3] & op3_lo[0] & rd_13;   // wr gsr
696
 
697
   assign fpdis_trap_d = any_fpinst_d & ~swl_dec_fp_enable_d &
698
                         fcl_dtu_inst_vld_d;
699
   dff_s #(1) fpdise_ff(.din (fpdis_trap_d),
700
                                .q   (fpdis_trap_e),
701
                                .clk (clk), .se(se), .si(), .so());
702
   assign dtu_fcl_fpdis_e = fpdis_trap_e;
703
 
704
   // FRF dirty bits
705
   // bit 0 is the msb for double and quad
706
   assign dec_swl_frf_upper_d = rd[0] & (mem_inst & op3_lo[3] |  // fld
707
                                                            fpop1_d & (opf[7] | opf[6] & opf[5]) &
708
                                         (opf[3] | ~opf[2]) |
709
                                                            fpop1_d & ~opf[7] & opf[1] & ~opf[0] |
710
                                                            fpop2_d & opf[1] |
711
                              visop_d & ~opf[0]);
712
 
713
   assign dec_swl_frf_lower_d = ~rd[0] & (mem_inst & op3_lo[3] |  // fld
714
                                                            fpop1_d & (opf[7] | opf[6] & opf[5]) &
715
                                          (opf[3] | ~opf[2]) |
716
                                                            fpop1_d & ~opf[7] & opf[1] & ~opf[0] |
717
                                                            fpop2_d & opf[1] |
718
                              visop_d & ~opf[0]) |
719
                                                      (fpop2_d & ~opf[1] |  // all sgl ops wrt lower
720
                                     fpop1_d & opf[7] & ~opf[3] & opf[2] |
721
                                     //bug 6470 - fdtoi,fstoi,fqtoi
722
                                     (fpop1_d & (opf[7:6]==2'b11) & (opf[3:2]==2'b00)) |
723
                                     //bug6470 - end
724
                                                       fpop1_d & ~opf[7] & ~opf[1] & opf[0] |
725
                               visop_d & opf[0] |
726
                                                       mem_inst & op3_lo[0] & op3[5]);
727
 
728
 
729
   //-------------------------
730
   // Special Reg R/W Controls
731
   //-------------------------
732
   // decode rs1
733
   assign rs1 = dtu_inst_d[18:14];
734
   assign rs1_00 = ~rs1[4] & ~rs1[3] & ~rs1[2] & ~rs1[1] & ~rs1[0]; // Y
735
   assign rs1_01 = ~rs1[4] & ~rs1[3] & ~rs1[2] & ~rs1[1] & rs1[0]; //
736
   assign rs1_02 = ~rs1[4] & ~rs1[3] & ~rs1[2] & rs1[1] & ~rs1[0];  // CCR
737
   assign rs1_05 = ~rs1[4] & ~rs1[3] & rs1[2] & ~rs1[1] & rs1[0]; // PC
738
   assign rs1_06 = ~rs1[4] & ~rs1[3] & rs1[2] & rs1[1] & ~rs1[0]; // fprs
739
   assign rs1_07 = ~rs1[4] & ~rs1[3] & rs1[2] & rs1[1] & rs1[0]; //
740
   assign rs1_0f = ~rs1[4] & rs1[3] & rs1[2] & rs1[1] & rs1[0];   // mem#
741
   assign rs1_10 = rs1[4] & ~rs1[3] & ~rs1[2] & ~rs1[1] & ~rs1[0];
742
   assign rs1_12 = rs1[4] & ~rs1[3] & ~rs1[2] & rs1[1] & ~rs1[0];
743
   assign rs1_13 = rs1[4] & ~rs1[3] & ~rs1[2] & rs1[1] & rs1[0];
744
   assign rs1_14_15 = rs1[4] & ~rs1[3] & rs1[2] & ~rs1[1];
745
   assign rs1_16_17 = rs1[4] & ~rs1[3] & rs1[2] & rs1[1];
746
   assign rs1_19 = rs1[4] & rs1[3] & ~rs1[2] & ~rs1[1] & rs1[0];
747
   assign rs1_1f = rs1[4] & rs1[3] & rs1[2] & rs1[1] & rs1[0];    // 
748
   assign rs1_1a = rs1[4] & rs1[3] & ~rs1[2] & rs1[1] & ~rs1[0]; // THR
749
   assign rs1_1b = rs1[4] & rs1[3] & ~rs1[2] & rs1[1] & rs1[0];
750
   assign rs1_1c_1f = rs1[4] & rs1[3] & rs1[2];
751
   assign rs1_09_0e = ~rs1[4] & rs1[3] &          // all window mgmt regs
752
                      (rs1[2] & ~rs1[1] | rs1[1] & ~rs1[0] |
753
                             rs1[0] & ~rs1[2]);
754
 
755
   // decode rd
756
   assign rd = dtu_inst_d[29:25];
757
   assign rd_00 = ~rd[4] & ~rd[3] & ~rd[2] & ~rd[1] & ~rd[0]; // mem#
758
   assign rd_01 = ~rd[4] & ~rd[3] & ~rd[2] & ~rd[1] & rd[0]; // 
759
   assign rd_04 = ~rd[4] & ~rd[3] & rd[2] & ~rd[1] & ~rd[0]; //  tick
760
   assign rd_05 = ~rd[4] & ~rd[3] & rd[2] & ~rd[1] & rd[0];  //  PC
761
   assign rd_06 = ~rd[4] & ~rd[3] & rd[2] & rd[1] & ~rd[0];
762
   assign rd_07 = ~rd[4] & ~rd[3] & rd[2] & rd[1] & rd[0];
763
   assign rd_09 = ~rd[4] & rd[3] & ~rd[2] & ~rd[1] & rd[0]; // CWP
764
   assign rd_0f = ~rd[4] & rd[3] & rd[2] & rd[1] & rd[0];   // not impl
765
   assign rd_10 = rd[4] & ~rd[3] & ~rd[2] & ~rd[1] & ~rd[0];   // gl
766
   assign rd_11 = rd[4] & ~rd[3] & ~rd[2] & ~rd[1] & rd[0];   // pic
767
   assign rd_12 = rd[4] & ~rd[3] & ~rd[2] & rd[1] & ~rd[0];   // not impl
768
   assign rd_13 = rd[4] & ~rd[3] & ~rd[2] & rd[1] & rd[0];   // GSR
769
   assign rd_18 = rd[4] & rd[3] & ~rd[2] & ~rd[1] & ~rd[0]; // stick   
770
   assign rd_1a = rd[4] & rd[3] & ~rd[2] & rd[1] & ~rd[0]; // Thr
771
   assign rd_1b = rd[4] & rd[3] & ~rd[2] & rd[1] & rd[0];
772
   assign rd_1c_1f = rd[4] & rd[3] & rd[2];
773
   assign rd_1f = rd[4] & rd[3] & rd[2] & rd[1] & rd[0];
774
 
775
   assign ifu_lsu_wsr_inst_d = arith_inst & fcl_dtu_ely_inst_vld_d &
776
                               op3_hi[3] & (op3_lo[0] | op3_lo[2] | op3_lo[3]);
777
   assign ifu_exu_wsr_inst_d = ifu_lsu_wsr_inst_d;
778
 
779
   assign ifu_tlu_rsr_inst_d = arith_inst & fcl_dtu_ely_inst_vld_d &
780
                               op3_hi[2] & (op3_lo[8] & ~rs1_0f | // ~membar
781
                                      op3_lo[9] |           // hpr
782
                                                                    op3_lo[10]);          // pr
783
 
784
   assign rdsr_done_d = arith_inst & op3_hi[2] & op3_lo[8] & ~mb_inst_d;
785
   assign rdpr_done_d = arith_inst & op3_hi[2] & (op3_lo[10] | op3_lo[9]);
786
 
787
   // all wrpr's except cwp are fixed length
788
   // 
789
   assign wsr_fixed_inst_d = arith_inst & op3_hi[3] &
790
                               (op3_lo[2] & ~rd_09 |  // wrpr exc. cwp 
791
                                      op3_lo[0] & ~rd_1a |  // wr exc. thr
792
                                op3_lo[3]);           // wrhpr
793
 
794
 
795
   dff_s #(1) wre_ff(.din (wsr_fixed_inst_d),
796
                             .clk (clk),
797
                             .q   (wsr_fixed_inst_e),
798
                             .se  (se), .si(), .so());
799
 
800
   assign wsr_inst_next_e = (~dtu_inst_anull_e) & wsr_fixed_inst_e &
801
                                  fcl_dtu_inst_vld_e;
802
 
803
   dff_s #(1) wrm_ff(.din (wsr_inst_next_e),
804
                             .clk (clk),
805
                             .q   (wsr_fixed_inst_m),
806
                             .se  (se), .si(), .so());
807
 
808
   dff_s #(1) wrw_ff(.din (wsr_fixed_inst_m),
809
                             .clk (clk),
810
                             .q   (wsr_fixed_inst_w),
811
                             .se  (se), .si(), .so());
812
 
813
   assign use_rsr_d_l = ~(ifu_tlu_rsr_inst_d | ibr_inst_d | call_inst);
814
 
815
   dff_s #(1) rdsre_ff(.din (use_rsr_d_l),
816
                               .clk (clk),
817
                               .q   (ifu_exu_use_rsr_e_l),
818
                               .se  (se), .si(), .so());
819
 
820
   assign flush_inst_d = fcl_dtu_inst_vld_d & arith_inst &
821
                               op3_hi[3] & op3_lo[11];
822
 
823
   dff_s #(1) flsh_ff(.din (flush_inst_d),
824
                              .q   (ifu_tlu_flsh_inst_e),
825
                              .clk (clk),
826
                              .se  (se), .si(), .so());
827
 
828
 
829
   // If machine state is changed kill the already fetched instructions
830
   assign state_chg_inst_d = ifu_lsu_wsr_inst_d | flush_inst_d |
831
                                   ifu_tlu_done_inst_d | ifu_tlu_retry_inst_d;
832
 
833
 
834
   dff_s #(1) schg_ff(.din (state_chg_inst_d),
835
                                .clk (clk),
836
                                .q   (state_chg_inst_e),
837
//                             .rst (reset),
838
                                .se  (se), .si(), .so());
839
 
840
//   assign sta_inst_d = mem_inst & op3[4] & fcl_dtu_inst_vld_d & 
841
//                       (~op3[5] & ~op3[3] & op3[2] |
842
//                                        op3[5] & (op3_lo[4] | op3_lo[7]) |
843
//                                        ~op3[5] & op3_lo[14]);
844
   assign sta_inst_d = mem_inst & op3[4] & op3[2] & fcl_dtu_inst_vld_d & ~prefetch;
845
 
846
   assign sta_nostf_d = mem_inst & op3[4] & fcl_dtu_inst_vld_d &
847
                       (~op3[5] & ~op3[3] & op3[2] |
848
                                          ~op3[5] & op3_lo[14]);
849
 
850
   dff_s #(1) sta_ff (.din (sta_inst_d),
851
                              .clk (clk),
852
                              .q   (sta_inst_e),
853
                              .se  (se), .si(), .so());
854
 
855
   dff_s #(1) stanf_ff (.din (sta_nostf_d),
856
                                  .clk (clk),
857
                                  .q   (sta_nostf_e),
858
                                  .se  (se), .si(), .so());
859
 
860
  assign dec_swl_sta_inst_e = sta_nostf_e;
861
 
862
   // Mov qualification with inst_vld_e to FCL?  Done
863
   assign dtu_fcl_flush_sonly_e = (sta_inst_e & lsu_ifu_ldsta_internal_e |
864
                                   state_chg_inst_e);
865
 
866
   dff_s #(1) ds_ff(.din (fcl_dec_dslot_s),
867
                  .q   (dslot_d),
868
                  .clk (clk), .se(se), .si(), .so());
869
 
870
   // suppress ifetch if arch state changes in delay slot (if not 
871
   // suppressed, it may cause in error in the L2 for an unmapped 
872
   // address). 
873
//   assign dtu_ifq_kill_latest_d = ifu_lsu_wsr_inst_d | flush_inst_d |
874
//                                    ifu_tlu_done_inst_d | ifu_tlu_retry_inst_d |  
875
//                                sta_inst_d;
876
   assign dtu_ifq_kill_latest_d = (((arith_inst & op3_hi[3] &
877
                                     (op3_lo[2] | op3_lo[3] | op3_lo[0]) |// wr
878
                                     mem_inst & op3[4] & op3[2]) &
879
                                    fcl_dtu_ely_inst_vld_d) |
880
                                   fcl_dec_intr_vld_d) & dslot_d; // in DS
881
 
882
//   assign kill_for_sta_d = mem_inst & op3[4] & op3[2] & 
883
                           // ~op3[5] &  // sta - excl stf and pref
884
//                           fcl_dtu_ely_inst_vld_d & dslot_d; // in DS
885
 
886
//   dff #(1) kfste_ff(.din (kill_for_sta_d),
887
//                     .q   (kill_for_sta_e),
888
//                     .clk (clk), .se(se), .si(), .so());
889
//   assign dec_fcl_kill4sta_e = kill_for_sta_e;
890
 
891
   assign rd_ifusr_d = arith_inst & op3_hi[2] &
892
                             (op3_lo[9] & rs1_06    |  // rdhpr - ver
893
                                          op3_lo[8] & (rs1_05 |    // rdsr - pc
894
                                                             rs1_1a |    // rdsr - thr
895
                                                             rs1_06))  | // rdsr - fprs
896
                                     jmpl_inst_d |                    // jmpl
897
                             call_inst;                         // call
898
 
899
   assign rd_exusr_d = arith_inst & op3_hi[2] &
900
                (op3_lo[10] & rs1_09_0e |         // rdpr (wind)
901
                             op3_lo[8] & (rs1_00 | rs1_02));  // rdsr (y + ccr)
902
 
903
   assign rd_ffusr_d = arith_inst & op3_hi[2] &
904
                                         op3_lo[8] & rs1_13;  // rdsr (gsr)
905
 
906
   dff_s #(1) ifusr_ff(.din  (rd_ifusr_d),
907
                               .clk  (clk),
908
                               .q    (rd_ifusr_e),
909
                               .se   (se), .si(), .so());
910
   dff_s #(1) ffusr_ff(.din  (rd_ffusr_d),
911
                               .clk  (clk),
912
                               .q    (rd_ffusr_e),
913
                               .se   (se), .si(), .so());
914
   dff_s #(1) exusr_ff(.din  (rd_exusr_d),
915
                               .clk  (clk),
916
                               .q    (rd_exusr_e),
917
                               .se   (se), .si(), .so());
918
 
919
   // make sure they are exclusive
920
   assign ifu_exu_rd_ifusr_e = rd_ifusr_e;
921
   assign ifu_exu_rd_exusr_e = rd_exusr_e;
922
   assign ifu_exu_rd_ffusr_e = rd_ffusr_e;
923
 
924
   // choose which of IFU special regs should be read
925
   // call, jmpl or rdpc (05) => pc
926
   assign dec_fcl_rdsr_sel_pc_d = ~dtu_inst_d[31] | op3_hi[3] | ~rs1[1] & rs1[0];
927
   // read thread conf (1a) or fprs (06)
928
   assign dec_fcl_rdsr_sel_thr_d = dtu_inst_d[31] & op3_hi[2] & op3_lo[8] & ~rs1[0];
929
   // else version reg (rdhpr 06)
930
 
931
   //   dff #(1) rdfprs_ff(.din (rs1[4]),
932
   //               .q   (dec_swl_rdsr_sel_thr_e),
933
   //               .clk (clk), .se(se), .si(), .so());
934
   assign dec_swl_rdsr_sel_thr_d = rs1[4];
935
 
936
   assign wrt_tcr_d = arith_inst & fcl_dtu_inst_vld_d &
937
                            op3_hi[3] & op3_lo[0] & rd_1a;
938
 
939
   dff_s #(1) tcre_ff(.din  (wrt_tcr_d),
940
                                .clk  (clk),
941
                                .q    (wrt_tcr_e),
942
                                .se   (se), .si(), .so());
943
 
944
   assign wrt_tcr_qual_e = wrt_tcr_e & (~dtu_inst_anull_e) &
945
                                                                       fcl_dtu_inst_vld_e;
946
 
947
   dff_s #(1) tcrm_ff(.din  (wrt_tcr_qual_e),
948
                              .clk  (clk),
949
                              .q    (wrt_tcr_m),
950
                              .se   (se), .si(), .so());
951
 
952
   dff_s #(1) tcrw_ff(.din  (wrt_tcr_m),
953
                              .clk  (clk),
954
                              .q    (dec_swl_wrt_tcr_w),
955
                              .se   (se), .si(), .so());
956
 
957
   // FPRS write
958
   assign wrt_fprs_d = arith_inst & fcl_dtu_inst_vld_d &
959
                             op3_hi[3] & op3_lo[0] & rd_06;
960
   dff_s #(1) fprse_ff(.din  (wrt_fprs_d),
961
                               .clk  (clk),
962
                               .q    (wrt_fprs_e),
963
                               .se   (se), .si(), .so());
964
   assign wrt_fprs_qual_e = wrt_fprs_e & (~dtu_inst_anull_e) &
965
                                                                         fcl_dtu_inst_vld_e;
966
   dff_s #(1) fprsm_ff(.din  (wrt_fprs_qual_e),
967
                               .clk  (clk),
968
                               .q    (wrt_fprs_m),
969
                               .se   (se), .si(), .so());
970
   dff_s #(1) fprsw_ff(.din  (wrt_fprs_m),
971
                               .clk  (clk),
972
                               .q    (dec_swl_wrtfprs_w),
973
                               .se   (se), .si(), .so());
974
 
975
   //----------------
976
   // RF/RML Controls
977
   //----------------
978
   // Reg Valid Signals for doing ECC
979
 
980
   //bug6777 - cas decode is incorrect
981
   //         ~(op3_hi[3] & dtu_inst_d[22] & mem_inst); // CAS
982
   assign ifu_exu_useimm_d = ~dtu_inst_d[31] |
983
                              dtu_inst_d[13] &
984
                             ~(op3_hi[3] & dtu_inst_d[22] & ~op3[0] & mem_inst); // CAS
985
 
986
   // alternately try: ~ren2_d | ~23 | ~22
987
   assign rs1_vld_d = (brsethi_inst & op2[1] & op2[0] |
988
                                   arith_inst & (~op3[5] |
989
                                                             op3_hi[2] & ~op3[3] |
990
                                                             op3_hi[2] & op3_lo[13] |
991
                                                             op3_hi[2] & op3_lo[15] |
992
                                                             op3_hi[3] & op3_lo[0]  |
993
                                                             op3_hi[3] & op3_lo[2]  |
994
                                                             op3_hi[3] & op3_lo[3]  |
995
                                                             op3_hi[3] & op3_lo[5] &
996
                                     ~opf[4] & ~opf[3] & opf[2] |  // fmovr
997
                                                             op3_hi[3] & op3_lo[6] & int_align_d  |
998
                                                             op3_hi[3] & op3[3] & ~op3[2] |
999
                                                             op3_hi[3] & op3[3] & ~op3[1]) |
1000
                                   mem_inst & (~op3[5] |
1001
                                                           ~op3[3] |
1002
                                                           op3[4] & op3[3] & op3[2]));
1003
 
1004
   assign ifu_exu_rs1_vld_d = rs1_vld_d;
1005
 
1006
   assign rs2_vld_d = (arith_inst & (~op3[5] |
1007
                                                             op3_hi[2] & (~op3[3] | op3[2]) |
1008
                                                             op3_hi[3] & op3_lo[0]  |
1009
                                                             op3_hi[3] & op3_lo[2]  |
1010
                                                             op3_hi[3] & op3_lo[3]  |
1011
                                                             op3_hi[3] & op3_lo[6] & int_align_d  |
1012
                                                             op3_hi[3] & op3[3] & ~op3[2] |
1013
                                                             op3_hi[3] & op3[3] & ~op3[1]) &
1014
                                               ~dtu_inst_d[13] |
1015
                                   mem_inst & (~op3[5] |
1016
                                                           ~op3[3]) & ~dtu_inst_d[13] |
1017
                                   mem_inst & op3_hi[3] & (op3_lo[12] |   // cas
1018
                                                                             op3_lo[14]));
1019
 
1020
   assign ifu_exu_rs2_vld_d = rs2_vld_d;
1021
 
1022
   assign rs3_vld_d = mem_inst & (~op3[5] & ~op3[3] & op3[2] | // all st
1023
                                                          ~op3[5] & op3[3] & op3[2] | // swp,stx,ldstub
1024
                                                          op3_hi[3] & (op3_lo[12] |   // cas
1025
                                                                             op3_lo[14])) |
1026
                      arith_inst & (op3_hi[2] & (op3_lo[12] |
1027
                                                 op3_lo[15]));
1028
 
1029
   // for std and stq(=stda) & ~stf
1030
   assign rs4_vld_d = mem_inst & ~op3[5] & op3_lo[7];
1031
 
1032
   // rs3even = rs4 + rs3 & ~rd[0]
1033
   // rs3odd = rs4 + rs3 & rd[0]
1034
   // needs both to distinguish std
1035
   assign ifu_exu_rs3e_vld_d = rs4_vld_d | rs3_vld_d & ~rd[0];
1036
   assign ifu_exu_rs3o_vld_d = rs4_vld_d | rs3_vld_d & rd[0];
1037
 
1038
   // RML control signals
1039
   assign ifu_exu_save_d = arith_inst & op3_hi[3] & op3_lo[12] &
1040
                           fcl_dtu_inst_vld_d;
1041
   assign ifu_exu_restore_d = arith_inst & op3_hi[3] & fcl_dtu_inst_vld_d &
1042
                        (op3_lo[13] |       // restore
1043
                                     op3_lo[9]);        // return
1044
   assign ifu_exu_return_d = arith_inst & op3_hi[3] & op3_lo[9] &
1045
                             fcl_dtu_inst_vld_d;
1046
 
1047
   assign save_retn_done_d = arith_inst & op3_hi[3] & (op3_lo[12] | op3_lo[9]);
1048
   assign saved_d = arith_inst & op3_hi[3] & op3_lo[1] & ~dtu_inst_d[25] &
1049
                    fcl_dtu_inst_vld_d;
1050
   assign restored_d = arith_inst & op3_hi[3] & op3_lo[1] & dtu_inst_d[25] &
1051
                     fcl_dtu_inst_vld_d;
1052
   assign flushw_d = arith_inst & op3_hi[2] & op3_lo[11] & fcl_dtu_inst_vld_d;
1053
 
1054
   dff_s #(1) savd_ff(.din  (saved_d),
1055
                              .clk  (clk),
1056
                              .q    (ifu_exu_saved_e),
1057
                              .se   (se), .si(), .so());
1058
   dff_s #(1) restd_ff(.din  (restored_d),
1059
                               .clk  (clk),
1060
                               .q    (ifu_exu_restored_e),
1061
                               .se   (se), .si(), .so());
1062
   dff_s #(1) flushw_ff(.din  (flushw_d),
1063
                                .clk  (clk),
1064
                                .q    (ifu_exu_flushw_e),
1065
                                .se   (se), .si(), .so());
1066
 
1067
   //-----------------------
1068
   // TLU Controls and Traps
1069
   //-----------------------
1070
   // Done/Retry
1071
   assign ifu_tlu_done_inst_d = arith_inst & op3_hi[3] & op3_lo[14] &
1072
                                fcl_dtu_ely_inst_vld_d &
1073
                                ~dtu_inst_d[25];   // inst_d[25] = lsb of fcn
1074
   assign ifu_tlu_retry_inst_d = arith_inst & op3_hi[3] & op3_lo[14] &
1075
                                fcl_dtu_ely_inst_vld_d & dtu_inst_d[25];
1076
 
1077
   // SIR
1078
   assign sir_inst_d = arith_inst & op3_hi[3] & op3_lo[0] &
1079
                       rs1_00 & rd_0f & dtu_inst_d[13];
1080
 
1081
//   assign kill_sir_d = sir_inst_d & ~(fcl_dtu_privmode_d | fcl_dtu_hprivmode_d);
1082
//bug 6484 - flag sir instrn. to tlu only in hpriv mode
1083
//   assign flag_sir_d = sir_inst_d & (fcl_dtu_privmode_d | fcl_dtu_hprivmode_d);
1084
 
1085
   assign flag_sir_d = sir_inst_d & fcl_dtu_hprivmode_d;
1086
 
1087
   dff_s #(1) sire_ff(.din (flag_sir_d),
1088
                              .q   (sir_inst_e),
1089
                              .clk (clk), .se(se), .si(), .so());
1090
   assign dtu_fcl_sir_inst_e = sir_inst_e;
1091
 
1092
//bug 6484 - kill sir instrn. to tlu if bits other than opcode bits cause illegal instrn.
1093
//   assign flag_sir_e = sir_inst_e & fcl_dtu_inst_vld_e & ~dtu_inst_anull_e;
1094
 
1095
   assign flag_sir_e = sir_inst_e & fcl_dtu_inst_vld_e & ~dtu_inst_anull_e & ~ill_inst_e;
1096
 
1097
   dff_s #(1) sirm_ff(.din (flag_sir_e),
1098
                              .q   (ifu_tlu_sir_inst_m),
1099
                              .clk (clk), .se(se), .si(), .so());
1100
 
1101
 
1102
   // Privileged opcode trap
1103
   assign fcn0 = ~rd[4] & ~rd[3] & ~rd[2] & ~rd[1];
1104
 
1105
         //op3_lo[0] & rd[4] & ~(rd_12 | rd_13 | 
1106
         //rd[3] & ~rd_1a |
1107
   //rd_1f)) | 
1108
 
1109
   assign privop_d = (op3_hi[3] & (op3_lo[14] | // done/retr
1110
                                                           op3_lo[2] |         // wrpr
1111
                                   // & (~rd[4] & ~rd_0f | rd_10) |
1112
                                   // op3_lo[3] |         // wrhpr
1113
                                   // & valid_hp_rd_d |  
1114
                                                           op3_lo[1] |  // savd,restd
1115
                                                           op3_lo[0] & ((rd[4] & ~(rd_11 | rd_12 | rd_13 | rd_1b |
1116
                                                                                                     rd[3] & rd[2])) |
1117
                                                rd_04)) | // wrasr
1118
 
1119
                                  op3_hi[2] & (op3_lo[10] |        // rdpr
1120
                                   // & (~rs1[4] | rs1_10 | rs1_1f) |
1121
                                   // op3_lo[9] |         // rdhpr
1122
                                   // & valid_hp_rs_d |
1123
                                                           op3_lo[8] &           // rdasr & ~mem#
1124
                                                           (rs1_10 | rs1_16_17 | // perf + sftint
1125
                                    rs1_19 | rs1_1a))    // stick, thrd stat
1126
                                  ) & arith_inst & ~(fcl_dtu_privmode_d |
1127
                                         fcl_dtu_hprivmode_d);
1128
 
1129
   // hp regs 0,1,3 and 5, 6 and 1f are implemented
1130
   // 6 is read only
1131
 
1132
   assign valid_hp_rd_d = (~rd[4] & ~rd[3] & rd[0] &
1133
                           (~rd[2] | ~rd[1]) |      // 1,3,5
1134
                           rd_00 | rd_1f );          // 0, 1f
1135
   assign valid_hp_rs_d = (~rs1[4] & ~rs1[3] & rs1[0] &
1136
                           (~rs1[2] | ~rs1[1]) |
1137
                           rs1_00 | rs1_06 | rs1_1f);
1138
 
1139
   assign hprivop_d = arith_inst & ~fcl_dtu_hprivmode_d &
1140
                      (op3_hi[3] & op3_lo[3] |      // wrhpr
1141
                       // & valid_hp_rd_d 
1142
                       op3_hi[2] & op3_lo[9] |      // rdhpr
1143
                       // & valid_hp_rs_d 
1144
                       // bug 6484 ----
1145
                       sir_inst_d |
1146
                       //  ----
1147
                       op3_hi[3] & op3_lo[0] &
1148
                          (rd_04 | rd_18) & fcl_dtu_privmode_d |   // wrsr s/tick
1149
                       op3_hi[3] & op3_lo[2] &
1150
                          rd_04 & fcl_dtu_privmode_d);             // wrpr
1151
 
1152
   dff_s #(1) prope_ff(.din (privop_d),
1153
                                 .q   (privop_e),
1154
                                 .clk (clk), .se(se), .si(), .so());
1155
 
1156
   dff_s #(1) hprope_ff(.din (hprivop_d),
1157
                                 .q   (hprivop_e),
1158
                                 .clk (clk), .se(se), .si(), .so());
1159
   assign dtu_fcl_privop_e = privop_e & ~hprivop_e;
1160
//   assign dtu_fcl_hprivop_e = hprivop_e & ~dtu_inst_anull_e;   
1161
 
1162
   // Illegal Instruction Trap
1163
   // when they are accessed.  
1164
   assign inv_reg_access_d = arith_inst & (op3_hi[2] & op3_lo[8] &    // rd asr
1165
                                                                         (rs1_01 | rs1_07 |         // 1, 7
1166
                                            ~rs1[4] & rs1[3] & ~rs1_0f |  // 8-E, F=mem#
1167
                                                                          rs1_12 | rs1_14_15 |      // 13 is gsr
1168
                                                                   // 14-15 are WO
1169
                                            rs1_1b |
1170
                                            rs1_1c_1f) |
1171
 
1172
                                                                         op3_hi[3] & op3_lo[0] &   // wr asr
1173
                                                                         (rd_01 | rd_05 | rd_07 |
1174
                                            ~rd[4] & rd[3] & ~rd_0f | // 8-E, F is sir
1175
                                                                          rd_12 | rd_1b |
1176
                                            rd_1c_1f)
1177
                                           );
1178
 
1179
   // reserved field checking (more done in ill_inst check below)
1180
   assign inst12_5_nonzero_d = (|dtu_inst_d[12:5]);
1181
   assign inst11_8_nonzero_d = (|dtu_inst_d[11:8]);
1182
   assign inst9_5_nonzero_d = (|dtu_inst_d[9:5]);
1183
   assign rs2_nonzero_d = (|dtu_inst_d[4:0]);
1184
 
1185
   // rsv check is not complete, but most of the important 
1186
   // holes are covered
1187
   assign rsvchk_fail_d = (arith_inst & ((~op3[5] |  // arith
1188
                                          op3_hi[2] & op3_lo[13] | // sdivx
1189
                                          op3_hi[2] & ~op3[3] & ~op3[2] | // tag
1190
                                          op3_hi[2] & op3_lo[4] |  // mulscc
1191
                                          op3_hi[3] & op3_lo[11] | // flsh
1192
                                          op3_hi[3] & op3[3] & ~op3[1]) & // sav,jmp
1193
                                         ~dtu_inst_d[13] & inst12_5_nonzero_d |
1194
 
1195
                                         op3_hi[2] & (op3[3] & ~op3[2] &  // rd/rdpr
1196
                                                      ~(rs1_0f &
1197
                                                        dtu_inst_d[13]) | // ~mem#
1198
                                                      op3_lo[11]) &  // flshw
1199
                                         (inst12_5_nonzero_d |
1200
                                          rs2_nonzero_d |
1201
                                          dtu_inst_d[13]) |
1202
 
1203
                                         op3_hi[3] & ~op3[3] & ~op3[2] & // wr/pr
1204
                                         ~rd_0f &  // ~sir
1205
                                         ~dtu_inst_d[13] & inst12_5_nonzero_d |
1206
 
1207
                                                                 op3_hi[2] & op3_lo[12] &  // movcc
1208
                                         ~dtu_inst_d[13] &
1209
                                         (inst9_5_nonzero_d | dtu_inst_d[10]) |
1210
 
1211
                                         op3_hi[2] & op3_lo[15] &  // movr
1212
                                         ~dtu_inst_d[13] &
1213
                                         inst9_5_nonzero_d |
1214
 
1215
                                         op3_hi[3] & op3_lo[11] &  // flsh
1216
                                         ~rd_00 |
1217
 
1218
                                         op3_hi[2] & op3_lo[11] &  // flshw
1219
                                         (~rd_00 | ~rs1_00) |
1220
 
1221
                                                                 op3_hi[2] &
1222
                                         (op3_lo[5] | op3_lo[6] |
1223
                                          op3_lo[7]) & // shft
1224
                                         (inst11_8_nonzero_d |
1225
                                          dtu_inst_d[7] |
1226
                                          dtu_inst_d[6] |
1227
                                          dtu_inst_d[5] & (~dtu_inst_d[12] |
1228
                                                           ~dtu_inst_d[13]))
1229
                                         ) |
1230
 
1231
                                       mem_inst & (~op3[4] & ~dtu_inst_d[13] &  // ld/st
1232
                                       inst12_5_nonzero_d |
1233
                                       op3_hi[3] &
1234
                                       (op3_lo[12] | op3_lo[14]) &  // cas
1235
                                       dtu_inst_d[13] & inst12_5_nonzero_d) |
1236
 
1237
                                       ((op[1] & ~op[0]) & (op3[5] & op3[4] & op3[3] & ~op3[2] & ~op3[1] & op3[0]) & |rd) // RETURN(rd != 0), bug 4490
1238
 
1239
                           );
1240
 
1241
 
1242
 
1243
   assign ill_inst_d = (brsethi_inst & (~op2[2] & ~op2[1] & ~op2[0] |  // ill inst
1244
                                                                      op2[2] & op2[1] & op2[0] | // null
1245
                                                                      op2[1] & op2[0] &  // wrong bpr cond
1246
                                                                      (~dtu_inst_d[25] & ~dtu_inst_d[26] |
1247
                                         dtu_inst_d[28]) | // b28 has to be 0
1248
                                                                      ~op2[2] & ~op2[1] & op2[0] & // bpcc
1249
                                                                      dtu_inst_d[20]) |
1250
                                          arith_inst & (op3_hi[1] & (op3_lo[9] | op3_lo[13]) |
1251
                                                              op3_hi[3] & (op3_lo[15] | // null
1252
                                                                                       op3_lo[7]) | // impdep2
1253
                                                              op3_hi[3] & op3_lo[14] &
1254
                                                              (~fcn0 | fcl_dtu_tlzero_d |
1255
                                       rs2_nonzero_d | inst12_5_nonzero_d |
1256
                                       dtu_inst_d[13] | ~rs1_00) |  // done/retr
1257
                                                              op3_hi[2] & op3_lo[12] & // movcc
1258
                                                              dtu_inst_d[18] & dtu_inst_d[11] |
1259
                                                              op3_hi[2] & op3_lo[15] &  // movr
1260
                                                              ~dtu_inst_d[11] & ~dtu_inst_d[10] |
1261
                                                              op3_hi[2] & op3_lo[14] | // popc
1262
                                                              op3_hi[2] & op3_lo[9] &  //rdhpr
1263
                                      (~valid_hp_rs_d | rs1_01 & fcl_dtu_tlzero_d) |
1264
                                                              op3_hi[2] & op3_lo[10] &      // rdpr
1265
                                                              (rs1[4] & ~rs1_10 | // not gl
1266
                                       rs1_0f |
1267
                                                               ~rs1[4] & ~rs1[3] & ~rs1[2] & fcl_dtu_tlzero_d) |
1268
                                                              op3_hi[2] & op3_lo[8] &
1269
                                      (rs1_0f & (~rd_00 |
1270
                                                 dtu_inst_d[12] |
1271
                                                 dtu_inst_d[7] |
1272
                                                 inst11_8_nonzero_d)) | // mem#
1273
                                                              op3_hi[3] & op3_lo[1] &
1274
                                      (~fcn0 | ~rs1_00 | rs2_nonzero_d |
1275
                                       inst12_5_nonzero_d |
1276
                                       dtu_inst_d[13]) | // savd, restd
1277
                                                              op3_hi[3] & op3_lo[10] &
1278
                                      (inst11_8_nonzero_d |
1279
                                       dtu_inst_d[7] &
1280
                                       ~(fcl_dtu_privmode_d |
1281
                                         fcl_dtu_hprivmode_d) |
1282
                                       dtu_inst_d[29] |
1283
                                       ~dtu_inst_d[13] & (dtu_inst_d[6] |
1284
                                                          dtu_inst_d[5])) |// tcc
1285
                                      op3_hi[3] & op3_lo[3] &   // wrhpr
1286
                                      (~valid_hp_rd_d | rd_01 & fcl_dtu_tlzero_d) |
1287
                                                              op3_hi[3] & op3_lo[2] &   // wrpr
1288
                                                              (rd[4] & ~rd_10 | rd_0f | // gl=0x10
1289
                                                               ~rd[4] & ~rd[3] & ~rd[2] & fcl_dtu_tlzero_d) |
1290
                                                              op3_hi[3] & op3_lo[0] &
1291
                                                              (rd_0f & ~(rs1_00 & dtu_inst_d[13]))  // sir
1292
                                      ) |
1293
                                          mem_inst & (~op3[5] & op3_lo[12] |
1294
                                                            op3[5] & (op3_lo[2] | op3_lo[6]) | // stqf, ldqf
1295
                                                            op3[5] & op3[3] & ~op3[2] |
1296
                                                            op3_hi[2] & (op3_lo[12] |
1297
                                                                                     op3_lo[14] | op3_lo[15]) |
1298
                                                            op3_hi[3] & (op3_lo[1] | op3_lo[5] |
1299
                                                                                     op3_lo[15]) |    //  null
1300
                                                            ~op3[5] & op3_lo[3] & rd[0] | // ldd w/ odd rd
1301
                                                            op3[5] & op3_lo[1] & ~fcn0 |  // ldfsr
1302
                                                            op3[5] & op3_lo[13] & // prefetch
1303
                                                              illegal_prefetch |
1304
                                                            op3[5] & op3_lo[5] & ~fcn0 | // stfsr
1305
                                                            ~op3[5] & op3_lo[7] & rd[0])  | // std w/ odd rd
1306
                                          inv_reg_access_d |
1307
                        rsvchk_fail_d);
1308
 
1309
   dff_s #(1) illinste_ff(.din (ill_inst_d),
1310
                                  .q   (ill_inst_e),
1311
                                  .clk (clk), .se(se), .si(), .so());
1312
   assign dtu_fcl_illinst_e = (ill_inst_e |
1313
//                               imask_hit_e |
1314
                               hprivop_e);
1315
 
1316
 
1317
   //-------------
1318
   // LSU Controls
1319
   //-------------
1320
   // prefetch
1321
   assign prefetch    = op3_lo[13] & op3[5];
1322
 
1323
   assign impl_prefetch = ~rd[4] & ~rd[3] & ~rd[2] | // 0-3
1324
                           rd[4] & ~rd[3];           // 10-17 (hex)
1325
   assign noop_prefetch = rd_04 | rd[4] & rd[3];     // 4, 18-1f
1326
 
1327
   assign illegal_prefetch = ~rd[4] & rd[2] & (rd[1] | rd[0]) | // 5-7
1328
                             ~rd[4] & rd[3];                    // 8-f
1329
 
1330
   assign prefetch_d = mem_inst & prefetch & impl_prefetch &
1331
                       fcl_dtu_inst_vld_d;
1332
   assign pref_done_d = mem_inst & prefetch & noop_prefetch;
1333
 
1334
   assign dec_swl_ll_done_d = (pref_done_d | rdsr_done_d | rdpr_done_d |
1335
                               save_retn_done_d);
1336
 
1337
   // alt space
1338
   assign lstype_d[2] = mem_inst & op3[4] & fcl_dtu_inst_vld_d;
1339
   // store
1340
   assign lstype_d[1] = mem_inst & op3[2] & ~prefetch & fcl_dtu_inst_vld_d &
1341
                        ~quad_ffuop_d;
1342
   // load
1343
   assign lstype_d[0] = mem_inst & ~prefetch & fcl_dtu_inst_vld_d &
1344
                              (~op3[2] | op3[3]) & (~op3_lo[14] | op3[5]) &
1345
                        ~quad_ffuop_d;
1346
 
1347
 
1348
   // only the stda instruction needs to be flagged
1349
   assign dec_swl_std_inst_d = mem_inst & op3_hi[1] & op3_lo[7] &
1350
                                     fcl_dtu_inst_vld_d;
1351
 
1352
   assign sext_d = op3[3] & ~op3[2]; // load sign extension
1353
   assign ldstub_d = mem_inst & ~op3[5] & op3_lo[13] & fcl_dtu_inst_vld_d;
1354
   assign casa_d = mem_inst & op3[5] & (op3_lo[12] | op3_lo[14]) &
1355
                                         fcl_dtu_inst_vld_d;
1356
   assign swap_d = mem_inst & op3_lo[15] & fcl_dtu_inst_vld_d;
1357
 
1358
   // load inst for speculation
1359
   // fp loads are not speculated on
1360
   // ldd is not speculated on
1361
   assign dec_swl_ld_inst_d = mem_inst & ~op3[2] &
1362
                                    ~op3[5] & ~op3_lo[3];
1363
 
1364
   // store, atomic or flush inst for stb flow control
1365
   // TBD: no need to full decode this if timing is a problem
1366
   assign dec_swl_st_inst_d = mem_inst & op3[2] |   // st, pref, cas, ldstb
1367
                              arith_inst & op3_hi[3] & op3_lo[11];  // flsh
1368
 
1369
   // size(out) 00-b 01-h 10-w 11-x/q/d
1370
   assign lssize_d[0] =  (op3[1] & ~op3_lo[15]) |   // stx,ld/sth,ld/stq, 
1371
                                                    // ldx, ldd, std, ~swap
1372
                                             op3[5] & (op3_lo[1] | op3_lo[5]) & rd[0]; // ldxfsr
1373
 
1374
 
1375
   assign lssize_d[1] =  ~(op3[1]^op3[0])      |  // ~ld/st b,h
1376
                          (op3[5] & op3_lo[2]) |  // ld/stq 
1377
                          op3_lo[14]           |  // stx, casx
1378
                                op3_hi[2] & (op3_lo[1] | op3_lo[5]);  // ldst fsr
1379
 
1380
   assign ifu_ffu_ldst_size_d = ~(op3[1] & op3[0]); // ldf, stf
1381
//   assign ifu_ffu_ldst_size_d[1] = op3[1] & op3[0];    // lddf, stdf
1382
 
1383
 
1384
   assign ldst_fp_d   =  op3[5] & ~op3[3] & fcl_dtu_inst_vld_d &
1385
                         ~swl_dec_fpbusy_e;
1386
 
1387
   assign ldst_dbl_d  =  (~op3[3] & op3[1] & op3[0] | // ldd(f), std(f)
1388
                                op3[5] & (op3_lo[2] | op3_lo[6])) &   // ldq, stq
1389
                                             fcl_dtu_inst_vld_d;
1390
 
1391
   // mem bar
1392
   assign mb_mask_d = dtu_inst_d[1] |   // #storeload
1393
                            dtu_inst_d[5] |   // #memissue
1394
                          dtu_inst_d[6];    // #sync
1395
 
1396
   assign mb_inst_d = arith_inst & op3_hi[2] & op3_lo[8] &
1397
                            rs1_0f & rd_00 & fcl_dtu_inst_vld_d &
1398
                            dtu_inst_d[13] & mb_mask_d;
1399
 
1400
 
1401
   dff_s #(3) lstype_reg(.din (lstype_d),
1402
                                 .clk (clk),
1403
                                 .q   (lstype_e),
1404
                                 .se  (se), .si(), .so());
1405
   dff_s #(2) lssize_reg(.din (lssize_d),
1406
                                 .clk (clk),
1407
                                 .q   (ifu_lsu_ldst_size_e),
1408
                                 .se  (se), .si(), .so());
1409
   dff_s #(1) lsfp_reg(.din (ldst_fp_d),
1410
                               .clk (clk),
1411
                               .q   (ifu_lsu_ldst_fp_e),
1412
                               .se  (se), .si(), .so());
1413
   dff_s #(1) lsdbl_reg(.din (ldst_dbl_d),
1414
                                .clk (clk),
1415
                                .q   (ifu_lsu_ldst_dbl_e),
1416
                                .se  (se), .si(), .so());
1417
 
1418
   dff_s #(1) sext_reg(.din(sext_d),
1419
                     .clk(clk),
1420
                     .q(ifu_lsu_sign_ext_e),
1421
                     .se(se), .si(), .so());
1422
   dff_s #(1) casa_reg(.din(casa_d),
1423
                     .clk(clk),
1424
                     .q(casa_e),
1425
                     .se(se), .si(), .so());
1426
   dff_s #(1) ldstub_reg(.din(ldstub_d),
1427
                       .clk(clk),
1428
                       .q(ifu_lsu_ldstub_e),
1429
                       .se(se), .si(), .so());
1430
   dff_s #(1) swap_reg(.din(swap_d),
1431
                     .clk(clk),
1432
                     .q(ifu_lsu_swap_e),
1433
                     .se(se), .si(), .so());
1434
 
1435
   dff_s #(1) pfe_ff(.din (prefetch_d),
1436
                   .q   (prefetch_e),
1437
                   .clk (clk), .se(se), .si(), .so());
1438
 
1439
   dff_s #(1) mb_ff(.din (mb_inst_d),
1440
                            .q   (mb_inst_e),
1441
                            .clk (clk),
1442
                .se(se), .si(), .so());
1443
 
1444
   assign ifu_lsu_casa_e = casa_e;
1445
   assign ifu_exu_casa_d = casa_d;
1446
 
1447
//   assign ifu_lsu_ld_inst_e = lstype_e[0] & (~dtu_inst_anull_e) & 
1448
//                                                ~ifu_ffu_quad_op_e & fcl_dtu_inst_vld_e;
1449
//   assign ifu_lsu_st_inst_e = lstype_e[1] & (~dtu_inst_anull_e) & 
1450
//                                                ~ifu_ffu_quad_op_e & fcl_dtu_inst_vld_e;
1451
 
1452
   assign ifu_lsu_ld_inst_e = lstype_e[0];
1453
   assign ifu_lsu_st_inst_e = lstype_e[1];
1454
 
1455
   // temporary
1456
//   assign ifu_lsu_alt_space_e = lstype_e[2] & ~dtu_inst_anull_e & 
1457
//                                    fcl_dtu_inst_vld_e;
1458
 
1459
   assign ifu_lsu_alt_space_e = lstype_e[2];
1460
   assign ifu_lsu_alt_space_d = mem_inst & op3[4] & fcl_dtu_inst_vld_d;
1461
   assign ifu_tlu_alt_space_d = op3[4] & fcl_dtu_ely_inst_vld_d;
1462
//   assign ifu_lsu_imm_asi_vld_d = op3[4] & ~dtu_inst_d[13];
1463
   assign ifu_lsu_memref_d = mem_inst & fcl_dtu_ely_inst_vld_d;
1464
 
1465
   assign ifu_tlu_mb_inst_e = mb_inst_e & ~dtu_inst_anull_e &
1466
                                    fcl_dtu_inst_vld_e;
1467
 
1468
   assign ifu_lsu_pref_inst_e = fcl_dtu_inst_vld_e & prefetch_e &
1469
                                ~dtu_inst_anull_e;
1470
 
1471
   //------------
1472
   // IMASK
1473
   //------------
1474
   assign rs2_hit = (dtu_inst_d[4:0] == erb_dtu_imask[4:0]);
1475
   assign opf_hit = (dtu_inst_d[12:5] == erb_dtu_imask[12:5]);
1476
   assign ibit_hit = (dtu_inst_d[13] == erb_dtu_imask[13]);
1477
   assign rs1_hit = (dtu_inst_d[18:14] == erb_dtu_imask[18:14]);
1478
   assign op3_hit = (dtu_inst_d[24:19] == erb_dtu_imask[24:19]);
1479
   assign rd_hit = (dtu_inst_d[29:25] == erb_dtu_imask[29:25]);
1480
   assign op_hit = (dtu_inst_d[31:30] == erb_dtu_imask[31:30]);
1481
 
1482
   assign imask_hit = (rs2_hit  | ~erb_dtu_imask[32]) &
1483
                      (opf_hit  | ~erb_dtu_imask[33]) &
1484
                      (ibit_hit | ~erb_dtu_imask[34]) &
1485
                      (rs1_hit  | ~erb_dtu_imask[35]) &
1486
                      (op3_hit  | ~erb_dtu_imask[36]) &
1487
                      (rd_hit   | ~erb_dtu_imask[37]) &
1488
                      (op_hit   | ~erb_dtu_imask[38]) &
1489
                      (|erb_dtu_imask[38:32]) &
1490
                      fcl_dtu_inst_vld_d;
1491
 
1492
   dff_s #(1) imsk_ff(.din (imask_hit),
1493
                              .q   (imask_hit_e),
1494
                              .clk (clk), .se(se), .si(), .so());
1495
   assign dtu_fcl_imask_hit_e = imask_hit_e & swl_dec_ibe_e;
1496
 
1497
 
1498
   //-------------
1499
   // SPU Controls
1500
   //-------------
1501
 
1502
//   assign scpy_inst_d = arith_inst & op3_hi[3] & op3_lo[7] & // use impdep 2
1503
//                      ~dtu_inst_d[13] & dtu_inst_d[12];    // i=0 always
1504
//   assign scmp_inst_d = arith_inst & op3_hi[3] & op3_lo[7] & 
1505
//                      ~dtu_inst_d[13] & ~dtu_inst_d[12];
1506
//
1507
//   dff #(1) scpy_ff (.din (scpy_inst_d),
1508
//                 .clk (clk),
1509
//                 .q   (scpy_inst_e),
1510
//                 .se  (se), .si(), .so());
1511
//
1512
//   assign ifu_spu_scpy_inst_e = scpy_inst_e & ~dtu_inst_anull_e & 
1513
//                              fcl_dtu_inst_vld_e;
1514
//   
1515
//   dff #(1) scmp_ff (.din (scmp_inst_d),
1516
//                 .q   (scmp_inst_e),
1517
//                 .clk (clk), .se  (se), .si(), .so());
1518
//
1519
//   assign ifu_spu_scmp_inst_e = scmp_inst_e & ~dtu_inst_anull_e & 
1520
//                              fcl_dtu_inst_vld_e;
1521
//
1522
//
1523
 
1524
endmodule // sparc_ifu_dec
1525
 
1526
// Local Variables:
1527
// verilog-library-directories:("../rtl" ".")
1528
// End:

powered by: WebSVN 2.1.0

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