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

Subversion Repositories s1_core

[/] [s1_core/] [trunk/] [hdl/] [rtl/] [sparc_core/] [sparc_ffu_ctl_visctl.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_ffu_ctl_visctl.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 113 albert.wat
`ifdef SIMPLY_RISC_TWEAKS
23
`define SIMPLY_RISC_SCANIN .si('h0)
24
`else
25
`define SIMPLY_RISC_SCANIN .si()
26
`endif
27 95 fafa1971
/*
28
//  Module Name: sparc_ffu_ctl_visctl
29
//      Description: This is the ffu vis control block.
30
*/
31
module sparc_ffu_ctl_visctl (/*AUTOARG*/
32
   // Outputs
33
   ctl_vis_sel_add, ctl_vis_sel_log, ctl_vis_sel_align,
34
   ctl_vis_add32, ctl_vis_subtract, ctl_vis_cin, ctl_vis_align0,
35
   ctl_vis_align2, ctl_vis_align4, ctl_vis_align6, ctl_vis_align_odd,
36
   ctl_vis_log_sel_pass, ctl_vis_log_sel_nand, ctl_vis_log_sel_nor,
37
   ctl_vis_log_sel_xor, ctl_vis_log_invert_rs1,
38
   ctl_vis_log_invert_rs2, ctl_vis_log_constant,
39
   ctl_vis_log_pass_const, ctl_vis_log_pass_rs1,
40
   ctl_vis_log_pass_rs2, vis_result, illegal_vis_e, vis_nofrf_e,
41
   visop_m, visop_w_vld, vis_wen_next, fpu_rnd,
42
   ffu_exu_rsr_data_hi_m, ffu_exu_rsr_data_mid_m,
43
   ffu_exu_rsr_data_lo_m, ctl_dp_wsr_data_w2, ctl_dp_gsr_wsr_w2,
44
   ctl_dp_thr_e,
45
   // Inputs
46
   clk, se, reset, opf, tid_w2, tid_e, tid, visop_e, kill_w,
47
   ifu_tlu_sraddr_d, exu_ffu_wsr_inst_e, exu_ffu_gsr_align_m,
48
   exu_ffu_gsr_rnd_m, exu_ffu_gsr_mask_m, exu_ffu_gsr_scale_m,
49
   ifu_ffu_rnd_e, dp_ctl_fsr_rnd, flush_w2, thr_match_mw2,
50
   thr_match_ww2, ifu_tlu_inst_vld_w, ue_trap_w3, frs1_e, frs2_e,
51
   frd_e, rollback_c3, rollback_rs2_w2, visop, rollback_rs1_w3,
52
   dp_ctl_gsr_mask_e, dp_ctl_gsr_scale_e
53
   ) ;
54
   input clk;
55
   input se;
56
   input reset;
57
   input [8:0] opf;
58
   input [1:0] tid_w2;
59
   input [1:0] tid_e;
60
   input [1:0] tid;
61
   input      visop_e;
62
   input       kill_w;
63
   input [6:0] ifu_tlu_sraddr_d;
64
   input       exu_ffu_wsr_inst_e;
65
   input [2:0] exu_ffu_gsr_align_m;
66
   input [2:0] exu_ffu_gsr_rnd_m;
67
   input [31:0] exu_ffu_gsr_mask_m;
68
   input [4:0]  exu_ffu_gsr_scale_m;
69
   input [2:0] ifu_ffu_rnd_e;
70
   input [1:0] dp_ctl_fsr_rnd;
71
   input      flush_w2;
72
   input      thr_match_mw2;
73
   input      thr_match_ww2;
74
   input      ifu_tlu_inst_vld_w;
75
   input      ue_trap_w3;
76
   input [4:0] frs1_e;
77
   input [4:0] frs2_e;
78
   input [4:0] frd_e;
79
   input       rollback_c3;
80
   input       rollback_rs2_w2;
81
   input       visop;
82
   input       rollback_rs1_w3;
83
   input [31:0] dp_ctl_gsr_mask_e;
84
   input [4:0]  dp_ctl_gsr_scale_e;
85
 
86
   output      ctl_vis_sel_add;
87
   output      ctl_vis_sel_log;
88
   output      ctl_vis_sel_align;
89
   output      ctl_vis_add32;
90
   output      ctl_vis_subtract;
91
   output      ctl_vis_cin;
92
   output      ctl_vis_align0;
93
   output      ctl_vis_align2;
94
   output      ctl_vis_align4;
95
   output      ctl_vis_align6;
96
   output      ctl_vis_align_odd;
97
   output      ctl_vis_log_sel_pass;
98
   output      ctl_vis_log_sel_nand;
99
   output      ctl_vis_log_sel_nor;
100
   output      ctl_vis_log_sel_xor;
101
   output      ctl_vis_log_invert_rs1;
102
   output      ctl_vis_log_invert_rs2;
103
   output      ctl_vis_log_constant;
104
   output      ctl_vis_log_pass_const;
105
   output      ctl_vis_log_pass_rs1;
106
   output      ctl_vis_log_pass_rs2;
107
   output      vis_result;
108
   output      illegal_vis_e;
109
   output      vis_nofrf_e;
110
   output      visop_m;
111
   output      visop_w_vld;
112
   output      vis_wen_next;
113
   output [1:0] fpu_rnd;
114
   output [31:0] ffu_exu_rsr_data_hi_m;
115
   output [2:0]  ffu_exu_rsr_data_mid_m;
116
   output [7:0] ffu_exu_rsr_data_lo_m;
117
 
118
   output [36:0] ctl_dp_wsr_data_w2;
119
   output [3:0] ctl_dp_gsr_wsr_w2;
120
   output [3:0] ctl_dp_thr_e;
121
 
122
   wire         illegal_rs1_e;
123
   wire         illegal_rs2_e;
124
   wire         illegal_siam_e;
125
   wire         rs2_check_nonzero_e;
126
   wire         rs1_check_nonzero_e;
127
   wire        visop_e;
128
   wire        issue_visop_e;
129
   wire        visop_m;
130
   wire        visop_w;
131
   wire        visop_w_vld;
132
   wire        visop_w2_vld;
133
   wire        visop_w2;
134
   wire        visop_w3;
135
   wire        visop_w3_vld;
136
   wire        add;
137
   wire        align;
138 113 albert.wat
   wire        logic_wire;
139 95 fafa1971
   wire        siam;
140
   wire        alignaddr;
141
 
142
   wire        opf_log_zero;
143
   wire        opf_log_one;
144
   wire        opf_log_src1;
145
   wire        opf_log_src2;
146
   wire        opf_log_not1;
147
   wire        opf_log_not2;
148
   wire        opf_log_or;
149
   wire        opf_log_nor;
150
   wire        opf_log_and;
151
   wire        opf_log_nand;
152
   wire        opf_log_xor;
153
   wire        opf_log_xnor;
154
   wire        opf_log_ornot1;
155
   wire        opf_log_ornot2;
156
   wire        opf_log_andnot1;
157
   wire        opf_log_andnot2;
158
   wire        invert_rs1_next;
159
   wire        invert_rs2_next;
160
   wire        log_pass_rs1_next;
161
   wire        log_pass_rs2_next;
162
   wire        log_pass_rs1;
163
   wire        log_pass_rs2;
164
 
165
   wire [2:0] t0_gsr_rnd;
166
   wire [2:0] t1_gsr_rnd;
167
   wire [2:0] t2_gsr_rnd;
168
   wire [2:0] t3_gsr_rnd;
169
   wire [2:0] t0_gsr_align;
170
   wire [2:0] t1_gsr_align;
171
   wire [2:0] t2_gsr_align;
172
   wire [2:0] t3_gsr_align;
173
   wire [2:0] t0_gsr_rnd_next;
174
   wire [2:0] t1_gsr_rnd_next;
175
   wire [2:0] t2_gsr_rnd_next;
176
   wire [2:0] t3_gsr_rnd_next;
177
   wire [2:0] t0_gsr_align_next;
178
   wire [2:0] t1_gsr_align_next;
179
   wire [2:0] t2_gsr_align_next;
180
   wire [2:0] t3_gsr_align_next;
181
   wire [2:0] gsr_rnd_e;
182
   wire [2:0] gsr_align_e;
183
   wire       t0_rnd_wen_l;
184
   wire       t0_gsr_wsr_w2;
185
   wire       t0_siam_w2;
186
   wire       t0_align_wen_l;
187
   wire       t0_alignaddr_w2;
188
   wire       t1_rnd_wen_l;
189
   wire       t1_gsr_wsr_w2;
190
   wire       t1_siam_w2;
191
   wire       t1_align_wen_l;
192
   wire       t1_alignaddr_w2;
193
   wire       t2_rnd_wen_l;
194
   wire       t2_gsr_wsr_w2;
195
   wire       t2_siam_w2;
196
   wire       t2_align_wen_l;
197
   wire       t2_alignaddr_w2;
198
   wire       t3_rnd_wen_l;
199
   wire       t3_gsr_wsr_w2;
200
   wire       t3_siam_w2;
201
   wire       t3_align_wen_l;
202
   wire       t3_alignaddr_w2;
203
 
204
   wire [2:0] siam_rnd;
205
   wire [3:0] thr_w2;
206
   wire [3:0] ctl_dp_thr_e;
207
   wire [3:0] thr_fp;
208
   wire       gsr_addr_d;
209
   wire       gsr_addr_e;
210
   wire       wgsr_e;
211
   wire       wgsr_m;
212
   wire       wgsr_w;
213
   wire       wgsr_vld_m;
214
   wire       wgsr_vld_w;
215
   wire       wgsr_vld_w2;
216
   wire       wgsr_w2;
217
   wire [2:0] gsr_rnd;
218
   wire [1:0] fpu_rnd_next;
219
   wire [2:0]  gsr_align;
220
   wire [2:0]  gsr_align_d1;
221
 
222
   wire [2:0] align_addr_data_w2;
223
   wire [2:0] wgsr_align_offset_w;
224
   wire [2:0] wgsr_rnd_w;
225
   wire [2:0] wgsr_align_offset_w2;
226
   wire [2:0] wgsr_rnd_w2;
227
 
228
   wire [36:0] wsr_data_m;
229
   wire [36:0] wsr_data_w;
230
 
231
 
232
   //////////////////////////////////////
233
   // VIS PIPELINE
234
   //------------------------------------
235
   // Note: rs2_ce, rs2_ue, rs1_ue will kill vis instruction
236
   //       in addition to any traps, etc.
237
   //       These are incorporated into the "kill" signals
238
   // E: ren rs2
239
   // M: ren rs1
240
   // W: rs2 data ready, check rs2 ecc
241
   // W2: rs1 data ready, check rs1 ecc
242
   // W3: execute vis operation (result written to rs2/rd flop)
243
   // W4: gen ecc and write to frf
244
 
245 113 albert.wat
   dff_s visop_e2m(.din(issue_visop_e), .clk(clk), .q(visop_m), `SIMPLY_RISC_SCANIN, .so(), .se(se));
246
   dff_s visop_m2w(.din(visop_m), .clk(clk), .q(visop_w), `SIMPLY_RISC_SCANIN, .so(), .se(se));
247
   dff_s visop_w2w2(.din(visop_w_vld), .clk(clk), .q(visop_w2), `SIMPLY_RISC_SCANIN, .so(), .se(se));
248
   dff_s visop_w22w3(.din(visop_w2_vld), .clk(clk), .q(visop_w3), `SIMPLY_RISC_SCANIN, .so(), .se(se));
249 95 fafa1971
 
250
   assign     issue_visop_e = visop_e | visop & rollback_c3;
251
   // only check kills in w since they are accumulated into kill_w
252
   assign      visop_w_vld = visop_w & ~kill_w;
253
   assign      visop_w2_vld = visop_w2 & ~flush_w2 & ~rollback_rs2_w2;
254
   assign      visop_w3_vld = visop_w3 & ~ue_trap_w3 & ~rollback_rs1_w3;
255
 
256
   assign      vis_result = visop_w3_vld;
257
   assign      vis_wen_next = vis_result & ~siam & ~alignaddr;
258
 
259
   ////////////////////////////////////
260
   // Decode opf
261
   ////////////////////////////////////
262
   assign      add = ~opf[8] & ~opf[7] & opf[6] & ~opf[5] & opf[4] & ~opf[3];
263
   assign      align = ~opf[8] & ~opf[7] & opf[6] & ~opf[5] & ~opf[4] & opf[3] & ~opf[2] & ~opf[1] & ~opf[0];
264 113 albert.wat
   assign      logic_wire = ~opf[8] & ~opf[7] & opf[6] & opf[5];
265 95 fafa1971
   assign siam = ~opf[8] & opf[7] & ~opf[6] & ~opf[5] & ~opf[4] & ~opf[3] & ~opf[2] & ~opf[1] & opf[0];
266
   assign alignaddr = ~opf[8] & ~opf[7] & ~opf[6] & ~opf[5] & opf[4] & opf[3] & ~opf[2] & ~opf[0]; //alignaddress
267
 
268 113 albert.wat
   assign illegal_vis_e = (visop_e & ~(add | align | logic_wire | siam | alignaddr) |
269 95 fafa1971
                           illegal_rs1_e | illegal_rs2_e | illegal_siam_e);
270 113 albert.wat
   assign rs1_check_nonzero_e = visop_e & (siam | (logic_wire & (opf_log_zero | opf_log_one | opf_log_src2 | opf_log_not2)));
271
   assign rs2_check_nonzero_e = visop_e & logic_wire & (opf_log_zero | opf_log_one | opf_log_src1 | opf_log_not1);
272 95 fafa1971
   assign illegal_rs1_e = (frs1_e[4:0] != 5'b00000) & rs1_check_nonzero_e;
273
   assign illegal_rs2_e = (frs2_e[4:0] != 5'b00000) & rs2_check_nonzero_e;
274
   assign illegal_siam_e = ((frd_e[4:0] != 5'b00000) | frs2_e[4] | frs2_e[3]) & siam & visop_e;
275
 
276
   assign vis_nofrf_e = visop_e & (siam | alignaddr | opf_log_zero | opf_log_one);
277
 
278
   // controls for add
279
   // Make subtract come out of its own flop for loading purposes (very critical timing)
280 113 albert.wat
   dff_s sub_dff(.din(opf[2]), .clk(clk), .q(ctl_vis_subtract), .se(se), `SIMPLY_RISC_SCANIN, .so());
281 95 fafa1971
   assign ctl_vis_cin = opf[2];
282
   assign ctl_vis_add32 = opf[1];
283
 
284 113 albert.wat
   // controls for logic
285 95 fafa1971
   assign opf_log_zero = ~opf[4] & ~opf[3] & ~opf[2] & ~opf[1];
286
   assign opf_log_nor = ~opf[4] & ~opf[3] & ~opf[2] & opf[1];
287
   assign opf_log_andnot2 = ~opf[4] & ~opf[3] & opf[2] & ~opf[1];
288
   assign opf_log_not2 = ~opf[4] & ~opf[3] & opf[2] & opf[1];
289
   assign opf_log_andnot1 = ~opf[4] & opf[3] & ~opf[2] & ~opf[1];
290
   assign opf_log_not1 = ~opf[4] & opf[3] & ~opf[2] & opf[1];
291
   assign opf_log_xor = ~opf[4] & opf[3] & opf[2] & ~opf[1];
292
   assign opf_log_nand = ~opf[4] & opf[3] & opf[2] & opf[1];
293
   assign opf_log_and = opf[4] & ~opf[3] & ~opf[2] & ~opf[1];
294
   assign opf_log_xnor = opf[4] & ~opf[3] & ~opf[2] & opf[1];
295
   assign opf_log_src1 = opf[4] & ~opf[3] & opf[2] & ~opf[1];
296
   assign opf_log_ornot2 = opf[4] & ~opf[3] & opf[2] & opf[1];
297
   assign opf_log_src2 = opf[4] & opf[3] & ~opf[2] & ~opf[1];
298
   assign opf_log_ornot1 = opf[4] & opf[3] & ~opf[2] & opf[1];
299
   assign opf_log_or = opf[4] & opf[3] & opf[2] & ~opf[1];
300
   assign opf_log_one = opf[4] & opf[3] & opf[2] & opf[1];
301
 
302 113 albert.wat
   // selects for logic mux
303 95 fafa1971
   assign ctl_vis_log_sel_nand = opf_log_or | opf_log_nand | opf_log_ornot1 | opf_log_ornot2;
304
   assign ctl_vis_log_sel_xor = opf_log_xor | opf_log_xnor;
305
   assign ctl_vis_log_sel_nor = opf_log_and | opf_log_nor | opf_log_andnot1 | opf_log_andnot2;
306
   assign ctl_vis_log_sel_pass = (opf_log_zero | opf_log_one | opf_log_src1 | opf_log_src2 |
307
                                  opf_log_not1 | opf_log_not2);
308
 
309
   assign invert_rs1_next = (opf_log_not1 | opf_log_or | opf_log_and |
310
                                    opf_log_ornot2 | opf_log_andnot2);
311
   assign invert_rs2_next = (opf_log_not2 | opf_log_or | opf_log_and |
312
                                    opf_log_ornot1 | opf_log_andnot1 | opf_log_xnor);
313 113 albert.wat
   dff_s invert_rs1_dff(.din(invert_rs1_next), .clk(clk), .q(ctl_vis_log_invert_rs1),
314
                      .se(se), `SIMPLY_RISC_SCANIN, .so());
315
   dff_s invert_rs2_dff(.din(invert_rs2_next), .clk(clk), .q(ctl_vis_log_invert_rs2),
316
                      .se(se), `SIMPLY_RISC_SCANIN, .so());
317 95 fafa1971
   // precalculate to help timing
318
   assign log_pass_rs1_next = opf_log_src1 | opf_log_not1;
319
   assign log_pass_rs2_next = opf_log_src2 | opf_log_not2;
320 113 albert.wat
   dff_s #(2) log_pass_dff(.din({log_pass_rs1_next,log_pass_rs2_next}), .clk(clk),
321
                         .q({log_pass_rs1,log_pass_rs2}), .se(se), `SIMPLY_RISC_SCANIN, .so());
322 95 fafa1971
 
323
   assign ctl_vis_log_pass_rs1 = log_pass_rs1;
324
   assign ctl_vis_log_pass_rs2 = log_pass_rs2 & ~log_pass_rs1;
325
   assign ctl_vis_log_constant = opf_log_one;
326
   assign ctl_vis_log_pass_const = ~(ctl_vis_log_pass_rs1 | ctl_vis_log_pass_rs2);
327
 
328
   // controls for falign
329
   assign ctl_vis_align0 = ~gsr_align_d1[2] & ~gsr_align_d1[1];
330
   assign ctl_vis_align2 = ~gsr_align_d1[2] & gsr_align_d1[1];
331
   assign ctl_vis_align4 = gsr_align_d1[2] & ~gsr_align_d1[1];
332
   assign ctl_vis_align6 = gsr_align_d1[2] & gsr_align_d1[1];
333
   assign ctl_vis_align_odd = gsr_align_d1[0];
334
 
335
   // controls for output mux
336
   assign ctl_vis_sel_add = add;
337
   assign ctl_vis_sel_align = align;
338
   assign ctl_vis_sel_log = ~(add | align);
339
 
340
   ///////////////////////////////////////////////////////////
341
   // GSR.alignaddr_offset, GSR.IM, GSR.IRND
342
   ///////////////////////////////////////////////////////////
343
 
344
   mux4ds #(6) curr_gsr_mux(.dout({gsr_rnd[2:0], gsr_align[2:0]}),
345
                            .in0({t0_gsr_rnd[2:0], t0_gsr_align[2:0]}),
346
                            .in1({t1_gsr_rnd[2:0], t1_gsr_align[2:0]}),
347
                            .in2({t2_gsr_rnd[2:0], t2_gsr_align[2:0]}),
348
                            .in3({t3_gsr_rnd[2:0], t3_gsr_align[2:0]}),
349
                            .sel0(thr_fp[0]),
350
                            .sel1(thr_fp[1]),
351
                            .sel2(thr_fp[2]),
352
                            .sel3(thr_fp[3]));
353
   mux4ds #(6) gsr_e_mux(.dout({gsr_rnd_e[2:0], gsr_align_e[2:0]}),
354
                            .in0({t0_gsr_rnd[2:0], t0_gsr_align[2:0]}),
355
                            .in1({t1_gsr_rnd[2:0], t1_gsr_align[2:0]}),
356
                            .in2({t2_gsr_rnd[2:0], t2_gsr_align[2:0]}),
357
                            .in3({t3_gsr_rnd[2:0], t3_gsr_align[2:0]}),
358
                            .sel0(ctl_dp_thr_e[0]),
359
                            .sel1(ctl_dp_thr_e[1]),
360
                            .sel2(ctl_dp_thr_e[2]),
361
                            .sel3(ctl_dp_thr_e[3]));
362 113 albert.wat
   dff_s #(43) gsr_e2m(.din({dp_ctl_gsr_mask_e[31:0],gsr_rnd_e[2:0],
363 95 fafa1971
                          dp_ctl_gsr_scale_e[4:0],gsr_align_e[2:0]}), .clk(clk),
364
                    .q({ffu_exu_rsr_data_hi_m[31:0],ffu_exu_rsr_data_mid_m[2:0], ffu_exu_rsr_data_lo_m[7:0]}),
365 113 albert.wat
                    .se(se), `SIMPLY_RISC_SCANIN, .so());
