| // ========== Copyright Header Begin ========================================== |
| // |
| // OpenSPARC T1 Processor File: scdata_ctr_io.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 scdata_ctr_io(/*AUTOARG*/ |
| // Outputs |
| so, scdata_sctag_decc_c6_ctr, scdata_decc_out_c6, |
| cache_decc_in_c3, cache_col_offset_c3, cache_word_en_c3, |
| cache_way_sel_c3_0, cache_set_c3_0, cache_wr_en_c3_0, |
| cache_way_sel_c3_1, cache_set_c3_1, cache_wr_en_c3_1, |
| cache_way_sel_c3_2, cache_set_c3_2, cache_wr_en_c3_2, |
| cache_way_sel_c3_3, cache_set_c3_3, cache_wr_en_c3_3, |
| // Inputs |
| sctag_scdata_way_sel_c2_buf, sctag_scdata_rd_wr_c2_buf, |
| sctag_scdata_set_c2_buf, sctag_scdata_col_offset_c2_buf, |
| sctag_scdata_word_en_c2_buf, sctag_scdata_fbrd_c3_buf, |
| scbuf_scdata_fbdecc_c5, sctag_scdata_fb_hit_c3_buf, |
| sctag_scdata_stdecc_c2_buf, cache_decc_out_c5, rclk, se, si |
| ); |
| |
| input [11:0] sctag_scdata_way_sel_c2_buf; // way select |
| input sctag_scdata_rd_wr_c2_buf; // Rd/WRbar |
| input [9:0] sctag_scdata_set_c2_buf; // index |
| input [3:0] sctag_scdata_col_offset_c2_buf; // 16B column that is accessed |
| input [15:0] sctag_scdata_word_en_c2_buf; // word enables for stores |
| input sctag_scdata_fbrd_c3_buf; // if fill 1 else 0 |
| input [623:0] scbuf_scdata_fbdecc_c5; |
| input sctag_scdata_fb_hit_c3_buf; // use bypass data from the Fill Buffer. |
| input [77:0] sctag_scdata_stdecc_c2_buf; // store data from sctag |
| input [623:0] cache_decc_out_c5; // data output from memory array |
| input rclk, se, si; |
| |
| output so; |
| output [155:0] scdata_sctag_decc_c6_ctr; |
| output [623:0] scdata_decc_out_c6; |
| output [623:0] cache_decc_in_c3; |
| output [3:0] cache_col_offset_c3; |
| output [15:0] cache_word_en_c3; |
| |
| output [11:0] cache_way_sel_c3_0; |
| output [9:0] cache_set_c3_0; |
| output cache_wr_en_c3_0; |
| |
| output [11:0] cache_way_sel_c3_1; |
| output [9:0] cache_set_c3_1; |
| output cache_wr_en_c3_1; |
| |
| output [11:0] cache_way_sel_c3_2; |
| output [9:0] cache_set_c3_2; |
| output cache_wr_en_c3_2; |
| |
| output [11:0] cache_way_sel_c3_3; |
| output [9:0] cache_set_c3_3; |
| output cache_wr_en_c3_3; |
| |
| wire [11:0] cache_way_sel_c3; |
| wire [9:0] cache_set_c3; |
| wire cache_wr_en_c3; |
| |
| wire [77:0] st_decc_out_c3; |
| wire [155:0] scdata_sctag_decc_c5; |
| wire sel_decc_c5_23; |
| wire [155:0] decc_c5_01; |
| wire [155:0] decc_c5_23; |
| wire [3:0] cache_col_offset_c4, cache_col_offset_c5 ; |
| wire cache_sel_fbdecc_c4, cache_sel_fbdecc_c5 ; |
| wire cache_fb_hit_c4, cache_fb_hit_c5 ; |
| wire [155:0] scdata_sctag_decc_c6_ctr ; |
| wire [623:0] rd_decc_out_c5; |
| wire [623:0] scdata_decc_out_c5; |
| wire [623:0] scdata_decc_out_c6; |
| |
| |
| // way selects |
| dff_s #(12) ff_cache_way_sel_c3 (.q(cache_way_sel_c3[11:0]), |
| .din(sctag_scdata_way_sel_c2_buf[11:0]), |
| .clk(rclk), .se(se), .si(), .so()); |
| |
| assign cache_way_sel_c3_0 = cache_way_sel_c3; |
| assign cache_way_sel_c3_1 = cache_way_sel_c3; |
| assign cache_way_sel_c3_2 = cache_way_sel_c3; |
| assign cache_way_sel_c3_3 = cache_way_sel_c3; |
| |
| // set |
| dff_s #(10) ff_cache_set_c3 (.q(cache_set_c3[9:0]), |
| .din(sctag_scdata_set_c2_buf[9:0]), |
| .clk(rclk), .se(se), .si(), .so()); |
| |
| assign cache_set_c3_0 = cache_set_c3; |
| assign cache_set_c3_1 = cache_set_c3; |
| assign cache_set_c3_2 = cache_set_c3; |
| assign cache_set_c3_3 = cache_set_c3; |
| |
| // col offset |
| dff_s #(4) ff_cache_col_offset_c3 (.q(cache_col_offset_c3[3:0]), |
| .din(sctag_scdata_col_offset_c2_buf[3:0]), |
| .clk(rclk), .se(se), .si(), .so()); |
| |
| dff_s #(4) ff_cache_col_offset_c4 (.q(cache_col_offset_c4[3:0]), |
| .din(cache_col_offset_c3[3:0]), |
| .clk(rclk), .se(se), .si(), .so()); |
| dff_s #(4) ff_cache_col_offset_c5 (.q(cache_col_offset_c5[3:0]), |
| .din(cache_col_offset_c4[3:0]), |
| .clk(rclk), .se(se), .si(), .so()); |
| |
| |
| |
| // word enables for writes |
| dff_s #(16) ff_cache_word_en_c3 (.q(cache_word_en_c3[15:0]), |
| .din(sctag_scdata_word_en_c2_buf[15:0]), |
| .clk(rclk), .se(se), .si(), .so()); |
| |
| // write enable into cache |
| dff_s #(1) ff_cache_wr_en_c3 (.q(cache_wr_en_c3), |
| .din(~sctag_scdata_rd_wr_c2_buf), |
| .clk(rclk), .se(se), .si(), .so()); |
| |
| assign cache_wr_en_c3_0 = cache_wr_en_c3; |
| assign cache_wr_en_c3_1 = cache_wr_en_c3; |
| assign cache_wr_en_c3_2 = cache_wr_en_c3; |
| assign cache_wr_en_c3_3 = cache_wr_en_c3; |
| |
| // sel fill data instead of store data. |
| dff_s #(1) ff_cache_sel_fbdecc_c4 (.q(cache_sel_fbdecc_c4), |
| .din(sctag_scdata_fbrd_c3_buf), |
| .clk(rclk), .se(se), .si(), .so()); |
| dff_s #(1) ff_cache_sel_fbdecc_c5 (.q(cache_sel_fbdecc_c5), |
| .din(cache_sel_fbdecc_c4), |
| .clk(rclk), .se(se), .si(), .so()); |
| |
| // sel fill buffer data over l2$ data. |
| dff_s #(1) ff_cache_fb_hit_c4 (.q(cache_fb_hit_c4), |
| .din(sctag_scdata_fb_hit_c3_buf), |
| .clk(rclk), .se(se), .si(), .so()); |
| dff_s #(1) ff_cache_fb_hit_c5 (.q(cache_fb_hit_c5), |
| .din(cache_fb_hit_c4), |
| .clk(rclk), .se(se), .si(), .so()); |
| |
| // store data |
| dff_s #(78) ff_st_decc_out_c3 (.q(st_decc_out_c3[77:0]), |
| .din(sctag_scdata_stdecc_c2_buf[77:0]), |
| .clk(rclk), .se(se), .si(), .so()); |
| |
| |
| mux2ds #(624) mux_cache_decc_in_c3 (.dout(cache_decc_in_c3[623:0]), |
| .in0({8{st_decc_out_c3[77:0]}}), |
| .in1(scbuf_scdata_fbdecc_c5[623:0]), |
| .sel0(~cache_sel_fbdecc_c5), |
| .sel1(cache_sel_fbdecc_c5)); |
| |
| dff_s #(156) ff_scdata_sctag_decc_c6 (.q(scdata_sctag_decc_c6_ctr[155:0]), |
| .din(scdata_sctag_decc_c5[155:0]), |
| .clk(rclk), .se(se), .si(), .so()); |
| |
| |
| |
| |
| mux2ds #(624) mux_rd_decc_out_c5 (.dout(rd_decc_out_c5[623:0]), |
| .in0(cache_decc_out_c5[623:0]), |
| .in1(scbuf_scdata_fbdecc_c5[623:0]), |
| .sel0(~cache_fb_hit_c5), |
| .sel1(cache_fb_hit_c5)); |
| |
| assign scdata_decc_out_c5[623:0] = rd_decc_out_c5[623:0]; |
| |
| dff_s #(624) ff_scdata_decc_out_c6 (.q(scdata_decc_out_c6[623:0]), |
| .din(scdata_decc_out_c5[623:0]), |
| .clk(rclk), .se(se), .si(), .so()); |
| |
| //////////////////////////////////////////////////////////////////////// |
| // The 64B-16B mux will be performed in the full custom data array. |
| // if the col offsets are non one hot, sctag will cause the hold signal |
| // to be high causing the output mux to hold its old value. |
| //////////////////////////////////////////////////////////////////////// |
| |
| |
| assign sel_decc_c5_23 = cache_col_offset_c5[3] || cache_col_offset_c5[2]; |
| |
| mux2ds #(156) mux_decc_c5_01 (.dout(decc_c5_01[155:0]), |
| .in0(rd_decc_out_c5[155:0]), |
| .in1(rd_decc_out_c5[311:156]), |
| .sel0(cache_col_offset_c5[0]), |
| .sel1(~cache_col_offset_c5[0])); |
| |
| mux2ds #(156) mux_decc_c5_23 (.dout(decc_c5_23[155:0]), |
| .in0(rd_decc_out_c5[467:312]), |
| .in1(rd_decc_out_c5[623:468]), |
| .sel0(cache_col_offset_c5[2]), |
| .sel1(~cache_col_offset_c5[2])); |
| |
| mux2ds #(156) mux_scdata_sctag_decc_c5 (.dout(scdata_sctag_decc_c5[155:0]), |
| .in0(decc_c5_01[155:0]), |
| .in1(decc_c5_23[155:0]), |
| .sel0(~sel_decc_c5_23), |
| .sel1(sel_decc_c5_23)); |
| |
| endmodule // scdata_ctr_io |
| |