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

Subversion Repositories s1_core

[/] [s1_core/] [trunk/] [hdl/] [rtl/] [sparc_core/] [sparc_ffu_dp.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_dp.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(0)
24
`else
25
`define SIMPLY_RISC_SCANIN .si()
26
`endif
27 95 fafa1971
/*
28
//  Module Name: sparc_ffu_dp
29
//      Description: This is the ffu datapath.  It stores the 2 128 bit operands
30
//      and the result (puts result in the 1st source to save space).
31
*/
32
 
33 113 albert.wat
`include "iop.h"
34 95 fafa1971
 
35
module sparc_ffu_dp (/*AUTOARG*/
36
   // Outputs
37
   so, dp_frf_data, ffu_lsu_data, dp_vis_rs1_data, dp_vis_rs2_data,
38
   dp_ctl_rs2_sign, dp_ctl_fsr_fcc, dp_ctl_fsr_rnd, dp_ctl_fsr_tem,
39
   dp_ctl_fsr_aexc, dp_ctl_fsr_cexc, dp_ctl_ld_fcc,
40
   dp_ctl_gsr_mask_e, dp_ctl_gsr_scale_e, dp_ctl_synd_out_low,
41
   dp_ctl_synd_out_high,
42
   // Inputs
43
   rclk, se, si, ctl_dp_rst_l, frf_dp_data, cpx_fpu_data,
44
   lsu_ffu_ld_data, vis_dp_rd_data, ctl_dp_wsr_data_w2, ctl_dp_sign,
45
   ctl_dp_exc_w2, ctl_dp_fcc_w2, ctl_dp_ftt_w2, ctl_dp_noshift64_frf,
46
   ctl_dp_shift_frf_right, ctl_dp_shift_frf_left,
47
   ctl_dp_zero_low32_frf, ctl_dp_output_sel_rs1,
48
   ctl_dp_output_sel_rs2, ctl_dp_output_sel_frf,
49
   ctl_dp_output_sel_fsr, ctl_dp_noflip_lsu, ctl_dp_flip_lsu,
50
   ctl_dp_noflip_fpu, ctl_dp_flip_fpu, ctl_dp_rs2_frf_read,
51
   ctl_dp_rs2_sel_vis, ctl_dp_rs2_sel_fpu_lsu, ctl_dp_rs2_keep_data,
52
   ctl_dp_rd_ecc, ctl_dp_fp_thr, ctl_dp_fsr_sel_old,
53
   ctl_dp_fsr_sel_ld, ctl_dp_fsr_sel_fpu, ctl_dp_gsr_wsr_w2,
54
   ctl_dp_thr_e, ctl_dp_new_rs1, ctl_dp_ecc_sel_frf
55
   ) ;
56
   input rclk;
57
   input se;
58
   input si;
59
   input ctl_dp_rst_l;
60
   input [77:0] frf_dp_data;
61
   input [63:0]   cpx_fpu_data;
62
   input [63:0] lsu_ffu_ld_data;
63
   input [63:0] vis_dp_rd_data;
64
 
65
   input [36:0] ctl_dp_wsr_data_w2;
66
 
67
   input [1:0]   ctl_dp_sign;  // sign after abs or neg
68
   input [9:0]    ctl_dp_exc_w2;
69
   input [7:0]    ctl_dp_fcc_w2;
70
   input [2:0]    ctl_dp_ftt_w2;
71
 
72
   // mux selects
73
   input         ctl_dp_noshift64_frf;     // choose output from FRF
74
   input         ctl_dp_shift_frf_right;
75
   input         ctl_dp_shift_frf_left;
76
 
77
   input         ctl_dp_zero_low32_frf;
78
 
79
   input         ctl_dp_output_sel_rs1;  // choose output to lsu
80
   input         ctl_dp_output_sel_rs2;
81
   input         ctl_dp_output_sel_frf;
82
   input         ctl_dp_output_sel_fsr;
83
 
84
   input         ctl_dp_noflip_lsu;// inputs from lsu and fpu
85
   input         ctl_dp_flip_lsu;
86
   input         ctl_dp_noflip_fpu;
87
   input         ctl_dp_flip_fpu;
88
 
89
   input         ctl_dp_rs2_frf_read;    // choose r2
90
   input         ctl_dp_rs2_sel_vis;
91
   input         ctl_dp_rs2_sel_fpu_lsu;
92
   input         ctl_dp_rs2_keep_data;
93
   input         ctl_dp_rd_ecc;
94
 
95
   input [3:0]    ctl_dp_fp_thr;
96
 
97
   input [3:0]    ctl_dp_fsr_sel_old,     // choose what to update FSR with
98
                 ctl_dp_fsr_sel_ld,
99
                 ctl_dp_fsr_sel_fpu;
100
 
101
   input [3:0]   ctl_dp_gsr_wsr_w2;
102
   input [3:0]   ctl_dp_thr_e;
103
 
104
 
105
   // rs1 selects
106
   input         ctl_dp_new_rs1;
107
 
108
   // 2:1 mux selects
109
   input      ctl_dp_ecc_sel_frf;
110
 
111
   // outputs
112
   output       so;
113
   output [63:0] dp_frf_data;
114
   output [63:0] ffu_lsu_data;
115
   output [63:0] dp_vis_rs1_data;
116
   output [63:0] dp_vis_rs2_data;
117
   output [1:0]  dp_ctl_rs2_sign;  // sign for rs2
118
   output [7:0]  dp_ctl_fsr_fcc;
119
   output [1:0]  dp_ctl_fsr_rnd;
120
   output [4:0]  dp_ctl_fsr_tem;
121
   output [4:0]  dp_ctl_fsr_aexc;
122
   output [4:0]  dp_ctl_fsr_cexc;
123
 
124
   output [7:0]  dp_ctl_ld_fcc;
125
 
126
   output [31:0] dp_ctl_gsr_mask_e;
127
   output [4:0]  dp_ctl_gsr_scale_e;
128
 
129
 
130
   output [6:0] dp_ctl_synd_out_low;   // signals for ecc errors
131
   output [6:0] dp_ctl_synd_out_high;
132
 
133
   wire         clk;
134
   wire         reset;
135
   // local signals
136
   wire [63:0]    fpu_ffu_data;
137
   wire [63:0]   lsu_ffu_ld_data_d1;
138
   wire [63:0]   rs2_rd_data;  // stores both the rs2 and rd data
139
   wire [63:0]   rs2_rd_data_next;
140
   wire [63:0]   write_data;    // needed since block loads are pipelined
141
   wire [63:0]   rs2_data_changed;
142
   wire [63:0]   local_rd_data;
143
   wire [63:0]   rs1_data;
144
   wire [63:0]   rs1_data_next;
145
   wire [63:0]   shifted_frf_data;
146
   wire [63:0]   new_frf_data;
147
   wire [63:0]   lsu_fpu_data;
148
   wire [63:0]   frf_data_in;
149
   wire [6:0]    synd_in_low;   // input ecc for lower word
150
   wire [6:0]    synd_in_h;   // input ecc for upper word
151
   wire [63:0] corr_data_next;
152
   wire [63:0] corr_data;
153
   wire [63:0] ecc_data_in;
154
 
155
   wire [27:0]    current_fsr,
156
                 t0_fsr,
157
                 t1_fsr,
158
                 t2_fsr,
159
                 t3_fsr;
160
   wire [27:0]    t0_fsr_nxt,
161
                 t1_fsr_nxt,
162
                 t2_fsr_nxt,
163
                 t3_fsr_nxt;
164
   wire [27:0]    t0_ldfsr_data,
165
                             t0_fpufsr_data;
166
   wire [27:0]    t1_ldfsr_data,
167
                             t1_fpufsr_data;
168
   wire [27:0]    t2_ldfsr_data,
169
                             t2_fpufsr_data;
170
   wire [27:0]    t3_ldfsr_data,
171
                             t3_fpufsr_data;
172
 
173
   wire [36:0]   gsr_e;
174
   wire [36:0]   t0_gsr;
175
   wire [36:0]   t0_gsr_nxt;
176
   wire [36:0]   t1_gsr;
177
   wire [36:0]   t1_gsr_nxt;
178
   wire [36:0]   t2_gsr;
179
   wire [36:0]   t2_gsr_nxt;
180
   wire [36:0]   t3_gsr;
181
   wire [36:0]   t3_gsr_nxt;
182
 
183
   assign        reset = ~ctl_dp_rst_l;
184
   assign        clk= rclk;
185
 
186 113 albert.wat
   dff_s #(64) cpx_reg(.din(cpx_fpu_data[63:0]),
187 95 fafa1971
                                       .q   (fpu_ffu_data[63:0]),
188 113 albert.wat
                                       .clk (clk), .se(se), `SIMPLY_RISC_SCANIN, .so());
189 95 fafa1971
 
190
   // flop for lsu data.  the data is flopped in ffu, but the vld is flopped in the lsu.
191
   // This is for timing reasons on the valid bit and Sanjay didn't want to redo the
192
   // lsu dp for the data portion
193 113 albert.wat
   dff_s #(64) lsu_data_dff(.din(lsu_ffu_ld_data[63:0]), .clk(clk), .q(lsu_ffu_ld_data_d1[63:0]),
194
                          .se(se), `SIMPLY_RISC_SCANIN, .so());