366
   dff_s #(3) gsr_align_dff(.din(gsr_align[2:0]), .clk(clk), .q(gsr_align_d1[2:0]), .se(se), `SIMPLY_RISC_SCANIN, .so());
367 95 fafa1971
 
368
   // put in to help timing for sending to lsu
369 113 albert.wat
   dff_s #(2) fpu_rnd_dff(.din(fpu_rnd_next[1:0]), .clk(clk), .q(fpu_rnd[1:0]), `SIMPLY_RISC_SCANIN, .so(), .se(se));
370 95 fafa1971
   assign      fpu_rnd_next[1:0] = (gsr_rnd[2])? gsr_rnd[1:0]: dp_ctl_fsr_rnd[1:0];
371
 
372
   // if alignaddress_little then write the 2's complement
373
   assign     align_addr_data_w2[2:0] = (opf[1])? (~wgsr_align_offset_w2[2:0] + 3'b001):
374
                                                  wgsr_align_offset_w2[2:0];
375
 
376
   assign     gsr_addr_d = (ifu_tlu_sraddr_d[6:0] == 7'b0010011);
377
   assign     wgsr_e = exu_ffu_wsr_inst_e & gsr_addr_e;
378 113 albert.wat
   dff_s gsr_addr_d2e(.din(gsr_addr_d), .clk(clk), .q(gsr_addr_e), .se(se), `SIMPLY_RISC_SCANIN, .so());
379 95 fafa1971
 
380
   // need independent kill checks because this isn't killed by new fpop
381
   assign     wgsr_vld_m = wgsr_m & ~(thr_match_mw2 & flush_w2);
382
   assign     wgsr_vld_w = wgsr_w & ifu_tlu_inst_vld_w & ~(thr_match_ww2 & flush_w2);
383
   assign     wgsr_vld_w2 = wgsr_w2 & ~flush_w2;
384 113 albert.wat
   dff_s wgsr_e2m(.din(wgsr_e), .clk(clk), .q(wgsr_m), `SIMPLY_RISC_SCANIN, .so(), .se(se));
385
   dff_s wgsr_m2w(.din(wgsr_vld_m), .clk(clk), .q(wgsr_w), `SIMPLY_RISC_SCANIN, .so(), .se(se));
386
   dff_s wgsr_w2w2(.din(wgsr_vld_w), .clk(clk), .q(wgsr_w2), `SIMPLY_RISC_SCANIN, .so(), .se(se));
387 95 fafa1971
 
388
   assign     thr_w2[3] = (tid_w2[1:0] == 2'b11);
389
   assign     thr_w2[2] = (tid_w2[1:0] == 2'b10);
390
   assign     thr_w2[1] = (tid_w2[1:0] == 2'b01);
391
   assign     thr_w2[0] = (tid_w2[1:0] == 2'b00);
392
   assign     ctl_dp_thr_e[3] = (tid_e[1:0] == 2'b11);
393
   assign     ctl_dp_thr_e[2] = (tid_e[1:0] == 2'b10);
394
   assign     ctl_dp_thr_e[1] = (tid_e[1:0] == 2'b01);
395
   assign     ctl_dp_thr_e[0] = (tid_e[1:0] == 2'b00);
396
   assign     thr_fp[3] = (tid[1:0] == 2'b11);
397
   assign     thr_fp[2] = (tid[1:0] == 2'b10);
398
   assign     thr_fp[1] = (tid[1:0] == 2'b01);
399
   assign     thr_fp[0] = (tid[1:0] == 2'b00);
400
 
401
   assign     t0_siam_w2 = thr_fp[0] & siam & visop_w2_vld;
402
   assign     t0_gsr_wsr_w2 = thr_w2[0] & wgsr_vld_w2;
403
   assign     t0_alignaddr_w2 = thr_fp[0] & alignaddr & visop_w2_vld;
404
   assign     t0_rnd_wen_l = ~(t0_gsr_wsr_w2 | t0_siam_w2);
405
   assign     t0_align_wen_l = ~(t0_gsr_wsr_w2 | t0_alignaddr_w2);
406
   assign     t1_siam_w2 = thr_fp[1] & siam & visop_w2_vld;
407
   assign     t1_gsr_wsr_w2 = thr_w2[1] & wgsr_vld_w2;
408
   assign     t1_alignaddr_w2 = thr_fp[1] & alignaddr & visop_w2_vld;
409
   assign     t1_rnd_wen_l = ~(t1_gsr_wsr_w2 | t1_siam_w2);
410
   assign     t1_align_wen_l = ~(t1_gsr_wsr_w2 | t1_alignaddr_w2);
411
   assign     t2_siam_w2 = thr_fp[2] & siam & visop_w2_vld;
412
   assign     t2_gsr_wsr_w2 = thr_w2[2] & wgsr_vld_w2;
413
   assign     t2_alignaddr_w2 = thr_fp[2] & alignaddr & visop_w2_vld;
414
   assign     t2_rnd_wen_l = ~(t2_gsr_wsr_w2 | t2_siam_w2);
415
   assign     t2_align_wen_l = ~(t2_gsr_wsr_w2 | t2_alignaddr_w2);
416
   assign     t3_siam_w2 = thr_fp[3] & siam & visop_w2_vld;
417
   assign     t3_gsr_wsr_w2 = thr_w2[3] & wgsr_vld_w2;
418
   assign     t3_alignaddr_w2 = thr_fp[3] & alignaddr & visop_w2_vld;
419
   assign     t3_rnd_wen_l = ~(t3_gsr_wsr_w2 | t3_siam_w2);
420
   assign     t3_align_wen_l = ~(t3_gsr_wsr_w2 | t3_alignaddr_w2);
421
 
422
   assign     ctl_dp_gsr_wsr_w2[3:0] = {t3_gsr_wsr_w2,t2_gsr_wsr_w2,t1_gsr_wsr_w2,t0_gsr_wsr_w2};
423
 
424
   // Storage flops and muxes
425
   mux3ds #(3) t0_rnd_mux(.dout(t0_gsr_rnd_next[2:0]),
426
                          .in0(t0_gsr_rnd[2:0]),
427
                          .in1(wgsr_rnd_w2[2:0]),
428
                          .in2(siam_rnd[2:0]),
429
                          .sel0(t0_rnd_wen_l),
430
                          .sel1(t0_gsr_wsr_w2),
431
                          .sel2(t0_siam_w2));
432
   mux3ds #(3) t0_align_mux(.dout(t0_gsr_align_next[2:0]),
433
                            .in0(t0_gsr_align[2:0]),
434
                            .in1(wgsr_align_offset_w2[2:0]),
435
                            .in2(align_addr_data_w2[2:0]),
436
                            .sel0(t0_align_wen_l),
437
                            .sel1(t0_gsr_wsr_w2),
438
                            .sel2(t0_alignaddr_w2));
439
   mux3ds #(3) t1_rnd_mux(.dout(t1_gsr_rnd_next[2:0]),
440
                          .in0(t1_gsr_rnd[2:0]),
441
                          .in1(wgsr_rnd_w2[2:0]),
442
                          .in2(siam_rnd[2:0]),
443
                          .sel0(t1_rnd_wen_l),
444
                          .sel1(t1_gsr_wsr_w2),
445
                          .sel2(t1_siam_w2));
446
   mux3ds #(3) t1_align_mux(.dout(t1_gsr_align_next[2:0]),
447
                            .in0(t1_gsr_align[2:0]),
448
                            .in1(wgsr_align_offset_w2[2:0]),
449
                            .in2(align_addr_data_w2[2:0]),
450
                            .sel0(t1_align_wen_l),
451
                            .sel1(t1_gsr_wsr_w2),
452
                            .sel2(t1_alignaddr_w2));
453
   mux3ds #(3) t2_rnd_mux(.dout(t2_gsr_rnd_next[2:0]),
454
                          .in0(t2_gsr_rnd[2:0]),
455
                          .in1(wgsr_rnd_w2[2:0]),
456
                          .in2(siam_rnd[2:0]),
457
                          .sel0(t2_rnd_wen_l),
458
                          .sel1(t2_gsr_wsr_w2),
459
                          .sel2(t2_siam_w2));
460
   mux3ds #(3) t2_align_mux(.dout(t2_gsr_align_next[2:0]),
461
                            .in0(t2_gsr_align[2:0]),
462
                            .in1(wgsr_align_offset_w2[2:0]),
463
                            .in2(align_addr_data_w2[2:0]),
464
                            .sel0(t2_align_wen_l),
465
                            .sel1(t2_gsr_wsr_w2),
466
                            .sel2(t2_alignaddr_w2));
467
   mux3ds #(3) t3_rnd_mux(.dout(t3_gsr_rnd_next[2:0]),
468
                          .in0(t3_gsr_rnd[2:0]),
469
                          .in1(wgsr_rnd_w2[2:0]),
470
                          .in2(siam_rnd[2:0]),
471
                          .sel0(t3_rnd_wen_l),
472
                          .sel1(t3_gsr_wsr_w2),
473
                          .sel2(t3_siam_w2));
474
   mux3ds #(3) t3_align_mux(.dout(t3_gsr_align_next[2:0]),
475
                            .in0(t3_gsr_align[2:0]),
476
                            .in1(wgsr_align_offset_w2[2:0]),
477
                            .in2(align_addr_data_w2[2:0]),
478
                            .sel0(t3_align_wen_l),
479
                            .sel1(t3_gsr_wsr_w2),
480
                            .sel2(t3_alignaddr_w2));
481
 
482
 
483 113 albert.wat
   dffr_s #(6) t0_gsr_dff(.din({t0_gsr_rnd_next[2:0], t0_gsr_align_next[2:0]}), .clk(clk),
484 95 fafa1971
                       .q({t0_gsr_rnd[2:0], t0_gsr_align[2:0]}), .se(se),
485 113 albert.wat
                       `SIMPLY_RISC_SCANIN, .so(), .rst(reset));
486
   dffr_s #(6) t1_gsr_dff(.din({t1_gsr_rnd_next[2:0], t1_gsr_align_next[2:0]}), .clk(clk),
487 95 fafa1971
                       .q({t1_gsr_rnd[2:0], t1_gsr_align[2:0]}), .se(se),
488 113 albert.wat
                       `SIMPLY_RISC_SCANIN, .so(), .rst(reset));
489
   dffr_s #(6) t2_gsr_dff(.din({t2_gsr_rnd_next[2:0], t2_gsr_align_next[2:0]}), .clk(clk),
490 95 fafa1971
                       .q({t2_gsr_rnd[2:0], t2_gsr_align[2:0]}), .se(se),
491 113 albert.wat
                       `SIMPLY_RISC_SCANIN, .so(), .rst(reset));
492
   dffr_s #(6) t3_gsr_dff(.din({t3_gsr_rnd_next[2:0], t3_gsr_align_next[2:0]}), .clk(clk),
493 95 fafa1971
                       .q({t3_gsr_rnd[2:0], t3_gsr_align[2:0]}), .se(se),
494 113 albert.wat
                       `SIMPLY_RISC_SCANIN, .so(), .rst(reset));
495 95 fafa1971
 
496 113 albert.wat
   dffre_s #(3) siam_rnd_dff(.din(ifu_ffu_rnd_e[2:0]), .clk(clk),
497
                          .q(siam_rnd), .se(se), `SIMPLY_RISC_SCANIN, .so(),
498 95 fafa1971
                           .rst(reset), .en(visop_e));
499 113 albert.wat
   dff_s #(3) align_offset_dff1(.din(exu_ffu_gsr_align_m[2:0]), .clk(clk),
500
                             .q(wgsr_align_offset_w[2:0]), .se(se), `SIMPLY_RISC_SCANIN, .so());
501
   dff_s #(3) align_offset_dff2(.din(wgsr_align_offset_w[2:0]), .clk(clk),
502
                             .q(wgsr_align_offset_w2[2:0]), .se(se), `SIMPLY_RISC_SCANIN, .so());
503
   dff_s #(3) rnd_dff1(.din(exu_ffu_gsr_rnd_m[2:0]), .clk(clk),
504
                      .q(wgsr_rnd_w[2:0]), .se(se), `SIMPLY_RISC_SCANIN, .so());
505
   dff_s #(3) rnd_dff2(.din(wgsr_rnd_w[2:0]), .clk(clk),
506
                      .q(wgsr_rnd_w2[2:0]), .se(se), `SIMPLY_RISC_SCANIN, .so());
507 95 fafa1971
   assign     wsr_data_m[36:0] = {exu_ffu_gsr_mask_m[31:0], exu_ffu_gsr_scale_m[4:0]};
508 113 albert.wat
   dff_s #(37) wsr_data_m2w(.din(wsr_data_m[36:0]), .clk(clk), .q(wsr_data_w[36:0]),
509
                          .se(se), `SIMPLY_RISC_SCANIN, .so());
510
   dff_s #(37) wsr_data_w2w2(.din(wsr_data_w[36:0]), .clk(clk), .q(ctl_dp_wsr_data_w2[36:0]),
511
                          .se(se), `SIMPLY_RISC_SCANIN, .so());
512 95 fafa1971
 
513
 
514
endmodule // sparc_ffu_ctl_visctl

powered by: WebSVN 2.1.0

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