| // ========== Copyright Header Begin ========================================== |
| // |
| // OpenSPARC T1 Processor File: lsu_dcdp.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 ============================================ |
| //////////////////////////////////////////////////////////////////////// |
| /* |
| // Description: LSU Data Cache Data Path |
| // - Final Way-Select Mux. |
| // - Alignment, Sign-Extension, Endianness. |
| */ |
| //////////////////////////////////////////////////////////////////////// |
| // Global header file includes |
| //////////////////////////////////////////////////////////////////////// |
| `include "sys.h" // system level definition file which contains the |
| // time scale definition |
| |
| //////////////////////////////////////////////////////////////////////// |
| // Local header file includes / local defines |
| //////////////////////////////////////////////////////////////////////// |
| |
| module lsu_dcdp ( /*AUTOARG*/ |
| // Outputs |
| so, dcache_rdata_wb_buf, mbist_dcache_data_in, |
| lsu_exu_dfill_data_w2, lsu_ffu_ld_data, stb_rdata_ramc_buf, |
| // Inputs |
| rclk, si, se, rst_tri_en, dcache_rdata_wb, dcache_rparity_wb, |
| dcache_rdata_msb_w0_m, dcache_rdata_msb_w1_m, |
| dcache_rdata_msb_w2_m, dcache_rdata_msb_w3_m, lsu_bist_rsel_way_e, |
| dcache_alt_mx_sel_e, cache_way_hit_buf2, morphed_addr_m, |
| signed_ldst_byte_m, signed_ldst_hw_m, signed_ldst_w_m, |
| merge7_sel_byte0_m, merge7_sel_byte7_m, merge6_sel_byte1_m, |
| merge6_sel_byte6_m, merge5_sel_byte2_m, merge5_sel_byte5_m, |
| merge4_sel_byte3_m, merge4_sel_byte4_m, merge3_sel_byte0_m, |
| merge3_sel_byte3_m, merge3_sel_byte4_m, |
| merge3_sel_byte7_default_m, merge3_sel_byte_m, merge2_sel_byte1_m, |
| merge2_sel_byte2_m, merge2_sel_byte5_m, |
| merge2_sel_byte6_default_m, merge2_sel_byte_m, merge0_sel_byte0_m, |
| merge0_sel_byte1_m, merge0_sel_byte2_m, |
| merge0_sel_byte3_default_m, merge0_sel_byte4_m, |
| merge0_sel_byte5_m, merge0_sel_byte6_m, |
| merge0_sel_byte7_default_m, merge1_sel_byte0_m, |
| merge1_sel_byte1_m, merge1_sel_byte2_m, |
| merge1_sel_byte3_default_m, merge1_sel_byte4_m, |
| merge1_sel_byte5_m, merge1_sel_byte6_m, |
| merge1_sel_byte7_default_m, merge0_sel_byte_1h_m, |
| merge1_sel_byte_1h_m, merge1_sel_byte_2h_m, stb_rdata_ramc |
| ) ; |
| |
| input rclk; |
| input si; |
| input se; |
| output so; |
| input rst_tri_en; |
| |
| input [63:0] dcache_rdata_wb; |
| output [63:0] dcache_rdata_wb_buf; |
| |
| input [7:0] dcache_rparity_wb; |
| output [71:0] mbist_dcache_data_in; |
| |
| output [63:0] lsu_exu_dfill_data_w2; // bypass data - d$ fill or hit |
| output [63:0] lsu_ffu_ld_data ; // ld data to frf |
| |
| |
| //========================================= |
| //dc_fill CP |
| //========================================= |
| input [7:0] dcache_rdata_msb_w0_m; //from D$ |
| input [7:0] dcache_rdata_msb_w1_m; //from D$ |
| input [7:0] dcache_rdata_msb_w2_m; //from D$ |
| input [7:0] dcache_rdata_msb_w3_m; //from D$ |
| |
| input [3:0] lsu_bist_rsel_way_e; //from qdp2 |
| |
| input dcache_alt_mx_sel_e; |
| input [3:0] cache_way_hit_buf2; //from dtlb |
| |
| input [7:0] morphed_addr_m; //from dctl |
| |
| input signed_ldst_byte_m; //from dctl |
| // input unsigned_ldst_byte_m; //from dctl |
| input signed_ldst_hw_m; //from dctl |
| // input unsigned_ldst_hw_m; //from dctl |
| input signed_ldst_w_m; //from dctl |
| // input unsigned_ldst_w_m; //from dctl |
| |
| input merge7_sel_byte0_m; |
| input merge7_sel_byte7_m; |
| |
| input merge6_sel_byte1_m; |
| input merge6_sel_byte6_m; |
| |
| input merge5_sel_byte2_m; |
| input merge5_sel_byte5_m; |
| |
| input merge4_sel_byte3_m; |
| input merge4_sel_byte4_m; |
| |
| input merge3_sel_byte0_m; |
| input merge3_sel_byte3_m; |
| input merge3_sel_byte4_m; |
| input merge3_sel_byte7_default_m; |
| input merge3_sel_byte_m ; |
| |
| input merge2_sel_byte1_m; |
| input merge2_sel_byte2_m; |
| input merge2_sel_byte5_m; |
| input merge2_sel_byte6_default_m; |
| input merge2_sel_byte_m ; |
| |
| input merge0_sel_byte0_m, merge0_sel_byte1_m; |
| input merge0_sel_byte2_m, merge0_sel_byte3_default_m; |
| |
| input merge0_sel_byte4_m, merge0_sel_byte5_m; |
| input merge0_sel_byte6_m, merge0_sel_byte7_default_m; |
| |
| input merge1_sel_byte0_m, merge1_sel_byte1_m; |
| input merge1_sel_byte2_m, merge1_sel_byte3_default_m; |
| input merge1_sel_byte4_m, merge1_sel_byte5_m; |
| input merge1_sel_byte6_m, merge1_sel_byte7_default_m; |
| |
| input merge0_sel_byte_1h_m ; |
| |
| input merge1_sel_byte_1h_m, merge1_sel_byte_2h_m ; |
| |
| input [14:9] stb_rdata_ramc; |
| output [14:9] stb_rdata_ramc_buf; |
| |
| //wire [3:1] lsu_byp_byte_zero_extend ; // zero-extend for bypass bytes 7-1 |
| wire [7:1] lsu_byp_byte_sign_extend ; // sign-extend by 1 for byp bytes 7-1 |
| |
| wire [7:0] byte0,byte1,byte2,byte3; |
| wire [7:0] byte4,byte5,byte6,byte7; |
| //wire [3:1] zero_extend_g; |
| wire [7:1] sign_extend_g; |
| |
| wire [7:0] align_byte3 ; |
| wire [7:0] align_byte2 ; |
| wire [7:0] align_byte1_1h,align_byte1_2h; |
| wire [7:0] align_byte0_1h,align_byte0_2h ; |
| wire [63:0] align_byte ; |
| |
| |
| wire merge7_sel_byte0; |
| wire merge7_sel_byte7; |
| |
| wire merge6_sel_byte1; |
| wire merge6_sel_byte6; |
| |
| wire merge5_sel_byte2; |
| wire merge5_sel_byte5; |
| |
| wire merge4_sel_byte3; |
| wire merge4_sel_byte4; |
| |
| wire merge3_sel_byte0; |
| wire merge3_sel_byte3; |
| wire merge3_sel_byte4; |
| wire merge3_sel_byte7; |
| wire merge3_sel_byte ; |
| |
| wire merge2_sel_byte1; |
| wire merge2_sel_byte2; |
| wire merge2_sel_byte5; |
| wire merge2_sel_byte6; |
| wire merge2_sel_byte ; |
| |
| wire merge0_sel_byte0, merge0_sel_byte1; |
| wire merge0_sel_byte2, merge0_sel_byte3; |
| wire merge0_sel_byte4, merge0_sel_byte5; |
| wire merge0_sel_byte6, merge0_sel_byte7; |
| wire merge1_sel_byte0, merge1_sel_byte1; |
| wire merge1_sel_byte2, merge1_sel_byte3; |
| wire merge1_sel_byte4, merge1_sel_byte5; |
| wire merge1_sel_byte6, merge1_sel_byte7; |
| |
| wire merge0_sel_byte_1h ; |
| wire merge1_sel_byte_1h, merge1_sel_byte_2h ; |
| |
| wire clk; |
| assign clk = rclk; |
| |
| assign stb_rdata_ramc_buf[14:9] = stb_rdata_ramc[14:9]; |
| |
| //========================================================================================= |
| // Alignment of Fill Data |
| //========================================================================================= |
| |
| // Alignment needs to be done for following reasons : |
| // - Write of data to irf on ld hit in l1. |
| // - Write of data to irf on ld fill to l1 after miss in l1. |
| // - Store of irf data to memory. |
| // - Data must be aligned before write to stb. |
| // - If data is bypassed from stb by ld then it will |
| // need realignment thru dfq i.e., it looks like a fill. |
| // This applies to data either read from the dcache (hit) or dfq(fill on miss). |
| |
| |
| assign byte7[7:0] = dcache_rdata_wb[63:56]; |
| assign byte6[7:0] = dcache_rdata_wb[55:48]; |
| assign byte5[7:0] = dcache_rdata_wb[47:40]; |
| assign byte4[7:0] = dcache_rdata_wb[39:32]; |
| assign byte3[7:0] = dcache_rdata_wb[31:24]; |
| assign byte2[7:0] = dcache_rdata_wb[23:16]; |
| assign byte1[7:0] = dcache_rdata_wb[15:8]; |
| assign byte0[7:0] = dcache_rdata_wb[7:0]; |
| |
| //assign zero_extend_g[3:1] = lsu_byp_byte_zero_extend[3:1] ; |
| assign sign_extend_g[7:1] = lsu_byp_byte_sign_extend[7:1] ; |
| |
| //buffer |
| assign dcache_rdata_wb_buf[63:0] = dcache_rdata_wb[63:0]; |
| assign mbist_dcache_data_in[71:0] = {dcache_rdata_wb_buf[63:0], dcache_rparity_wb[7:0]}; |
| |
| // Final endian/justified/sign-extend Byte 0. |
| //assign align_byte0_1h[7:0] |
| // = merge0_sel_byte0 ? byte0[7:0] : |
| // merge0_sel_byte1 ? byte1[7:0] : |
| // merge0_sel_byte2 ? byte2[7:0] : |
| // merge0_sel_byte3 ? byte3[7:0] : |
| // 8'hxx ; |
| |
| wire merge0_sel_byte0_mxsel0, merge0_sel_byte1_mxsel1, merge0_sel_byte2_mxsel2, merge0_sel_byte3_mxsel3; |
| assign merge0_sel_byte0_mxsel0 = merge0_sel_byte0 & ~rst_tri_en; |
| assign merge0_sel_byte1_mxsel1 = merge0_sel_byte1 & ~rst_tri_en; |
| assign merge0_sel_byte2_mxsel2 = merge0_sel_byte2 & ~rst_tri_en; |
| assign merge0_sel_byte3_mxsel3 = merge0_sel_byte3 | rst_tri_en; |
| |
| mux4ds #(8) align_byte0_1h_mx ( |
| .in0 (byte0[7:0]), |
| .in1 (byte1[7:0]), |
| .in2 (byte2[7:0]), |
| .in3 (byte3[7:0]), |
| .sel0(merge0_sel_byte0_mxsel0), |
| .sel1(merge0_sel_byte1_mxsel1), |
| .sel2(merge0_sel_byte2_mxsel2), |
| .sel3(merge0_sel_byte3_mxsel3), |
| .dout(align_byte0_1h[7:0]) |
| ); |
| |
| //assign align_byte0_2h[7:0] |
| // = merge0_sel_byte4 ? byte4[7:0] : |
| // merge0_sel_byte5 ? byte5[7:0] : |
| // merge0_sel_byte6 ? byte6[7:0] : |
| // merge0_sel_byte7 ? byte7[7:0] : |
| // 8'hxx ; |
| |
| wire merge0_sel_byte4_mxsel0, merge0_sel_byte5_mxsel1, merge0_sel_byte6_mxsel2, merge0_sel_byte7_mxsel3; |
| assign merge0_sel_byte4_mxsel0 = merge0_sel_byte4 & ~rst_tri_en; |
| assign merge0_sel_byte5_mxsel1 = merge0_sel_byte5 & ~rst_tri_en; |
| assign merge0_sel_byte6_mxsel2 = merge0_sel_byte6 & ~rst_tri_en; |
| assign merge0_sel_byte7_mxsel3 = merge0_sel_byte7 | rst_tri_en; |
| |
| mux4ds #(8) align_byte0_2h_mx ( |
| .in0 (byte4[7:0]), |
| .in1 (byte5[7:0]), |
| .in2 (byte6[7:0]), |
| .in3 (byte7[7:0]), |
| .sel0(merge0_sel_byte4_mxsel0), |
| .sel1(merge0_sel_byte5_mxsel1), |
| .sel2(merge0_sel_byte6_mxsel2), |
| .sel3(merge0_sel_byte7_mxsel3), |
| .dout(align_byte0_2h[7:0]) |
| ); |
| |
| // No sign-extension or zero-extension for byte0 |
| //assign align_byte[7:0] |
| // = merge0_sel_byte_1h ? align_byte0_1h[7:0] : |
| // align_byte0_2h[7:0] ; |
| |
| assign align_byte[7:0] = merge0_sel_byte_1h ? align_byte0_1h[7:0] : |
| align_byte0_2h[7:0]; |
| |
| |
| // Final endian/justified/sign-extend Byte 1. |
| // *** The path thru byte1 is the most critical *** |
| //assign align_byte1_1h[7:0] |
| // = merge1_sel_byte0 ? byte0[7:0] : |
| // merge1_sel_byte1 ? byte1[7:0] : |
| // merge1_sel_byte2 ? byte2[7:0] : |
| // merge1_sel_byte3 ? byte3[7:0] : |
| // 8'hxx ; |
| |
| wire merge1_sel_byte0_mxsel0, merge1_sel_byte1_mxsel1, merge1_sel_byte2_mxsel2, merge1_sel_byte3_mxsel3; |
| assign merge1_sel_byte0_mxsel0 = merge1_sel_byte0 & ~rst_tri_en; |
| assign merge1_sel_byte1_mxsel1 = merge1_sel_byte1 & ~rst_tri_en; |
| assign merge1_sel_byte2_mxsel2 = merge1_sel_byte2 & ~rst_tri_en; |
| assign merge1_sel_byte3_mxsel3 = merge1_sel_byte3 | rst_tri_en; |
| |
| mux4ds #(8) align_byte1_1h_mx ( |
| .in0 (byte0[7:0]), |
| .in1 (byte1[7:0]), |
| .in2 (byte2[7:0]), |
| .in3 (byte3[7:0]), |
| .sel0(merge1_sel_byte0_mxsel0), |
| .sel1(merge1_sel_byte1_mxsel1), |
| .sel2(merge1_sel_byte2_mxsel2), |
| .sel3(merge1_sel_byte3_mxsel3), |
| .dout(align_byte1_1h[7:0]) |
| ); |
| |
| //assign align_byte1_2h[7:0] |
| // = merge1_sel_byte4 ? byte4[7:0] : |
| // merge1_sel_byte5 ? byte5[7:0] : |
| // merge1_sel_byte6 ? byte6[7:0] : |
| // merge1_sel_byte7 ? byte7[7:0] : |
| // 8'hxx ; |
| |
| wire merge1_sel_byte4_mxsel0, merge1_sel_byte5_mxsel1, merge1_sel_byte6_mxsel2, merge1_sel_byte7_mxsel3; |
| assign merge1_sel_byte4_mxsel0 = merge1_sel_byte4 & ~rst_tri_en; |
| assign merge1_sel_byte5_mxsel1 = merge1_sel_byte5 & ~rst_tri_en; |
| assign merge1_sel_byte6_mxsel2 = merge1_sel_byte6 & ~rst_tri_en; |
| assign merge1_sel_byte7_mxsel3 = merge1_sel_byte7 | rst_tri_en; |
| |
| mux4ds #(8) align_byte1_2h_mx ( |
| .in0 (byte4[7:0]), |
| .in1 (byte5[7:0]), |
| .in2 (byte6[7:0]), |
| .in3 (byte7[7:0]), |
| .sel0(merge1_sel_byte4_mxsel0), |
| .sel1(merge1_sel_byte5_mxsel1), |
| .sel2(merge1_sel_byte6_mxsel2), |
| .sel3(merge1_sel_byte7_mxsel3), |
| .dout(align_byte1_2h[7:0]) |
| ); |
| |
| //assign align_byte[15:8] = |
| // zero_extend_g[1] ? 8'h00 : |
| // sign_extend_g[1] ? 8'hff : |
| // merge1_sel_byte_1h ? align_byte1_1h[7:0] : |
| // merge1_sel_byte_2h ? align_byte1_2h[7:0] : |
| // 8'hxx ; |
| |
| //mux4ds #(8) align_byte1_mx ( |
| // .in0 (8'h00), |
| // .in1 (8'hff), |
| // .in2 (align_byte1_1h[7:0]), |
| // .in3 (align_byte1_2h[7:0]), |
| // .sel0(zero_extend_g[1]), |
| // .sel1(sign_extend_g[1]), |
| // .sel2(merge1_sel_byte_1h), |
| // .sel3(merge1_sel_byte_2h), |
| // .dout(align_byte[15:8]) |
| //); |
| |
| //change to aoi from pass gate |
| //don't need zero_extend |
| |
| assign align_byte[15:8] = |
| (sign_extend_g[1] ? 8'hff : 8'h00) | |
| (merge1_sel_byte_1h ? align_byte1_1h[7:0] : 8'h00) | |
| (merge1_sel_byte_2h ? align_byte1_2h[7:0] : 8'h00); |
| |
| // Final endian/justified/sign-extend Byte 2. |
| //assign align_byte2[7:0] |
| // = merge2_sel_byte1 ? byte1[7:0] : |
| // merge2_sel_byte2 ? byte2[7:0] : |
| // merge2_sel_byte5 ? byte5[7:0] : |
| // merge2_sel_byte6 ? byte6[7:0] : |
| // 8'hxx ; |
| |
| wire merge2_sel_byte1_mxsel0, merge2_sel_byte2_mxsel1, merge2_sel_byte5_mxsel2, merge2_sel_byte6_mxsel3; |
| assign merge2_sel_byte1_mxsel0 = merge2_sel_byte1 & ~rst_tri_en; |
| assign merge2_sel_byte2_mxsel1 = merge2_sel_byte2 & ~rst_tri_en; |
| assign merge2_sel_byte5_mxsel2 = merge2_sel_byte5 & ~rst_tri_en; |
| assign merge2_sel_byte6_mxsel3 = merge2_sel_byte6 | rst_tri_en; |
| |
| mux4ds #(8) align_byte2_1st_mx ( |
| .in0 (byte1[7:0]), |
| .in1 (byte2[7:0]), |
| .in2 (byte5[7:0]), |
| .in3 (byte6[7:0]), |
| .sel0(merge2_sel_byte1_mxsel0), |
| .sel1(merge2_sel_byte2_mxsel1), |
| .sel2(merge2_sel_byte5_mxsel2), |
| .sel3(merge2_sel_byte6_mxsel3), |
| .dout(align_byte2[7:0]) |
| ); |
| |
| //assign align_byte[23:16] = |
| // zero_extend_g[2] ? 8'h00 : |
| // sign_extend_g[2] ? 8'hff : |
| // merge2_sel_byte ? align_byte2[7:0] : |
| // 8'hxx ; |
| |
| //mux3ds #(8) align_byte2_2nd_mx ( |
| // .in0 (8'h00), |
| // .in1 (8'hff), |
| // .in2 (align_byte2[7:0]), |
| // .sel0(zero_extend_g[2]), |
| // .sel1(sign_extend_g[2]), |
| // .sel2(merge2_sel_byte), |
| // .dout(align_byte[23:16]) |
| // ); |
| |
| assign align_byte[23:16] = |
| ( sign_extend_g[2] ? 8'hff : 8'h00) | |
| ( merge2_sel_byte ? align_byte2[7:0] : 8'h00); |
| |
| // Final endian/justified/sign-extend Byte 3. |
| //assign align_byte3[7:0] |
| // = merge3_sel_byte0 ? byte0[7:0] : |
| // merge3_sel_byte3 ? byte3[7:0] : |
| // merge3_sel_byte4 ? byte4[7:0] : |
| // merge3_sel_byte7 ? byte7[7:0] : |
| // 8'hxx ; |
| |
| wire merge3_sel_byte0_mxsel0, merge3_sel_byte3_mxsel1, merge3_sel_byte4_mxsel2, merge3_sel_byte7_mxsel3; |
| assign merge3_sel_byte0_mxsel0 = merge3_sel_byte0 & ~rst_tri_en; |
| assign merge3_sel_byte3_mxsel1 = merge3_sel_byte3 & ~rst_tri_en; |
| assign merge3_sel_byte4_mxsel2 = merge3_sel_byte4 & ~rst_tri_en; |
| assign merge3_sel_byte7_mxsel3 = merge3_sel_byte7 | rst_tri_en; |
| |
| mux4ds #(8) align_byte3_1st_mx ( |
| .in0 (byte0[7:0]), |
| .in1 (byte3[7:0]), |
| .in2 (byte4[7:0]), |
| .in3 (byte7[7:0]), |
| .sel0(merge3_sel_byte0_mxsel0), |
| .sel1(merge3_sel_byte3_mxsel1), |
| .sel2(merge3_sel_byte4_mxsel2), |
| .sel3(merge3_sel_byte7_mxsel3), |
| .dout(align_byte3[7:0]) |
| ); |
| |
| //assign align_byte[31:24] = |
| // zero_extend_g[3] ? 8'h00 : |
| // sign_extend_g[3] ? 8'hff : |
| // merge3_sel_byte ? align_byte3[7:0] : |
| // 8'hxx ; |
| |
| //mux3ds #(8) align_byte3_2nd_mx ( |
| // .in0 (8'h00), |
| // .in1 (8'hff), |
| // .in2 (align_byte3[7:0]), |
| // .sel0(zero_extend_g[3]), |
| // .sel1(sign_extend_g[3]), |
| // .sel2(merge3_sel_byte), |
| // .dout(align_byte[31:24]) |
| // ); |
| |
| assign align_byte[31:24] = |
| (sign_extend_g[3] ? 8'hff : 8'h00 ) | |
| (merge3_sel_byte ? align_byte3[7:0] : 8'h00); |
| |
| // Final endian/justified/sign-extend Byte 4. |
| //assign align_byte[39:32] |
| // = zero_extend_g[4] ? 8'h00 : |
| // sign_extend_g[4] ? 8'hff : |
| // merge4_sel_byte3 ? byte3[7:0] : |
| // merge4_sel_byte4 ? byte4[7:0] : |
| // 8'hxx; |
| |
| //mux4ds #(8) align_byte4_mx ( |
| // .in0 (8'h00), |
| // .in1 (8'hff), |
| // .in2 (byte3[7:0]), |
| // .in3 (byte4[7:0]), |
| // .sel0(zero_extend_g[4]), |
| // .sel1(sign_extend_g[4]), |
| // .sel2(merge4_sel_byte3), |
| // .sel3(merge4_sel_byte4), |
| // .dout(align_byte[39:32]) |
| // ); |
| |
| assign align_byte[39:32] = |
| (sign_extend_g[4] ? 8'hff : 8'h00) | |
| (merge4_sel_byte3 ? byte3[7:0] : 8'h00) | |
| (merge4_sel_byte4 ? byte4[7:0] : 8'h00); |
| |
| // Final endian/justified/sign-extend Byte 5. |
| //assign align_byte[47:40] |
| // = zero_extend_g[5] ? 8'h00 : |
| // sign_extend_g[5] ? 8'hff : |
| // merge5_sel_byte2 ? byte2[7:0] : |
| // merge5_sel_byte5 ? byte5[7:0] : |
| // 8'hxx ; |
| |
| //mux4ds #(8) align_byte5_mx ( |
| // .in0 (8'h00), |
| // .in1 (8'hff), |
| // .in2 (byte2[7:0]), |
| // .in3 (byte5[7:0]), |
| // .sel0(zero_extend_g[5]), |
| // .sel1(sign_extend_g[5]), |
| // .sel2(merge5_sel_byte2), |
| // .sel3(merge5_sel_byte5), |
| // .dout(align_byte[47:40]) |
| // ); |
| |
| assign align_byte[47:40] = |
| (sign_extend_g[5] ? 8'hff : 8'h00) | |
| (merge5_sel_byte2 ? byte2[7:0] : 8'h00) | |
| (merge5_sel_byte5 ? byte5[7:0] : 8'h00); |
| |
| |
| // Final endian/justified/sign-extend Byte 6. |
| //assign align_byte[55:48] |
| // = zero_extend_g[6] ? 8'h00 : |
| // sign_extend_g[6] ? 8'hff : |
| // merge6_sel_byte1 ? byte1[7:0] : |
| // merge6_sel_byte6 ? byte6[7:0] : |
| // 8'hxx ; |
| |
| //mux4ds #(8) align_byte6_mx ( |
| // .in0 (8'h00), |
| // .in1 (8'hff), |
| // .in2 (byte1[7:0]), |
| // .in3 (byte6[7:0]), |
| // .sel0(zero_extend_g[6]), |
| // .sel1(sign_extend_g[6]), |
| // .sel2(merge6_sel_byte1), |
| // .sel3(merge6_sel_byte6), |
| // .dout(align_byte[55:48]) |
| // ); |
| |
| assign align_byte[55:48] = |
| (sign_extend_g[6] ? 8'hff : 8'h00) | |
| (merge6_sel_byte1 ? byte1[7:0] : 8'h00) | |
| (merge6_sel_byte6 ? byte6[7:0] : 8'h00); |
| |
| |
| // Final endian/justified/sign-extend Byte 7. |
| //assign align_byte[63:56] = |
| // zero_extend_g[7] ? 8'h00 : |
| // sign_extend_g[7] ? 8'hff : |
| // merge7_sel_byte0 ? byte0[7:0] : |
| // merge7_sel_byte7 ? byte7[7:0] : |
| // 8'hxx ; |
| |
| //mux4ds #(8) align_byte7_mx ( |
| // .in0 (8'h00), |
| // .in1 (8'hff), |
| // .in2 (byte0[7:0]), |
| // .in3 (byte7[7:0]), |
| // .sel0(zero_extend_g[7]), |
| // .sel1(sign_extend_g[7]), |
| // .sel2(merge7_sel_byte0), |
| // .sel3(merge7_sel_byte7), |
| // .dout(align_byte[63:56]) |
| // ); |
| |
| assign align_byte[63:56] = |
| (sign_extend_g[7] ? 8'hff : 8'h00 ) | |
| (merge7_sel_byte0 ? byte0[7:0] : 8'h00) | |
| (merge7_sel_byte7 ? byte7[7:0] : 8'h00); |
| |
| //==================================================== |
| //dc_fill CP sign/zero control signals |
| //==================================================== |
| wire [7:0] ld_data_msb_w0_m; |
| wire [7:0] ld_data_msb_w1_m; |
| wire [7:0] ld_data_msb_w2_m; |
| wire [7:0] ld_data_msb_w3_m; |
| |
| wire [7:0] ld_data_msb_w0_g; |
| wire [7:0] ld_data_msb_w1_g; |
| wire [7:0] ld_data_msb_w2_g; |
| wire [7:0] ld_data_msb_w3_g; |
| |
| assign ld_data_msb_w0_m[7:0] = dcache_rdata_msb_w0_m[7:0]; |
| assign ld_data_msb_w1_m[7:0] = dcache_rdata_msb_w1_m[7:0]; |
| assign ld_data_msb_w2_m[7:0] = dcache_rdata_msb_w2_m[7:0]; |
| assign ld_data_msb_w3_m[7:0] = dcache_rdata_msb_w3_m[7:0]; |
| |
| dff_s #(32) ld_data_msb_stgg ( |
| .din ({ld_data_msb_w0_m[7:0], ld_data_msb_w1_m[7:0], ld_data_msb_w2_m[7:0], ld_data_msb_w3_m[7:0]}), |
| .q ({ld_data_msb_w0_g[7:0], ld_data_msb_w1_g[7:0], ld_data_msb_w2_g[7:0], ld_data_msb_w3_g[7:0]}), |
| .clk (clk), |
| .se (se), .si (), .so () |
| ); |
| |
| wire [3:0] dcache_alt_rsel_way_m; |
| wire dcache_alt_mx_sel_m; |
| |
| dff_s #(5) dcache_alt_stgm ( |
| .din ({lsu_bist_rsel_way_e[3:0], dcache_alt_mx_sel_e}), |
| .q ({dcache_alt_rsel_way_m[3:0], dcache_alt_mx_sel_m}), |
| .clk (clk), |
| .se (se), .si (), .so () |
| ); |
| |
| wire [3:0] dcache_alt_rsel_way_g; |
| wire dcache_alt_mx_sel_g; |
| |
| dff_s #(5) dcache_alt_stgg ( |
| .din ({dcache_alt_rsel_way_m[3:0], dcache_alt_mx_sel_m}), |
| .q ({dcache_alt_rsel_way_g[3:0], dcache_alt_mx_sel_g}), |
| .clk (clk), |
| .se (se), .si (), .so () |
| ); |
| wire [3:0] cache_way_mx_sel; |
| |
| assign cache_way_mx_sel [3:0] = dcache_alt_mx_sel_g ? dcache_alt_rsel_way_g[3:0] : cache_way_hit_buf2[3:0]; |
| |
| // wire [7:0] align_bytes_msb; |
| |
| //mux4ds #(8) align_bytes_msb_mux ( |
| // .in0 (ld_data_msb_w0_g[7:0]), |
| // .in1 (ld_data_msb_w1_g[7:0]), |
| // .in2 (ld_data_msb_w2_g[7:0]), |
| // .in3 (ld_data_msb_w3_g[7:0]), |
| // .sel0 (cache_way_mx_sel[0]), |
| // .sel1 (cache_way_mx_sel[1]), |
| // .sel2 (cache_way_mx_sel[2]), |
| // .sel3 (cache_way_mx_sel[3]), |
| // .dout (align_bytes_msb[7:0]) |
| //); |
| |
| wire signed_ldst_byte_g; |
| wire signed_ldst_hw_g; |
| wire signed_ldst_w_g; |
| |
| dff_s #(3) ldst_size_stgg( |
| .din ({signed_ldst_byte_m, signed_ldst_hw_m, signed_ldst_w_m}), |
| .q ({signed_ldst_byte_g, signed_ldst_hw_g, signed_ldst_w_g}), |
| .clk (clk), |
| .se (se), .si (), .so () |
| ); |
| |
| wire [7:0] morphed_addr_g; |
| |
| dff_s #(8) stgg_morphadd( |
| .din (morphed_addr_m[7:0]), |
| .q (morphed_addr_g[7:0]), |
| .clk (clk), |
| .se (se), .si (), .so () |
| ); |
| |
| wire sign_bit_w0_g, sign_bit_w1_g, sign_bit_w2_g, sign_bit_w3_g; |
| |
| assign sign_bit_w0_g = |
| (morphed_addr_g[0] & ld_data_msb_w0_g[7]) | |
| (morphed_addr_g[1] & ld_data_msb_w0_g[6]) | |
| (morphed_addr_g[2] & ld_data_msb_w0_g[5]) | |
| (morphed_addr_g[3] & ld_data_msb_w0_g[4]) | |
| (morphed_addr_g[4] & ld_data_msb_w0_g[3]) | |
| (morphed_addr_g[5] & ld_data_msb_w0_g[2]) | |
| (morphed_addr_g[6] & ld_data_msb_w0_g[1]) | |
| (morphed_addr_g[7] & ld_data_msb_w0_g[0]) ; |
| |
| assign sign_bit_w1_g = |
| (morphed_addr_g[0] & ld_data_msb_w1_g[7]) | |
| (morphed_addr_g[1] & ld_data_msb_w1_g[6]) | |
| (morphed_addr_g[2] & ld_data_msb_w1_g[5]) | |
| (morphed_addr_g[3] & ld_data_msb_w1_g[4]) | |
| (morphed_addr_g[4] & ld_data_msb_w1_g[3]) | |
| (morphed_addr_g[5] & ld_data_msb_w1_g[2]) | |
| (morphed_addr_g[6] & ld_data_msb_w1_g[1]) | |
| (morphed_addr_g[7] & ld_data_msb_w1_g[0]) ; |
| |
| assign sign_bit_w2_g = |
| (morphed_addr_g[0] & ld_data_msb_w2_g[7]) | |
| (morphed_addr_g[1] & ld_data_msb_w2_g[6]) | |
| (morphed_addr_g[2] & ld_data_msb_w2_g[5]) | |
| (morphed_addr_g[3] & ld_data_msb_w2_g[4]) | |
| (morphed_addr_g[4] & ld_data_msb_w2_g[3]) | |
| (morphed_addr_g[5] & ld_data_msb_w2_g[2]) | |
| (morphed_addr_g[6] & ld_data_msb_w2_g[1]) | |
| (morphed_addr_g[7] & ld_data_msb_w2_g[0]) ; |
| |
| assign sign_bit_w3_g = |
| (morphed_addr_g[0] & ld_data_msb_w3_g[7]) | |
| (morphed_addr_g[1] & ld_data_msb_w3_g[6]) | |
| (morphed_addr_g[2] & ld_data_msb_w3_g[5]) | |
| (morphed_addr_g[3] & ld_data_msb_w3_g[4]) | |
| (morphed_addr_g[4] & ld_data_msb_w3_g[3]) | |
| (morphed_addr_g[5] & ld_data_msb_w3_g[2]) | |
| (morphed_addr_g[6] & ld_data_msb_w3_g[1]) | |
| (morphed_addr_g[7] & ld_data_msb_w3_g[0]) ; |
| |
| //assign sign_bit_g = |
| // (morphed_addr_g[0] & align_bytes_msb[7]) | |
| // (morphed_addr_g[1] & align_bytes_msb[6]) | |
| // (morphed_addr_g[2] & align_bytes_msb[5]) | |
| // (morphed_addr_g[3] & align_bytes_msb[4]) | |
| // (morphed_addr_g[4] & align_bytes_msb[3]) | |
| // (morphed_addr_g[5] & align_bytes_msb[2]) | |
| // (morphed_addr_g[6] & align_bytes_msb[1]) | |
| // (morphed_addr_g[7] & align_bytes_msb[0]) ; |
| |
| |
| //dff #(4) ssign_bit_stgg ( |
| // .din ({sign_bit_w0_m, sign_bit_w1_m, sign_bit_w2_m, sign_bit_w3_m}), |
| // .q ({sign_bit_w0_g, sign_bit_w1_g, sign_bit_w2_g, sign_bit_w3_g}), |
| // .clk (clk), |
| // .se (se), .si (), .so () |
| // ); |
| |
| // byte0 never requires sign or zero extension. |
| //w0 |
| // wire [3:1] lsu_byp_byte_zero_extend_w0; |
| wire [7:1] lsu_byp_byte_sign_extend_w0; |
| |
| //assign lsu_byp_byte_zero_extend_w0[1] = |
| // unsigned_ldst_byte_g | (signed_ldst_byte_g & ~sign_bit_w0_g); |
| |
| assign lsu_byp_byte_sign_extend_w0[1] = |
| signed_ldst_byte_g & sign_bit_w0_g; |
| |
| //assign lsu_byp_byte_zero_extend_w0[2] = |
| // unsigned_ldst_hw_g | (signed_ldst_hw_g & ~sign_bit_w0_g); |
| |
| assign lsu_byp_byte_sign_extend_w0[2] = |
| signed_ldst_hw_g & sign_bit_w0_g; |
| |
| //assign lsu_byp_byte_zero_extend_w0[3] = |
| // lsu_byp_byte_zero_extend_w0[2] ; |
| |
| assign lsu_byp_byte_sign_extend_w0[3] = |
| lsu_byp_byte_sign_extend_w0[2] ; |
| |
| //assign lsu_byp_byte_zero_extend_w0[4] = |
| // unsigned_ldst_w_g | (signed_ldst_w_g & ~sign_bit_w0_g); |
| |
| assign lsu_byp_byte_sign_extend_w0[4] = |
| signed_ldst_w_g & sign_bit_w0_g; |
| |
| //assign lsu_byp_byte_zero_extend_w0[5] = |
| // lsu_byp_byte_zero_extend_w0[4] ; |
| assign lsu_byp_byte_sign_extend_w0[5] = |
| lsu_byp_byte_sign_extend_w0[4] ; |
| //assign lsu_byp_byte_zero_extend_w0[6] = |
| // lsu_byp_byte_zero_extend_w0[4] ; |
| assign lsu_byp_byte_sign_extend_w0[6] = |
| lsu_byp_byte_sign_extend_w0[4] ; |
| //assign lsu_byp_byte_zero_extend_w0[7] = |
| // lsu_byp_byte_zero_extend_w0[4] ; |
| assign lsu_byp_byte_sign_extend_w0[7] = |
| lsu_byp_byte_sign_extend_w0[4] ; |
| |
| //w1 |
| // wire [3:1] lsu_byp_byte_zero_extend_w1; |
| wire [7:1] lsu_byp_byte_sign_extend_w1; |
| |
| //assign lsu_byp_byte_zero_extend_w1[1] = |
| // unsigned_ldst_byte_g | (signed_ldst_byte_g & ~sign_bit_w1_g); |
| |
| assign lsu_byp_byte_sign_extend_w1[1] = |
| signed_ldst_byte_g & sign_bit_w1_g; |
| |
| //assign lsu_byp_byte_zero_extend_w1[2] = |
| // unsigned_ldst_hw_g | (signed_ldst_hw_g & ~sign_bit_w1_g); |
| |
| assign lsu_byp_byte_sign_extend_w1[2] = |
| signed_ldst_hw_g & sign_bit_w1_g; |
| |
| //assign lsu_byp_byte_zero_extend_w1[3] = |
| // lsu_byp_byte_zero_extend_w1[2] ; |
| |
| assign lsu_byp_byte_sign_extend_w1[3] = |
| lsu_byp_byte_sign_extend_w1[2] ; |
| |
| //assign lsu_byp_byte_zero_extend_w1[4] = |
| // unsigned_ldst_w_g | (signed_ldst_w_g & ~sign_bit_w1_g); |
| |
| assign lsu_byp_byte_sign_extend_w1[4] = |
| signed_ldst_w_g & sign_bit_w1_g; |
| |
| //assign lsu_byp_byte_zero_extend_w1[5] = |
| // lsu_byp_byte_zero_extend_w1[4] ; |
| assign lsu_byp_byte_sign_extend_w1[5] = |
| lsu_byp_byte_sign_extend_w1[4] ; |
| //assign lsu_byp_byte_zero_extend_w1[6] = |
| // lsu_byp_byte_zero_extend_w1[4] ; |
| assign lsu_byp_byte_sign_extend_w1[6] = |
| lsu_byp_byte_sign_extend_w1[4] ; |
| //assign lsu_byp_byte_zero_extend_w1[7] = |
| // lsu_byp_byte_zero_extend_w1[4] ; |
| assign lsu_byp_byte_sign_extend_w1[7] = |
| lsu_byp_byte_sign_extend_w1[4] ; |
| |
| //w2 |
| // wire [3:1] lsu_byp_byte_zero_extend_w2; |
| wire [7:1] lsu_byp_byte_sign_extend_w2; |
| |
| //assign lsu_byp_byte_zero_extend_w2[1] = |
| // unsigned_ldst_byte_g | (signed_ldst_byte_g & ~sign_bit_w2_g); |
| |
| assign lsu_byp_byte_sign_extend_w2[1] = |
| signed_ldst_byte_g & sign_bit_w2_g; |
| |
| //assign lsu_byp_byte_zero_extend_w2[2] = |
| // unsigned_ldst_hw_g | (signed_ldst_hw_g & ~sign_bit_w2_g); |
| |
| assign lsu_byp_byte_sign_extend_w2[2] = |
| signed_ldst_hw_g & sign_bit_w2_g; |
| |
| //assign lsu_byp_byte_zero_extend_w2[3] = |
| // lsu_byp_byte_zero_extend_w2[2] ; |
| |
| assign lsu_byp_byte_sign_extend_w2[3] = |
| lsu_byp_byte_sign_extend_w2[2] ; |
| |
| //assign lsu_byp_byte_zero_extend_w2[4] = |
| // unsigned_ldst_w_g | (signed_ldst_w_g & ~sign_bit_w2_g); |
| |
| assign lsu_byp_byte_sign_extend_w2[4] = |
| signed_ldst_w_g & sign_bit_w2_g; |
| |
| //assign lsu_byp_byte_zero_extend_w2[5] = |
| // lsu_byp_byte_zero_extend_w2[4] ; |
| assign lsu_byp_byte_sign_extend_w2[5] = |
| lsu_byp_byte_sign_extend_w2[4] ; |
| //assign lsu_byp_byte_zero_extend_w2[6] = |
| // lsu_byp_byte_zero_extend_w2[4] ; |
| assign lsu_byp_byte_sign_extend_w2[6] = |
| lsu_byp_byte_sign_extend_w2[4] ; |
| //assign lsu_byp_byte_zero_extend_w2[7] = |
| // lsu_byp_byte_zero_extend_w2[4] ; |
| assign lsu_byp_byte_sign_extend_w2[7] = |
| lsu_byp_byte_sign_extend_w2[4] ; |
| |
| //w3 |
| // wire [3:1] lsu_byp_byte_zero_extend_w3; |
| wire [7:1] lsu_byp_byte_sign_extend_w3; |
| |
| //assign lsu_byp_byte_zero_extend_w3[1] = |
| // unsigned_ldst_byte_g | (signed_ldst_byte_g & ~sign_bit_w3_g); |
| |
| assign lsu_byp_byte_sign_extend_w3[1] = |
| signed_ldst_byte_g & sign_bit_w3_g; |
| |
| //assign lsu_byp_byte_zero_extend_w3[2] = |
| // unsigned_ldst_hw_g | (signed_ldst_hw_g & ~sign_bit_w3_g); |
| |
| assign lsu_byp_byte_sign_extend_w3[2] = |
| signed_ldst_hw_g & sign_bit_w3_g; |
| |
| //assign lsu_byp_byte_zero_extend_w3[3] = |
| // lsu_byp_byte_zero_extend_w3[2] ; |
| |
| assign lsu_byp_byte_sign_extend_w3[3] = |
| lsu_byp_byte_sign_extend_w3[2] ; |
| |
| //assign lsu_byp_byte_zero_extend_w3[4] = |
| // unsigned_ldst_w_g | (signed_ldst_w_g & ~sign_bit_w3_g); |
| |
| assign lsu_byp_byte_sign_extend_w3[4] = |
| signed_ldst_w_g & sign_bit_w3_g; |
| |
| //assign lsu_byp_byte_zero_extend_w3[5] = |
| // lsu_byp_byte_zero_extend_w3[4] ; |
| assign lsu_byp_byte_sign_extend_w3[5] = |
| lsu_byp_byte_sign_extend_w3[4] ; |
| //assign lsu_byp_byte_zero_extend_w3[6] = |
| // lsu_byp_byte_zero_extend_w3[4] ; |
| assign lsu_byp_byte_sign_extend_w3[6] = |
| lsu_byp_byte_sign_extend_w3[4] ; |
| //assign lsu_byp_byte_zero_extend_w3[7] = |
| // lsu_byp_byte_zero_extend_w3[4] ; |
| assign lsu_byp_byte_sign_extend_w3[7] = |
| lsu_byp_byte_sign_extend_w3[4] ; |
| |
| |
| //mux4ds #(14) zero_sign_sel_mux ( |
| // .in0 ({lsu_byp_byte_zero_extend_w0[7:1],lsu_byp_byte_sign_extend_w0[7:1]}), |
| // .in1 ({lsu_byp_byte_zero_extend_w1[7:1],lsu_byp_byte_sign_extend_w1[7:1]}), |
| // .in2 ({lsu_byp_byte_zero_extend_w2[7:1],lsu_byp_byte_sign_extend_w2[7:1]}), |
| // .in3 ({lsu_byp_byte_zero_extend_w3[7:1],lsu_byp_byte_sign_extend_w3[7:1]}), |
| // .sel0 (cache_way_mx_sel[0]), |
| // .sel1 (cache_way_mx_sel[1]), |
| // .sel2 (cache_way_mx_sel[2]), |
| // .sel3 (cache_way_mx_sel[3]), |
| // .dout ({lsu_byp_byte_zero_extend[7:1],lsu_byp_byte_sign_extend[7:1]}) |
| //); |
| |
| //assign lsu_byp_byte_zero_extend[3:1] = |
| // (cache_way_mx_sel[0] ? lsu_byp_byte_zero_extend_w0[3:1] : 3'b0 ) | |
| // (cache_way_mx_sel[1] ? lsu_byp_byte_zero_extend_w1[3:1] : 3'b0 ) | |
| // (cache_way_mx_sel[2] ? lsu_byp_byte_zero_extend_w2[3:1] : 3'b0 ) | |
| // (cache_way_mx_sel[3] ? lsu_byp_byte_zero_extend_w3[3:1] : 3'b0 ) ; |
| |
| assign lsu_byp_byte_sign_extend[7:1] = |
| (cache_way_mx_sel[0] ? lsu_byp_byte_sign_extend_w0[7:1] : 7'b0) | |
| (cache_way_mx_sel[1] ? lsu_byp_byte_sign_extend_w1[7:1] : 7'b0) | |
| (cache_way_mx_sel[2] ? lsu_byp_byte_sign_extend_w2[7:1] : 7'b0) | |
| (cache_way_mx_sel[3] ? lsu_byp_byte_sign_extend_w3[7:1] : 7'b0) ; |
| |
| |
| |
| dff_s #(37) stgg_mergesel( |
| .din ({ |
| merge7_sel_byte0_m, merge7_sel_byte7_m, |
| merge6_sel_byte1_m, merge6_sel_byte6_m, |
| merge5_sel_byte2_m, merge5_sel_byte5_m, |
| merge4_sel_byte3_m, merge4_sel_byte4_m, |
| merge3_sel_byte0_m, merge3_sel_byte3_m, |
| merge3_sel_byte4_m, merge3_sel_byte7_default_m, merge3_sel_byte_m, |
| merge2_sel_byte1_m, merge2_sel_byte2_m, merge2_sel_byte5_m, |
| merge2_sel_byte6_default_m, merge2_sel_byte_m, |
| merge0_sel_byte0_m, merge0_sel_byte1_m, |
| merge0_sel_byte2_m, merge0_sel_byte3_default_m, |
| merge0_sel_byte4_m, merge0_sel_byte5_m, |
| merge0_sel_byte6_m, merge0_sel_byte7_default_m, |
| merge1_sel_byte0_m, merge1_sel_byte1_m, |
| merge1_sel_byte2_m, merge1_sel_byte3_default_m, |
| merge1_sel_byte4_m, merge1_sel_byte5_m, |
| merge1_sel_byte6_m, merge1_sel_byte7_default_m, |
| merge0_sel_byte_1h_m,merge1_sel_byte_1h_m, merge1_sel_byte_2h_m |
| }), |
| .q ({ |
| merge7_sel_byte0, merge7_sel_byte7, |
| merge6_sel_byte1, merge6_sel_byte6, |
| merge5_sel_byte2, merge5_sel_byte5, |
| merge4_sel_byte3, merge4_sel_byte4, |
| merge3_sel_byte0, merge3_sel_byte3, |
| merge3_sel_byte4, merge3_sel_byte7,merge3_sel_byte, |
| merge2_sel_byte1, merge2_sel_byte2, merge2_sel_byte5, |
| merge2_sel_byte6, merge2_sel_byte, |
| merge0_sel_byte0, merge0_sel_byte1, |
| merge0_sel_byte2, merge0_sel_byte3, |
| merge0_sel_byte4, merge0_sel_byte5, |
| merge0_sel_byte6, merge0_sel_byte7, |
| merge1_sel_byte0, merge1_sel_byte1, |
| merge1_sel_byte2, merge1_sel_byte3, |
| merge1_sel_byte4, merge1_sel_byte5, |
| merge1_sel_byte6, merge1_sel_byte7, |
| merge0_sel_byte_1h,merge1_sel_byte_1h, merge1_sel_byte_2h |
| }), |
| .clk (clk), |
| .se (se), .si (), .so () |
| ); |
| |
| |
| assign lsu_exu_dfill_data_w2[63:0] = align_byte[63:0] ; |
| assign lsu_ffu_ld_data[63:0] = align_byte[63:0] ; |
| |
| endmodule |
| |
| |