195 95 fafa1971
   assign dp_ctl_ld_fcc[7:0] = {lsu_ffu_ld_data_d1[37:32], lsu_ffu_ld_data_d1[11:10]};
196
 
197
   ///////////////////////////////////////////////
198
   //   Input from FRF (shift as needed for singles)
199
   //   The data needs to be shifted around because these are 64 bit reads but
200
   //   the required data might be in either the upper or lower 32 bits for
201
   //   singles.  If it is a double then the data is left alone.
202
   //   If it is a single move and the source and target have the same alignment
203
   //   then no change happens.  If it is a single move and the source and target
204
   //   have different alignments the operands get moved into place for the write.
205
   //   If it is data that will be sent to the lsu the data is moved into the lower
206
   //   32 bits.  If the data will be sent to the fpu the data is moved to the upper
207
   //   32 bits (if not there already)
208
   ///////////////////////////////////////////////
209
   assign  frf_data_in[63:32] = frf_dp_data[70:39];
210
   assign  frf_data_in[31:0] = frf_dp_data[31:0];
211
   mux3ds #(64) frf_input_mux(.dout(shifted_frf_data[63:0]),
212
                              .in0(frf_data_in[63:0]),
213
                              .in1({32'b0, frf_data_in[63:32]}),
214
                              .in2({frf_data_in[31:0], 32'b0}),
215
                              .sel0(ctl_dp_noshift64_frf),
216
                              .sel1(ctl_dp_shift_frf_right),
217
                              .sel2(ctl_dp_shift_frf_left));
218
   assign  new_frf_data[63:32] = shifted_frf_data[63:32];
219
   assign  new_frf_data[31:0] = shifted_frf_data[31:0] & {32{~ctl_dp_zero_low32_frf}};
220
 
221
   mux4ds #(64) lsu_fpu_input_mux(.dout(lsu_fpu_data[63:0]),
222
                                  .in0(lsu_ffu_ld_data_d1[63:0]),
223
                                  .in1({lsu_ffu_ld_data_d1[31:0], 32'b0}),
224
                                  .in2(fpu_ffu_data[63:0]),
225
                                  .in3({32'b0, fpu_ffu_data[63:32]}),
226
                                  .sel0(ctl_dp_noflip_lsu),
227
                                  .sel1(ctl_dp_flip_lsu),
228
                                  .sel2(ctl_dp_noflip_fpu),
229
                                  .sel3(ctl_dp_flip_fpu));
230
 
231
   // Data to FRF
232
   dp_buffer #(64) frf_out_buf(.in(write_data[63:0]), .dout (dp_frf_data[63:0]));
233
 
234
 
235
 
236
   // Data to LSU
237
   // Mux for lsu data between two sets of data and the direct 
238
   // frf output for stores
239
   mux4ds #(64) output_mux(.dout (ffu_lsu_data[63:0]),
240
                           .in0  (rs2_rd_data[63:0]),
241
                           .in1  (rs1_data[63:0]),
242
                           .in2  (shifted_frf_data[63:0]),
243
                                             .in3  ({26'b0, current_fsr[27:20], 2'b0, current_fsr[19:15], 6'b0, current_fsr[14:12], 2'b0, current_fsr[11:0]}),
244
                           .sel0 (ctl_dp_output_sel_rs2),
245
                           .sel1 (ctl_dp_output_sel_rs1),
246
                           .sel2 (ctl_dp_output_sel_frf),
247
                                             .sel3 (ctl_dp_output_sel_fsr));
248
 
249
   // RS2 can take value from frf  (with modification to sign), from lsu 
250
   // or keep value
251
   // The modification to the sign bits allows for FABS and FNEG
252
   assign dp_ctl_rs2_sign[1:0] = {new_frf_data[63], new_frf_data[31]};
253
 
254
   assign rs2_data_changed[63:0] = {ctl_dp_sign[1], new_frf_data[62:32],
255
                                    ctl_dp_sign[0], new_frf_data[30:0]};
256
 
257
   dp_mux2es #(64) local_rd_mux(.dout(local_rd_data[63:0]),
258
                             .in0(rs2_data_changed[63:0]),
259
                             .in1(corr_data[63:0]),
260
                             .sel(ctl_dp_rd_ecc));
261
 
262
   mux4ds #(64) rs2_rd_mux(.dout (rs2_rd_data_next[63:0]),
263
                           .in0  (local_rd_data[63:0]),
264
                           .in1  (vis_dp_rd_data[63:0]),
265
                           .in2  (lsu_fpu_data[63:0]),
266
                           .in3  (rs2_rd_data[63:0]),
267
                           .sel0 (ctl_dp_rs2_frf_read),
268
                           .sel1 (ctl_dp_rs2_sel_vis),
269
                           .sel2 (ctl_dp_rs2_sel_fpu_lsu),
270
                           .sel3 (ctl_dp_rs2_keep_data));
271
 
272 113 albert.wat
   dff_s #(64) rs2_rd_dff(.din (rs2_rd_data_next[63:0]),
273 95 fafa1971
                                          .q   (rs2_rd_data[63:0]),
274 113 albert.wat
                                          .clk (clk), .se(se), `SIMPLY_RISC_SCANIN, .so());
275 95 fafa1971
   assign dp_vis_rs2_data[63:0] = rs2_rd_data[63:0];
276 113 albert.wat
   dff_s #(64) write_data_dff(.din(rs2_rd_data[63:0]),
277 95 fafa1971
                            .q(write_data[63:0]),
278 113 albert.wat
                            .clk(clk), .se(se), `SIMPLY_RISC_SCANIN, .so());
279 95 fafa1971
 
280
   ////////////////////////////////////////////////////////
281
   //                   RS1
282
   ////////////////////////////////////////////////////////
283
   // RS1 next either takes value from frf or keeps value
284
   dp_mux2es #(64) rs1_mux(.dout (rs1_data_next[63:0]),
285
                           .in0  (rs1_data[63:0]),
286
                           .in1  (new_frf_data[63:0]),
287
                           .sel  (ctl_dp_new_rs1));
288
 
289 113 albert.wat
   dff_s #(64) rs1_dff(.din (rs1_data_next[63:0]),
290 95 fafa1971
                                 .q   (rs1_data[63:0]),
291 113 albert.wat
                                 .clk (clk), .se(se), `SIMPLY_RISC_SCANIN, .so());
292 95 fafa1971
   assign dp_vis_rs1_data[63:0] = rs1_data[63:0];
293
 
294
 
295
   /////////////////////////////////////////////////////////
296
   //                   FSR
297
   /////////////////////////////////////////////////////////
298
   // FSR takes data from load
299
   // fsr is set by ldfsr, ldxfsr, or any fpu operation
300
   assign t0_ldfsr_data[27:0] = {ctl_dp_fcc_w2[7:2],     // fcc3,2,1
301
                                                   lsu_ffu_ld_data_d1[31:30],   // RND mode
302
                                                   //2'b0,                     // rsvd
303
                                                   lsu_ffu_ld_data_d1[27:23],   // TEM
304
                                                   //6'b0,                     // NS, rsvd, ver
305
                                                   t0_fsr[14:12],       // ftt
306
                                                   //2'b0,                     // qne, rsvd
307
                                                   lsu_ffu_ld_data_d1[11:0]};   // fcc0, aexc, cexc
308
 
309
   assign t0_fpufsr_data[27:0] = {ctl_dp_fcc_w2[7:2],
310
                                                    t0_fsr[21:20],  // rnd
311
                                                    t0_fsr[19:15],  // TEM
312
                                                    ctl_dp_ftt_w2[2:0],  // ftt
313
                                                    ctl_dp_fcc_w2[1:0],
314
                                                    ctl_dp_exc_w2[9:0]};
315
 
316
   assign t1_ldfsr_data[27:0] = {ctl_dp_fcc_w2[7:2],     // fcc3,2,1
317
                                                   lsu_ffu_ld_data_d1[31:30],   // RND mode
318
                                                   //2'b0,                     // rsvd
319
                                                   lsu_ffu_ld_data_d1[27:23],   // TEM
320
                                                   //6'b0,                     // NS, rsvd, ver
321
                                                   t1_fsr[14:12],       // ftt
322
                                                   //2'b0,                     // qne, rsvd
323
                                                   lsu_ffu_ld_data_d1[11:0]};   // fcc0, aexc, cexc
324
 
325
   assign t1_fpufsr_data[27:0] = {ctl_dp_fcc_w2[7:2],
326
                                                    t1_fsr[21:20],  // rnd
327
                                                    t1_fsr[19:15],  // TEM
328
                                                    ctl_dp_ftt_w2[2:0],  // ftt
329
                                                    ctl_dp_fcc_w2[1:0],
330
                                                    ctl_dp_exc_w2[9:0]};
331
 
332
   assign t2_ldfsr_data[27:0] = {ctl_dp_fcc_w2[7:2],     // fcc3,2,1
333
                                                   lsu_ffu_ld_data_d1[31:30],   // RND mode
334
                                                   //2'b0,                     // rsvd
335
                                                   lsu_ffu_ld_data_d1[27:23],   // TEM
336
                                                   //6'b0,                     // NS, rsvd, ver
337
                                                   t2_fsr[14:12],       // ftt
338
                                                   //2'b0,                     // qne, rsvd
339
                                                   lsu_ffu_ld_data_d1[11:0]};   // fcc0, aexc, cexc
340
 
341
   assign t2_fpufsr_data[27:0] = {ctl_dp_fcc_w2[7:2],
342
                                                    t2_fsr[21:20],  // rnd
343
                                                    t2_fsr[19:15],  // TEM
344
                                                    ctl_dp_ftt_w2[2:0],  // ftt
345
                                                    ctl_dp_fcc_w2[1:0],
346
                                                    ctl_dp_exc_w2[9:0]};
347
 
348
   assign t3_ldfsr_data[27:0] = {ctl_dp_fcc_w2[7:2],     // fcc3,2,1
349
                                                   lsu_ffu_ld_data_d1[31:30],   // RND mode
350
                                                   //2'b0,                     // rsvd
351
                                                   lsu_ffu_ld_data_d1[27:23],   // TEM
352
                                                   //6'b0,                     // NS, rsvd, ver
353
                                                   t3_fsr[14:12],       // ftt
354
                                                   //2'b0,                     // qne, rsvd
355
                                                   lsu_ffu_ld_data_d1[11:0]};   // fcc0, aexc, cexc
356
 
357
   assign t3_fpufsr_data[27:0] = {ctl_dp_fcc_w2[7:2],
358
                                                    t3_fsr[21:20],  // rnd
359
                                                    t3_fsr[19:15],  // TEM
360
                                                    ctl_dp_ftt_w2[2:0],  // ftt
361
                                                    ctl_dp_fcc_w2[1:0],
362
                                                    ctl_dp_exc_w2[9:0]};
363
 
364 113 albert.wat
`ifdef FPGA_SYN_1THREAD
365 95 fafa1971
 
366
   mux3ds #28 fsr0_mux(.dout (t0_fsr_nxt[27:0]),
367
                       .in0  (t0_fsr[27:0]),
368
                       .in1  (t0_ldfsr_data[27:0]),
369
                       .in2  (t0_fpufsr_data[27:0]),
370
                       .sel0 (ctl_dp_fsr_sel_old[0]),
371
                       .sel1 (ctl_dp_fsr_sel_ld[0]),
372 113 albert.wat
                       .sel2 (ctl_dp_fsr_sel_fpu[0]));
