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