// ========== Copyright Header Begin ========================================== // // OpenSPARC T1 Processor File: spu_lsurpt1.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 ============================================ module spu_lsurpt1 ( /*outputs*/ so, spu_lsu_ldxa_data_w2, spu_lsu_ldxa_data_vld_w2, spu_lsu_ldxa_tid_w2, spu_lsu_ldst_pckt, spu_lsurpt1_rs3_data_g2, spu_lsu_ldxa_illgl_va_w2, spu_lsurpt1_stb_empty, spu_lsurpt_cpx_data_out, spu_ifu_ttype_tid_w2, spu_lsu_unc_error_w2, spu_ifu_err_addr_w2, spu_lsu_stxa_ack_tid, /*inputs*/ spu_ctl_ldxa_illgl_va_w, spu_madp_ldxa_data, spu_ldstreq_pcx, spu_ctl_ldxa_data_vld_w2, spu_ctl_ldxa_tid_w2, exu_lsu_rs3_data_e, lsu_spu_stb_empty, spu_lsurpt_cpx_data_in, spu_wen_pcx_wen, spu_wen_pcx_7170_sel, spu_ifu_ttype_tid_w, spu_lsu_unc_error_w, spu_lsu_stxa_ack_tid_ctl, si,se, //tmb_l, reset_l, rclk); // --------------------------------------------------------------------- input rclk; input reset_l; input se; input si; //input tmb_l; input [63:0] spu_madp_ldxa_data; input [122:0] spu_ldstreq_pcx; input spu_ctl_ldxa_data_vld_w2; input [1:0] spu_ctl_ldxa_tid_w2; input [63:0] exu_lsu_rs3_data_e; input spu_ctl_ldxa_illgl_va_w; input [3:0] lsu_spu_stb_empty; input [134:0] spu_lsurpt_cpx_data_in; input spu_wen_pcx_wen; input spu_wen_pcx_7170_sel; input [1:0] spu_ifu_ttype_tid_w; input spu_lsu_unc_error_w; input [1:0] spu_lsu_stxa_ack_tid_ctl; // --------------------------------------------------------------------- output [122:0] spu_lsu_ldst_pckt; output [63:0] spu_lsu_ldxa_data_w2; output spu_lsu_ldxa_data_vld_w2; output [1:0] spu_lsu_ldxa_tid_w2; output [63:0] spu_lsurpt1_rs3_data_g2; output spu_lsu_ldxa_illgl_va_w2; output [3:0] spu_lsurpt1_stb_empty; output [134:0] spu_lsurpt_cpx_data_out; output [1:0] spu_ifu_ttype_tid_w2; output spu_lsu_unc_error_w2; output [39:4] spu_ifu_err_addr_w2; output [1:0] spu_lsu_stxa_ack_tid; output so; // --------------------------------------------------------------------- dffe_s #(121) pcx_ff ( .din({spu_ldstreq_pcx[122:72],spu_ldstreq_pcx[69:0]}) , .q({spu_lsu_ldst_pckt[122:72],spu_lsu_ldst_pckt[69:0]}), .en(spu_wen_pcx_wen), .clk (rclk), .se(1'b0),.si (),.so () ); // bank select needs to be fast. //assign spu_lsu_ldst_pckt[71:70] = spu_ldstreq_pcx[71:70]; wire [71:70] spu_ldstreq_pcx_q; dffe_s #(2) pcx_7170_ff ( .din(spu_ldstreq_pcx[71:70]) , .q(spu_ldstreq_pcx_q[71:70]), .en(spu_wen_pcx_wen), .clk (rclk), .se(1'b0),.si (),.so () ); dp_mux2es #(2) pcx_7170_mx ( .in0 (spu_ldstreq_pcx_q[71:70]), .in1 (spu_ldstreq_pcx[71:70]), .sel (spu_wen_pcx_7170_sel), .dout (spu_lsu_ldst_pckt[71:70])); assign spu_ifu_err_addr_w2[39:8] = spu_ldstreq_pcx[103:72]; // buf_10x assign spu_ifu_err_addr_w2[7:6] = spu_ldstreq_pcx[71:70]; // very critical to not overload double // buffer(buf_2x+buf10x) assign spu_ifu_err_addr_w2[5:4] = spu_ldstreq_pcx[69:68]; // buf_10x // --------------------------------------------------------------------- dff_s #(64) ldxa_data_ff ( .din(spu_madp_ldxa_data[63:0]) , .q(spu_lsu_ldxa_data_w2[63:0]), .clk (rclk), .se(1'b0),.si (),.so () ); dff_s #(2) ldxa_tid_ff ( .din(spu_ctl_ldxa_tid_w2[1:0]) , .q(spu_lsu_ldxa_tid_w2[1:0]), .clk (rclk), .se(1'b0),.si (),.so () ); wire reset = ~reset_l; dffr_s #(1) ldxa_vld_ff ( .din(spu_ctl_ldxa_data_vld_w2) , .q(spu_lsu_ldxa_data_vld_w2), .rst(reset), .clk (rclk), .se(1'b0),.si (),.so () ); dffr_s #(1) illgl_va_ff ( .din(spu_ctl_ldxa_illgl_va_w) , .q(spu_lsu_ldxa_illgl_va_w2), .rst(reset), .clk (rclk), .se(1'b0),.si (),.so () ); //--------------------------------------------- wire [63:0] spu_lsurpt1_rs3_data_m, spu_lsurpt1_rs3_data_g; dff_s #(64) exu_rs3_data_e_ff ( .din(exu_lsu_rs3_data_e[63:0]) , .q(spu_lsurpt1_rs3_data_m[63:0]), .clk (rclk), .se(1'b0),.si (),.so () ); dff_s #(64) spu_rs3_data_m_ff ( .din(spu_lsurpt1_rs3_data_m[63:0]) , .q(spu_lsurpt1_rs3_data_g[63:0]), .clk (rclk), .se(1'b0),.si (),.so () ); dff_s #(64) spu_rs3_data_g_ff ( .din(spu_lsurpt1_rs3_data_g[63:0]) , .q(spu_lsurpt1_rs3_data_g2[63:0]), .clk (rclk), .se(1'b0),.si (),.so () ); //--------------------------------------------- //--------------------------------------------- // port postion should be: input on the BOTTOM and output on TOP. dff_s #(4) lsu_spu_stb_empty_ff ( .din(lsu_spu_stb_empty[3:0]) , .q(spu_lsurpt1_stb_empty[3:0]), .clk (rclk), .se(1'b0), .si(), .so()); //--------------------------------------------- //--------------------------------------------- // port postion should be: input on the BOTTOM and output on TOP. assign spu_lsurpt_cpx_data_out[134:0] = spu_lsurpt_cpx_data_in[134:0]; //--------------------------------------------- //--------------------------------------------- // place all the following flops on the right hand side. inputs located on the top // and outputs located on the bottom. dff_s #(2) spu_ifu_ttype_tid_w2_ff ( .din(spu_ifu_ttype_tid_w[1:0]) , .q(spu_ifu_ttype_tid_w2[1:0]), .clk (rclk), .se(se), .si(), .so()); dff_s #(1) spu_lsu_unc_error_w2_ff ( .din(spu_lsu_unc_error_w) , .q(spu_lsu_unc_error_w2), .clk (rclk), .se(se), .si(), .so()); dff_s #(2) spu_lsu_stxa_ack_tid_ff ( .din(spu_lsu_stxa_ack_tid_ctl[1:0]) , .q(spu_lsu_stxa_ack_tid[1:0]), .clk (rclk), .se(se), .si(), .so()); endmodule