373
   // FSR registers
374
   // need only 28 flops for FSR since rest are always 0
375
   dffr_s #28 fsr0_reg(.din (t0_fsr_nxt[27:0]),
376
                                 .q   (t0_fsr[27:0]),
377
                     .rst(reset),
378
                                 .clk (clk), .se(se), `SIMPLY_RISC_SCANIN, .so());
379
   assign current_fsr[27:0] = t0_fsr[27:0];
380
 
381
`else
382
 
383
   mux3ds #28 fsr0_mux(.dout (t0_fsr_nxt[27:0]),
384
                       .in0  (t0_fsr[27:0]),
385
                       .in1  (t0_ldfsr_data[27:0]),
386
                       .in2  (t0_fpufsr_data[27:0]),
387
                       .sel0 (ctl_dp_fsr_sel_old[0]),
388
                       .sel1 (ctl_dp_fsr_sel_ld[0]),
389 95 fafa1971
                       .sel2 (ctl_dp_fsr_sel_fpu[0]));
390
   mux3ds #28 fsr1_mux(.dout (t1_fsr_nxt[27:0]),
391
                       .in0  (t1_fsr[27:0]),
392
                       .in1  (t1_ldfsr_data[27:0]),
393
                       .in2  (t1_fpufsr_data[27:0]),
