blob: d8a8616ebae8918319a0f996b3671d62ea1063b8 [file] [log] [blame] [edit]
// ========== Copyright Header Begin ==========================================
//
// OpenSPARC T1 Processor File: fpu_in_dp.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 ============================================
///////////////////////////////////////////////////////////////////////////////
//
// FPU input datapath.
//
///////////////////////////////////////////////////////////////////////////////
module fpu_in_dp (
fp_data_rdy,
fpio_data_px2_116_112,
fpio_data_px2_79_72,
fpio_data_px2_67_0,
inq_fwrd,
inq_fwrd_inv,
inq_bp,
inq_bp_inv,
inq_dout,
rclk,
fp_op_in_7in,
inq_id,
inq_rnd_mode,
inq_fcc,
inq_op,
inq_in1_exp_neq_ffs,
inq_in1_exp_eq_0,
inq_in1_53_0_neq_0,
inq_in1_50_0_neq_0,
inq_in1_53_32_neq_0,
inq_in1,
inq_in2_exp_neq_ffs,
inq_in2_exp_eq_0,
inq_in2_53_0_neq_0,
inq_in2_50_0_neq_0,
inq_in2_53_32_neq_0,
inq_in2,
fp_id_in,
fp_rnd_mode_in,
fp_fcc_in,
fp_op_in,
fp_src1_in,
fp_src2_in,
se,
si,
so
);
input fp_data_rdy;
input [116:112] fpio_data_px2_116_112; // FPU request data from PCX
input [79:72] fpio_data_px2_79_72; // FPU request data from PCX
input [67:0] fpio_data_px2_67_0; // FPU request data from PCX
input inq_fwrd; // input Q is empty
input inq_fwrd_inv; // input Q is not empty
input inq_bp; // bypass the input Q SRAM
input inq_bp_inv; // don't bypass the input Q SRAM
input [154:0] inq_dout; // data read out from input Q SRAM
input rclk; // global clock
output fp_op_in_7in; // request opcode
output [4:0] inq_id; // request ID to the operation pipes
output [1:0] inq_rnd_mode; // request rounding mode to op pipes
output [1:0] inq_fcc; // request cc ID to op pipes
output [7:0] inq_op; // request opcode to op pipes
output inq_in1_exp_neq_ffs; // request operand 1 exp!=ff's
output inq_in1_exp_eq_0; // request operand 1 exp==0
output inq_in1_53_0_neq_0; // request operand 1[53:0]!=0
output inq_in1_50_0_neq_0; // request operand 1[50:0]!=0
output inq_in1_53_32_neq_0; // request operand 1[53:32]!=0
output [63:0] inq_in1; // request operand 1 to op pipes
output inq_in2_exp_neq_ffs; // request operand 2 exp!=ff's
output inq_in2_exp_eq_0; // request operand 2 exp==0
output inq_in2_53_0_neq_0; // request operand 2[53:0]!=0
output inq_in2_50_0_neq_0; // request operand 2[50:0]!=0
output inq_in2_53_32_neq_0; // request operand 2[53:32]!=0
output [63:0] inq_in2; // request operand 2 to op pipes
// 6/20/03: New outputs to drive fpu-level i_fpu_inq_sram inputs
output [4:0] fp_id_in; // id to be written into inq_sram
output [1:0] fp_rnd_mode_in; // rnd_mode to be written into inq_sram
output [1:0] fp_fcc_in; // fcc to be written into inq_sram
output [7:0] fp_op_in; // request opcode
output [68:0] fp_src1_in; // operand1 and its pre-computed bits portion
output [68:0] fp_src2_in; // operand2, includes pre-computed bits
input se; // scan_enable
input si; // scan in
output so; // scan out
wire [154:0] inq_dout;
wire [4:0] fp_id_in;
wire [7:0] fp_op_in;
wire fp_op_in_7; // request opcode bit[7]
wire fp_op_in_7_inv; // inverted request opcode bit[7]
wire fp_op_in_7in;
wire [1:0] fp_fcc_in;
wire [1:0] fp_rnd_mode_in;
wire [63:0] fp_srca_in;
wire fp_srca_53_0_neq_0;
wire fp_srca_50_0_neq_0;
wire fp_srca_53_32_neq_0;
wire fp_srca_exp_eq_0;
wire fp_srca_exp_neq_ffs;
wire [68:0] fp_srcb_in;
wire [68:0] fp_src1_in;
wire [68:0] fp_src2_in;
wire [154:0] inq_din_d1;
wire [154:0] inq_data;
wire [4:0] inq_id;
wire [1:0] inq_rnd_mode;
wire [1:0] inq_fcc;
wire [7:0] inq_op;
wire inq_in1_exp_neq_ffs;
wire inq_in1_exp_eq_0;
wire inq_in1_53_0_neq_0;
wire inq_in1_50_0_neq_0;
wire inq_in1_53_32_neq_0;
wire [63:0] inq_in1;
wire inq_in2_exp_neq_ffs;
wire inq_in2_exp_eq_0;
wire inq_in2_53_0_neq_0;
wire inq_in2_50_0_neq_0;
wire inq_in2_53_32_neq_0;
wire [63:0] inq_in2;
wire clk;
wire se_l;
// 6/23/03: Replaced tm_l with se_l
assign se_l = ~se;
clken_buf ckbuf_in_dp (
.clk(clk),
.rclk(rclk),
.enb_l(1'b0),
.tmb_l(se_l)
);
///////////////////////////////////////////////////////////////////////////////
//
// Capture input information.
//
///////////////////////////////////////////////////////////////////////////////
dff_s #(5) i_fp_id_in (
.din (fpio_data_px2_116_112[116:112]),
.clk (clk),
.q (fp_id_in[4:0]),
.se (se),
.si (),
.so ()
);
dff_s #(8) i_fp_op_in (
.din (fpio_data_px2_79_72[79:72]),
.clk (clk),
.q (fp_op_in[7:0]),
.se (se),
.si (),
.so ()
);
assign fp_op_in_7in = fp_op_in[7];
assign fp_op_in_7 = fp_op_in[7];
assign fp_op_in_7_inv = ~fp_op_in[7];
dff_s #(2) i_fp_fcc_in (
.din (fpio_data_px2_67_0[67:66]),
.clk (clk),
.q (fp_fcc_in[1:0]),
.se (se),
.si (),
.so ()
);
dff_s #(2) i_fp_rnd_mode_in (
.din (fpio_data_px2_67_0[65:64]),
.clk (clk),
.q (fp_rnd_mode_in[1:0]),
.se (se),
.si (),
.so ()
);
dff_s #(64) i_fp_srca_in (
.din (fpio_data_px2_67_0[63:0]),
.clk (clk),
.q (fp_srca_in[63:0]),
.se (se),
.si (),
.so ()
);
assign fp_srca_53_0_neq_0= (|fp_srca_in[53:0]);
assign fp_srca_50_0_neq_0= (|fp_srca_in[50:0]);
assign fp_srca_53_32_neq_0= (|fp_srca_in[53:32]);
assign fp_srca_exp_eq_0= (!((|fp_srca_in[62:55])
|| (fp_op_in[1] && (|fp_srca_in[54:52]))));
assign fp_srca_exp_neq_ffs= (!((&fp_srca_in[62:55])
&& (fp_op_in[0] || (&fp_srca_in[54:52]))));
///////////////////////////////////////////////////////////////////////////////
//
// Extract the two operands.
//
///////////////////////////////////////////////////////////////////////////////
dffe_s #(69) i_fp_srcb_in (
.din ({fp_srca_exp_neq_ffs, fp_srca_exp_eq_0, fp_srca_53_0_neq_0,
fp_srca_50_0_neq_0, fp_srca_53_32_neq_0,
fp_srca_in[63:0]}),
.en (fp_data_rdy),
.clk (clk),
.q (fp_srcb_in[68:0]),
.se (se),
.si (),
.so ()
);
assign fp_src1_in[68:0]= ({69{fp_op_in_7_inv}}
& {fp_srca_exp_neq_ffs, fp_srca_exp_eq_0,
fp_srca_53_0_neq_0, fp_srca_50_0_neq_0,
fp_srca_53_32_neq_0, fp_srca_in[63:0]})
| ({69{fp_op_in_7}}
& 69'h180000000000000000);
assign fp_src2_in[68:0]= ({69{fp_op_in_7_inv}}
& fp_srcb_in[68:0])
| ({69{fp_op_in_7}}
& {fp_srca_exp_neq_ffs, fp_srca_exp_eq_0,
fp_srca_53_0_neq_0, fp_srca_50_0_neq_0,
fp_srca_53_32_neq_0, fp_srca_in[63:0]});
///////////////////////////////////////////////////////////////////////////////
//
// Input queue FIFO bypass and output.
//
///////////////////////////////////////////////////////////////////////////////
dff_s #(155) i_inq_din_d1 (
.din ({fp_id_in[4:0], fp_rnd_mode_in[1:0], fp_fcc_in[1:0],
fp_op_in[7:0], fp_src1_in[68:0], fp_src2_in[68:0]}),
.clk (clk),
.q (inq_din_d1[154:0]),
.se (se),
.si (),
.so ()
);
assign inq_data[154:0]= ({155{inq_fwrd}}
& {fp_id_in[4:0], fp_rnd_mode_in[1:0],
fp_fcc_in[1:0], fp_op_in[7:0],
fp_src1_in[68:0], fp_src2_in[68:0]})
| ({155{inq_fwrd_inv}}
& (({155{inq_bp}}
& inq_din_d1[154:0])
| ({155{inq_bp_inv}}
& inq_dout[154:0])));
assign inq_id[4:0]= inq_data[154:150];
assign inq_rnd_mode[1:0]= inq_data[149:148];
assign inq_fcc[1:0]= inq_data[147:146];
assign inq_op[7:0]= inq_data[145:138];
assign inq_in1_exp_neq_ffs= inq_data[137];
assign inq_in1_exp_eq_0= inq_data[136];
assign inq_in1_53_0_neq_0= inq_data[135];
assign inq_in1_50_0_neq_0= inq_data[134];
assign inq_in1_53_32_neq_0= inq_data[133];
assign inq_in1[63:0]= inq_data[132:69];
assign inq_in2_exp_neq_ffs= inq_data[68];
assign inq_in2_exp_eq_0= inq_data[67];
assign inq_in2_53_0_neq_0= inq_data[66];
assign inq_in2_50_0_neq_0= inq_data[65];
assign inq_in2_53_32_neq_0= inq_data[64];
assign inq_in2[63:0]= inq_data[63:0];
endmodule