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

Subversion Repositories s1_core

[/] [s1_core/] [trunk/] [hdl/] [rtl/] [sparc_core/] [sparc_exu_div_yreg.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_exu_div_yreg.v
4
// Copyright (c) 2006 Sun Microsystems, Inc.  All Rights Reserved.
5
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES.
6
// 
7
// The above named program is free software; you can redistribute it and/or
8
// modify it under the terms of the GNU General Public
9
// License version 2 as published by the Free Software Foundation.
10
// 
11
// The above named program is distributed in the hope that it will be 
12
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
// General Public License for more details.
15
// 
16
// You should have received a copy of the GNU General Public
17
// License along with this work; if not, write to the Free Software
18
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
19
// 
20
// ========== Copyright Header End ============================================
21 113 albert.wat
`ifdef SIMPLY_RISC_TWEAKS
22
`define SIMPLY_RISC_SCANIN .si(0)
23
`else
24
`define SIMPLY_RISC_SCANIN .si()
25
`endif
26 95 fafa1971
////////////////////////////////////////////////////////////////////////
27
/*
28
//  Module Name: sparc_exu_div_yreg
29
//      Description: The 4 32 bit y registers.  It can be written to
30
//              twice each cycle because by definition the writes must come
31
//              from different threads.  There is no bypassing because wry switches out.
32
*/
33
module sparc_exu_div_yreg (/*AUTOARG*/
34
   // Outputs
35
   yreg_mdq_y_e, div_ecl_yreg_0_l,
36
   // Inputs
37
   clk, se, byp_div_yreg_data_w, mul_div_yreg_data_g, ecl_div_thr_e,
38
   ecl_div_yreg_wen_w, ecl_div_yreg_wen_g, ecl_div_yreg_wen_l,
39
   ecl_div_yreg_data_31_g, ecl_div_yreg_shift_g
40
   ) ;
41
   input clk;
42
   input se;
43
   input [31:0] byp_div_yreg_data_w;
44
   input [31:0] mul_div_yreg_data_g;
45
   input [3:0]  ecl_div_thr_e;
46
   input [3:0]  ecl_div_yreg_wen_w;
47
   input [3:0]  ecl_div_yreg_wen_g;
48
   input [3:0]  ecl_div_yreg_wen_l;// w or w2
49
   input        ecl_div_yreg_data_31_g;// bit shifted in on muls
50
   input [3:0]  ecl_div_yreg_shift_g;// yreg should be shifted
51
 
52
   output [31:0] yreg_mdq_y_e;
53
   output [3:0]  div_ecl_yreg_0_l;
54
 
55
   wire [31:0]   next_yreg_thr0;// next value for yreg
56
   wire [31:0]   next_yreg_thr1;
57
   wire [31:0]   next_yreg_thr2;
58
   wire [31:0]   next_yreg_thr3;
59
   wire [31:0]   yreg_thr0;     // current value of yreg
60
   wire [31:0]   yreg_thr1;
61
   wire [31:0]   yreg_thr2;
62
   wire [31:0]   yreg_thr3;
63
   wire [3:0]    div_ecl_yreg_0;
64
   wire [31:0]   yreg_data_w1;
65
 
66
 
67
   //////////////////////////////////
68
   //  Output selection for yreg
69
   //////////////////////////////////
70
   // output the LSB of all 4 regs
71
   assign        div_ecl_yreg_0[3:0] = {yreg_thr3[0],yreg_thr2[0],yreg_thr1[0],yreg_thr0[0]};
72
   assign        div_ecl_yreg_0_l[3:0] = ~div_ecl_yreg_0[3:0];
73
 
74 113 albert.wat
`ifdef FPGA_SYN_1THREAD
75 95 fafa1971
 
76 113 albert.wat
   assign        yreg_mdq_y_e[31:0] = yreg_thr0[31:0];
77 95 fafa1971
 
78 113 albert.wat
`else
79 95 fafa1971
 
80
   // mux between the 4 yregs
81
   mux4ds #(32) mux_yreg_out(.dout(yreg_mdq_y_e[31:0]), .sel0(ecl_div_thr_e[0]),
82
                         .sel1(ecl_div_thr_e[1]), .sel2(ecl_div_thr_e[2]),
83
                         .sel3(ecl_div_thr_e[3]), .in0(yreg_thr0[31:0]),
84
                         .in1(yreg_thr1[31:0]), .in2(yreg_thr2[31:0]),
85
                         .in3(yreg_thr3[31:0]));
86 113 albert.wat
`endif
87 95 fafa1971
 
88
   //////////////////////////////////////
89
   //  Storage of yreg
90
   //////////////////////////////////////
91
   // pass along yreg w to w2 (for control signal timing)
92 113 albert.wat
   dff_s #(32) yreg_dff_w2w2(.din(byp_div_yreg_data_w[31:0]), .clk(clk), .q(yreg_data_w1[31:0]),
93
                           .se(se), `SIMPLY_RISC_SCANIN, .so());
94 95 fafa1971
 
95
 
96
   // mux between yreg_w, yreg_g, old value
97
   mux4ds #(32) mux_yregin0(.dout(next_yreg_thr0[31:0]),
98
                          .sel0(ecl_div_yreg_wen_w[0]),
99
                          .sel1(ecl_div_yreg_wen_g[0]),
100
                          .sel2(ecl_div_yreg_wen_l[0]),
101
                          .sel3(ecl_div_yreg_shift_g[0]),
102
                          .in0(yreg_data_w1[31:0]),
103
                          .in1(mul_div_yreg_data_g[31:0]),
104
                          .in2(yreg_thr0[31:0]),
105
                          .in3({ecl_div_yreg_data_31_g, yreg_thr0[31:1]}));
106 113 albert.wat
`ifdef FPGA_SYN_1THREAD
107
   assign        next_yreg_thr1[31:0] = yreg_data_w1[31:0];
108
   assign        next_yreg_thr2[31:0] = yreg_data_w1[31:0];
109
   assign        next_yreg_thr3[31:0] = yreg_data_w1[31:0];
110 95 fafa1971
 
111 113 albert.wat
`else
112
 
113 95 fafa1971
   mux4ds #(32) mux_yregin1(.dout(next_yreg_thr1[31:0]),
114
                          .sel0(ecl_div_yreg_wen_w[1]),
115
                          .sel1(ecl_div_yreg_wen_g[1]),
116
                          .sel2(ecl_div_yreg_wen_l[1]),
117
                          .sel3(ecl_div_yreg_shift_g[1]),
118
                          .in0(yreg_data_w1[31:0]),
119
                          .in1(mul_div_yreg_data_g[31:0]),
120
                          .in2(yreg_thr1[31:0]),
121
                          .in3({ecl_div_yreg_data_31_g, yreg_thr1[31:1]}));
122
   mux4ds #(32) mux_yregin2(.dout(next_yreg_thr2[31:0]),
123
                          .sel0(ecl_div_yreg_wen_w[2]),
124
                          .sel1(ecl_div_yreg_wen_g[2]),
125
                          .sel2(ecl_div_yreg_wen_l[2]),
126
                          .sel3(ecl_div_yreg_shift_g[2]),
127
                          .in0(yreg_data_w1[31:0]),
128
                          .in1(mul_div_yreg_data_g[31:0]),
129
                          .in2(yreg_thr2[31:0]),
130
                          .in3({ecl_div_yreg_data_31_g, yreg_thr2[31:1]}));
131
   mux4ds #(32) mux_yregin3(.dout(next_yreg_thr3[31:0]),
132
                          .sel0(ecl_div_yreg_wen_w[3]),
133
                          .sel1(ecl_div_yreg_wen_g[3]),
134
                          .sel2(ecl_div_yreg_wen_l[3]),
135
                          .sel3(ecl_div_yreg_shift_g[3]),
136
                          .in0(yreg_data_w1[31:0]),
137
                          .in1(mul_div_yreg_data_g[31:0]),
138
                          .in2(yreg_thr3[31:0]),
139
                          .in3({ecl_div_yreg_data_31_g, yreg_thr3[31:1]}));
140 113 albert.wat
`endif // !`ifdef FPGA_SYN_1THREAD
141 95 fafa1971
 
142
   // store new value
143 113 albert.wat
   dff_s #(32) dff_yreg_thr0(.din(next_yreg_thr0[31:0]), .clk(clk), .q(yreg_thr0[31:0]),
144
                       .se(se), `SIMPLY_RISC_SCANIN, .so());
145
   dff_s #(32) dff_yreg_thr1(.din(next_yreg_thr1[31:0]), .clk(clk), .q(yreg_thr1[31:0]),
146
                       .se(se), `SIMPLY_RISC_SCANIN, .so());
147
   dff_s #(32) dff_yreg_thr2(.din(next_yreg_thr2[31:0]), .clk(clk), .q(yreg_thr2[31:0]),
148
                       .se(se), `SIMPLY_RISC_SCANIN, .so());
149
   dff_s #(32) dff_yreg_thr3(.din(next_yreg_thr3[31:0]), .clk(clk), .q(yreg_thr3[31:0]),
150
                       .se(se), `SIMPLY_RISC_SCANIN, .so());
151 95 fafa1971
 
152
 
153
endmodule // sparc_exu_div_yreg

powered by: WebSVN 2.1.0

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