394
                       .sel0 (ctl_dp_fsr_sel_old[1]),
395
                       .sel1 (ctl_dp_fsr_sel_ld[1]),
396
                       .sel2 (ctl_dp_fsr_sel_fpu[1]));
397
   mux3ds #28 fsr2_mux(.dout (t2_fsr_nxt[27:0]),
398
                       .in0  (t2_fsr[27:0]),
399
                       .in1  (t2_ldfsr_data[27:0]),
400
                       .in2  (t2_fpufsr_data[27:0]),
401
                       .sel0 (ctl_dp_fsr_sel_old[2]),
402
                       .sel1 (ctl_dp_fsr_sel_ld[2]),
403
                       .sel2 (ctl_dp_fsr_sel_fpu[2]));
404
   mux3ds #28 fsr3_mux(.dout (t3_fsr_nxt[27:0]),
405
                       .in0  (t3_fsr[27:0]),
406
                       .in1  (t3_ldfsr_data[27:0]),
407
                       .in2  (t3_fpufsr_data[27:0]),
408
                       .sel0 (ctl_dp_fsr_sel_old[3]),
409
                       .sel1 (ctl_dp_fsr_sel_ld[3]),
410
                       .sel2 (ctl_dp_fsr_sel_fpu[3]));
411
 
412
   // FSR registers
