1 |
48 |
alirezamon |
/////////////////////////////////////////////////////////////////////
|
2 |
|
|
//// ////
|
3 |
|
|
//// pfpu32_top ////
|
4 |
|
|
//// 32-bit floating point top level ////
|
5 |
|
|
//// ////
|
6 |
|
|
//// Author: Andrey Bacherov ////
|
7 |
|
|
//// avbacherov@opencores.org ////
|
8 |
|
|
//// ////
|
9 |
|
|
/////////////////////////////////////////////////////////////////////
|
10 |
|
|
//// ////
|
11 |
|
|
//// Copyright (C) 2014 Andrey Bacherov ////
|
12 |
|
|
//// avbacherov@opencores.org ////
|
13 |
|
|
//// ////
|
14 |
|
|
//// This source file may be used and distributed without ////
|
15 |
|
|
//// restriction provided that this copyright statement is not ////
|
16 |
|
|
//// removed from the file and that any derivative work contains ////
|
17 |
|
|
//// the original copyright notice and the associated disclaimer.////
|
18 |
|
|
//// ////
|
19 |
|
|
//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY ////
|
20 |
|
|
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED ////
|
21 |
|
|
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ////
|
22 |
|
|
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR ////
|
23 |
|
|
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, ////
|
24 |
|
|
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ////
|
25 |
|
|
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE ////
|
26 |
|
|
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ////
|
27 |
|
|
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ////
|
28 |
|
|
//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ////
|
29 |
|
|
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT ////
|
30 |
|
|
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ////
|
31 |
|
|
//// POSSIBILITY OF SUCH DAMAGE. ////
|
32 |
|
|
//// ////
|
33 |
|
|
/////////////////////////////////////////////////////////////////////
|
34 |
|
|
|
35 |
|
|
// fpu operations:
|
36 |
|
|
// ==========================
|
37 |
|
|
// 0000 = add,
|
38 |
|
|
// 0001 = substract,
|
39 |
|
|
// 0010 = multiply,
|
40 |
|
|
// 0011 = divide,
|
41 |
|
|
// 0100 = i2f
|
42 |
|
|
// 0101 = f2i
|
43 |
|
|
// 0110 = unused (rem)
|
44 |
|
|
// 0111 = reserved
|
45 |
|
|
// 1xxx = comparison
|
46 |
|
|
|
47 |
|
|
`include "mor1kx-defines.v"
|
48 |
|
|
|
49 |
|
|
module pfpu32_top
|
50 |
|
|
#(
|
51 |
|
|
parameter OPTION_OPERAND_WIDTH = 32
|
52 |
|
|
)
|
53 |
|
|
(
|
54 |
|
|
input clk,
|
55 |
|
|
input rst,
|
56 |
|
|
input flush_i,
|
57 |
|
|
input padv_decode_i,
|
58 |
|
|
input padv_execute_i,
|
59 |
|
|
input [`OR1K_FPUOP_WIDTH-1:0] op_fpu_i,
|
60 |
|
|
input [`OR1K_FPCSR_RM_SIZE-1:0] round_mode_i,
|
61 |
|
|
input [OPTION_OPERAND_WIDTH-1:0] rfa_i,
|
62 |
|
|
input [OPTION_OPERAND_WIDTH-1:0] rfb_i,
|
63 |
|
|
output [OPTION_OPERAND_WIDTH-1:0] fpu_result_o,
|
64 |
|
|
output fpu_arith_valid_o,
|
65 |
|
|
output fpu_cmp_flag_o,
|
66 |
|
|
output fpu_cmp_valid_o,
|
67 |
|
|
output [`OR1K_FPCSR_WIDTH-1:0] fpcsr_o
|
68 |
|
|
);
|
69 |
|
|
|
70 |
|
|
// MSB (set by decode stage) indicates FPU instruction
|
71 |
|
|
// Get rid of top bit - is FPU op valid bit
|
72 |
|
|
wire is_op_fpu = op_fpu_i[`OR1K_FPUOP_WIDTH-1];
|
73 |
|
|
wire [`OR1K_FPUOP_WIDTH-1:0] op_fpu = {1'b0,op_fpu_i[`OR1K_FPUOP_WIDTH-2:0]};
|
74 |
|
|
wire [2:0] op_arith_conv = op_fpu_i[2:0]; // alias
|
75 |
|
|
wire a_cmp = op_fpu_i[3]; // alias for compare bit of fpu's opcode
|
76 |
|
|
|
77 |
|
|
// advance FPU units
|
78 |
|
|
wire padv_fpu_units = padv_execute_i |
|
79 |
|
|
((~fpu_arith_valid_o) & (~fpu_cmp_valid_o));
|
80 |
|
|
|
81 |
|
|
// start logic
|
82 |
|
|
reg new_data;
|
83 |
|
|
always @(posedge clk `OR_ASYNC_RST) begin
|
84 |
|
|
if (rst)
|
85 |
|
|
new_data <= 1'b0;
|
86 |
|
|
else if(flush_i)
|
87 |
|
|
new_data <= 1'b0;
|
88 |
|
|
else if(padv_decode_i)
|
89 |
|
|
new_data <= 1'b1;
|
90 |
|
|
else if(padv_fpu_units)
|
91 |
|
|
new_data <= 1'b0;
|
92 |
|
|
end // posedge clock
|
93 |
|
|
|
94 |
|
|
wire new_fpu_data = new_data & is_op_fpu;
|
95 |
|
|
|
96 |
|
|
|
97 |
|
|
// analysis of input values
|
98 |
|
|
// split input a
|
99 |
|
|
wire in_signa = rfa_i[31];
|
100 |
|
|
wire [7:0] in_expa = rfa_i[30:23];
|
101 |
|
|
wire [22:0] in_fracta = rfa_i[22:0];
|
102 |
|
|
// detect infinity a
|
103 |
|
|
wire in_expa_ff = &in_expa;
|
104 |
|
|
wire in_infa = in_expa_ff & (~(|in_fracta));
|
105 |
|
|
// signaling NaN: exponent is 8hff, [22] is zero,
|
106 |
|
|
// rest of fract is non-zero
|
107 |
|
|
// quiet NaN: exponent is 8hff, [22] is 1
|
108 |
|
|
wire in_snan_a = in_expa_ff & (~in_fracta[22]) & (|in_fracta[21:0]);
|
109 |
|
|
wire in_qnan_a = in_expa_ff & in_fracta[22];
|
110 |
|
|
// denormalized/zero of a
|
111 |
|
|
wire in_opa_0 = ~(|rfa_i[30:0]);
|
112 |
|
|
wire in_opa_dn = (~(|in_expa)) & (|in_fracta);
|
113 |
|
|
|
114 |
|
|
// split input b
|
115 |
|
|
wire in_signb = rfb_i[31];
|
116 |
|
|
wire [7:0] in_expb = rfb_i[30:23];
|
117 |
|
|
wire [22:0] in_fractb = rfb_i[22:0];
|
118 |
|
|
// detect infinity b
|
119 |
|
|
wire in_expb_ff = &in_expb;
|
120 |
|
|
wire in_infb = in_expb_ff & (~(|in_fractb));
|
121 |
|
|
// detect NaNs in b
|
122 |
|
|
wire in_snan_b = in_expb_ff & (~in_fractb[22]) & (|in_fractb[21:0]);
|
123 |
|
|
wire in_qnan_b = in_expb_ff & in_fractb[22];
|
124 |
|
|
// denormalized/zero of a
|
125 |
|
|
wire in_opb_0 = ~(|rfb_i[30:0]);
|
126 |
|
|
wire in_opb_dn = (~(|in_expb)) & (|in_fractb);
|
127 |
|
|
|
128 |
|
|
// detection of some exceptions
|
129 |
|
|
// a nan input -> qnan output
|
130 |
|
|
wire in_snan = in_snan_a | in_snan_b;
|
131 |
|
|
wire in_qnan = in_qnan_a | in_qnan_b;
|
132 |
|
|
// sign of output nan
|
133 |
|
|
wire in_anan_sign = (in_snan_a | in_qnan_a) ? in_signa :
|
134 |
|
|
in_signb;
|
135 |
|
|
|
136 |
|
|
// restored exponents
|
137 |
|
|
wire [9:0] in_exp10a = {2'd0,in_expa[7:1],(in_expa[0] | in_opa_dn)};
|
138 |
|
|
wire [9:0] in_exp10b = {2'd0,in_expb[7:1],(in_expb[0] | in_opb_dn)};
|
139 |
|
|
// restored fractionals
|
140 |
|
|
wire [23:0] in_fract24a = {((~in_opa_dn) & (~in_opa_0)),in_fracta};
|
141 |
|
|
wire [23:0] in_fract24b = {((~in_opb_dn) & (~in_opb_0)),in_fractb};
|
142 |
|
|
|
143 |
|
|
|
144 |
|
|
// comparator
|
145 |
|
|
// inputs & outputs
|
146 |
|
|
wire op_cmp = a_cmp &
|
147 |
|
|
new_fpu_data;
|
148 |
|
|
wire addsub_agtb_o, addsub_aeqb_o;
|
149 |
|
|
wire cmp_result, cmp_ready,
|
150 |
|
|
cmp_inv, cmp_inf;
|
151 |
|
|
// module istance
|
152 |
|
|
pfpu32_fcmp u_f32_cmp
|
153 |
|
|
(
|
154 |
|
|
.fpu_op_is_comp_i(op_cmp),
|
155 |
|
|
.generic_cmp_opc_i(op_fpu[`OR1K_FPUOP_GENERIC_CMP_SELECT]),
|
156 |
|
|
.unordered_cmp_bit_i(op_fpu[`OR1K_FPUOP_UNORDERED_CMP_BIT]),
|
157 |
|
|
// operand 'a' related inputs
|
158 |
|
|
.signa_i(in_signa),
|
159 |
|
|
.exp10a_i(in_exp10a),
|
160 |
|
|
.fract24a_i(in_fract24a),
|
161 |
|
|
.snana_i(in_snan_a),
|
162 |
|
|
.qnana_i(in_qnan_a),
|
163 |
|
|
.infa_i(in_infa),
|
164 |
|
|
.zeroa_i(in_opa_0),
|
165 |
|
|
// operand 'b' related inputs
|
166 |
|
|
.signb_i(in_signb),
|
167 |
|
|
.exp10b_i(in_exp10b),
|
168 |
|
|
.fract24b_i(in_fract24b),
|
169 |
|
|
.snanb_i(in_snan_b),
|
170 |
|
|
.qnanb_i(in_qnan_b),
|
171 |
|
|
.infb_i(in_infb),
|
172 |
|
|
.zerob_i(in_opb_0),
|
173 |
|
|
// support addsub
|
174 |
|
|
.addsub_agtb_o(addsub_agtb_o),
|
175 |
|
|
.addsub_aeqb_o(addsub_aeqb_o),
|
176 |
|
|
// outputs
|
177 |
|
|
.cmp_flag_o(cmp_result),
|
178 |
|
|
.inv_o(cmp_inv),
|
179 |
|
|
.inf_o(cmp_inf),
|
180 |
|
|
.ready_o(cmp_ready)
|
181 |
|
|
);
|
182 |
|
|
|
183 |
|
|
|
184 |
|
|
// addition / substraction
|
185 |
|
|
// inputs & outputs
|
186 |
|
|
wire the_sub = (op_arith_conv == 3'd1);
|
187 |
|
|
wire op_add = (~a_cmp) & ((op_arith_conv == 3'd0) | the_sub);
|
188 |
|
|
wire add_start = op_add &
|
189 |
|
|
new_fpu_data;
|
190 |
|
|
wire add_rdy_o; // add/sub is ready
|
191 |
|
|
wire add_sign_o; // add/sub signum
|
192 |
|
|
wire add_sub_0_o; // flag that actual substruction is performed and result is zero
|
193 |
|
|
wire [4:0] add_shl_o; // do left shift in align stage
|
194 |
|
|
wire [9:0] add_exp10shl_o; // exponent for left shift align
|
195 |
|
|
wire [9:0] add_exp10sh0_o; // exponent for no shift in align
|
196 |
|
|
wire [27:0] add_fract28_o; // fractional with appended {r,s} bits
|
197 |
|
|
wire add_inv_o; // add/sub invalid operation flag
|
198 |
|
|
wire add_inf_o; // add/sub infinity output reg
|
199 |
|
|
wire add_snan_o; // add/sub signaling NaN output reg
|
200 |
|
|
wire add_qnan_o; // add/sub quiet NaN output reg
|
201 |
|
|
wire add_anan_sign_o; // add/sub signum for output nan
|
202 |
|
|
// module istance
|
203 |
|
|
pfpu32_addsub u_f32_addsub
|
204 |
|
|
(
|
205 |
|
|
.clk (clk),
|
206 |
|
|
.rst (rst),
|
207 |
|
|
.flush_i (flush_i), // flushe pipe
|
208 |
|
|
.adv_i (padv_fpu_units), // advance pipe
|
209 |
|
|
.start_i (add_start),
|
210 |
|
|
.is_sub_i (the_sub), // 1: substruction, 0: addition
|
211 |
|
|
// input 'a' related values
|
212 |
|
|
.signa_i (in_signa),
|
213 |
|
|
.exp10a_i (in_exp10a),
|
214 |
|
|
.fract24a_i (in_fract24a),
|
215 |
|
|
.infa_i (in_infa),
|
216 |
|
|
// input 'b' related values
|
217 |
|
|
.signb_i (in_signb),
|
218 |
|
|
.exp10b_i (in_exp10b),
|
219 |
|
|
.fract24b_i (in_fract24b),
|
220 |
|
|
.infb_i (in_infb),
|
221 |
|
|
// 'a'/'b' related
|
222 |
|
|
.snan_i (in_snan),
|
223 |
|
|
.qnan_i (in_qnan),
|
224 |
|
|
.anan_sign_i (in_anan_sign),
|
225 |
|
|
.addsub_agtb_i (addsub_agtb_o),
|
226 |
|
|
.addsub_aeqb_i (addsub_aeqb_o),
|
227 |
|
|
// outputs
|
228 |
|
|
.add_rdy_o (add_rdy_o), // add/sub is ready
|
229 |
|
|
.add_sign_o (add_sign_o), // add/sub signum
|
230 |
|
|
.add_sub_0_o (add_sub_0_o), // flag that actual substruction is performed and result is zero
|
231 |
|
|
.add_shl_o (add_shl_o), // do left shift in align stage
|
232 |
|
|
.add_exp10shl_o (add_exp10shl_o), // exponent for left shift align
|
233 |
|
|
.add_exp10sh0_o (add_exp10sh0_o), // exponent for no shift in align
|
234 |
|
|
.add_fract28_o (add_fract28_o), // fractional with appended {r,s} bits
|
235 |
|
|
.add_inv_o (add_inv_o), // add/sub invalid operation flag
|
236 |
|
|
.add_inf_o (add_inf_o), // add/sub infinity output reg
|
237 |
|
|
.add_snan_o (add_snan_o), // add/sub signaling NaN output reg
|
238 |
|
|
.add_qnan_o (add_qnan_o), // add/sub quiet NaN output reg
|
239 |
|
|
.add_anan_sign_o (add_anan_sign_o) // add/sub signum for output nan
|
240 |
|
|
);
|
241 |
|
|
|
242 |
|
|
// MUL/DIV combined pipeline
|
243 |
|
|
// inputs & outputs
|
244 |
|
|
wire op_mul = (~a_cmp) & (op_arith_conv == 3'd2);
|
245 |
|
|
wire op_div = (~a_cmp) & (op_arith_conv == 3'd3);
|
246 |
|
|
wire mul_start = (op_mul | op_div) &
|
247 |
|
|
new_fpu_data;
|
248 |
|
|
// MUL/DIV common outputs
|
249 |
|
|
wire mul_rdy_o; // mul is ready
|
250 |
|
|
wire mul_sign_o; // mul signum
|
251 |
|
|
wire [4:0] mul_shr_o; // do right shift in align stage
|
252 |
|
|
wire [9:0] mul_exp10shr_o; // exponent for right shift align
|
253 |
|
|
wire mul_shl_o; // do left shift in align stage
|
254 |
|
|
wire [9:0] mul_exp10shl_o; // exponent for left shift align
|
255 |
|
|
wire [9:0] mul_exp10sh0_o; // exponent for no shift in align
|
256 |
|
|
wire [27:0] mul_fract28_o; // fractional with appended {r,s} bits
|
257 |
|
|
wire mul_inv_o; // mul invalid operation flag
|
258 |
|
|
wire mul_inf_o; // mul infinity output reg
|
259 |
|
|
wire mul_snan_o; // mul signaling NaN output reg
|
260 |
|
|
wire mul_qnan_o; // mul quiet NaN output reg
|
261 |
|
|
wire mul_anan_sign_o; // mul signum for output nan
|
262 |
|
|
// DIV additional outputs
|
263 |
|
|
wire div_op_o; // operation is division
|
264 |
|
|
wire div_sign_rmnd_o; // signum or reminder for IEEE compliant rounding
|
265 |
|
|
wire div_dbz_o; // division by zero flag
|
266 |
|
|
// module istance
|
267 |
|
|
pfpu32_muldiv u_f32_muldiv
|
268 |
|
|
(
|
269 |
|
|
.clk (clk),
|
270 |
|
|
.rst (rst),
|
271 |
|
|
.flush_i (flush_i), // flushe pipe
|
272 |
|
|
.adv_i (padv_fpu_units), // advance pipe
|
273 |
|
|
.start_i (mul_start),
|
274 |
|
|
.is_div_i (op_div),
|
275 |
|
|
// input 'a' related values
|
276 |
|
|
.signa_i (in_signa),
|
277 |
|
|
.exp10a_i (in_exp10a),
|
278 |
|
|
.fract24a_i (in_fract24a),
|
279 |
|
|
.infa_i (in_infa),
|
280 |
|
|
.zeroa_i (in_opa_0),
|
281 |
|
|
// input 'b' related values
|
282 |
|
|
.signb_i (in_signb),
|
283 |
|
|
.exp10b_i (in_exp10b),
|
284 |
|
|
.fract24b_i (in_fract24b),
|
285 |
|
|
.infb_i (in_infb),
|
286 |
|
|
.zerob_i (in_opb_0),
|
287 |
|
|
// 'a'/'b' related
|
288 |
|
|
.snan_i (in_snan),
|
289 |
|
|
.qnan_i (in_qnan),
|
290 |
|
|
.anan_sign_i (in_anan_sign),
|
291 |
|
|
// MUL/DIV common outputs
|
292 |
|
|
.muldiv_rdy_o (mul_rdy_o), // mul is ready
|
293 |
|
|
.muldiv_sign_o (mul_sign_o), // mul signum
|
294 |
|
|
.muldiv_shr_o (mul_shr_o), // do right shift in align stage
|
295 |
|
|
.muldiv_exp10shr_o (mul_exp10shr_o), // exponent for right shift align
|
296 |
|
|
.muldiv_shl_o (mul_shl_o), // do left shift in align stage
|
297 |
|
|
.muldiv_exp10shl_o (mul_exp10shl_o), // exponent for left shift align
|
298 |
|
|
.muldiv_exp10sh0_o (mul_exp10sh0_o), // exponent for no shift in align
|
299 |
|
|
.muldiv_fract28_o (mul_fract28_o), // fractional with appended {r,s} bits
|
300 |
|
|
.muldiv_inv_o (mul_inv_o), // mul invalid operation flag
|
301 |
|
|
.muldiv_inf_o (mul_inf_o), // mul infinity output reg
|
302 |
|
|
.muldiv_snan_o (mul_snan_o), // mul signaling NaN output reg
|
303 |
|
|
.muldiv_qnan_o (mul_qnan_o), // mul quiet NaN output reg
|
304 |
|
|
.muldiv_anan_sign_o (mul_anan_sign_o), // mul signum for output nan
|
305 |
|
|
// DIV additional outputs
|
306 |
|
|
.div_op_o(div_op_o), // operation is division
|
307 |
|
|
.div_sign_rmnd_o(div_sign_rmnd_o), // signum of reminder for IEEE compliant rounding
|
308 |
|
|
.div_dbz_o(div_dbz_o) // division by zero flag
|
309 |
|
|
);
|
310 |
|
|
|
311 |
|
|
// convertor
|
312 |
|
|
// i2f signals
|
313 |
|
|
wire op_i2f_cnv = (~a_cmp) & (op_arith_conv == 3'd4);
|
314 |
|
|
wire i2f_start = op_i2f_cnv &
|
315 |
|
|
new_fpu_data;
|
316 |
|
|
wire i2f_rdy_o; // i2f is ready
|
317 |
|
|
wire i2f_sign_o; // i2f signum
|
318 |
|
|
wire [3:0] i2f_shr_o;
|
319 |
|
|
wire [7:0] i2f_exp8shr_o;
|
320 |
|
|
wire [4:0] i2f_shl_o;
|
321 |
|
|
wire [7:0] i2f_exp8shl_o;
|
322 |
|
|
wire [7:0] i2f_exp8sh0_o;
|
323 |
|
|
wire [31:0] i2f_fract32_o;
|
324 |
|
|
// i2f module instance
|
325 |
|
|
pfpu32_i2f u_i2f_cnv
|
326 |
|
|
(
|
327 |
|
|
.clk (clk),
|
328 |
|
|
.rst (rst),
|
329 |
|
|
.flush_i (flush_i), // flush pipe
|
330 |
|
|
.adv_i (padv_fpu_units), // advance pipe
|
331 |
|
|
.start_i (i2f_start), // start conversion
|
332 |
|
|
.opa_i (rfa_i),
|
333 |
|
|
.i2f_rdy_o (i2f_rdy_o), // i2f is ready
|
334 |
|
|
.i2f_sign_o (i2f_sign_o), // i2f signum
|
335 |
|
|
.i2f_shr_o (i2f_shr_o),
|
336 |
|
|
.i2f_exp8shr_o (i2f_exp8shr_o),
|
337 |
|
|
.i2f_shl_o (i2f_shl_o),
|
338 |
|
|
.i2f_exp8shl_o (i2f_exp8shl_o),
|
339 |
|
|
.i2f_exp8sh0_o (i2f_exp8sh0_o),
|
340 |
|
|
.i2f_fract32_o (i2f_fract32_o)
|
341 |
|
|
);
|
342 |
|
|
// f2i signals
|
343 |
|
|
wire op_f2i_cnv = (~a_cmp) & (op_arith_conv == 3'd5);
|
344 |
|
|
wire f2i_start = op_f2i_cnv &
|
345 |
|
|
new_fpu_data;
|
346 |
|
|
wire f2i_rdy_o; // f2i is ready
|
347 |
|
|
wire f2i_sign_o; // f2i signum
|
348 |
|
|
wire [23:0] f2i_int24_o; // f2i fractional
|
349 |
|
|
wire [4:0] f2i_shr_o; // f2i required shift right value
|
350 |
|
|
wire [3:0] f2i_shl_o; // f2i required shift left value
|
351 |
|
|
wire f2i_ovf_o; // f2i overflow flag
|
352 |
|
|
wire f2i_snan_o; // f2i signaling NaN output reg
|
353 |
|
|
// f2i module instance
|
354 |
|
|
pfpu32_f2i u_f2i_cnv
|
355 |
|
|
(
|
356 |
|
|
.clk (clk),
|
357 |
|
|
.rst (rst),
|
358 |
|
|
.flush_i (flush_i), // flush pipe
|
359 |
|
|
.adv_i (padv_fpu_units), // advance pipe
|
360 |
|
|
.start_i (f2i_start), // start conversion
|
361 |
|
|
.signa_i (in_signa), // input 'a' related values
|
362 |
|
|
.exp10a_i (in_exp10a),
|
363 |
|
|
.fract24a_i (in_fract24a),
|
364 |
|
|
.snan_i (in_snan), // 'a'/'b' related
|
365 |
|
|
.qnan_i (in_qnan),
|
366 |
|
|
.f2i_rdy_o (f2i_rdy_o), // f2i is ready
|
367 |
|
|
.f2i_sign_o (f2i_sign_o), // f2i signum
|
368 |
|
|
.f2i_int24_o (f2i_int24_o), // f2i fractional
|
369 |
|
|
.f2i_shr_o (f2i_shr_o), // f2i required shift right value
|
370 |
|
|
.f2i_shl_o (f2i_shl_o), // f2i required shift left value
|
371 |
|
|
.f2i_ovf_o (f2i_ovf_o), // f2i overflow flag
|
372 |
|
|
.f2i_snan_o (f2i_snan_o) // f2i signaling NaN output reg
|
373 |
|
|
);
|
374 |
|
|
|
375 |
|
|
|
376 |
|
|
// multiplexing and rounding
|
377 |
|
|
pfpu32_rnd u_f32_rnd
|
378 |
|
|
(
|
379 |
|
|
// clocks, resets and other controls
|
380 |
|
|
.clk (clk),
|
381 |
|
|
.rst (rst),
|
382 |
|
|
.flush_i (flush_i), // flush pipe
|
383 |
|
|
.adv_i (padv_fpu_units), // advance pipe
|
384 |
|
|
.rmode_i (round_mode_i), // rounding mode
|
385 |
|
|
// from add/sub
|
386 |
|
|
.add_rdy_i (add_rdy_o), // add/sub is ready
|
387 |
|
|
.add_sign_i (add_sign_o), // add/sub signum
|
388 |
|
|
.add_sub_0_i (add_sub_0_o), // flag that actual substruction is performed and result is zero
|
389 |
|
|
.add_shl_i (add_shl_o), // do left shift in align stage
|
390 |
|
|
.add_exp10shl_i (add_exp10shl_o), // exponent for left shift align
|
391 |
|
|
.add_exp10sh0_i (add_exp10sh0_o), // exponent for no shift in align
|
392 |
|
|
.add_fract28_i (add_fract28_o), // fractional with appended {r,s} bits
|
393 |
|
|
.add_inv_i (add_inv_o), // add/sub invalid operation flag
|
394 |
|
|
.add_inf_i (add_inf_o), // add/sub infinity
|
395 |
|
|
.add_snan_i (add_snan_o), // add/sub signaling NaN
|
396 |
|
|
.add_qnan_i (add_qnan_o), // add/sub quiet NaN
|
397 |
|
|
.add_anan_sign_i (add_anan_sign_o), // add/sub signum for output nan
|
398 |
|
|
// from mul
|
399 |
|
|
.mul_rdy_i (mul_rdy_o), // mul is ready
|
400 |
|
|
.mul_sign_i (mul_sign_o), // mul signum
|
401 |
|
|
.mul_shr_i (mul_shr_o), // do right shift in align stage
|
402 |
|
|
.mul_exp10shr_i (mul_exp10shr_o), // exponent for right shift align
|
403 |
|
|
.mul_shl_i (mul_shl_o), // do left shift in align stage
|
404 |
|
|
.mul_exp10shl_i (mul_exp10shl_o), // exponent for left shift align
|
405 |
|
|
.mul_exp10sh0_i (mul_exp10sh0_o), // exponent for no shift in align
|
406 |
|
|
.mul_fract28_i (mul_fract28_o), // fractional with appended {r,s} bits
|
407 |
|
|
.mul_inv_i (mul_inv_o), // mul invalid operation flag
|
408 |
|
|
.mul_inf_i (mul_inf_o), // mul infinity
|
409 |
|
|
.mul_snan_i (mul_snan_o), // mul signaling NaN
|
410 |
|
|
.mul_qnan_i (mul_qnan_o), // mul quiet NaN
|
411 |
|
|
.mul_anan_sign_i (mul_anan_sign_o), // mul signum for output nan
|
412 |
|
|
.div_op_i (div_op_o), // MUL/DIV output is division
|
413 |
|
|
.div_sign_rmnd_i (div_sign_rmnd_o), // signum or reminder for IEEE compliant rounding
|
414 |
|
|
.div_dbz_i (div_dbz_o), // division by zero flag
|
415 |
|
|
// from i2f
|
416 |
|
|
.i2f_rdy_i (i2f_rdy_o), // i2f is ready
|
417 |
|
|
.i2f_sign_i (i2f_sign_o), // i2f signum
|
418 |
|
|
.i2f_shr_i (i2f_shr_o),
|
419 |
|
|
.i2f_exp8shr_i (i2f_exp8shr_o),
|
420 |
|
|
.i2f_shl_i (i2f_shl_o),
|
421 |
|
|
.i2f_exp8shl_i (i2f_exp8shl_o),
|
422 |
|
|
.i2f_exp8sh0_i (i2f_exp8sh0_o),
|
423 |
|
|
.i2f_fract32_i (i2f_fract32_o),
|
424 |
|
|
// from f2i
|
425 |
|
|
.f2i_rdy_i (f2i_rdy_o), // f2i is ready
|
426 |
|
|
.f2i_sign_i (f2i_sign_o), // f2i signum
|
427 |
|
|
.f2i_int24_i (f2i_int24_o), // f2i fractional
|
428 |
|
|
.f2i_shr_i (f2i_shr_o), // f2i required shift right value
|
429 |
|
|
.f2i_shl_i (f2i_shl_o), // f2i required shift left value
|
430 |
|
|
.f2i_ovf_i (f2i_ovf_o), // f2i overflow flag
|
431 |
|
|
.f2i_snan_i (f2i_snan_o), // f2i signaling NaN
|
432 |
|
|
// from cmp
|
433 |
|
|
.cmp_rdy_i (cmp_ready), // cmp is ready
|
434 |
|
|
.cmp_res_i (cmp_result), // cmp result
|
435 |
|
|
.cmp_inv_i (cmp_inv), // cmp invalid flag
|
436 |
|
|
.cmp_inf_i (cmp_inf), // cmp infinity flag
|
437 |
|
|
// outputs
|
438 |
|
|
.fpu_result_o (fpu_result_o),
|
439 |
|
|
.fpu_arith_valid_o (fpu_arith_valid_o),
|
440 |
|
|
.fpu_cmp_flag_o (fpu_cmp_flag_o),
|
441 |
|
|
.fpu_cmp_valid_o (fpu_cmp_valid_o),
|
442 |
|
|
.fpcsr_o (fpcsr_o)
|
443 |
|
|
);
|
444 |
|
|
|
445 |
|
|
endmodule // pfpu32_top
|