blob: ccfa8ee9b48fe4a97214b1c7632e6bdcfa60930c [file] [log] [blame] [edit]
// ========== 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