413
   // need only 28 flops for FSR since rest are always 0
414 113 albert.wat
   dffr_s #28 fsr0_reg(.din (t0_fsr_nxt[27:0]),
415 95 fafa1971
                                 .q   (t0_fsr[27:0]),
416
                     .rst(reset),
417 113 albert.wat
                                 .clk (clk), .se(se), `SIMPLY_RISC_SCANIN, .so());
418
   dffr_s #28 fsr1_reg(.din (t1_fsr_nxt[27:0]),
419 95 fafa1971
                                 .q   (t1_fsr[27:0]),
420
                     .rst(reset),
421 113 albert.wat
                                 .clk (clk), .se(se), `SIMPLY_RISC_SCANIN, .so());
422
   dffr_s #28 fsr2_reg(.din (t2_fsr_nxt[27:0]),
423 95 fafa1971
                                 .q   (t2_fsr[27:0]),
424
                     .rst(reset),
425 113 albert.wat
                                 .clk (clk), .se(se), `SIMPLY_RISC_SCANIN, .so());
426
   dffr_s #28 fsr3_reg(.din (t3_fsr_nxt[27:0]),
427 95 fafa1971
                                 .q   (t3_fsr[27:0]),
428
                     .rst(reset),
429 113 albert.wat
                                 .clk (clk), .se(se), `SIMPLY_RISC_SCANIN, .so());
