| // ========== 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 |
| |