blob: 893655f2453e0f7ff58c6a3de71b9101c3e23980 [file] [log] [blame]
// ========== Copyright Header Begin ==========================================
//
// OpenSPARC T1 Processor File: fpu_add_ctl.v
// Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES.
//
// The above named program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public
// License version 2 as published by the Free Software Foundation.
//
// The above named program is distributed in the hope that it will be
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public
// License along with this work; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
//
// ========== Copyright Header End ============================================
///////////////////////////////////////////////////////////////////////////////
//
// Add pipeline synthesizable logic
// - special input cases
// - opcode pipeline
// - sign logic
// - exception logic
// - datapath control- select lines and control logic
//
///////////////////////////////////////////////////////////////////////////////
module fpu_add_ctl (
inq_in1_51,
inq_in1_54,
inq_in1_63,
inq_in1_50_0_neq_0,
inq_in1_53_32_neq_0,
inq_in1_exp_eq_0,
inq_in1_exp_neq_ffs,
inq_in2_51,
inq_in2_54,
inq_in2_63,
inq_in2_50_0_neq_0,
inq_in2_53_32_neq_0,
inq_in2_exp_eq_0,
inq_in2_exp_neq_ffs,
inq_op,
inq_rnd_mode,
inq_id,
inq_fcc,
inq_add,
add_dest_rdy,
a1stg_in2_neq_in1_frac,
a1stg_in2_gt_in1_frac,
a1stg_in2_eq_in1_exp,
a1stg_expadd1,
a2stg_expadd,
a2stg_frac2hi_neq_0,
a2stg_frac2lo_neq_0,
a2stg_exp,
a3stg_fsdtoix_nx,
a3stg_fsdtoi_nx,
a2stg_frac2_63,
a4stg_exp,
add_of_out_cout,
a4stg_frac_neq_0,
a4stg_shl_data_neq_0,
a4stg_frac_dbl_nx,
a4stg_frac_sng_nx,
a1stg_expadd2,
a1stg_expadd4_inv,
a3stg_denorm,
a3stg_denorm_inv,
a4stg_denorm_inv,
a3stg_exp,
a4stg_round,
a3stg_lead0,
a4stg_rnd_frac_40,
a4stg_rnd_frac_39,
a4stg_rnd_frac_11,
a4stg_rnd_frac_10,
a4stg_frac_38_0_nx,
a4stg_frac_9_0_nx,
arst_l,
grst_l,
rclk,
add_pipe_active,
a1stg_denorm_sng_in1,
a1stg_denorm_dbl_in1,
a1stg_denorm_sng_in2,
a1stg_denorm_dbl_in2,
a1stg_norm_sng_in1,
a1stg_norm_dbl_in1,
a1stg_norm_sng_in2,
a1stg_norm_dbl_in2,
a1stg_step,
a1stg_stepa,
a1stg_sngop,
a1stg_intlngop,
a1stg_fsdtoix,
a1stg_fstod,
a1stg_fstoi,
a1stg_fstox,
a1stg_fdtoi,
a1stg_fdtox,
a1stg_faddsubs,
a1stg_faddsubd,
a1stg_fdtos,
a2stg_faddsubop,
a2stg_fsdtoix_fdtos,
a2stg_fitos,
a2stg_fitod,
a2stg_fxtos,
a2stg_fxtod,
a3stg_faddsubop,
a3stg_faddsubopa,
a4stg_dblop,
a6stg_fadd_in,
add_id_out_in,
add_fcc_out,
a6stg_dbl_dst,
a6stg_sng_dst,
a6stg_long_dst,
a6stg_int_dst,
a6stg_fcmpop,
a6stg_step,
a3stg_sub_in,
add_sign_out,
add_cc_out,
a4stg_in_of,
add_exc_out,
a2stg_frac1_in_frac1,
a2stg_frac1_in_frac2,
a1stg_2nan_in_inv,
a1stg_faddsubop_inv,
a2stg_frac1_in_qnan,
a2stg_frac1_in_nv,
a2stg_frac1_in_nv_dbl,
a2stg_frac2_in_frac1,
a2stg_frac2_in_qnan,
a2stg_shr_cnt_in,
a2stg_shr_cnt_5_inv_in,
a2stg_shr_frac2_shr_int,
a2stg_shr_frac2_shr_dbl,
a2stg_shr_frac2_shr_sng,
a2stg_shr_frac2_max,
a2stg_sub_step,
a2stg_fracadd_frac2_inv_in,
a2stg_fracadd_frac2_inv_shr1_in,
a2stg_fracadd_frac2,
a2stg_fracadd_cin_in,
a3stg_exp_7ff,
a3stg_exp_ff,
a3stg_exp_add,
a2stg_expdec_neq_0,
a3stg_exp10_0_eq0,
a3stg_exp10_1_eq0,
a3stg_fdtos_inv,
a4stg_fixtos_fxtod_inv,
a4stg_rnd_frac_add_inv,
a4stg_shl_cnt_in,
a4stg_rnd_sng,
a4stg_rnd_dbl,
add_frac_out_rndadd,
add_frac_out_rnd_frac,
add_frac_out_shl,
a4stg_to_0,
add_exp_out_expinc,
add_exp_out_exp,
add_exp_out_exp1,
add_exp_out_expadd,
a4stg_to_0_inv,
se,
si,
so
);
parameter
FADDS= 8'h41,
FADDD= 8'h42,
FSUBS= 8'h45,
FSUBD= 8'h46,
FCMPS= 8'h51,
FCMPD= 8'h52,
FCMPES= 8'h55,
FCMPED= 8'h56,
FSTOX= 8'h81,
FDTOX= 8'h82,
FSTOI= 8'hd1,
FDTOI= 8'hd2,
FSTOD= 8'hc9,
FDTOS= 8'hc6,
FXTOS= 8'h84,
FXTOD= 8'h88,
FITOS= 8'hc4,
FITOD= 8'hc8;
input inq_in1_51; // request operand 1[51]
input inq_in1_54; // request operand 1[54]
input inq_in1_63; // request operand 1[63]
input inq_in1_50_0_neq_0; // request operand 1[50:0]!=0
input inq_in1_53_32_neq_0; // request operand 1[53:32]!=0
input inq_in1_exp_eq_0; // request operand 1[62:52]==0
input inq_in1_exp_neq_ffs; // request operand 1[62:52]!=0x7ff
input inq_in2_51; // request operand 2[51]
input inq_in2_54; // request operand 2[54]
input inq_in2_63; // request operand 2[63]
input inq_in2_50_0_neq_0; // request operand 2[50:0]!=0
input inq_in2_53_32_neq_0; // request operand 2[53:32]!=0
input inq_in2_exp_eq_0; // request operand 2[62:52]==0
input inq_in2_exp_neq_ffs; // request operand 2[62:52]!=0x7ff
input [7:0] inq_op; // request opcode to op pipes
input [1:0] inq_rnd_mode; // request rounding mode to op pipes
input [4:0] inq_id; // request ID to the operation pipes
input [1:0] inq_fcc; // request cc ID to op pipes
input inq_add; // add pipe request
input add_dest_rdy; // add result req accepted for CPX
input a1stg_in2_neq_in1_frac; // operand 2 fraction != oprnd 1 frac
input a1stg_in2_gt_in1_frac; // operand 2 fraction > oprnd 1 frac
input a1stg_in2_eq_in1_exp; // operand 2 exponent == oprnd 1 exp
input [11:0] a1stg_expadd1; // exponent adder 1 output- add 1 stage
input [11:0] a2stg_expadd; // exponent adder- add 2 stage
input a2stg_frac2hi_neq_0; // fraction 2[62:32]in add 2 stage != 0
input a2stg_frac2lo_neq_0; // fraction 2[31:11] in add 2 stage != 0
input [11:0] a2stg_exp; // exponent- add 2 stage
input a3stg_fsdtoix_nx; // inexact result for flt -> ints
input a3stg_fsdtoi_nx; // inexact result for flt -> 32b ints
input a2stg_frac2_63; // fraction 2 bit[63]- add 2 stage
input [11:0] a4stg_exp; // exponent- add 4 stage
input add_of_out_cout; // fraction rounding adder carry out
input a4stg_frac_neq_0; // fraction != 0- add 4 stage
input a4stg_shl_data_neq_0; // left shift result != 0- add 4 stage
input a4stg_frac_dbl_nx; // inexact double precision result
input a4stg_frac_sng_nx; // inexact single precision result
input [5:0] a1stg_expadd2; // exponent adder 2 output- add 1 stage
input [10:0] a1stg_expadd4_inv; // exponent adder 4 output- add 1 stage
input a3stg_denorm; // denorm output- add 3 stage
input a3stg_denorm_inv; // result is not a denorm- add 3 stage
input a4stg_denorm_inv; // 0 the exponent
input [10:0] a3stg_exp; // exponent- add 3 stage
input a4stg_round; // round the result- add 4 stage
input [5:0] a3stg_lead0; // leading 0's count- add 3 stage
input a4stg_rnd_frac_40; // rounded fraction[40]- add 4 stage
input a4stg_rnd_frac_39; // rounded fraction[39]- add 4 stage
input a4stg_rnd_frac_11; // rounded fraction[11]- add 4 stage
input a4stg_rnd_frac_10; // rounded fraction[10]- add 4 stage
input a4stg_frac_38_0_nx; // inexact single precision result
input a4stg_frac_9_0_nx; // inexact double precision result
input arst_l; // global asynchronous reset- asserted low
input grst_l; // global synchronous reset- asserted low
input rclk; // global clock
output add_pipe_active; // add pipe is executing a valid instr
output a1stg_denorm_sng_in1; // select line to normalized fraction 1
output a1stg_denorm_dbl_in1; // select line to normalized fraction 1
output a1stg_denorm_sng_in2; // select line to normalized fraction 2
output a1stg_denorm_dbl_in2; // select line to normalized fraction 2
output a1stg_norm_sng_in1; // select line to normalized fraction 1
output a1stg_norm_dbl_in1; // select line to normalized fraction 1
output a1stg_norm_sng_in2; // select line to normalized fraction 2
output a1stg_norm_dbl_in2; // select line to normalized fraction 2
output a1stg_step; // add pipe load
output a1stg_stepa; // add pipe load- copy
output a1stg_sngop; // single precision operation- add 1 stg
output a1stg_intlngop; // integer/long input- add 1 stage
output a1stg_fsdtoix; // float to integer convert- add 1 stg
output a1stg_fstod; // fstod- add 1 stage
output a1stg_fstoi; // fstoi- add 1 stage
output a1stg_fstox; // fstox- add 1 stage
output a1stg_fdtoi; // fdtoi- add 1 stage
output a1stg_fdtox; // fdtox- add 1 stage
output a1stg_faddsubs; // add/subtract single- add 1 stg
output a1stg_faddsubd; // add/subtract double- add 1 stg
output a1stg_fdtos; // fdtos- add 1 stage
output a2stg_faddsubop; // float add or subtract- add 2 stage
output a2stg_fsdtoix_fdtos; // float to integer convert- add 2 stg
output a2stg_fitos; // fitos- add 2 stage
output a2stg_fitod; // fitod- add 2 stage
output a2stg_fxtos; // fxtos- add 2 stage
output a2stg_fxtod; // fxtod- add 2 stage
output a3stg_faddsubop; // denorm compare lead0[10] input select
output [1:0] a3stg_faddsubopa; // denorm compare lead0[10] input select
output a4stg_dblop; // double precision operation- add 4 stg
output a6stg_fadd_in; // add pipe output request next cycle
output [9:0] add_id_out_in; // add pipe output ID next cycle
output [1:0] add_fcc_out; // add pipe input fcc passed through
output a6stg_dbl_dst; // float double result- add 6 stage
output a6stg_sng_dst; // float single result- add 6 stage
output a6stg_long_dst; // 64bit integer result- add 6 stage
output a6stg_int_dst; // 32bit integer result- add 6 stage
output a6stg_fcmpop; // compare- add 6 stage
output a6stg_step; // advance the add pipe
output a3stg_sub_in; // subtract in main adder- add 3 stage
output add_sign_out; // add sign output
output [1:0] add_cc_out; // add pipe result- condition
output a4stg_in_of; // add overflow- select exp out
output [4:0] add_exc_out; // add pipe result- exception flags
output a2stg_frac1_in_frac1; // select line to a2stg_frac1
output a2stg_frac1_in_frac2; // select line to a2stg_frac1
output a1stg_2nan_in_inv; // 2 NaN inputs- a1 stage
output a1stg_faddsubop_inv; // add/subtract- a1 stage
output a2stg_frac1_in_qnan; // make fraction 1 a QNaN
output a2stg_frac1_in_nv; // NV- make a new QNaN
output a2stg_frac1_in_nv_dbl; // NV- make a new double prec QNaN
output a2stg_frac2_in_frac1; // select line to a2stg_frac2
output a2stg_frac2_in_qnan; // make fraction 2 a QNaN
output [5:0] a2stg_shr_cnt_in; // right shift count input- add 1 stage
output a2stg_shr_cnt_5_inv_in; // right shift count input[5]- add 1 stg
output a2stg_shr_frac2_shr_int; // select line to a3stg_frac2
output a2stg_shr_frac2_shr_dbl; // select line to a3stg_frac2
output a2stg_shr_frac2_shr_sng; // select line to a3stg_frac2
output a2stg_shr_frac2_max; // select line to a3stg_frac2
output a2stg_sub_step; // select line to a3stg_frac2
output a2stg_fracadd_frac2_inv_in; // sel line to main adder input 2
output a2stg_fracadd_frac2_inv_shr1_in; // sel line to main adder in 2
output a2stg_fracadd_frac2; // select line to main adder input 2
output a2stg_fracadd_cin_in; // carry in to main adder- add 1 stage
output a3stg_exp_7ff; // select line to a3stg_exp
output a3stg_exp_ff; // select line to a3stg_exp
output a3stg_exp_add; // select line to a3stg_exp
output a2stg_expdec_neq_0; // exponent will be < 54
output a3stg_exp10_0_eq0; // exponent[10:0]==0- add 3 stage
output a3stg_exp10_1_eq0; // exponent[10:1]==0- add 3 stage
output a3stg_fdtos_inv; // double to single convert- add 3 stg
output a4stg_fixtos_fxtod_inv; // int to single/double cvt- add 4 stg
output a4stg_rnd_frac_add_inv; // select line to a4stg_rnd_frac
output [9:0] a4stg_shl_cnt_in; // postnorm shift left count- add 3 stg
output a4stg_rnd_sng; // round to single precision- add 4 stg
output a4stg_rnd_dbl; // round to double precision- add 4 stg
output add_frac_out_rndadd; // select line to add_frac_out
output add_frac_out_rnd_frac; // select line to add_frac_out
output add_frac_out_shl; // select line to add_frac_out
output a4stg_to_0; // result to max finite on overflow
output add_exp_out_expinc; // select line to add_exp_out
output add_exp_out_exp; // select line to add_exp_out
output add_exp_out_exp1; // select line to add_exp_out
output add_exp_out_expadd; // select line to add_exp_out
output a4stg_to_0_inv; // result to infinity on overflow
input se; // scan_enable
input si; // scan in
output so; // scan out
wire reset;
wire a1stg_in1_51;
wire a1stg_in1_54;
wire a1stg_in1_63;
wire a1stg_in1_50_0_neq_0;
wire a1stg_in1_53_32_neq_0;
wire a1stg_in1_exp_eq_0;
wire a1stg_in1_exp_neq_ffs;
wire a1stg_in2_51;
wire a1stg_in2_54;
wire a1stg_in2_63;
wire a1stg_in2_50_0_neq_0;
wire a1stg_in2_53_32_neq_0;
wire a1stg_in2_exp_eq_0;
wire a1stg_in2_exp_neq_ffs;
wire a1stg_denorm_sng_in1;
wire a1stg_denorm_dbl_in1;
wire a1stg_denorm_sng_in2;
wire a1stg_denorm_dbl_in2;
wire a1stg_norm_sng_in1;
wire a1stg_norm_dbl_in1;
wire a1stg_norm_sng_in2;
wire a1stg_norm_dbl_in2;
wire a1stg_snan_sng_in1;
wire a1stg_snan_dbl_in1;
wire a1stg_snan_sng_in2;
wire a1stg_snan_dbl_in2;
wire a1stg_qnan_sng_in1;
wire a1stg_qnan_dbl_in1;
wire a1stg_qnan_sng_in2;
wire a1stg_qnan_dbl_in2;
wire a1stg_snan_in1;
wire a1stg_snan_in2;
wire a1stg_qnan_in1;
wire a1stg_qnan_in2;
wire a1stg_nan_sng_in1;
wire a1stg_nan_dbl_in1;
wire a1stg_nan_sng_in2;
wire a1stg_nan_dbl_in2;
wire a1stg_nan_in1;
wire a1stg_nan_in2;
wire a1stg_nan_in;
wire a1stg_2nan_in;
wire a1stg_inf_sng_in1;
wire a1stg_inf_dbl_in1;
wire a1stg_inf_sng_in2;
wire a1stg_inf_dbl_in2;
wire a1stg_inf_in1;
wire a1stg_inf_in2;
wire a1stg_2inf_in;
wire a1stg_infnan_sng_in1;
wire a1stg_infnan_dbl_in1;
wire a1stg_infnan_sng_in2;
wire a1stg_infnan_dbl_in2;
wire a1stg_infnan_in1;
wire a1stg_infnan_in2;
wire a1stg_infnan_in;
wire a1stg_2zero_in;
wire a1stg_step;
wire a1stg_stepa;
wire [7:0] a1stg_op_in;
wire [7:0] a1stg_op;
wire a1stg_sngop;
wire [3:0] a1stg_sngopa;
wire a1stg_dblop;
wire [3:0] a1stg_dblopa;
wire [1:0] a1stg_rnd_mode;
wire [4:0] a1stg_id;
wire [1:0] a1stg_fcc;
wire a1stg_fadd;
wire a1stg_dbl_dst;
wire a1stg_sng_dst;
wire a1stg_long_dst;
wire a1stg_int_dst;
wire a1stg_intlngop;
wire a1stg_faddsubop;
wire a1stg_fsubop;
wire a1stg_fsdtox;
wire a1stg_fcmpesd;
wire a1stg_fcmpsd;
wire a1stg_faddsub_dtosop;
wire a1stg_fdtoix;
wire a1stg_fstoix;
wire a1stg_fsdtoix;
wire a1stg_fixtosd;
wire a1stg_fstod;
wire a1stg_fstoi;
wire a1stg_fstox;
wire a1stg_fdtoi;
wire a1stg_fdtox;
wire a1stg_fsdtoix_fdtos;
wire a1stg_fitos;
wire a1stg_fitod;
wire a1stg_fxtos;
wire a1stg_fcmpop;
wire a1stg_f4cycop;
wire a1stg_fixtos_fxtod;
wire a1stg_faddsubs_fdtos;
wire a1stg_faddsubs;
wire a1stg_faddsubd;
wire a1stg_fdtos;
wire a1stg_fistod;
wire a1stg_fixtos;
wire a1stg_fxtod;
wire a1stg_opdec_36;
wire [34:28] a1stg_opdec;
wire [3:0] a1stg_opdec_24_21;
wire [8:0] a1stg_opdec_19_11;
wire [9:0] a1stg_opdec_9_0;
wire fixtosd_hold;
wire [30:0] a2stg_opdec_in;
wire a2stg_opdec_36;
wire [34:28] a2stg_opdec;
wire [3:0] a2stg_opdec_24_21;
wire [8:0] a2stg_opdec_19_11;
wire [9:0] a2stg_opdec_9_0;
wire [1:0] a2stg_rnd_mode;
wire [4:0] a2stg_id;
wire [1:0] a2stg_fcc;
wire a2stg_fadd;
wire a2stg_long_dst;
wire a2stg_faddsubop;
wire a2stg_fsubop;
wire a2stg_faddsub_dtosop;
wire a2stg_fdtoix;
wire a2stg_fstoix;
wire a2stg_fsdtoix;
wire a2stg_fstod;
wire a2stg_fstoi;
wire a2stg_fstox;
wire a2stg_fdtoi;
wire a2stg_fdtox;
wire a2stg_fsdtoix_fdtos;
wire a2stg_fitos;
wire a2stg_fitod;
wire a2stg_fxtos;
wire a2stg_fcmpop;
wire a2stg_fixtos_fxtod;
wire a2stg_fdtos;
wire a2stg_fxtod;
wire a3stg_opdec_36;
wire [34:29] a3stg_opdec;
wire a3stg_opdec_24;
wire a3stg_opdec_21;
wire [9:0] a3stg_opdec_9_0;
wire [1:0] a3stg_rnd_mode;
wire [4:0] a3stg_id;
wire [1:0] a3stg_fcc;
wire a3stg_fadd;
wire a3stg_int_dst;
wire a3stg_faddsubop;
wire [1:0] a3stg_faddsubopa;
wire a3stg_fsdtoix;
wire a3stg_f4cycop;
wire a3stg_fixtos_fxtod;
wire a3stg_fdtos;
wire a4stg_opdec_36;
wire [34:29] a4stg_opdec;
wire a4stg_opdec_24;
wire a4stg_opdec_21;
wire a4stg_opdec_9;
wire [7:0] a4stg_opdec_7_0;
wire [1:0] a4stg_rnd_mode_in;
wire [1:0] a4stg_rnd_mode;
wire [1:0] a4stg_rnd_mode2;
wire [9:0] a4stg_id_in;
wire [9:0] a4stg_id;
wire [1:0] a4stg_fcc;
wire a4stg_dblop;
wire a4stg_fadd;
wire a4stg_faddsubop;
wire a4stg_faddsub_dtosop;
wire a4stg_fsdtoix;
wire a4stg_fcmpop;
wire a4stg_fixtos_fxtod;
wire a4stg_faddsubs_fdtos;
wire a4stg_faddsubs;
wire a4stg_faddsubd;
wire a4stg_fdtos;
wire a4stg_fistod;
wire [34:30] a5stg_opdec;
wire a5stg_opdec_9;
wire a5stg_opdec_7;
wire a5stg_opdec_1;
wire a5stg_opdec_0;
wire [9:0] a5stg_id;
wire a5stg_fadd;
wire a5stg_fixtos_fxtod;
wire a5stg_fixtos;
wire a5stg_fxtod;
wire [34:30] a6stg_opdec_in;
wire a6stg_opdec_in_9;
wire a6stg_fadd_in;
wire [34:30] a6stg_opdec;
wire a6stg_opdec_9;
wire [9:0] add_id_out_in;
wire [9:0] add_id_out;
wire [1:0] add_fcc_out_in;
wire [1:0] add_fcc_out;
wire a6stg_fadd;
wire a6stg_dbl_dst;
wire a6stg_sng_dst;
wire a6stg_long_dst;
wire a6stg_int_dst;
wire a6stg_fcmpop;
wire a6stg_hold;
wire a6stg_step;
wire a1stg_sub;
wire a2stg_sign1;
wire a2stg_sign2;
wire a2stg_sub;
wire a2stg_in2_neq_in1_frac;
wire a2stg_in2_gt_in1_frac;
wire a2stg_in2_eq_in1_exp;
wire a2stg_in2_gt_in1_exp;
wire a2stg_nan_in;
wire a2stg_nan_in2;
wire a2stg_snan_in2;
wire a2stg_qnan_in2;
wire a2stg_snan_in1;
wire a2stg_qnan_in1;
wire a2stg_2zero_in;
wire a2stg_2inf_in;
wire a2stg_in2_eq_in1;
wire a2stg_in2_gt_in1;
wire a3stg_sub_in;
wire a2stg_faddsub_sign;
wire a3stg_sign_in;
wire a3stg_sign;
wire a2stg_cc_1;
wire a2stg_cc_0;
wire [1:0] a2stg_cc;
wire [1:0] a3stg_cc;
wire a4stg_sign_in;
wire a4stg_sign;
wire a4stg_sign2;
wire [1:0] a4stg_cc;
wire add_sign_out;
wire [1:0] add_cc_out_in;
wire [1:0] add_cc_out;
wire a1stg_nv;
wire a2stg_nv;
wire a1stg_of_mask;
wire a2stg_of_mask;
wire a3stg_nv_in;
wire a3stg_nv;
wire a3stg_of_mask;
wire a2stg_nx_tmp1;
wire a2stg_nx_tmp2;
wire a2stg_nx_tmp3;
wire a3stg_a2_expadd_11;
wire a3stg_nx_tmp1;
wire a3stg_nx_tmp2;
wire a3stg_nx_tmp3;
wire a3stg_nx;
wire a4stg_nv_in;
wire a4stg_nv;
wire a4stg_nv2;
wire a4stg_of_mask_in;
wire a4stg_of_mask;
wire a4stg_of_mask2;
wire a4stg_nx_in;
wire a4stg_nx;
wire a4stg_nx2;
wire add_nv_out;
wire a4stg_in_of;
wire add_of_out_tmp1_in;
wire add_of_out_tmp1;
wire add_of_out_tmp2;
wire add_of_out;
wire a4stg_uf;
wire add_uf_out;
wire add_nx_out_in;
wire add_nx_out;
wire [4:0] add_exc_out;
wire a2stg_frac1_in_frac1;
wire a2stg_frac1_in_frac2;
wire a1stg_2nan_in_inv;
wire a1stg_faddsubop_inv;
wire a2stg_frac1_in_qnan;
wire a2stg_frac1_in_nv;
wire a2stg_frac1_in_nv_dbl;
wire a2stg_frac2_in_frac1;
wire a2stg_frac2_in_qnan;
wire a1stg_exp_diff_add1;
wire a1stg_exp_diff_add2;
wire a1stg_exp_diff_5;
wire [10:0] a1stg_exp_diff;
wire [5:0] a1stg_clamp63;
wire [5:0] a2stg_shr_cnt_in;
wire a2stg_shr_cnt_5_inv_in;
wire a2stg_shr_frac2_shr_int;
wire a2stg_shr_frac2_shr_dbl;
wire a2stg_shr_frac2_shr_sng;
wire a2stg_shr_frac2_max;
wire a2stg_sub_step;
wire a1stg_faddsub_clamp63_0;
wire a2stg_fracadd_frac2_inv_in;
wire a2stg_fracadd_frac2_inv_shr1_in;
wire a2stg_fracadd_frac2_in;
wire a2stg_fracadd_frac2;
wire a2stg_fracadd_cin_in;
wire a3stg_exp_7ff;
wire a3stg_exp_ff;
wire a3stg_exp_add;
wire a2stg_expdec_neq_0;
wire a3stg_exp10_0_eq0;
wire a3stg_exp10_1_eq0;
wire a3stg_fdtos_inv;
wire a4stg_fixtos_fxtod_inv;
wire a4stg_rnd_frac_add_inv;
wire [9:0] a4stg_shl_cnt_in;
wire a4stg_rnd_sng;
wire a4stg_rnd_dbl;
wire a4stg_rndup_sng;
wire a4stg_rndup_dbl;
wire a4stg_rndup;
wire a5stg_rndup;
wire add_frac_out_rndadd;
wire add_frac_out_rnd_frac;
wire add_frac_out_shl;
wire a4stg_to_0;
wire add_exp_out_expinc;
wire add_exp_out_exp;
wire add_exp_out_exp1;
wire add_exp_out_expadd;
wire a4stg_to_0_inv;
wire add_pipe_active_in;
wire add_pipe_active;
dffrl_async #(1) dffrl_add_ctl (
.din (grst_l),
.clk (rclk),
.rst_l(arst_l),
.q (add_ctl_rst_l),
.se (se),
.si (),
.so ()
);
assign reset= (!add_ctl_rst_l);
///////////////////////////////////////////////////////////////////////////////
//
// Add pipeline special input cases.
//
///////////////////////////////////////////////////////////////////////////////
dffe_s #(1) i_a1stg_in1_51 (
.din (inq_in1_51),
.en (a1stg_step),
.clk (rclk),
.q (a1stg_in1_51),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a1stg_in1_54 (
.din (inq_in1_54),
.en (a1stg_step),
.clk (rclk),
.q (a1stg_in1_54),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a1stg_in1_63 (
.din (inq_in1_63),
.en (a1stg_step),
.clk (rclk),
.q (a1stg_in1_63),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a1stg_in1_50_0_neq_0 (
.din (inq_in1_50_0_neq_0),
.en (a1stg_step),
.clk (rclk),
.q (a1stg_in1_50_0_neq_0),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a1stg_in1_53_32_neq_0 (
.din (inq_in1_53_32_neq_0),
.en (a1stg_step),
.clk (rclk),
.q (a1stg_in1_53_32_neq_0),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a1stg_in1_exp_eq_0 (
.din (inq_in1_exp_eq_0),
.en (a1stg_step),
.clk (rclk),
.q (a1stg_in1_exp_eq_0),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a1stg_in1_exp_neq_ffs (
.din (inq_in1_exp_neq_ffs),
.en (a1stg_step),
.clk (rclk),
.q (a1stg_in1_exp_neq_ffs),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a1stg_in2_51 (
.din (inq_in2_51),
.en (a1stg_step),
.clk (rclk),
.q (a1stg_in2_51),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a1stg_in2_54 (
.din (inq_in2_54),
.en (a1stg_step),
.clk (rclk),
.q (a1stg_in2_54),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a1stg_in2_63 (
.din (inq_in2_63),
.en (a1stg_step),
.clk (rclk),
.q (a1stg_in2_63),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a1stg_in2_50_0_neq_0 (
.din (inq_in2_50_0_neq_0),
.en (a1stg_step),
.clk (rclk),
.q (a1stg_in2_50_0_neq_0),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a1stg_in2_53_32_neq_0 (
.din (inq_in2_53_32_neq_0),
.en (a1stg_step),
.clk (rclk),
.q (a1stg_in2_53_32_neq_0),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a1stg_in2_exp_eq_0 (
.din (inq_in2_exp_eq_0),
.en (a1stg_step),
.clk (rclk),
.q (a1stg_in2_exp_eq_0),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a1stg_in2_exp_neq_ffs (
.din (inq_in2_exp_neq_ffs),
.en (a1stg_step),
.clk (rclk),
.q (a1stg_in2_exp_neq_ffs),
.se (se),
.si (),
.so ()
);
///////////////////////////////////////////////////////////////////////////////
//
// Denorm add inputs.
//
///////////////////////////////////////////////////////////////////////////////
assign a1stg_denorm_sng_in1= a1stg_in1_exp_eq_0 && a1stg_sngopa[0];
assign a1stg_denorm_dbl_in1= a1stg_in1_exp_eq_0 && a1stg_dblopa[0];
assign a1stg_denorm_sng_in2= a1stg_in2_exp_eq_0 && a1stg_sngopa[0];
assign a1stg_denorm_dbl_in2= a1stg_in2_exp_eq_0 && a1stg_dblopa[0];
///////////////////////////////////////////////////////////////////////////////
//
// Non-denorm add inputs.
//
///////////////////////////////////////////////////////////////////////////////
assign a1stg_norm_sng_in1= (!a1stg_in1_exp_eq_0) && a1stg_sngopa[0];
assign a1stg_norm_dbl_in1= (!a1stg_in1_exp_eq_0) && a1stg_dblopa[0];
assign a1stg_norm_sng_in2= (!a1stg_in2_exp_eq_0) && a1stg_sngopa[0];
assign a1stg_norm_dbl_in2= (!a1stg_in2_exp_eq_0) && a1stg_dblopa[0];
///////////////////////////////////////////////////////////////////////////////
//
// Nan add inputs.
//
///////////////////////////////////////////////////////////////////////////////
assign a1stg_snan_sng_in1= (!a1stg_in1_exp_neq_ffs) && (!a1stg_in1_54)
&& a1stg_in1_53_32_neq_0 && a1stg_sngopa[1];
assign a1stg_snan_dbl_in1= (!a1stg_in1_exp_neq_ffs) && (!a1stg_in1_51)
&& a1stg_in1_50_0_neq_0 && a1stg_dblopa[1];
assign a1stg_snan_sng_in2= (!a1stg_in2_exp_neq_ffs) && (!a1stg_in2_54)
&& a1stg_in2_53_32_neq_0 && a1stg_sngopa[1];
assign a1stg_snan_dbl_in2= (!a1stg_in2_exp_neq_ffs) && (!a1stg_in2_51)
&& a1stg_in2_50_0_neq_0 && a1stg_dblopa[1];
assign a1stg_qnan_sng_in1= (!a1stg_in1_exp_neq_ffs) && a1stg_in1_54
&& a1stg_sngopa[1];
assign a1stg_qnan_dbl_in1= (!a1stg_in1_exp_neq_ffs) && a1stg_in1_51
&& a1stg_dblopa[1];
assign a1stg_qnan_sng_in2= (!a1stg_in2_exp_neq_ffs) && a1stg_in2_54
&& a1stg_sngopa[1];
assign a1stg_qnan_dbl_in2= (!a1stg_in2_exp_neq_ffs) && a1stg_in2_51
&& a1stg_dblopa[1];
assign a1stg_snan_in1= a1stg_snan_sng_in1 || a1stg_snan_dbl_in1;
assign a1stg_snan_in2= a1stg_snan_sng_in2 || a1stg_snan_dbl_in2;
assign a1stg_qnan_in1= a1stg_qnan_sng_in1 || a1stg_qnan_dbl_in1;
assign a1stg_qnan_in2= a1stg_qnan_sng_in2 || a1stg_qnan_dbl_in2;
assign a1stg_nan_sng_in1= (!a1stg_in1_exp_neq_ffs)
&& (a1stg_in1_54 || a1stg_in1_53_32_neq_0)
&& a1stg_sngopa[2];
assign a1stg_nan_dbl_in1= (!a1stg_in1_exp_neq_ffs)
&& (a1stg_in1_51 || a1stg_in1_50_0_neq_0)
&& a1stg_dblopa[2];
assign a1stg_nan_sng_in2= (!a1stg_in2_exp_neq_ffs)
&& (a1stg_in2_54 || a1stg_in2_53_32_neq_0)
&& a1stg_sngopa[2];
assign a1stg_nan_dbl_in2= (!a1stg_in2_exp_neq_ffs)
&& (a1stg_in2_51 || a1stg_in2_50_0_neq_0)
&& a1stg_dblopa[2];
assign a1stg_nan_in1= a1stg_nan_sng_in1 || a1stg_nan_dbl_in1;
assign a1stg_nan_in2= a1stg_nan_sng_in2 || a1stg_nan_dbl_in2;
assign a1stg_nan_in= a1stg_nan_in1 || a1stg_nan_in2;
assign a1stg_2nan_in= a1stg_nan_in1 && a1stg_nan_in2;
///////////////////////////////////////////////////////////////////////////////
//
// Infinity add inputs.
//
///////////////////////////////////////////////////////////////////////////////
assign a1stg_inf_sng_in1= (!a1stg_in1_exp_neq_ffs)
&& (!a1stg_in1_54) && (!a1stg_in1_53_32_neq_0)
&& a1stg_sngopa[2];
assign a1stg_inf_dbl_in1= (!a1stg_in1_exp_neq_ffs)
&& (!a1stg_in1_51) && (!a1stg_in1_50_0_neq_0)
&& a1stg_dblopa[2];
assign a1stg_inf_sng_in2= (!a1stg_in2_exp_neq_ffs)
&& (!a1stg_in2_54) && (!a1stg_in2_53_32_neq_0)
&& a1stg_sngopa[2];
assign a1stg_inf_dbl_in2= (!a1stg_in2_exp_neq_ffs)
&& (!a1stg_in2_51) && (!a1stg_in2_50_0_neq_0)
&& a1stg_dblopa[2];
assign a1stg_inf_in1= a1stg_inf_sng_in1 || a1stg_inf_dbl_in1;
assign a1stg_inf_in2= a1stg_inf_sng_in2 || a1stg_inf_dbl_in2;
assign a1stg_2inf_in= a1stg_inf_in1 && a1stg_inf_in2;
///////////////////////////////////////////////////////////////////////////////
//
// Infinity/Nan add inputs.
//
///////////////////////////////////////////////////////////////////////////////
assign a1stg_infnan_sng_in1= (!a1stg_in1_exp_neq_ffs) && a1stg_sngopa[3];
assign a1stg_infnan_dbl_in1= (!a1stg_in1_exp_neq_ffs) && a1stg_dblopa[3];
assign a1stg_infnan_sng_in2= (!a1stg_in2_exp_neq_ffs) && a1stg_sngopa[3];
assign a1stg_infnan_dbl_in2= (!a1stg_in2_exp_neq_ffs) && a1stg_dblopa[3];
assign a1stg_infnan_in1= a1stg_infnan_sng_in1 || a1stg_infnan_dbl_in1;
assign a1stg_infnan_in2= a1stg_infnan_sng_in2 || a1stg_infnan_dbl_in2;
assign a1stg_infnan_in= a1stg_infnan_in1 || a1stg_infnan_in2;
///////////////////////////////////////////////////////////////////////////////
//
// Zero inputs.
//
///////////////////////////////////////////////////////////////////////////////
// Austin update
// correctly detect case where both single precision operands are zero
// assign a1stg_2zero_in= a1stg_in1_exp_eq_0 && (!a1stg_in1_51)
// && (!a1stg_in1_50_0_neq_0)
// && a1stg_in2_exp_eq_0 && (!a1stg_in2_51)
// && (!a1stg_in2_50_0_neq_0);
assign a1stg_2zero_in =
a1stg_in1_exp_eq_0 &&
(!a1stg_in1_54 || a1stg_dblopa[3]) && // (!bit54 ) || dp
(!a1stg_in1_53_32_neq_0 || a1stg_dblopa[3]) && // (!bit53 && !bit52) || dp
(!a1stg_in1_51) &&
(!a1stg_in1_50_0_neq_0) &&
a1stg_in2_exp_eq_0 &&
(!a1stg_in2_54 || a1stg_dblopa[3]) && // (!bit54 ) || dp
(!a1stg_in2_53_32_neq_0 || a1stg_dblopa[3]) && // (!bit53 && !bit52) || dp
(!a1stg_in2_51) &&
(!a1stg_in2_50_0_neq_0);
///////////////////////////////////////////////////////////////////////////////
//
// Floating point add control pipeline.
//
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
// Opcode pipeline- add input stage.
//
///////////////////////////////////////////////////////////////////////////////
assign a1stg_step= (!fixtosd_hold) && (!a6stg_hold);
assign a1stg_stepa= a1stg_step;
assign a1stg_op_in[7:0]= ({8{inq_add}}
& inq_op[7:0]);
dffre_s #(8) i_a1stg_op (
.din (a1stg_op_in[7:0]),
.en (a1stg_step),
.rst (reset),
.clk (rclk),
.q (a1stg_op[7:0]),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a1stg_sngop (
.din (inq_op[0]),
.en (a1stg_step),
.clk (rclk),
.q (a1stg_sngop),
.se (se),
.si (),
.so ()
);
dffe_s #(4) i_a1stg_sngopa (
.din ({4{inq_op[0]}}),
.en (a1stg_step),
.clk (rclk),
.q (a1stg_sngopa[3:0]),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a1stg_dblop (
.din (inq_op[1]),
.en (a1stg_step),
.clk (rclk),
.q (a1stg_dblop),
.se (se),
.si (),
.so ()
);
dffe_s #(4) i_a1stg_dblopa (
.din ({4{inq_op[1]}}),
.en (a1stg_step),
.clk (rclk),
.q (a1stg_dblopa[3:0]),
.se (se),
.si (),
.so ()
);
dffe_s #(2) i_a1stg_rnd_mode (
.din (inq_rnd_mode[1:0]),
.en (a1stg_step),
.clk (rclk),
.q (a1stg_rnd_mode[1:0]),
.se (se),
.si (),
.so ()
);
dffe_s #(5) i_a1stg_id (
.din (inq_id[4:0]),
.en (a1stg_step),
.clk (rclk),
.q (a1stg_id[4:0]),
.se (se),
.si (),
.so ()
);
dffe_s #(2) i_a1stg_fcc (
.din (inq_fcc[1:0]),
.en (a1stg_step),
.clk (rclk),
.q (a1stg_fcc[1:0]),
.se (se),
.si (),
.so ()
);
///////////////////////////////////////////////////////////////////////////////
//
// Opcode decode- add stage 1.
//
///////////////////////////////////////////////////////////////////////////////
assign a1stg_fadd= (a1stg_op[7:0]==FADDS) || (a1stg_op[7:0]==FADDD)
|| (a1stg_op[7:0]==FSUBS) || (a1stg_op[7:0]==FSUBD)
|| (a1stg_op[7:0]==FCMPES) || (a1stg_op[7:0]==FCMPED)
|| (a1stg_op[7:0]==FCMPS) || (a1stg_op[7:0]==FCMPD)
|| (a1stg_op[7:0]==FITOS) || (a1stg_op[7:0]==FITOD)
|| (a1stg_op[7:0]==FXTOS) || (a1stg_op[7:0]==FXTOD)
|| (a1stg_op[7:0]==FSTOI) || (a1stg_op[7:0]==FSTOX)
|| (a1stg_op[7:0]==FDTOI) || (a1stg_op[7:0]==FDTOX)
|| (a1stg_op[7:0]==FSTOD) || (a1stg_op[7:0]==FDTOS);
assign a1stg_dbl_dst= (a1stg_op[7:0]==FADDD) || (a1stg_op[7:0]==FSUBD)
|| (a1stg_op[7:0]==FITOD) || (a1stg_op[7:0]==FXTOD)
|| (a1stg_op[7:0]==FSTOD);
assign a1stg_sng_dst= (a1stg_op[7:0]==FADDS) || (a1stg_op[7:0]==FSUBS)
|| (a1stg_op[7:0]==FITOS) || (a1stg_op[7:0]==FXTOS)
|| (a1stg_op[7:0]==FDTOS);
assign a1stg_long_dst= (a1stg_op[7:0]==FSTOX) || (a1stg_op[7:0]==FDTOX);
assign a1stg_int_dst= (a1stg_op[7:0]==FSTOI) || (a1stg_op[7:0]==FDTOI);
assign a1stg_intlngop= (!(a1stg_sngopa[3] || a1stg_dblop));
assign a1stg_faddsubop= (a1stg_op[7:0]==FADDS) || (a1stg_op[7:0]==FADDD)
|| (a1stg_op[7:0]==FSUBS) || (a1stg_op[7:0]==FSUBD);
assign a1stg_fsubop= (a1stg_op[7:0]==FSUBS) || (a1stg_op[7:0]==FSUBD);
assign a1stg_fsdtox= (a1stg_op[7:0]==FSTOX) || (a1stg_op[7:0]==FDTOX);
assign a1stg_fcmpesd= (a1stg_op[7:0]==FCMPES) || (a1stg_op[7:0]==FCMPED);
assign a1stg_fcmpsd= (a1stg_op[7:0]==FCMPS) || (a1stg_op[7:0]==FCMPD);
assign a1stg_faddsub_dtosop= (a1stg_op[7:0]==FADDS) || (a1stg_op[7:0]==FADDD)
|| (a1stg_op[7:0]==FSUBS) || (a1stg_op[7:0]==FSUBD)
|| (a1stg_op[7:0]==FDTOS);
assign a1stg_fdtoix= (a1stg_op[7:0]==FDTOI) || (a1stg_op[7:0]==FDTOX);
assign a1stg_fstoix= (a1stg_op[7:0]==FSTOI) || (a1stg_op[7:0]==FSTOX);
assign a1stg_fsdtoix= (a1stg_op[7:0]==FSTOI) || (a1stg_op[7:0]==FSTOX)
|| (a1stg_op[7:0]==FDTOI) || (a1stg_op[7:0]==FDTOX);
assign a1stg_fixtosd= (a1stg_op[7:0]==FITOS) || (a1stg_op[7:0]==FITOD)
|| (a1stg_op[7:0]==FXTOS) || (a1stg_op[7:0]==FXTOD);
assign a1stg_fstod= (a1stg_op[7:0]==FSTOD);
assign a1stg_fstoi= (a1stg_op[7:0]==FSTOI);
assign a1stg_fstox= (a1stg_op[7:0]==FSTOX);
assign a1stg_fdtoi= (a1stg_op[7:0]==FDTOI);
assign a1stg_fdtox= (a1stg_op[7:0]==FDTOX);
assign a1stg_fsdtoix_fdtos= (a1stg_op[7:0]==FSTOI) || (a1stg_op[7:0]==FSTOX)
|| (a1stg_op[7:0]==FDTOI) || (a1stg_op[7:0]==FDTOX)
|| (a1stg_op[7:0]==FDTOS);
assign a1stg_fitos= (a1stg_op[7:0]==FITOS);
assign a1stg_fitod= (a1stg_op[7:0]==FITOD);
assign a1stg_fxtos= (a1stg_op[7:0]==FXTOS);
assign a1stg_fcmpop= (a1stg_op[7:0]==FCMPS) || (a1stg_op[7:0]==FCMPD)
|| (a1stg_op[7:0]==FCMPES) || (a1stg_op[7:0]==FCMPED);
assign a1stg_f4cycop= (a1stg_op[7:0]==FADDS) || (a1stg_op[7:0]==FADDD)
|| (a1stg_op[7:0]==FSUBS) || (a1stg_op[7:0]==FSUBD)
|| (a1stg_op[7:0]==FDTOS) || (a1stg_op[7:0]==FSTOD)
|| (a1stg_op[7:0]==FITOD);
assign a1stg_fixtos_fxtod= (a1stg_op[7:0]==FITOS) || (a1stg_op[7:0]==FXTOS)
|| (a1stg_op[7:0]==FXTOD);
assign a1stg_faddsubs_fdtos= (a1stg_op[7:0]==FADDS) || (a1stg_op[7:0]==FSUBS)
|| (a1stg_op[7:0]==FDTOS);
assign a1stg_faddsubs= (a1stg_op[7:0]==FADDS) || (a1stg_op[7:0]==FSUBS);
assign a1stg_faddsubd= (a1stg_op[7:0]==FADDD) || (a1stg_op[7:0]==FSUBD);
assign a1stg_fdtos= (a1stg_op[7:0]==FDTOS);
assign a1stg_fistod= (a1stg_op[7:0]==FITOD) || (a1stg_op[7:0]==FSTOD);
assign a1stg_fixtos= (a1stg_op[7:0]==FITOS) || (a1stg_op[7:0]==FXTOS);
assign a1stg_fxtod= (a1stg_op[7:0]==FXTOD);
assign a1stg_opdec_36 = a1stg_dblop;
assign a1stg_opdec[34:28] =
{a1stg_fadd,
a1stg_dbl_dst,
a1stg_sng_dst,
a1stg_long_dst,
a1stg_int_dst,
a1stg_faddsubop,
a1stg_fsubop};
assign a1stg_opdec_24_21[3:0] =
{a1stg_faddsub_dtosop,
a1stg_fdtoix,
a1stg_fstoix,
a1stg_fsdtoix};
assign a1stg_opdec_19_11[8:0] =
{a1stg_fstod,
a1stg_fstoi,
a1stg_fstox,
a1stg_fdtoi,
a1stg_fdtox,
a1stg_fsdtoix_fdtos,
a1stg_fitos,
a1stg_fitod,
a1stg_fxtos};
assign a1stg_opdec_9_0[9:0] =
{a1stg_fcmpop,
a1stg_f4cycop,
a1stg_fixtos_fxtod,
a1stg_faddsubs_fdtos,
a1stg_faddsubs,
a1stg_faddsubd,
a1stg_fdtos,
a1stg_fistod,
a1stg_fixtos,
a1stg_fxtod};
assign fixtosd_hold= a2stg_fixtos_fxtod
&& (!(a1stg_op[7] && (!a1stg_op[1]) && (!a1stg_op[0])
&& (a1stg_op[2] || (!a1stg_op[6]))));
assign a2stg_opdec_in[30:0]= {31{(!fixtosd_hold)}}
& {a1stg_opdec_36, a1stg_opdec[34:28],
a1stg_opdec_24_21[3:0], a1stg_opdec_19_11[8:0],
a1stg_opdec_9_0[9:0]};
dffre_s #(31) i_a2stg_opdec (
.din (a2stg_opdec_in[30:0]),
.en (a6stg_step),
.rst (reset),
.clk (rclk),
.q ({a2stg_opdec_36, a2stg_opdec[34:28], a2stg_opdec_24_21[3:0],
a2stg_opdec_19_11[8:0], a2stg_opdec_9_0[9:0]}),
.se (se),
.si (),
.so ()
);
dffe_s #(2) i_a2stg_rnd_mode (
.din (a1stg_rnd_mode[1:0]),
.en (a6stg_step),
.clk (rclk),
.q (a2stg_rnd_mode[1:0]),
.se (se),
.si (),
.so ()
);
dffe_s #(5) i_a2stg_id (
.din (a1stg_id[4:0]),
.en (a6stg_step),
.clk (rclk),
.q (a2stg_id[4:0]),
.se (se),
.si (),
.so ()
);
dffe_s #(2) i_a2stg_fcc (
.din (a1stg_fcc[1:0]),
.en (a6stg_step),
.clk (rclk),
.q (a2stg_fcc[1:0]),
.se (se),
.si (),
.so ()
);
///////////////////////////////////////////////////////////////////////////////
//
// Opcode pipeline- add stage 2.
//
///////////////////////////////////////////////////////////////////////////////
assign a2stg_fadd= a2stg_opdec[34];
assign a2stg_long_dst= a2stg_opdec[31];
assign a2stg_faddsubop= a2stg_opdec[29];
assign a2stg_fsubop= a2stg_opdec[28];
assign a2stg_faddsub_dtosop= a2stg_opdec_24_21[3];
assign a2stg_fdtoix= a2stg_opdec_24_21[2];
assign a2stg_fstoix= a2stg_opdec_24_21[1];
assign a2stg_fsdtoix= a2stg_opdec_24_21[0];
assign a2stg_fstod= a2stg_opdec_19_11[8];
assign a2stg_fstoi= a2stg_opdec_19_11[7];
assign a2stg_fstox= a2stg_opdec_19_11[6];
assign a2stg_fdtoi= a2stg_opdec_19_11[5];
assign a2stg_fdtox= a2stg_opdec_19_11[4];
assign a2stg_fsdtoix_fdtos= a2stg_opdec_19_11[3];
assign a2stg_fitos= a2stg_opdec_19_11[2];
assign a2stg_fitod= a2stg_opdec_19_11[1];
assign a2stg_fxtos= a2stg_opdec_19_11[0];
assign a2stg_fcmpop= a2stg_opdec_9_0[9];
assign a2stg_fixtos_fxtod= a2stg_opdec_9_0[7];
assign a2stg_fdtos= a2stg_opdec_9_0[3];
assign a2stg_fxtod= a2stg_opdec_9_0[0];
dffre_s #(19) i_a3stg_opdec (
.din ({a2stg_opdec_36, a2stg_opdec[34:29], a2stg_opdec_24_21[3],
a2stg_opdec_24_21[0], a2stg_opdec_9_0[9:0]}),
.en (a6stg_step),
.rst (reset),
.clk (rclk),
.q ({a3stg_opdec_36, a3stg_opdec[34:29], a3stg_opdec_24,
a3stg_opdec_21, a3stg_opdec_9_0[9:0]}),
.se (se),
.si (),
.so ()
);
dffre_s #(2) i_a3stg_faddsubopa (
.din ({2{a2stg_faddsubop}}),
.en (a6stg_step),
.rst (reset),
.clk (rclk),
.q (a3stg_faddsubopa[1:0]),
.se (se),
.si (),
.so ()
);
dffe_s #(2) i_a3stg_rnd_mode (
.din (a2stg_rnd_mode[1:0]),
.en (a6stg_step),
.clk (rclk),
.q (a3stg_rnd_mode[1:0]),
.se (se),
.si (),
.so ()
);
dffe_s #(5) i_a3stg_id (
.din (a2stg_id[4:0]),
.en (a6stg_step),
.clk (rclk),
.q (a3stg_id[4:0]),
.se (se),
.si (),
.so ()
);
dffe_s #(2) i_a3stg_fcc (
.din (a2stg_fcc[1:0]),
.en (a6stg_step),
.clk (rclk),
.q (a3stg_fcc[1:0]),
.se (se),
.si (),
.so ()
);
///////////////////////////////////////////////////////////////////////////////
//
// Opcode pipeline- add stage 3.
//
///////////////////////////////////////////////////////////////////////////////
assign a3stg_fadd= a3stg_opdec[34];
assign a3stg_int_dst= a3stg_opdec[30];
assign a3stg_faddsubop= a3stg_opdec[29];
assign a3stg_fsdtoix= a3stg_opdec_21;
assign a3stg_f4cycop= a3stg_opdec_9_0[8];
assign a3stg_fixtos_fxtod= a3stg_opdec_9_0[7];
assign a3stg_fdtos= a3stg_opdec_9_0[3];
dffre_s #(18) i_a4stg_opdec (
.din ({a3stg_opdec_36, a3stg_opdec[34:29], a3stg_opdec_24,
a3stg_opdec_21, a3stg_opdec_9_0[9], a3stg_opdec_9_0[7:0]}),
.en (a6stg_step),
.rst (reset),
.clk (rclk),
.q ({a4stg_opdec_36, a4stg_opdec[34:29], a4stg_opdec_24,
a4stg_opdec_21, a4stg_opdec_9, a4stg_opdec_7_0[7:0]}),
.se (se),
.si (),
.so ()
);
assign a4stg_rnd_mode_in[1:0]= ({2{a3stg_f4cycop}}
& a3stg_rnd_mode[1:0])
| ({2{(!a3stg_f4cycop)}}
& a4stg_rnd_mode2[1:0]);
dffe_s #(2) i_a4stg_rnd_mode (
.din (a4stg_rnd_mode_in[1:0]),
.en (a6stg_step),
.clk (rclk),
.q (a4stg_rnd_mode[1:0]),
.se (se),
.si (),
.so ()
);
dffe_s #(2) i_a4stg_rnd_mode2 (
.din (a3stg_rnd_mode[1:0]),
.en (a6stg_step),
.clk (rclk),
.q (a4stg_rnd_mode2[1:0]),
.se (se),
.si (),
.so ()
);
assign a4stg_id_in[9:0]= {(a3stg_id[4:2]==3'o7),
(a3stg_id[4:2]==3'o6),
(a3stg_id[4:2]==3'o5),
(a3stg_id[4:2]==3'o4),
(a3stg_id[4:2]==3'o3),
(a3stg_id[4:2]==3'o2),
(a3stg_id[4:2]==3'o1),
(a3stg_id[4:2]==3'o0),
a3stg_id[1:0]};
dffe_s #(10) i_a4stg_id (
.din (a4stg_id_in[9:0]),
.en (a6stg_step),
.clk (rclk),
.q (a4stg_id[9:0]),
.se (se),
.si (),
.so ()
);
dffe_s #(2) i_a4stg_fcc (
.din (a3stg_fcc[1:0]),
.en (a6stg_step),
.clk (rclk),
.q (a4stg_fcc[1:0]),
.se (se),
.si (),
.so ()
);
///////////////////////////////////////////////////////////////////////////////
//
// Opcode pipeline- add stages 4 and 5.
//
///////////////////////////////////////////////////////////////////////////////
assign a4stg_dblop= a4stg_opdec_36;
assign a4stg_fadd= a4stg_opdec[34];
assign a4stg_faddsubop= a4stg_opdec[29];
assign a4stg_faddsub_dtosop= a4stg_opdec_24;
assign a4stg_fsdtoix= a4stg_opdec_21;
assign a4stg_fcmpop= a4stg_opdec_9;
assign a4stg_fixtos_fxtod= a4stg_opdec_7_0[7];
assign a4stg_faddsubs_fdtos= a4stg_opdec_7_0[6];
assign a4stg_faddsubs= a4stg_opdec_7_0[5];
assign a4stg_faddsubd= a4stg_opdec_7_0[4];
assign a4stg_fdtos= a4stg_opdec_7_0[3];
assign a4stg_fistod= a4stg_opdec_7_0[2];
dffre_s #(9) i_a5stg_opdec (
.din ({a4stg_opdec[34:30], a4stg_opdec_9, a4stg_opdec_7_0[7],
a4stg_opdec_7_0[1], a4stg_opdec_7_0[0]}),
.en (a6stg_step),
.rst (reset),
.clk (rclk),
.q ({a5stg_opdec[34:30], a5stg_opdec_9, a5stg_opdec_7,
a5stg_opdec_1, a5stg_opdec_0}),
.se (se),
.si (),
.so ()
);
dffe_s #(10) i_a5stg_id (
.din (a4stg_id[9:0]),
.en (a6stg_step),
.clk (rclk),
.q (a5stg_id[9:0]),
.se (se),
.si (),
.so ()
);
assign a5stg_fadd= a5stg_opdec[34];
assign a5stg_fixtos_fxtod= a5stg_opdec_7;
assign a5stg_fixtos= a5stg_opdec_1;
assign a5stg_fxtod= a5stg_opdec_0;
assign a6stg_opdec_in[34:30] = ({5{a5stg_fixtos_fxtod}}
& a5stg_opdec[34:30])
| ({5{((!a4stg_fixtos_fxtod) && (!a5stg_fixtos_fxtod))}}
& a4stg_opdec[34:30]);
assign a6stg_opdec_in_9 = (a5stg_fixtos_fxtod
& a5stg_opdec_9)
| (((!a4stg_fixtos_fxtod) && (!a5stg_fixtos_fxtod))
& a4stg_opdec_9);
assign a6stg_fadd_in= (a5stg_fixtos_fxtod && a6stg_step && (!reset)
&& a5stg_fadd)
|| ((!a4stg_fixtos_fxtod) && (!a5stg_fixtos_fxtod)
&& a6stg_step && (!reset) && a4stg_fadd)
|| ((!a6stg_step) && (!reset) && a6stg_fadd);
dffre_s #(6) i_a6stg_opdec (
.din ({a6stg_opdec_in[34:30], a6stg_opdec_in_9}),
.en (a6stg_step),
.rst (reset),
.clk (rclk),
.q ({a6stg_opdec[34:30], a6stg_opdec_9}),
.se (se),
.si (),
.so ()
);
assign add_id_out_in[9:0]= ({10{((!a5stg_fixtos_fxtod) && a6stg_step)}}
& a4stg_id[9:0])
| ({10{(a5stg_fixtos_fxtod && a6stg_step)}}
& a5stg_id[9:0])
| ({10{(!a6stg_step)}}
& add_id_out[9:0]);
dff_s #(10) i_add_id_out (
.din (add_id_out_in[9:0]),
.clk (rclk),
.q (add_id_out[9:0]),
.se (se),
.si (),
.so ()
);
assign add_fcc_out_in[1:0]= ({2{a4stg_fcmpop}}
& a4stg_fcc);
dffe_s #(2) i_add_fcc_out (
.din (add_fcc_out_in[1:0]),
.en (a6stg_step),
.clk (rclk),
.q (add_fcc_out[1:0]),
.se (se),
.si (),
.so ()
);
///////////////////////////////////////////////////////////////////////////////
//
// Opcode pipeline- add pipeline output.
//
///////////////////////////////////////////////////////////////////////////////
assign a6stg_fadd= a6stg_opdec[34];
assign a6stg_dbl_dst= a6stg_opdec[33];
assign a6stg_sng_dst= a6stg_opdec[32];
assign a6stg_long_dst= a6stg_opdec[31];
assign a6stg_int_dst= a6stg_opdec[30];
assign a6stg_fcmpop= a6stg_opdec_9;
assign a6stg_hold= a6stg_fadd && (!add_dest_rdy);
assign a6stg_step= (!a6stg_hold);
// Austin update
// Power management update
assign add_pipe_active_in = // add pipe is executing a valid instr
a1stg_fadd || a2stg_fadd || a3stg_fadd || a4stg_fadd || a5stg_fadd || a6stg_fadd;
dffre_s #(1) i_add_pipe_active (
.din (add_pipe_active_in),
.en (1'b1),
.rst (reset),
.clk (rclk),
.q (add_pipe_active),
.se (se),
.si (),
.so ()
);
///////////////////////////////////////////////////////////////////////////////
//
// Add sign and exception logic.
//
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
// Add sign logic.
//
// Add stage 1.
//
///////////////////////////////////////////////////////////////////////////////
assign a1stg_sub= (a1stg_fsubop ^ (a1stg_in1_63 ^ a1stg_in2_63))
&& (!a1stg_fdtos)
&& (!(a1stg_faddsubop && a1stg_nan_in));
dffe_s #(1) i_a2stg_sign1 (
.din (a1stg_in1_63),
.en (a6stg_step),
.clk (rclk),
.q (a2stg_sign1),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a2stg_sign2 (
.din (a1stg_in2_63),
.en (a6stg_step),
.clk (rclk),
.q (a2stg_sign2),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a2stg_sub (
.din (a1stg_sub),
.en (a6stg_step),
.clk (rclk),
.q (a2stg_sub),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a2stg_in2_neq_in1_frac (
.din (a1stg_in2_neq_in1_frac),
.en (a6stg_step),
.clk (rclk),
.q (a2stg_in2_neq_in1_frac),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a2stg_in2_gt_in1_frac (
.din (a1stg_in2_gt_in1_frac),
.en (a6stg_step),
.clk (rclk),
.q (a2stg_in2_gt_in1_frac),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a2stg_in2_eq_in1_exp (
.din (a1stg_in2_eq_in1_exp),
.en (a6stg_step),
.clk (rclk),
.q (a2stg_in2_eq_in1_exp),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a2stg_in2_gt_in1_exp (
.din (a1stg_expadd1[11]),
.en (a6stg_step),
.clk (rclk),
.q (a2stg_in2_gt_in1_exp),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a2stg_nan_in (
.din (a1stg_nan_in),
.en (a6stg_step),
.clk (rclk),
.q (a2stg_nan_in),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a2stg_nan_in2 (
.din (a1stg_nan_in2),
.en (a6stg_step),
.clk (rclk),
.q (a2stg_nan_in2),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a2stg_snan_in2 (
.din (a1stg_snan_in2),
.en (a6stg_step),
.clk (rclk),
.q (a2stg_snan_in2),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a2stg_qnan_in2 (
.din (a1stg_qnan_in2),
.en (a6stg_step),
.clk (rclk),
.q (a2stg_qnan_in2),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a2stg_snan_in1 (
.din (a1stg_snan_in1),
.en (a6stg_step),
.clk (rclk),
.q (a2stg_snan_in1),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a2stg_qnan_in1 (
.din (a1stg_qnan_in1),
.en (a6stg_step),
.clk (rclk),
.q (a2stg_qnan_in1),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a2stg_2zero_in (
.din (a1stg_2zero_in),
.en (a6stg_step),
.clk (rclk),
.q (a2stg_2zero_in),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a2stg_2inf_in (
.din (a1stg_2inf_in),
.en (a6stg_step),
.clk (rclk),
.q (a2stg_2inf_in),
.se (se),
.si (),
.so ()
);
///////////////////////////////////////////////////////////////////////////////
//
// Add sign logic.
//
// Add stage 2.
//
///////////////////////////////////////////////////////////////////////////////
assign a2stg_in2_eq_in1= a2stg_in2_eq_in1_exp && (!a2stg_in2_neq_in1_frac);
assign a2stg_in2_gt_in1= a2stg_in2_gt_in1_exp
|| (a2stg_in2_eq_in1_exp && a2stg_in2_neq_in1_frac
&& a2stg_in2_gt_in1_frac);
assign a3stg_sub_in= a2stg_sub
&& (!a2stg_nan_in)
&& (!(a2stg_fsdtoix && (!a2stg_expadd[11])));
assign a2stg_faddsub_sign= (a2stg_sign1
&& (!a2stg_nan_in)
&& (a2stg_sign2 ^ a2stg_fsubop)
&& (!(a2stg_2inf_in && a2stg_sub)))
|| (a2stg_sign1
&& (!a2stg_nan_in)
&& (!a2stg_in2_eq_in1)
&& (!a2stg_in2_gt_in1)
&& (!(a2stg_2inf_in && a2stg_sub)))
|| ((!a2stg_in2_eq_in1)
&& a2stg_in2_gt_in1
&& (!a2stg_nan_in)
&& (a2stg_sign2 ^ a2stg_fsubop)
&& (!(a2stg_2inf_in && a2stg_sub)))
|| (a2stg_sign2
&& (a2stg_snan_in2
|| (a2stg_qnan_in2 && (!a2stg_snan_in1))))
|| (a2stg_sign1
&& ((a2stg_snan_in1 && (!a2stg_snan_in2))
|| (a2stg_qnan_in1 && (!a2stg_nan_in2))))
|| ((a2stg_rnd_mode[1:0]==2'b11)
&& a2stg_in2_eq_in1
&& (a2stg_sign1 ^ (a2stg_sign2 ^ a2stg_fsubop))
&& (!a2stg_nan_in)
&& (!a2stg_2inf_in));
assign a3stg_sign_in= (a2stg_faddsubop && a2stg_faddsub_sign)
|| ((!a2stg_faddsubop) && a2stg_sign2);
dffe_s #(1) i_a3stg_sign (
.din (a3stg_sign_in),
.en (a6stg_step),
.clk (rclk),
.q (a3stg_sign),
.se (se),
.si (),
.so ()
);
assign a2stg_cc_1= ((a2stg_sign2 && (!a2stg_2zero_in) && a2stg_sub)
|| ((!a2stg_in2_eq_in1) && (!a2stg_sub)
&& (a2stg_in2_gt_in1 ^ (!a2stg_sign2)))
|| a2stg_nan_in)
&& a2stg_fcmpop;
assign a2stg_cc_0= (((!a2stg_sign2) && (!a2stg_2zero_in) && a2stg_sub)
|| ((!a2stg_in2_eq_in1) && (!a2stg_sub)
&& (a2stg_in2_gt_in1 ^ a2stg_sign2))
|| a2stg_nan_in)
&& a2stg_fcmpop;
assign a2stg_cc[1:0]= {a2stg_cc_1, a2stg_cc_0};
dffe_s #(2) i_a3stg_cc (
.din (a2stg_cc[1:0]),
.en (a6stg_step),
.clk (rclk),
.q (a3stg_cc[1:0]),
.se (se),
.si (),
.so ()
);
///////////////////////////////////////////////////////////////////////////////
//
// Add sign logic.
//
// Add stage 3.
//
///////////////////////////////////////////////////////////////////////////////
assign a4stg_sign_in= (a3stg_f4cycop && a3stg_sign)
|| ((!a3stg_f4cycop) && a4stg_sign2);
dffe_s #(1) i_a4stg_sign (
.din (a4stg_sign_in),
.en (a6stg_step),
.clk (rclk),
.q (a4stg_sign),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a4stg_sign2 (
.din (a3stg_sign),
.en (a6stg_step),
.clk (rclk),
.q (a4stg_sign2),
.se (se),
.si (),
.so ()
);
dffe_s #(2) i_a4stg_cc (
.din (a3stg_cc[1:0]),
.en (a6stg_step),
.clk (rclk),
.q (a4stg_cc[1:0]),
.se (se),
.si (),
.so ()
);
///////////////////////////////////////////////////////////////////////////////
//
// Add sign logic.
//
// Add stage 4.
//
///////////////////////////////////////////////////////////////////////////////
dffe_s #(1) i_add_sign_out (
.din (a4stg_sign),
.en (a6stg_step),
.clk (rclk),
.q (add_sign_out),
.se (se),
.si (),
.so ()
);
assign add_cc_out_in[1:0]= ({2{a4stg_fcmpop}}
& a4stg_cc[1:0]);
dffe_s #(2) i_add_cc_out (
.din (add_cc_out_in[1:0]),
.en (a6stg_step),
.clk (rclk),
.q (add_cc_out[1:0]),
.se (se),
.si (),
.so ()
);
///////////////////////////////////////////////////////////////////////////////
//
// Add exception logic.
//
// Add stage 1.
//
///////////////////////////////////////////////////////////////////////////////
assign a1stg_nv= (a1stg_faddsubop
&& ((a1stg_2inf_in && a1stg_sub)
|| a1stg_snan_in1
|| a1stg_snan_in2))
|| (a1stg_fstod && a1stg_snan_in2)
|| (a1stg_fdtos && a1stg_snan_in2)
|| (a1stg_fcmpesd && a1stg_nan_in)
|| (a1stg_fcmpsd
&& (a1stg_snan_in1 || a1stg_snan_in2));
dffe_s #(1) i_a2stg_nv (
.din (a1stg_nv),
.en (a6stg_step),
.clk (rclk),
.q (a2stg_nv),
.se (se),
.si (),
.so ()
);
assign a1stg_of_mask= (!(a1stg_faddsub_dtosop && a1stg_infnan_in));
dffe_s #(1) i_a2stg_of_mask (
.din (a1stg_of_mask),
.en (a6stg_step),
.clk (rclk),
.q (a2stg_of_mask),
.se (se),
.si (),
.so ()
);
///////////////////////////////////////////////////////////////////////////////
//
// Add exception logic.
//
// Add stage 2.
//
///////////////////////////////////////////////////////////////////////////////
assign a3stg_nv_in= ((!a2stg_expadd[11])
&& a2stg_fsdtoix
&& ((!a2stg_sign2)
|| (|a2stg_expadd[10:0])
|| a2stg_frac2hi_neq_0
|| (a2stg_long_dst && a2stg_frac2lo_neq_0)))
|| a2stg_nv;
dffe_s #(1) i_a3stg_nv (
.din (a3stg_nv_in),
.en (a6stg_step),
.clk (rclk),
.q (a3stg_nv),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a3stg_of_mask (
.din (a2stg_of_mask),
.en (a6stg_step),
.clk (rclk),
.q (a3stg_of_mask),
.se (se),
.si (),
.so ()
);
assign a2stg_nx_tmp1= (a2stg_fdtoix && (|a2stg_exp[11:10]))
|| (a2stg_fstoix && (|a2stg_exp[11:7]));
assign a2stg_nx_tmp2= ((a2stg_fdtoix && (!(|a2stg_exp[11:10])))
|| (a2stg_fstoix && (!(|a2stg_exp[11:7]))))
&& ((|a2stg_exp[10:1])
|| a2stg_frac2hi_neq_0
|| a2stg_frac2lo_neq_0
|| a2stg_frac2_63);
assign a2stg_nx_tmp3= (a2stg_exp[11:0]==12'h41f)
&& a2stg_sign2
&& (!a2stg_frac2hi_neq_0)
&& a2stg_frac2lo_neq_0
&& a2stg_fdtoi;
dffe_s #(1) i_a3stg_a2_expadd_11 (
.din (a2stg_expadd[11]),
.en (a6stg_step),
.clk (rclk),
.q (a3stg_a2_expadd_11),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a3stg_nx_tmp1 (
.din (a2stg_nx_tmp1),
.en (a6stg_step),
.clk (rclk),
.q (a3stg_nx_tmp1),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a3stg_nx_tmp2 (
.din (a2stg_nx_tmp2),
.en (a6stg_step),
.clk (rclk),
.q (a3stg_nx_tmp2),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a3stg_nx_tmp3 (
.din (a2stg_nx_tmp3),
.en (a6stg_step),
.clk (rclk),
.q (a3stg_nx_tmp3),
.se (se),
.si (),
.so ()
);
///////////////////////////////////////////////////////////////////////////////
//
// Add exception logic.
//
// Add stage 3.
//
///////////////////////////////////////////////////////////////////////////////
assign a3stg_nx= (a3stg_a2_expadd_11
&& ((a3stg_nx_tmp1
&& ((a3stg_fsdtoi_nx && a3stg_int_dst)
|| a3stg_fsdtoix_nx))
|| a3stg_nx_tmp2))
|| a3stg_nx_tmp3;
assign a4stg_nv_in= ((a3stg_fadd && (!a3stg_fixtos_fxtod))
&& a3stg_nv)
|| ((!(a3stg_fadd && (!a3stg_fixtos_fxtod)))
&& a4stg_nv2);
dffe_s #(1) i_a4stg_nv (
.din (a4stg_nv_in),
.en (a6stg_step),
.clk (rclk),
.q (a4stg_nv),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a4stg_nv2 (
.din (a3stg_nv),
.en (a6stg_step),
.clk (rclk),
.q (a4stg_nv2),
.se (se),
.si (),
.so ()
);
assign a4stg_of_mask_in= ((a3stg_fadd && (!a3stg_fixtos_fxtod))
&& a3stg_of_mask)
|| ((!(a3stg_fadd && (!a3stg_fixtos_fxtod)))
&& a4stg_of_mask2);
dffe_s #(1) i_a4stg_of_mask (
.din (a4stg_of_mask_in),
.en (a6stg_step),
.clk (rclk),
.q (a4stg_of_mask),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a4stg_of_mask2 (
.din (a3stg_of_mask),
.en (a6stg_step),
.clk (rclk),
.q (a4stg_of_mask2),
.se (se),
.si (),
.so ()
);
assign a4stg_nx_in= ((a3stg_fadd && (!a3stg_fixtos_fxtod))
&& a3stg_nx)
|| ((!(a3stg_fadd && (!a3stg_fixtos_fxtod)))
&& a4stg_nx2);
dffe_s #(1) i_a4stg_nx (
.din (a4stg_nx_in),
.en (a6stg_step),
.clk (rclk),
.q (a4stg_nx),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_a4stg_nx2 (
.din (a3stg_nx),
.en (a6stg_step),
.clk (rclk),
.q (a4stg_nx2),
.se (se),
.si (),
.so ()
);
///////////////////////////////////////////////////////////////////////////////
//
// Add exception logic.
//
// Add stage 4.
//
///////////////////////////////////////////////////////////////////////////////
dffe_s #(1) i_add_nv_out (
.din (a4stg_nv),
.en (a6stg_step),
.clk (rclk),
.q (add_nv_out),
.se (se),
.si (),
.so ()
);
assign a4stg_in_of= ((a4stg_exp[11] || (&a4stg_exp[10:0]))
&& a4stg_faddsubd
&& a4stg_of_mask)
|| (((|a4stg_exp[11:8]) || (&a4stg_exp[7:0]))
&& a4stg_faddsubs_fdtos
&& a4stg_of_mask);
assign add_of_out_tmp1_in= ((&a4stg_exp[10:1]) && a4stg_rndup && a4stg_round
&& a4stg_faddsubd
&& a4stg_of_mask)
|| ((&a4stg_exp[7:1]) && a4stg_rndup
&& (a4stg_round || a4stg_fdtos)
&& a4stg_faddsubs_fdtos
&& a4stg_of_mask);
dffe_s #(1) i_add_of_out_tmp1 (
.din (add_of_out_tmp1_in),
.en (a6stg_step),
.clk (rclk),
.q (add_of_out_tmp1),
.se (se),
.si (),
.so ()
);
dffe_s #(1) i_add_of_out_tmp2 (
.din (a4stg_in_of),
.en (a6stg_step),
.clk (rclk),
.q (add_of_out_tmp2),
.se (se),
.si (),
.so ()
);
assign add_of_out= add_of_out_tmp2
|| (add_of_out_tmp1 && add_of_out_cout);
assign a4stg_uf= ((!(|a4stg_exp[10:0]))
&& a4stg_frac_neq_0
&& (a4stg_round || a4stg_fdtos)
&& a4stg_faddsub_dtosop)
|| (a4stg_faddsubop
&& (!(a4stg_round || a4stg_fdtos))
&& (!a4stg_denorm_inv)
&& a4stg_shl_data_neq_0);
dffe_s #(1) i_add_uf_out (
.din (a4stg_uf),
.en (a6stg_step),
.clk (rclk),
.q (add_uf_out),
.se (se),
.si (),
.so ()
);
assign add_nx_out_in= (a4stg_of_mask
&& a4stg_frac_dbl_nx
&& (a4stg_faddsubd || a5stg_fxtod)
&& ((!a4stg_faddsubd) || a4stg_round))
|| (a4stg_of_mask
&& a4stg_frac_sng_nx
&& (a4stg_faddsubs_fdtos || a5stg_fixtos)
&& ((!a4stg_faddsubs) || a4stg_round))
|| a4stg_nx;
dffe_s #(1) i_add_nx_out (
.din (add_nx_out_in),
.en (a6stg_step),
.clk (rclk),
.q (add_nx_out),
.se (se),
.si (),
.so ()
);
///////////////////////////////////////////////////////////////////////////////
//
// Add pipe exception output.
//
///////////////////////////////////////////////////////////////////////////////
// Austin update
// Overflow is always accompanied by inexact.
// Previously this was handled within the FFU.
// assign add_exc_out[4:0]= {add_nv_out, add_of_out, add_uf_out, 1'b0, add_nx_out};
assign add_exc_out[4:0] =
{add_nv_out,
add_of_out,
add_uf_out,
1'b0,
(add_nx_out || add_of_out)}; // Overflow is always accompanied by inexact
///////////////////////////////////////////////////////////////////////////////
//
// Add pipeline control logic.
//
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
// Select lines- add normalization and special input injection.
//
// Add stage 1.
//
///////////////////////////////////////////////////////////////////////////////
assign a2stg_frac1_in_frac1= a1stg_snan_in2
|| (a1stg_qnan_in2 && (!a1stg_snan_in1));
assign a2stg_frac1_in_frac2= a1stg_faddsubop
&& ((!a1stg_2nan_in)
|| a1stg_snan_in2
|| (a1stg_qnan_in2 && (!a1stg_snan_in1)));
assign a1stg_2nan_in_inv= (!a1stg_2nan_in);
assign a1stg_faddsubop_inv= (!a1stg_faddsubop);
assign a2stg_frac1_in_qnan= (a1stg_nan_in
|| (a1stg_2inf_in && a1stg_sub))
&& a1stg_faddsubop;
assign a2stg_frac1_in_nv= a1stg_2inf_in && a1stg_sub && a1stg_faddsubop;
assign a2stg_frac1_in_nv_dbl= a1stg_2inf_in && a1stg_sub && a1stg_faddsubd;
assign a2stg_frac2_in_frac1= a1stg_faddsubop && (!a1stg_infnan_in);
assign a2stg_frac2_in_qnan= a1stg_snan_in2 && (!a1stg_faddsubop);
///////////////////////////////////////////////////////////////////////////////
//
// Select lines and control logic- add pipe right shift count
// count calculation.
//
// Add stage 1.
//
///////////////////////////////////////////////////////////////////////////////
assign a1stg_exp_diff_add1= a1stg_faddsub_dtosop && (!a1stg_expadd1[11]);
assign a1stg_exp_diff_add2= a1stg_faddsubop && a1stg_expadd1[11];
assign a1stg_exp_diff_5= (!a1stg_expadd2[5]) && a1stg_fsdtox;
assign a1stg_exp_diff[10:0]= ({11{a1stg_exp_diff_add1}}
& a1stg_expadd1[10:0])
| ({11{a1stg_exp_diff_add2}}
& (~a1stg_expadd4_inv[10:0]))
| ({11{a1stg_fsdtoix}}
& {5'b0, a1stg_exp_diff_5, (~a1stg_expadd2[4:0])});
assign a1stg_clamp63[5:0]= a1stg_exp_diff[5:0] | {6{(|a1stg_exp_diff[10:6])}};
assign a2stg_shr_cnt_in[5:0]= a1stg_clamp63[5:0];
assign a2stg_shr_cnt_5_inv_in= (!a1stg_clamp63[5]);
///////////////////////////////////////////////////////////////////////////////
//
// Select lines- add pipe right shift.
//
// Add stage 2.
//
///////////////////////////////////////////////////////////////////////////////
assign a2stg_shr_frac2_shr_int= a2stg_faddsub_dtosop && a6stg_step;
assign a2stg_shr_frac2_shr_dbl= ((a2stg_fdtox && (|a2stg_exp[11:10]))
|| (a2stg_fstox && (|a2stg_exp[11:7])))
&& a6stg_step;
assign a2stg_shr_frac2_shr_sng= ((a2stg_fdtoi && (|a2stg_exp[11:10]))
|| (a2stg_fstoi && (|a2stg_exp[11:7])))
&& a6stg_step;
assign a2stg_shr_frac2_max= a2stg_fsdtoix && a6stg_step;
assign a2stg_sub_step= a2stg_sub && a6stg_step;
///////////////////////////////////////////////////////////////////////////////
//
// Select lines- add pipe adder.
//
// Add stage 2.
//
///////////////////////////////////////////////////////////////////////////////
assign a1stg_faddsub_clamp63_0= (|(({6{a1stg_expadd1[11]}}
& (~{a1stg_expadd4_inv[10:6],
a1stg_expadd4_inv[0]}))
| ({6{(!a1stg_expadd1[11])}}
& {a1stg_expadd1[10:6], a1stg_expadd1[0]})));
assign a2stg_fracadd_frac2_inv_in= (a1stg_fixtosd && a1stg_in2_63)
|| (a1stg_faddsubop && a1stg_sub
&& (!a1stg_faddsub_clamp63_0));
assign a2stg_fracadd_frac2_inv_shr1_in= a1stg_faddsubop && a1stg_sub
&& a1stg_faddsub_clamp63_0;
assign a2stg_fracadd_frac2_in= (a1stg_fixtosd && (!a1stg_in2_63))
|| a1stg_fstod
|| (a1stg_faddsubop && (!a1stg_sub));
dffe_s #(1) i_a2stg_fracadd_frac2 (
.din (a2stg_fracadd_frac2_in),
.en (a6stg_step),
.clk (rclk),
.q (a2stg_fracadd_frac2),
.se (se),
.si (),
.so ()
);
assign a2stg_fracadd_cin_in= (a1stg_fixtosd && a1stg_in2_63)
|| (a1stg_faddsubop && a1stg_sub);
///////////////////////////////////////////////////////////////////////////////
//
// Select lines- add pipe exponent adjustment.
//
// Add stage 2.
//
///////////////////////////////////////////////////////////////////////////////
assign a3stg_exp_7ff= a2stg_fstod && (&a2stg_exp[7:0]);
assign a3stg_exp_ff= a2stg_fdtos && (&a2stg_exp[10:0]);
assign a3stg_exp_add= (a2stg_fstod && (!(&a2stg_exp[7:0])))
|| (a2stg_fdtos && (!(&a2stg_exp[10:0])));
///////////////////////////////////////////////////////////////////////////////
//
// Select lines- add pipe exponent decode- used to identify denorm results.
//
// Add stage 2.
//
///////////////////////////////////////////////////////////////////////////////
assign a2stg_expdec_neq_0= a2stg_faddsubop && (a2stg_exp[10:0]<11'h36);
///////////////////////////////////////////////////////////////////////////////
//
// Select lines and control logic
// - add pipe main adder
// - add pipe exponent increment/decrement adjustment
//
// Add stage 3.
//
///////////////////////////////////////////////////////////////////////////////
assign a3stg_exp10_0_eq0= (a3stg_exp[10:0]==11'b0);
assign a3stg_exp10_1_eq0= (a3stg_exp[10:1]==10'b0);
assign a3stg_fdtos_inv= (!a3stg_fdtos);
assign a4stg_fixtos_fxtod_inv= (!a4stg_fixtos_fxtod);
assign a4stg_rnd_frac_add_inv= (!(a3stg_fsdtoix
|| (a3stg_faddsubop && a3stg_exp10_0_eq0)));
///////////////////////////////////////////////////////////////////////////////
//
// Control logic- add pipe left shift count.
//
// Add stage 3.
//
///////////////////////////////////////////////////////////////////////////////
assign a4stg_shl_cnt_in[9:0]= ({10{a3stg_denorm}}
& {(a3stg_exp[5:4]==2'b11),
(a3stg_exp[5:4]==2'b10),
(a3stg_exp[5:4]==2'b01),
(a3stg_exp[5:4]==2'b00),
a3stg_exp[5:0]})
| ({10{a3stg_denorm_inv}}
& {(a3stg_lead0[5:4]==2'b11),
(a3stg_lead0[5:4]==2'b10),
(a3stg_lead0[5:4]==2'b01),
(a3stg_lead0[5:4]==2'b00),
a3stg_lead0[5:0]});
///////////////////////////////////////////////////////////////////////////////
//
// Select lines and control logic- add pipe rounding adder.
//
// Add stage 4.
//
///////////////////////////////////////////////////////////////////////////////
assign a4stg_rnd_sng= a5stg_fixtos || a4stg_faddsubs_fdtos;
assign a4stg_rnd_dbl= a5stg_fxtod || a4stg_faddsubd;
///////////////////////////////////////////////////////////////////////////////
//
// Select lines and control logic- add pipe fraction output.
//
// Add stage 4.
//
///////////////////////////////////////////////////////////////////////////////
assign a4stg_rndup_sng= ((a4stg_rnd_mode==2'b10) && (!a4stg_sign)
&& a4stg_frac_sng_nx)
|| ((a4stg_rnd_mode==2'b11) && a4stg_sign
&& a4stg_frac_sng_nx)
|| ((a4stg_rnd_mode==2'b00) && a4stg_rnd_frac_39
&& (a4stg_frac_38_0_nx || a4stg_rnd_frac_40));
assign a4stg_rndup_dbl= ((a4stg_rnd_mode==2'b10) && (!a4stg_sign)
&& a4stg_frac_dbl_nx)
|| ((a4stg_rnd_mode==2'b11) && a4stg_sign
&& a4stg_frac_dbl_nx)
|| ((a4stg_rnd_mode==2'b00) && a4stg_rnd_frac_10
&& (a4stg_frac_9_0_nx || a4stg_rnd_frac_11));
assign a4stg_rndup= (a4stg_faddsubd && a4stg_rndup_dbl)
|| (a4stg_faddsubs && a4stg_rndup_sng)
|| (a4stg_fdtos && a4stg_rndup_sng && a4stg_of_mask);
assign a5stg_rndup= (a5stg_fxtod && a4stg_rndup_dbl)
|| (a5stg_fixtos && a4stg_rndup_sng);
assign add_frac_out_rndadd= (a4stg_faddsubop && a4stg_round && a4stg_rndup
&& (!a4stg_in_of))
|| (a4stg_fdtos && a4stg_rndup && (!a4stg_in_of))
|| (a5stg_fixtos_fxtod && a5stg_rndup);
assign add_frac_out_rnd_frac= (a4stg_faddsubop && a4stg_round && (!a4stg_rndup)
&& (!a4stg_in_of))
|| (a4stg_fdtos && (!a4stg_rndup) && (!a4stg_in_of))
|| (a5stg_fixtos_fxtod && (!a5stg_rndup))
|| a4stg_fsdtoix;
assign add_frac_out_shl= (a4stg_faddsubop && (!a4stg_round) && (!a4stg_in_of))
|| a4stg_fistod;
assign a4stg_to_0= (!((a4stg_rnd_mode==2'b00)
|| ((a4stg_rnd_mode==2'b10) && (!a4stg_sign))
|| ((a4stg_rnd_mode==2'b11) && a4stg_sign)));
///////////////////////////////////////////////////////////////////////////////
//
// Select lines and control logic- add pipe exponent output.
//
// Add stage 4.
//
///////////////////////////////////////////////////////////////////////////////
assign add_exp_out_expinc= (a4stg_faddsubop && a4stg_round && a4stg_rndup
&& (!a4stg_in_of))
|| (a4stg_fdtos && a4stg_rndup
&& (!a4stg_in_of))
|| (a5stg_fixtos_fxtod && a5stg_rndup);
assign add_exp_out_exp= (a4stg_faddsubop && a4stg_round
&& (!a4stg_in_of))
|| (a4stg_fdtos
&& (!a4stg_in_of))
|| a5stg_fixtos_fxtod;
assign add_exp_out_exp1= (a4stg_faddsubop && a4stg_round
&& (!a4stg_rndup)
&& (!a4stg_in_of))
|| (a4stg_fdtos
&& (!a4stg_rndup)
&& (!a4stg_in_of))
|| (a5stg_fixtos_fxtod
&& (!a5stg_rndup));
assign add_exp_out_expadd= (a4stg_faddsubop && (!a4stg_round) && (!a4stg_in_of))
|| a4stg_fistod;
assign a4stg_to_0_inv= (!a4stg_to_0);
endmodule