430 95 fafa1971
 
431
   // Current FSR
432
   mux4ds #28 curr_fsr_mux(.dout (current_fsr[27:0]),
433
                           .in0  (t0_fsr[27:0]),
434
                           .in1  (t1_fsr[27:0]),
435
                           .in2  (t2_fsr[27:0]),
436
                           .in3  (t3_fsr[27:0]),
437
                           .sel0 (ctl_dp_fp_thr[0]),
438
                           .sel1 (ctl_dp_fp_thr[1]),
439
                           .sel2 (ctl_dp_fp_thr[2]),
440
                           .sel3 (ctl_dp_fp_thr[3]));
441 113 albert.wat
`endif // !`ifdef FPGA_SYN_1THREAD
442 95 fafa1971
 
443
   assign dp_ctl_fsr_fcc = {current_fsr[27:22], current_fsr[11:10]};
444
   assign dp_ctl_fsr_rnd = current_fsr[21:20];
445
   assign dp_ctl_fsr_tem = current_fsr[19:15];
446
   assign dp_ctl_fsr_aexc = current_fsr[9:5];
447
   assign dp_ctl_fsr_cexc = current_fsr[4:0];
448
 
449
   ////////////////////////////////////////////////////////////
450
   //           ECC generation and correction
451
   ////////////////////////////////////////////////////////////
452
   dp_mux2es #(64) ecc_mux(.dout(ecc_data_in[63:0]),
453
                           .in0(rs2_rd_data[63:0]),
454
                           .in1({frf_dp_data[70:39], frf_dp_data[31:0]}),
455
                           .sel(ctl_dp_ecc_sel_frf));
456
 
457
   assign     synd_in_low[6:0] = {7{ctl_dp_ecc_sel_frf}} & frf_dp_data[38:32];
458
   assign     synd_in_h[6:0] = {7{ctl_dp_ecc_sel_frf}} & frf_dp_data[77:71];
459
 
460
   zzecc_sctag_ecc39 ecccor_low(.din(ecc_data_in[31:0]),
461
                                .parity(synd_in_low[6:0]),
462
                                .dout(corr_data_next[31:0]),
463
                                .pflag(dp_ctl_synd_out_low[6]),
464
                                .cflag(dp_ctl_synd_out_low[5:0]));
465
 
466
   zzecc_sctag_ecc39 ecccor_high(.din(ecc_data_in[63:32]),
467
                                .parity(synd_in_h[6:0]),
468
                                .dout(corr_data_next[63:32]),
469
                                .pflag(dp_ctl_synd_out_high[6]),
470
                                .cflag(dp_ctl_synd_out_high[5:0]));
471
 
472
 
473 113 albert.wat
   dff_s #(64) ecc_corr_data(.din(corr_data_next[63:0]), .q(corr_data[63:0]),
474
                           .clk(clk), .se(se), `SIMPLY_RISC_SCANIN, .so());
475 95 fafa1971
 
476
 
477
   ////////////////////////////////////////////////
478
   // GSR Storage
479
   ////////////////////////////////////////////////
480
   // GSR registers
481
   // need only 37 flops for GSR since rest are always 0
482
   // and the align and rnd fields are in the ctl block
483 113 albert.wat
`ifdef FPGA_SYN_1THREAD
484
   dffr_s #37 gsr0_reg(.din (t0_gsr_nxt[36:0]),
485
                                 .q   (t0_gsr[36:0]),
486
                     .rst(reset),
487
                                 .clk (clk), .se(se), `SIMPLY_RISC_SCANIN, .so());
488
   assign     t0_gsr_nxt[36:0] = t0_gsr[36:0];
489
   assign     gsr_e[36:0] = t0_gsr[36:0];
490 95 fafa1971
 
491 113 albert.wat
`else
492
 
493
   dffr_s #37 gsr0_reg(.din (t0_gsr_nxt[36:0]),
494 95 fafa1971
                                 .q   (t0_gsr[36:0]),
495
                     .rst(reset),
496 113 albert.wat
                                 .clk (clk), .se(se), `SIMPLY_RISC_SCANIN, .so());
497
   dffr_s #37 gsr1_reg(.din (t1_gsr_nxt[36:0]),
498 95 fafa1971
                                 .q   (t1_gsr[36:0]),
499
                     .rst(reset),
500 113 albert.wat
                                 .clk (clk), .se(se), `SIMPLY_RISC_SCANIN, .so());
501
   dffr_s #37 gsr2_reg(.din (t2_gsr_nxt[36:0]),
502 95 fafa1971
                                 .q   (t2_gsr[36:0]),
503
                     .rst(reset),
504 113 albert.wat
                                 .clk (clk), .se(se), `SIMPLY_RISC_SCANIN, .so());
505
   dffr_s #37 gsr3_reg(.din (t3_gsr_nxt[36:0]),
506 95 fafa1971
                                 .q   (t3_gsr[36:0]),
507
                     .rst(reset),
508 113 albert.wat
                                 .clk (clk), .se(se), `SIMPLY_RISC_SCANIN, .so());
509 95 fafa1971
 
510
   dp_mux2es #(37) gsr0_mux(.dout(t0_gsr_nxt[36:0]),
511
                            .in0(t0_gsr[36:0]),
512
                            .in1(ctl_dp_wsr_data_w2[36:0]),
513
                            .sel(ctl_dp_gsr_wsr_w2[0]));
514
   dp_mux2es #(37) gsr1_mux(.dout(t1_gsr_nxt[36:0]),
515
                            .in0(t1_gsr[36:0]),
516
                            .in1(ctl_dp_wsr_data_w2[36:0]),
517
                            .sel(ctl_dp_gsr_wsr_w2[1]));
518
   dp_mux2es #(37) gsr2_mux(.dout(t2_gsr_nxt[36:0]),
519
                            .in0(t2_gsr[36:0]),
520
                            .in1(ctl_dp_wsr_data_w2[36:0]),
521
                            .sel(ctl_dp_gsr_wsr_w2[2]));
522
   dp_mux2es #(37) gsr3_mux(.dout(t3_gsr_nxt[36:0]),
523
                            .in0(t3_gsr[36:0]),
524
                            .in1(ctl_dp_wsr_data_w2[36:0]),
525
                            .sel(ctl_dp_gsr_wsr_w2[3]));
526
 
527
 
528
   // GSR_E
529
   mux4ds #37 curr_gsr_mux(.dout (gsr_e[36:0]),
530
                           .in0  (t0_gsr[36:0]),
531
                           .in1  (t1_gsr[36:0]),
532
                           .in2  (t2_gsr[36:0]),
533
                           .in3  (t3_gsr[36:0]),
534
                           .sel0 (ctl_dp_thr_e[0]),
535
                           .sel1 (ctl_dp_thr_e[1]),
536
                           .sel2 (ctl_dp_thr_e[2]),
537
                           .sel3 (ctl_dp_thr_e[3]));
538 113 albert.wat
`endif // !`ifdef FPGA_SYN_1THREAD
539 95 fafa1971
 
540
   assign     dp_ctl_gsr_scale_e[4:0] = gsr_e[4:0];
541
   assign     dp_ctl_gsr_mask_e[31:0] = gsr_e[36:5];
542
 
543
 
544
 
545
 
546
endmodule // sparc_ffu_dp

powered by: WebSVN 2.1.0

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