| // ========== Copyright Header Begin ========================================== |
| // |
| // OpenSPARC T1 Processor File: lsu_qdp1.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 PCX Datapath - QDP1 |
| */ |
| //////////////////////////////////////////////////////////////////////// |
| // header file includes |
| //////////////////////////////////////////////////////////////////////// |
| `include "sys.h" // system level definition file which contains the |
| // time scale definition |
| `include "iop.h" |
| `include "lsu.h" |
| |
| //////////////////////////////////////////////////////////////////////// |
| // Local header file includes / local defines |
| //////////////////////////////////////////////////////////////////////// |
| |
| //FPGA_SYN enables all FPGA related modifications |
| `ifdef FPGA_SYN |
| `define FPGA_SYN_CLK_EN |
| `define FPGA_SYN_CLK_DFF |
| `endif |
| |
| module lsu_qdp1 ( /*AUTOARG*/ |
| // Outputs |
| so, lsu_va_match_b47_b32_m, lsu_va_match_b31_b3_m, lsu_va_wtchpt_addr, spc_pcx_data_pa, |
| dtag_wdata_m, lmq0_byp_misc_sz, lmq1_byp_misc_sz, |
| lmq2_byp_misc_sz, lmq3_byp_misc_sz, lsu_byp_misc_sz_e, |
| lsu_l2fill_sign_extend_m, lsu_l2fill_bendian_m, lmq0_l2fill_fpld, |
| lmq1_l2fill_fpld, lmq2_l2fill_fpld, lmq3_l2fill_fpld, lmq_ld_rd1, |
| lmq0_ncache_ld, lmq1_ncache_ld, lmq2_ncache_ld, lmq3_ncache_ld, |
| lmq0_ld_rq_type, lmq1_ld_rq_type, lmq2_ld_rq_type, |
| lmq3_ld_rq_type, lmq0_ldd_vld, lmq1_ldd_vld, lmq2_ldd_vld, |
| lmq3_ldd_vld, ld_sec_hit_thrd0, ld_sec_hit_thrd1, |
| ld_sec_hit_thrd2, ld_sec_hit_thrd3, lmq0_pcx_pkt_addr, |
| lmq1_pcx_pkt_addr, lmq2_pcx_pkt_addr, lmq3_pcx_pkt_addr, |
| lsu_mmu_rs3_data_g, lsu_tlu_rs3_data_g, lsu_diagnstc_wr_data_b0, |
| lsu_diagnstc_wr_data_e, lsu_ifu_stxa_data, |
| lsu_ifu_ld_icache_index, lsu_ifu_ld_pcxpkt_tid, lsu_error_pa_m, |
| lsu_pref_pcx_req, st_rs3_data_g, lsu_ldst_va_way_g, |
| dcache_alt_data_w0_m, |
| // Inputs |
| rclk, si, se, lsu_dcache_iob_rd_w, lsu_ramtest_rd_w, |
| lsu_pcx_rq_sz_b3, lsu_diagnstc_data_sel, pcx_pkt_src_sel, |
| lsu_stb_pcx_rvld_d1, imiss_pcx_mx_sel, fwd_int_fp_pcx_mx_sel, |
| spu_lsu_ldst_pckt, tlu_lsu_pcxpkt, const_cpuid, ifu_pcx_pkt, |
| lmq_byp_data_en_w2, lmq_byp_data_sel0, lmq_byp_data_sel1, |
| lmq_byp_data_sel2, lmq_byp_data_sel3, lmq_byp_ldxa_sel0, |
| lmq_byp_ldxa_sel1, lmq_byp_ldxa_sel2, lmq_byp_ldxa_sel3, |
| lmq_byp_data_fmx_sel, exu_lsu_rs3_data_e, ifu_lsu_ldxa_data_w2, |
| tlu_lsu_int_ldxa_data_w2, spu_lsu_ldxa_data_w2, stb_rdata_ramd, |
| stb_rdata_ramc, lmq_byp_misc_sel, dfq_byp_sel, ld_pcx_rq_sel, |
| ld_pcx_thrd, lmq_enable, ld_pcx_pkt_g, ffu_lsu_data, |
| lsu_tlb_st_sel_m, lsu_pcx_fwd_pkt, lsu_pcx_fwd_reply, |
| lsu_diagnstc_dtagv_prty_invrt_e, lsu_misc_rdata_w2, |
| lsu_stb_rd_tid, lsu_iobrdge_rply_data_sel, lsu_iobrdge_rd_data, |
| lsu_atomic_pkt2_bsel_g, lsu_pcx_ld_dtag_perror_w2, |
| lsu_dcache_rdata_w, lsu_va_wtchpt0_wr_en_l, |
| lsu_va_wtchpt1_wr_en_l, lsu_va_wtchpt2_wr_en_l, |
| lsu_va_wtchpt3_wr_en_l, thread0_m, thread1_m, thread2_m, |
| thread3_m, lsu_thread_g, lsu_ldst_va_m, tlb_pgnum, lsu_bld_pcx_rq, |
| lsu_bld_rq_addr, lmq0_pcx_pkt_way, lmq1_pcx_pkt_way, |
| lmq2_pcx_pkt_way, lmq3_pcx_pkt_way, lsu_dfq_ld_vld, |
| lsu_ifu_asi_data_en_l, lsu_ld0_spec_vld_kill_w2, |
| lsu_ld1_spec_vld_kill_w2, lsu_ld2_spec_vld_kill_w2, |
| lsu_ld3_spec_vld_kill_w2, lsu_fwd_rply_sz1_unc, rst_tri_en, |
| lsu_l2fill_data, l2fill_vld_m, ld_thrd_byp_sel_m, sehold |
| ) ; |
| |
| input rclk ; |
| input si; |
| input se; |
| input sehold; |
| //input tmb_l; |
| |
| output so; |
| input lsu_dcache_iob_rd_w ; |
| input lsu_ramtest_rd_w ; |
| |
| input lsu_pcx_rq_sz_b3 ; |
| |
| input [3:0] lsu_diagnstc_data_sel ; |
| |
| input [3:0] pcx_pkt_src_sel ; // sel 1/4 pkt src for pcx. |
| input lsu_stb_pcx_rvld_d1 ; // stb has been read-delayby1cycle |
| input imiss_pcx_mx_sel ; // select imiss over spu. |
| input [2:0] fwd_int_fp_pcx_mx_sel ; // select fwd/intrpt/fpop |
| |
| input [`PCX_WIDTH-1:0] spu_lsu_ldst_pckt ; // stream ld/st pkt for pcx. |
| input [25:0] tlu_lsu_pcxpkt ; // truncated pcx interrupt pkt. |
| input [2:0] const_cpuid ; // cpu id |
| input [51:0] ifu_pcx_pkt ; // ifu imiss request. |
| input [3:0] lmq_byp_data_en_w2 ; |
| input [3:0] lmq_byp_data_sel0 ; // ldxa/stb/cas bypass data sel. |
| input [3:0] lmq_byp_data_sel1 ; // ldxa/stb/cas bypass data sel. |
| input [3:0] lmq_byp_data_sel2 ; // ldxa/stb/cas bypass data sel. |
| input [3:0] lmq_byp_data_sel3 ; // ldxa/stb/cas bypass data sel. |
| input [2:0] lmq_byp_ldxa_sel0 ; // ldxa data sel - thread0 |
| input [2:0] lmq_byp_ldxa_sel1 ; // ldxa data sel - thread1 |
| input [2:0] lmq_byp_ldxa_sel2 ; // ldxa data sel - thread2 |
| input [2:0] lmq_byp_ldxa_sel3 ; // ldxa data sel - thread3 |
| input [3:0] lmq_byp_data_fmx_sel ; // final sel for lmq data. |
| input [63:0] exu_lsu_rs3_data_e ; // rs3_data for cas pkt 2. |
| input [63:0] ifu_lsu_ldxa_data_w2 ; // ldxa data from ifu. |
| //input [63:0] tlu_lsu_ldxa_data_w2 ; // ldxa data from tlu (mmu) |
| input [63:0] tlu_lsu_int_ldxa_data_w2 ; // ldxa data from tlu (intrpt/scpd) |
| input [63:0] spu_lsu_ldxa_data_w2 ; // ldxa data from spu |
| input [75:0] stb_rdata_ramd ; // stb0 data ram output. |
| input [44:9] stb_rdata_ramc ; // stb0 tag ram output. |
| input [3:0] lmq_byp_misc_sel ; // select g-stage lmq source |
| input [3:0] dfq_byp_sel ; |
| input [3:0] ld_pcx_rq_sel ; |
| input [1:0] ld_pcx_thrd ; |
| |
| input [3:0] lmq_enable ; // 4 enables for lmq. |
| input [`LMQ_WIDTH-1:40] ld_pcx_pkt_g ; // ld miss pkt for thread. |
| input [80:0] ffu_lsu_data ; |
| input [3:0] lsu_tlb_st_sel_m ; |
| //input [3:0] lsu_tlb_st_sel_g ; |
| //input lsu_tlb_st_vld_g ; |
| input [107:0] lsu_pcx_fwd_pkt ; // local fwd reply/req |
| input lsu_pcx_fwd_reply ; // fwd reply on pcx pkt |
| input lsu_diagnstc_dtagv_prty_invrt_e ; |
| //input lsu_diagnstc_wr_src_sel_e ;// dcache/dtag/v write - diag |
| //input [47:0] lsu_local_ldxa_data_w2 ; // local ldxa data |
| input [63:0] lsu_misc_rdata_w2 ; // local ldxa data |
| input [1:0] lsu_stb_rd_tid ; // thread for which stb rd occurs |
| input [2:0] lsu_iobrdge_rply_data_sel ; |
| input [43:0] lsu_iobrdge_rd_data ; |
| input [2:0] lsu_atomic_pkt2_bsel_g ; |
| input lsu_pcx_ld_dtag_perror_w2 ; |
| input [63:0] lsu_dcache_rdata_w ; |
| //input [47:0] tlu_lsu_iobrdge_pc_data ; // NOTE: unused: remove this in sync w/ tlu |
| |
| input lsu_va_wtchpt0_wr_en_l; |
| input lsu_va_wtchpt1_wr_en_l; |
| input lsu_va_wtchpt2_wr_en_l; |
| input lsu_va_wtchpt3_wr_en_l; |
| input thread0_m; |
| input thread1_m; |
| input thread2_m; |
| input thread3_m; |
| |
| input [3:0] lsu_thread_g; |
| |
| |
| //input lsu_pa_wtchpt_wr_en_l; |
| input [47:0] lsu_ldst_va_m; |
| input [39:13] tlb_pgnum; |
| input lsu_bld_pcx_rq ; // cycle after request |
| input [1:0] lsu_bld_rq_addr ; // cycle after request |
| |
| //input [1:0] lsu_lmq_pkt_way_g; |
| input [1:0] lmq0_pcx_pkt_way; |
| input [1:0] lmq1_pcx_pkt_way; |
| input [1:0] lmq2_pcx_pkt_way; |
| input [1:0] lmq3_pcx_pkt_way; |
| |
| input lsu_dfq_ld_vld ; |
| input lsu_ifu_asi_data_en_l ; |
| |
| input lsu_ld0_spec_vld_kill_w2 ; |
| input lsu_ld1_spec_vld_kill_w2 ; |
| input lsu_ld2_spec_vld_kill_w2 ; |
| input lsu_ld3_spec_vld_kill_w2 ; |
| |
| input lsu_fwd_rply_sz1_unc ; |
| |
| input rst_tri_en ; |
| |
| output lsu_va_match_b47_b32_m; |
| output lsu_va_match_b31_b3_m; |
| |
| //output lsu_pa_match_b39_13_g; |
| //output lsu_pa_match_b12_3_m; |
| output [47:3] lsu_va_wtchpt_addr; |
| //output [39:3] lsu_pa_wtchpt_addr; |
| |
| //output [63:0] ld_stb_bypass_data ; // st to load bypass data. |
| |
| output [`PCX_WIDTH-1:0] spc_pcx_data_pa ; |
| output [29:0] dtag_wdata_m ; // tag to write to dtag. |
| //output [3:0] lsu_byp_misc_addr_m ; // lower 3bits of addr for ldxa/raw etc |
| //output [1:0] lsu_byp_misc_sz_m ; // size for ldxa/raw etc |
| output [1:0] lmq0_byp_misc_sz ; |
| output [1:0] lmq1_byp_misc_sz ; |
| output [1:0] lmq2_byp_misc_sz ; |
| output [1:0] lmq3_byp_misc_sz ; |
| |
| output [1:0] lsu_byp_misc_sz_e ; // size for ldxa/raw etc |
| output lsu_l2fill_sign_extend_m ;// requires sign-extend else zero extend |
| output lsu_l2fill_bendian_m ; // big endian fill/bypass. |
| //output lsu_l2fill_fpld_e ; // fp load |
| output lmq0_l2fill_fpld ; // fp load |
| output lmq1_l2fill_fpld ; // fp load |
| output lmq2_l2fill_fpld ; // fp load |
| output lmq3_l2fill_fpld ; // fp load |
| |
| output [4:0] lmq_ld_rd1 ; // rd for all loads |
| //output lsu_ncache_ld_e ; // non-cacheable ld from dfq |
| output lmq0_ncache_ld ; // non-cacheable ld from dfq |
| output lmq1_ncache_ld ; // non-cacheable ld from dfq |
| output lmq2_ncache_ld ; // non-cacheable ld from dfq |
| output lmq3_ncache_ld ; // non-cacheable ld from dfq |
| //output [2:0] lsu_ld_rq_type_e ; // for identifying atomic ld. |
| |
| output [2:0] lmq0_ld_rq_type ; // for identifying atomic ld. |
| output [2:0] lmq1_ld_rq_type ; // for identifying atomic ld. |
| output [2:0] lmq2_ld_rq_type ; // for identifying atomic ld. |
| output [2:0] lmq3_ld_rq_type ; // for identifying atomic ld. |
| |
| output lmq0_ldd_vld ; // ld double |
| output lmq1_ldd_vld ; // ld double |
| output lmq2_ldd_vld ; // ld double |
| output lmq3_ldd_vld ; // ld double |
| |
| output ld_sec_hit_thrd0 ; // ld has sec. hit against th0 |
| output ld_sec_hit_thrd1 ; // ld has sec. hit against th1 |
| output ld_sec_hit_thrd2 ; // ld has sec. hit against th2 |
| output ld_sec_hit_thrd3 ; // ld has sec. hit against th3 |
| //output [1:0] lmq_pcx_pkt_sz ; |
| //output [39:0] lmq_pcx_pkt_addr ; |
| output [10:0] lmq0_pcx_pkt_addr; |
| output [10:0] lmq1_pcx_pkt_addr; |
| output [10:0] lmq2_pcx_pkt_addr; |
| output [10:0] lmq3_pcx_pkt_addr; |
| |
| //output [63:0] lsu_tlu_st_rs3_data_g ; |
| output [63:0] lsu_mmu_rs3_data_g ; |
| output [63:0] lsu_tlu_rs3_data_g ; |
| |
| output lsu_diagnstc_wr_data_b0 ; // diagnostic wr data - bit 0 |
| output [63:0] lsu_diagnstc_wr_data_e ; |
| |
| output [47:0] lsu_ifu_stxa_data ; // stxa related data |
| |
| output [11:5] lsu_ifu_ld_icache_index ; |
| output [1:0] lsu_ifu_ld_pcxpkt_tid ; |
| |
| //output [1:0] lmq_ld_way ; // cache set way for ld fill |
| |
| output [28:0] lsu_error_pa_m ; // error phy addr |
| //output [13:0] lsu_spu_rsrv_data_m ; // rs3 data for reserved fields. |
| output lsu_pref_pcx_req ; // pref sent to pcx |
| |
| output [63:0] st_rs3_data_g; |
| |
| output [1:0] lsu_ldst_va_way_g ; // 12:11 for direct map |
| //==================================================================== |
| //dc_fill CP |
| |
| input [63:0] lsu_l2fill_data; //from qdp2 |
| input l2fill_vld_m; //from dctl |
| input [3:0] ld_thrd_byp_sel_m;//from dctl |
| |
| output [63:0] dcache_alt_data_w0_m; //to d$ |
| // output [7:0] lsu_l2fill_or_byp_msb_m; //to dctl |
| //==================================================================== |
| |
| |
| wire [`STB_PCX_WIDTH-1:0] store_pcx_pkt ; |
| wire [`PCX_WIDTH-1:0] pcx_pkt_data ; |
| wire [`STB_PCX_WIDTH-1:0] stb_pcx_pkt ; |
| wire [`PCX_WIDTH-1:0] imiss_strm_pcx_pkt ; |
| wire [`PCX_WIDTH-1:0] intrpt_full_pcxpkt ; |
| wire [`PCX_WIDTH-1:0] ifu_full_pcx_pkt_e ; |
| wire [51:0] ifu_pcx_pkt_e ; |
| wire [63:0] cas_pkt2_data ; |
| wire [63:0] lmq0_bypass_data_in,lmq1_bypass_data_in ; |
| wire [63:0] lmq2_bypass_data_in,lmq3_bypass_data_in ; |
| wire [63:0] lmq0_bypass_data, lmq1_bypass_data ; |
| wire [63:0] lmq2_bypass_data, lmq3_bypass_data ; |
| wire [39:0] lmq_ld_addr ; |
| wire [`LMQ_WIDTH:0] load_pcx_pkt ; |
| wire [`LMQ_WIDTH-1:0] lmq0_pcx_pkt, lmq1_pcx_pkt ; |
| wire [`LMQ_WIDTH-1:0] lmq2_pcx_pkt, lmq3_pcx_pkt ; |
| wire [`PCX_WIDTH-1:0] fpop_full_pcxpkt ; |
| wire [63:0] tlb_st_data ; |
| //wire [63:0] formatted_tte_tag ; |
| //wire [63:0] formatted_tte_data ; |
| wire [63:0] lmq0_bypass_ldxa_data ; |
| wire [63:0] lmq1_bypass_ldxa_data ; |
| wire [63:0] lmq2_bypass_ldxa_data ; |
| wire [63:0] lmq3_bypass_ldxa_data ; |
| wire [`PCX_WIDTH-1:0] fwd_full_pcxpkt ; |
| wire [47:3] lsu_tlu_st_rs3_data_g ; |
| |
| |
| //=================================================== |
| // clock buffer |
| //=================================================== |
| //wire lsu_qdp1_clk ; |
| wire clk; |
| assign clk = rclk; |
| |
| wire thread0_g; |
| wire thread1_g; |
| wire thread2_g; |
| wire thread3_g; |
| |
| assign thread0_g = lsu_thread_g[0]; |
| assign thread1_g = lsu_thread_g[1]; |
| assign thread2_g = lsu_thread_g[2]; |
| assign thread3_g = lsu_thread_g[3]; |
| |
| //================================================================================================= |
| // LMQ DP |
| //================================================================================================= |
| |
| wire [12:0] ldst_va_g; |
| |
| dff_s #(13) ff_ldst_va_g ( |
| .din (lsu_ldst_va_m[12:0]), |
| .q (ldst_va_g[12:0]), |
| .clk (clk), |
| .se (1'b0), .si (), .so () |
| ); |
| |
| assign lsu_ldst_va_way_g[1:0] = ldst_va_g[12:11]; |
| |
| wire [`LMQ_VLD:0] ld_pcx_pkt_g_tmp; |
| |
| assign ld_pcx_pkt_g_tmp[`LMQ_VLD:0] = {ld_pcx_pkt_g[`LMQ_WIDTH-1:44], |
| 2'b00, // done after the flop |
| //lsu_lmq_pkt_way_g[1:0], |
| ld_pcx_pkt_g[41:40], |
| tlb_pgnum[39:13],ldst_va_g[12:0]}; |
| |
| // Unfortunately ld_pcx_pkt_g is now 65 bits wide. Grape-mapper needs to give feedback. |
| // THREAD 0. |
| /* |
| dffe_s #(`LMQ_WIDTH) lmq0 ( |
| .din (ld_pcx_pkt_g_tmp[`LMQ_VLD:0]), |
| .q (lmq0_pcx_pkt[`LMQ_VLD:0]), |
| .en (lmq_enable[0]), .clk (clk), |
| .se (1'b0), .si (), .so () |
| ); |
| */ |
| wire lmq0_clk; |
| `ifdef FPGA_SYN_CLK_EN |
| `else |
| clken_buf lmq0_clkbuf ( |
| .rclk (clk), |
| .enb_l (~lmq_enable[0]), |
| .tmb_l (~se), |
| .clk (lmq0_clk) |
| ) ; |
| `endif |
| wire [`LMQ_VLD:0] lmq0_pcx_pkt_tmp ; |
| |
| `ifdef FPGA_SYN_CLK_DFF |
| dffe_s #(`LMQ_WIDTH) lmq0 ( |
| .din (ld_pcx_pkt_g_tmp[`LMQ_VLD:0]), |
| .q (lmq0_pcx_pkt_tmp[`LMQ_VLD:0]), |
| .en (~(~lmq_enable[0])), .clk(clk), |
| .se (1'b0), .si (), .so () |
| ); |
| `else |
| dff_s #(`LMQ_WIDTH) lmq0 ( |
| .din (ld_pcx_pkt_g_tmp[`LMQ_VLD:0]), |
| .q (lmq0_pcx_pkt_tmp[`LMQ_VLD:0]), |
| .clk (lmq0_clk), |
| .se (1'b0), .si (), .so () |
| ); |
| `endif |
| |
| //bug2705 - speculative pick in w-cycle |
| wire lmq0_pcx_pkt_vld ; |
| assign lmq0_pcx_pkt_vld = lmq0_pcx_pkt_tmp[`LMQ_VLD] & ~lsu_ld0_spec_vld_kill_w2 ; |
| |
| assign lmq0_pcx_pkt[`LMQ_VLD:0] = {lmq0_pcx_pkt_vld, |
| lmq0_pcx_pkt_tmp[`LMQ_VLD-1:44], |
| lmq0_pcx_pkt_way[1:0], |
| lmq0_pcx_pkt_tmp[41:0]}; |
| |
| // Needs to be multi-threaded. |
| //assign lmq_pcx_pkt_sz[1:0] = lmq0_pcx_pkt[`LMQ_SZ_HI:`LMQ_SZ_LO] ; |
| |
| assign ld_sec_hit_thrd0 = |
| (ld_pcx_pkt_g_tmp[`LMQ_AD_HI:`LMQ_AD_LO+4] == lmq0_pcx_pkt[`LMQ_AD_HI:`LMQ_AD_LO+4]) ; |
| |
| `ifdef FPGA_SYN_1THREAD |
| assign load_pcx_pkt[`LMQ_WIDTH-1:0] = lmq0_pcx_pkt[`LMQ_WIDTH-1:0]; |
| `else |
| // THREAD 1. |
| /* |
| dffe_s #(`LMQ_WIDTH) lmq1 ( |
| .din (ld_pcx_pkt_g_tmp[`LMQ_VLD:0]), |
| .q (lmq1_pcx_pkt[`LMQ_VLD:0]), |
| .en (lmq_enable[1]), .clk (clk), |
| .se (1'b0), .si (), .so () |
| ); |
| */ |
| wire lmq1_clk; |
| `ifdef FPGA_SYN_CLK_EN |
| `else |
| clken_buf lmq1_clkbuf ( |
| .rclk (clk), |
| .enb_l (~lmq_enable[1]), |
| .tmb_l (~se), |
| .clk (lmq1_clk) |
| ) ; |
| `endif |
| |
| wire [`LMQ_VLD:0] lmq1_pcx_pkt_tmp; |
| |
| `ifdef FPGA_SYN_CLK_DFF |
| dffe_s #(`LMQ_WIDTH) lmq1 ( |
| .din (ld_pcx_pkt_g_tmp[`LMQ_VLD:0]), |
| .q (lmq1_pcx_pkt_tmp[`LMQ_VLD:0]), |
| .en (~(~lmq_enable[1])), .clk(clk), |
| .se (1'b0), .si (), .so () |
| ); |
| `else |
| dff_s #(`LMQ_WIDTH) lmq1 ( |
| .din (ld_pcx_pkt_g_tmp[`LMQ_VLD:0]), |
| .q (lmq1_pcx_pkt_tmp[`LMQ_VLD:0]), |
| .clk (lmq1_clk), |
| .se (1'b0), .si (), .so () |
| ); |
| `endif |
| |
| //bug2705 - speculative pick in w-cycle |
| wire lmq1_pcx_pkt_vld ; |
| assign lmq1_pcx_pkt_vld = lmq1_pcx_pkt_tmp[`LMQ_VLD] & ~lsu_ld1_spec_vld_kill_w2 ; |
| |
| assign lmq1_pcx_pkt[`LMQ_VLD:0] = {lmq1_pcx_pkt_vld, |
| lmq1_pcx_pkt_tmp[`LMQ_VLD-1:44], |
| lmq1_pcx_pkt_way[1:0], |
| lmq1_pcx_pkt_tmp[41:0]}; |
| |
| assign ld_sec_hit_thrd1 = |
| (ld_pcx_pkt_g_tmp[`LMQ_AD_HI:`LMQ_AD_LO+4] == lmq1_pcx_pkt[`LMQ_AD_HI:`LMQ_AD_LO+4]) ; |
| |
| // THREAD 2. |
| /* |
| dffe_s #(`LMQ_WIDTH) lmq2 ( |
| .din (ld_pcx_pkt_g_tmp[`LMQ_VLD:0]), |
| .q (lmq2_pcx_pkt[`LMQ_VLD:0]), |
| .en (lmq_enable[2]), .clk (clk), |
| .se (1'b0), .si (), .so () |
| ); |
| */ |
| wire lmq2_clk; |
| `ifdef FPGA_SYN_CLK_EN |
| `else |
| clken_buf lmq2_clkbuf ( |
| .rclk (clk), |
| .enb_l (~lmq_enable[2]), |
| .tmb_l (~se), |
| .clk (lmq2_clk) |
| ) ; |
| `endif |
| |
| wire [`LMQ_VLD:0] lmq2_pcx_pkt_tmp; |
| |
| `ifdef FPGA_SYN_CLK_DFF |
| dffe_s #(`LMQ_WIDTH) lmq2 ( |
| .din (ld_pcx_pkt_g_tmp[`LMQ_VLD:0]), |
| .q (lmq2_pcx_pkt_tmp[`LMQ_VLD:0]), |
| .en (~(~lmq_enable[2])), .clk(clk), |
| .se (1'b0), .si (), .so () |
| ); |
| `else |
| dff_s #(`LMQ_WIDTH) lmq2 ( |
| .din (ld_pcx_pkt_g_tmp[`LMQ_VLD:0]), |
| .q (lmq2_pcx_pkt_tmp[`LMQ_VLD:0]), |
| .clk (lmq2_clk), |
| .se (1'b0), .si (), .so () |
| ); |
| `endif |
| |
| //bug2705 - speculative pick in w-cycle |
| wire lmq2_pcx_pkt_vld ; |
| assign lmq2_pcx_pkt_vld = lmq2_pcx_pkt_tmp[`LMQ_VLD] & ~lsu_ld2_spec_vld_kill_w2 ; |
| |
| |
| assign lmq2_pcx_pkt[`LMQ_VLD:0] = {lmq2_pcx_pkt_vld, |
| lmq2_pcx_pkt_tmp[`LMQ_VLD-1:44], |
| lmq2_pcx_pkt_way[1:0], |
| lmq2_pcx_pkt_tmp[41:0]}; |
| |
| assign ld_sec_hit_thrd2 = |
| (ld_pcx_pkt_g_tmp[`LMQ_AD_HI:`LMQ_AD_LO+4] == lmq2_pcx_pkt[`LMQ_AD_HI:`LMQ_AD_LO+4]) ; |
| |
| // THREAD 3. |
| /* |
| dffe_s #(`LMQ_WIDTH) lmq3 ( |
| .din (ld_pcx_pkt_g_tmp[`LMQ_VLD:0]), |
| .q (lmq3_pcx_pkt[`LMQ_VLD:0]), |
| .en (lmq_enable[3]), .clk (clk), |
| .se (1'b0), .si (), .so () |
| ); |
| */ |
| wire lmq3_clk; |
| `ifdef FPGA_SYN_CLK_EN |
| `else |
| clken_buf lmq3_clkbuf ( |
| .rclk (clk), |
| .enb_l (~lmq_enable[3]), |
| .tmb_l (~se), |
| .clk (lmq3_clk) |
| ) ; |
| `endif |
| |
| wire [`LMQ_VLD:0] lmq3_pcx_pkt_tmp; |
| |
| `ifdef FPGA_SYN_CLK_DFF |
| dffe_s #(`LMQ_WIDTH) lmq3 ( |
| .din (ld_pcx_pkt_g_tmp[`LMQ_VLD:0]), |
| .q (lmq3_pcx_pkt_tmp[`LMQ_VLD:0]), |
| .en (~(~lmq_enable[3])), .clk(clk), |
| .se (1'b0), .si (), .so () |
| ); |
| `else |
| dff_s #(`LMQ_WIDTH) lmq3 ( |
| .din (ld_pcx_pkt_g_tmp[`LMQ_VLD:0]), |
| .q (lmq3_pcx_pkt_tmp[`LMQ_VLD:0]), |
| .clk (lmq3_clk), |
| .se (1'b0), .si (), .so () |
| ); |
| `endif |
| |
| //bug2705 - speculative pick in w-cycle |
| wire lmq3_pcx_pkt_vld ; |
| assign lmq3_pcx_pkt_vld = lmq3_pcx_pkt_tmp[`LMQ_VLD] & ~lsu_ld3_spec_vld_kill_w2 ; |
| |
| |
| assign lmq3_pcx_pkt[`LMQ_VLD:0] = {lmq3_pcx_pkt_vld, |
| lmq3_pcx_pkt_tmp[`LMQ_VLD-1:44], |
| lmq3_pcx_pkt_way[1:0], |
| lmq3_pcx_pkt_tmp[41:0]}; |
| |
| |
| assign ld_sec_hit_thrd3 = |
| (ld_pcx_pkt_g_tmp[`LMQ_AD_HI:`LMQ_AD_LO+4] == lmq3_pcx_pkt[`LMQ_AD_HI:`LMQ_AD_LO+4]) ; |
| |
| // Select 1 of 4 LMQ Contents. |
| // selection is based on which thread's load is chosen for pcx. |
| mux4ds #(`LMQ_WIDTH) lmq_pthrd_sel ( |
| .in0 (lmq0_pcx_pkt[`LMQ_WIDTH-1:0]), |
| .in1 (lmq1_pcx_pkt[`LMQ_WIDTH-1:0]), |
| .in2 (lmq2_pcx_pkt[`LMQ_WIDTH-1:0]), |
| .in3 (lmq3_pcx_pkt[`LMQ_WIDTH-1:0]), |
| .sel0 (ld_pcx_rq_sel[0]), |
| .sel1 (ld_pcx_rq_sel[1]), |
| .sel2 (ld_pcx_rq_sel[2]), |
| .sel3 (ld_pcx_rq_sel[3]), |
| .dout (load_pcx_pkt[`LMQ_WIDTH-1:0]) |
| ); |
| `endif |
| |
| assign lsu_pref_pcx_req = load_pcx_pkt[`LMQ_PREF] ; |
| |
| // Choose data to src for fill/bypass. |
| // E-stage muxing : required for fills specifically. |
| |
| assign lmq0_ldd_vld = lmq0_pcx_pkt[`LMQ_RD2_VLD]; |
| `ifdef FPGA_SYN_1THREAD |
| assign lmq1_ldd_vld = 1'b0; |
| assign lmq2_ldd_vld = 1'b0; |
| assign lmq3_ldd_vld = 1'b0; |
| `else |
| assign lmq1_ldd_vld = lmq1_pcx_pkt[`LMQ_RD2_VLD]; |
| assign lmq2_ldd_vld = lmq2_pcx_pkt[`LMQ_RD2_VLD]; |
| assign lmq3_ldd_vld = lmq3_pcx_pkt[`LMQ_RD2_VLD]; |
| `endif |
| |
| assign lmq0_pcx_pkt_addr[10:0] = lmq0_pcx_pkt[`LMQ_AD_LO + 10 :`LMQ_AD_LO]; |
| `ifdef FPGA_SYN_1THREAD |
| assign lmq1_pcx_pkt_addr[10:0] = 11'b0; |
| assign lmq2_pcx_pkt_addr[10:0] = 11'b0; |
| assign lmq3_pcx_pkt_addr[10:0] = 11'b0; |
| `else |
| assign lmq1_pcx_pkt_addr[10:0] = lmq1_pcx_pkt[`LMQ_AD_LO + 10 :`LMQ_AD_LO]; |
| assign lmq2_pcx_pkt_addr[10:0] = lmq2_pcx_pkt[`LMQ_AD_LO + 10 :`LMQ_AD_LO]; |
| assign lmq3_pcx_pkt_addr[10:0] = lmq3_pcx_pkt[`LMQ_AD_LO + 10 :`LMQ_AD_LO]; |
| `endif |
| |
| assign lmq0_ld_rq_type[2:0] = lmq0_pcx_pkt[`LMQ_RQ_HI:`LMQ_RQ_LO]; |
| `ifdef FPGA_SYN_1THREAD |
| assign lmq1_ld_rq_type[2:0] = 3'b0; |
| assign lmq2_ld_rq_type[2:0] = 3'b0; |
| assign lmq3_ld_rq_type[2:0] = 3'b0; |
| `else |
| assign lmq1_ld_rq_type[2:0] = lmq1_pcx_pkt[`LMQ_RQ_HI:`LMQ_RQ_LO]; |
| assign lmq2_ld_rq_type[2:0] = lmq2_pcx_pkt[`LMQ_RQ_HI:`LMQ_RQ_LO]; |
| assign lmq3_ld_rq_type[2:0] = lmq3_pcx_pkt[`LMQ_RQ_HI:`LMQ_RQ_LO]; |
| `endif |
| |
| assign lmq0_l2fill_fpld = lmq0_pcx_pkt[`LMQ_FPLD]; |
| `ifdef FPGA_SYN_1THREAD |
| assign lmq1_l2fill_fpld = 1'b0; |
| assign lmq2_l2fill_fpld = 1'b0; |
| assign lmq3_l2fill_fpld = 1'b0; |
| `else |
| assign lmq1_l2fill_fpld = lmq1_pcx_pkt[`LMQ_FPLD]; |
| assign lmq2_l2fill_fpld = lmq2_pcx_pkt[`LMQ_FPLD]; |
| assign lmq3_l2fill_fpld = lmq3_pcx_pkt[`LMQ_FPLD]; |
| `endif |
| /* |
| wire lsu_l2fill_fpld_e; |
| |
| mux4ds #(44) lmq_dthrd_sel1 ( |
| .in0 ({lmq0_pcx_pkt[`LMQ_AD_HI:`LMQ_AD_LO], lmq0_pcx_pkt[`LMQ_NC], |
| lmq0_pcx_pkt[`LMQ_FPLD],lmq0_pcx_pkt[`LMQ_SZ_HI: `LMQ_SZ_LO]}), |
| .in1 ({lmq1_pcx_pkt[`LMQ_AD_HI:`LMQ_AD_LO], lmq1_pcx_pkt[`LMQ_NC], |
| lmq1_pcx_pkt[`LMQ_FPLD],lmq1_pcx_pkt[`LMQ_SZ_HI: `LMQ_SZ_LO]}), |
| .in2 ({lmq2_pcx_pkt[`LMQ_AD_HI:`LMQ_AD_LO], lmq2_pcx_pkt[`LMQ_NC], |
| lmq2_pcx_pkt[`LMQ_FPLD],lmq2_pcx_pkt[`LMQ_SZ_HI: `LMQ_SZ_LO]}), |
| .in3 ({lmq3_pcx_pkt[`LMQ_AD_HI:`LMQ_AD_LO], lmq3_pcx_pkt[`LMQ_NC], |
| lmq3_pcx_pkt[`LMQ_FPLD],lmq3_pcx_pkt[`LMQ_SZ_HI: `LMQ_SZ_LO]}), |
| .sel0 (dfq_byp_sel[0]), |
| .sel1 (dfq_byp_sel[1]), |
| .sel2 (dfq_byp_sel[2]), |
| .sel3 (dfq_byp_sel[3]), |
| .dout ({lmq_ld_addr[39:0], lsu_ncache_ld_e, |
| lsu_l2fill_fpld_e, lsu_byp_misc_sz_e[1:0]}) |
| ); |
| */ |
| |
| assign lmq0_ncache_ld = lmq0_pcx_pkt[`LMQ_NC]; |
| `ifdef FPGA_SYN_1THREAD |
| assign lmq1_ncache_ld = 1'b0; |
| assign lmq2_ncache_ld = 1'b0; |
| assign lmq3_ncache_ld = 1'b0; |
| `else |
| assign lmq1_ncache_ld = lmq1_pcx_pkt[`LMQ_NC]; |
| assign lmq2_ncache_ld = lmq2_pcx_pkt[`LMQ_NC]; |
| assign lmq3_ncache_ld = lmq3_pcx_pkt[`LMQ_NC]; |
| `endif |
| |
| `ifdef FPGA_SYN_1THREAD |
| assign lmq_ld_addr[39:0] = lmq0_pcx_pkt[`LMQ_AD_HI:`LMQ_AD_LO]; |
| assign lsu_byp_misc_sz_e[1:0] = lmq0_pcx_pkt[`LMQ_SZ_HI: `LMQ_SZ_LO]; |
| assign lmq_ld_rd1[4:0] = lmq0_pcx_pkt[`LMQ_RD1_HI: `LMQ_RD1_LO]; |
| assign lsu_l2fill_bendian_m = lmq0_pcx_pkt[`LMQ_BIGEND]; |
| assign lsu_l2fill_sign_extend_m = lmq0_pcx_pkt[`LMQ_SIGNEXT]; |
| `else |
| mux4ds #(42) lmq_dthrd_sel1 ( |
| .in0 ({lmq0_pcx_pkt[`LMQ_AD_HI:`LMQ_AD_LO], |
| lmq0_pcx_pkt[`LMQ_SZ_HI: `LMQ_SZ_LO]}), |
| .in1 ({lmq1_pcx_pkt[`LMQ_AD_HI:`LMQ_AD_LO], |
| lmq1_pcx_pkt[`LMQ_SZ_HI: `LMQ_SZ_LO]}), |
| .in2 ({lmq2_pcx_pkt[`LMQ_AD_HI:`LMQ_AD_LO], |
| lmq2_pcx_pkt[`LMQ_SZ_HI: `LMQ_SZ_LO]}), |
| .in3 ({lmq3_pcx_pkt[`LMQ_AD_HI:`LMQ_AD_LO], |
| lmq3_pcx_pkt[`LMQ_SZ_HI: `LMQ_SZ_LO]}), |
| .sel0 (dfq_byp_sel[0]), |
| .sel1 (dfq_byp_sel[1]), |
| .sel2 (dfq_byp_sel[2]), |
| .sel3 (dfq_byp_sel[3]), |
| .dout ({lmq_ld_addr[39:0], lsu_byp_misc_sz_e[1:0]}) |
| ); |
| |
| // POR |
| // M-stage muxing : require for alignment and bypassing to exu. |
| // flopped then used in qctl/dctl G-stage |
| // lmq_ld_rd1 to lsu_qctl |
| // others to lsu_dctl |
| |
| // M-Stage Muxing |
| |
| mux4ds #(7) lmq_dthrd_sel2 ( |
| .in0 ({lmq0_pcx_pkt[`LMQ_RD1_HI: `LMQ_RD1_LO],lmq0_pcx_pkt[`LMQ_BIGEND], |
| lmq0_pcx_pkt[`LMQ_SIGNEXT]}), |
| .in1 ({lmq1_pcx_pkt[`LMQ_RD1_HI: `LMQ_RD1_LO],lmq1_pcx_pkt[`LMQ_BIGEND], |
| lmq1_pcx_pkt[`LMQ_SIGNEXT]}), |
| .in2 ({lmq2_pcx_pkt[`LMQ_RD1_HI: `LMQ_RD1_LO],lmq2_pcx_pkt[`LMQ_BIGEND], |
| lmq2_pcx_pkt[`LMQ_SIGNEXT]}), |
| .in3 ({lmq3_pcx_pkt[`LMQ_RD1_HI: `LMQ_RD1_LO],lmq3_pcx_pkt[`LMQ_BIGEND], |
| lmq3_pcx_pkt[`LMQ_SIGNEXT]}), |
| .sel0 (lmq_byp_misc_sel[0]), |
| .sel1 (lmq_byp_misc_sel[1]), |
| .sel2 (lmq_byp_misc_sel[2]), |
| .sel3 (lmq_byp_misc_sel[3]), |
| .dout ({lmq_ld_rd1[4:0],lsu_l2fill_bendian_m,lsu_l2fill_sign_extend_m}) |
| ); |
| `endif |
| |
| assign lmq0_byp_misc_sz[1:0] = lmq0_pcx_pkt[`LMQ_SZ_HI: `LMQ_SZ_LO]; |
| `ifdef FPGA_SYN_1THREAD |
| assign lmq1_byp_misc_sz[1:0] = 2'b0; |
| assign lmq2_byp_misc_sz[1:0] = 2'b0; |
| assign lmq3_byp_misc_sz[1:0] = 2'b0; |
| `else |
| assign lmq1_byp_misc_sz[1:0] = lmq1_pcx_pkt[`LMQ_SZ_HI: `LMQ_SZ_LO]; |
| assign lmq2_byp_misc_sz[1:0] = lmq2_pcx_pkt[`LMQ_SZ_HI: `LMQ_SZ_LO]; |
| assign lmq3_byp_misc_sz[1:0] = lmq3_pcx_pkt[`LMQ_SZ_HI: `LMQ_SZ_LO]; |
| `endif |
| |
| |
| //assign lmq_pcx_pkt_addr[10:0] = lmq_ld_addr[10:0] ; |
| |
| |
| wire [28:0] dtag_wdata_e; |
| |
| assign dtag_wdata_e[28:0] = |
| ~lsu_dfq_ld_vld ? |
| lsu_diagnstc_wr_data_e[29:1] : lmq_ld_addr[39:11] ; |
| |
| // Parity Generation for Tag. Match with macro. |
| wire dtag_wr_parity ; |
| //assign dtag_wr_parity = ^dtag_wdata_e[28:0] ; |
| //assign dtag_wdata_e[29] = |
| // ~lsu_dfq_ld_vld ? |
| // lsu_diagnstc_dtagv_prty_invrt_e^dtag_wr_parity : dtag_wr_parity ; |
| |
| wire dtag_wr_parity_7_0, dtag_wr_parity_15_8, |
| dtag_wr_parity_23_16, dtag_wr_parity_28_24; |
| |
| assign dtag_wr_parity_7_0 = ^dtag_wdata_e[7:0]; //zzpar8 |
| assign dtag_wr_parity_15_8 = ^dtag_wdata_e[15:8]; //zzpar8 |
| assign dtag_wr_parity_23_16 = ^dtag_wdata_e[23:16]; //zzpar8 |
| assign dtag_wr_parity_28_24 = ^dtag_wdata_e[28:24]; //zzpar8 |
| |
| wire dtag_wr_parity_28_24_with_invrt; |
| |
| assign dtag_wr_parity_28_24_with_invrt = |
| (^dtag_wdata_e[28:24]) ^ lsu_diagnstc_dtagv_prty_invrt_e; //zzpar8 |
| |
| |
| wire dtag_wr_parity_7_0_m, dtag_wr_parity_15_8_m, |
| dtag_wr_parity_23_16_m, dtag_wr_parity_28_24_m; |
| wire lsu_dfq_ld_vld_m; |
| wire dtag_wr_parity_28_24_with_invrt_m; |
| |
| |
| // 12/12/03 : Change for Macrotest. I didn't mention |
| // these 4 bits ! Pls check for a max time violation. |
| wire dtag_wr_parity_7_0_din, dtag_wr_parity_15_8_din ; |
| wire dtag_wr_parity_23_16_din, dtag_wr_parity_28_24_din ; |
| assign dtag_wr_parity_7_0_din = |
| sehold ? dtag_wr_parity_7_0_m : dtag_wr_parity_7_0 ; |
| assign dtag_wr_parity_15_8_din = |
| sehold ? dtag_wr_parity_15_8_m : dtag_wr_parity_15_8 ; |
| assign dtag_wr_parity_23_16_din = |
| sehold ? dtag_wr_parity_23_16_m : dtag_wr_parity_23_16 ; |
| assign dtag_wr_parity_28_24_din = |
| sehold ? dtag_wr_parity_28_24_m : dtag_wr_parity_28_24 ; |
| |
| dff_s #(6) tag_parity_m ( |
| .din ({dtag_wr_parity_7_0_din, dtag_wr_parity_15_8_din, |
| dtag_wr_parity_23_16_din, dtag_wr_parity_28_24_din, |
| lsu_dfq_ld_vld, dtag_wr_parity_28_24_with_invrt}), |
| .q ({dtag_wr_parity_7_0_m, dtag_wr_parity_15_8_m, |
| dtag_wr_parity_23_16_m, dtag_wr_parity_28_24_m, |
| lsu_dfq_ld_vld_m, dtag_wr_parity_28_24_with_invrt_m}), |
| .clk (clk), |
| .se (1'b0), .si (), .so () |
| ); |
| |
| assign dtag_wr_parity = dtag_wr_parity_7_0_m ^ dtag_wr_parity_15_8_m ^ |
| dtag_wr_parity_23_16_m ^ dtag_wr_parity_28_24_m; |
| |
| wire dtag_wr_parity_with_invrt; |
| |
| assign dtag_wr_parity_with_invrt = |
| dtag_wr_parity_7_0_m ^ dtag_wr_parity_15_8_m ^ |
| dtag_wr_parity_23_16_m ^ dtag_wr_parity_28_24_with_invrt_m; |
| |
| wire [29:0] dtag_wdata_m; |
| |
| // 12/12/03 : Change for Macrotest. |
| assign dtag_wdata_m[29] = |
| ~(lsu_dfq_ld_vld_m | sehold) ? |
| dtag_wr_parity_with_invrt : dtag_wr_parity ; |
| |
| // 12/12/03 : Change for Macrotest. |
| wire [28:0] dtag_wdata_e_din ; |
| assign dtag_wdata_e_din[28:0] = |
| sehold ? dtag_wdata_m[28:0] : dtag_wdata_e[28:0] ; |
| |
| dff_s #(29) tag_stgm ( |
| .din (dtag_wdata_e_din[28:0]), |
| .q (dtag_wdata_m[28:0]), |
| .clk (clk), |
| .se (1'b0), .si (), .so () |
| ); |
| |
| assign lsu_error_pa_m[28:0] = dtag_wdata_m[28:0]; |
| |
| |
| //================================================================================================= |
| // RS3 DATA ALIGNMENT FOR CAS |
| //================================================================================================= |
| |
| wire [7:0] rs3_byte0, rs3_byte1, rs3_byte2, rs3_byte3 ; |
| wire [7:0] rs3_byte4, rs3_byte5, rs3_byte6, rs3_byte7 ; |
| wire [63:0] atm_byte_g ; |
| wire [63:0] st_rs3_data_m,st_rs3_data_g ; |
| |
| dff_s #(64) rs3_stgm ( |
| .din (exu_lsu_rs3_data_e[63:0]), |
| .q (st_rs3_data_m[63:0]), |
| .clk (clk), |
| .se (1'b0), .si (), .so () |
| ); |
| |
| // rm (along with spu). |
| //assign lsu_spu_rsrv_data_m[13:0] = |
| // {st_rs3_data_m[27:23],st_rs3_data_m[21:16],st_rs3_data_m[8:6]} ; |
| |
| dff_s #(64) rs3_stgg ( |
| .din (st_rs3_data_m[63:0]), |
| .q (st_rs3_data_g[63:0]), |
| .clk (clk), |
| .se (1'b0), .si (), .so () |
| ); |
| |
| assign rs3_byte0[7:0] = st_rs3_data_g[7:0] ; |
| assign rs3_byte1[7:0] = st_rs3_data_g[15:8] ; |
| assign rs3_byte2[7:0] = st_rs3_data_g[23:16] ; |
| assign rs3_byte3[7:0] = st_rs3_data_g[31:24] ; |
| assign rs3_byte4[7:0] = st_rs3_data_g[39:32] ; |
| assign rs3_byte5[7:0] = st_rs3_data_g[47:40] ; |
| assign rs3_byte6[7:0] = st_rs3_data_g[55:48] ; |
| assign rs3_byte7[7:0] = st_rs3_data_g[63:56] ; |
| |
| //assign atm_byte_g[7:0] = |
| //lsu_atomic_pkt2_bsel_g[2] ? rs3_byte0[7:0] : |
| // lsu_atomic_pkt2_bsel_g[1] ? rs3_byte3[7:0] : |
| // lsu_atomic_pkt2_bsel_g[0] ? rs3_byte7[7:0] : 8'bxxxx_xxxx ; |
| |
| mux3ds #(8) mx_atm_byte_g_7_0 ( |
| .in0 (rs3_byte0[7:0]), |
| .in1 (rs3_byte3[7:0]), |
| .in2 (rs3_byte7[7:0]), |
| .sel0(lsu_atomic_pkt2_bsel_g[2]), |
| .sel1(lsu_atomic_pkt2_bsel_g[1]), |
| .sel2(lsu_atomic_pkt2_bsel_g[0]), |
| .dout(atm_byte_g[7:0])); |
| |
| |
| //assign atm_byte_g[15:8] = |
| //lsu_atomic_pkt2_bsel_g[2] ? rs3_byte1[7:0] : |
| // lsu_atomic_pkt2_bsel_g[1] ? rs3_byte2[7:0] : |
| // lsu_atomic_pkt2_bsel_g[0] ? rs3_byte6[7:0] : 8'bxxxx_xxxx ; |
| |
| mux3ds #(8) mx_atm_byte_g_15_8 ( |
| .in0 (rs3_byte1[7:0]), |
| .in1 (rs3_byte2[7:0]), |
| .in2 (rs3_byte6[7:0]), |
| .sel0(lsu_atomic_pkt2_bsel_g[2]), |
| .sel1(lsu_atomic_pkt2_bsel_g[1]), |
| .sel2(lsu_atomic_pkt2_bsel_g[0]), |
| .dout(atm_byte_g[15:8])); |
| |
| //assign atm_byte_g[23:16] = |
| //lsu_atomic_pkt2_bsel_g[2] ? rs3_byte2[7:0] : |
| // lsu_atomic_pkt2_bsel_g[1] ? rs3_byte1[7:0] : |
| // lsu_atomic_pkt2_bsel_g[0] ? rs3_byte5[7:0] : 8'bxxxx_xxxx ; |
| |
| mux3ds #(8) mx_atm_byte_g_23_16 ( |
| .in0 (rs3_byte2[7:0]), |
| .in1 (rs3_byte1[7:0]), |
| .in2 (rs3_byte5[7:0]), |
| .sel0(lsu_atomic_pkt2_bsel_g[2]), |
| .sel1(lsu_atomic_pkt2_bsel_g[1]), |
| .sel2(lsu_atomic_pkt2_bsel_g[0]), |
| .dout(atm_byte_g[23:16])); |
| |
| //assign atm_byte_g[31:24] = |
| //lsu_atomic_pkt2_bsel_g[2] ? rs3_byte3[7:0] : |
| // lsu_atomic_pkt2_bsel_g[1] ? rs3_byte0[7:0] : |
| // lsu_atomic_pkt2_bsel_g[0] ? rs3_byte4[7:0] : 8'bxxxx_xxxx ; |
| |
| mux3ds #(8) mx_atm_byte_g_31_24 ( |
| .in0 (rs3_byte3[7:0]), |
| .in1 (rs3_byte0[7:0]), |
| .in2 (rs3_byte4[7:0]), |
| .sel0(lsu_atomic_pkt2_bsel_g[2]), |
| .sel1(lsu_atomic_pkt2_bsel_g[1]), |
| .sel2(lsu_atomic_pkt2_bsel_g[0]), |
| .dout(atm_byte_g[31:24])); |
| |
| //assign atm_byte_g[39:32] = |
| //lsu_atomic_pkt2_bsel_g[2] ? rs3_byte4[7:0] : |
| // lsu_atomic_pkt2_bsel_g[1] ? rs3_byte0[7:0] : |
| // lsu_atomic_pkt2_bsel_g[0] ? rs3_byte3[7:0] : 8'bxxxx_xxxx ; |
| |
| mux3ds #(8) mx_atm_byte_g_39_32 ( |
| .in0 (rs3_byte4[7:0]), |
| .in1 (rs3_byte0[7:0]), |
| .in2 (rs3_byte3[7:0]), |
| .sel0(lsu_atomic_pkt2_bsel_g[2]), |
| .sel1(lsu_atomic_pkt2_bsel_g[1]), |
| .sel2(lsu_atomic_pkt2_bsel_g[0]), |
| .dout(atm_byte_g[39:32])); |
| |
| //assign atm_byte_g[47:40] = |
| //lsu_atomic_pkt2_bsel_g[2] ? rs3_byte5[7:0] : |
| // lsu_atomic_pkt2_bsel_g[1] ? rs3_byte1[7:0] : |
| // lsu_atomic_pkt2_bsel_g[0] ? rs3_byte2[7:0] : 8'bxxxx_xxxx ; |
| |
| mux3ds #(8) mx_atm_byte_g_47_40( |
| .in0 (rs3_byte5[7:0]), |
| .in1 (rs3_byte1[7:0]), |
| .in2 (rs3_byte2[7:0]), |
| .sel0(lsu_atomic_pkt2_bsel_g[2]), |
| .sel1(lsu_atomic_pkt2_bsel_g[1]), |
| .sel2(lsu_atomic_pkt2_bsel_g[0]), |
| .dout(atm_byte_g[47:40])); |
| |
| //assign atm_byte_g[55:48] = |
| //lsu_atomic_pkt2_bsel_g[2] ? rs3_byte6[7:0] : |
| // lsu_atomic_pkt2_bsel_g[1] ? rs3_byte2[7:0] : |
| // lsu_atomic_pkt2_bsel_g[0] ? rs3_byte1[7:0] : 8'bxxxx_xxxx ; |
| |
| mux3ds #(8) mx_atm_byte_g_55_48( |
| .in0 (rs3_byte6[7:0]), |
| .in1 (rs3_byte2[7:0]), |
| .in2 (rs3_byte1[7:0]), |
| .sel0(lsu_atomic_pkt2_bsel_g[2]), |
| .sel1(lsu_atomic_pkt2_bsel_g[1]), |
| .sel2(lsu_atomic_pkt2_bsel_g[0]), |
| .dout(atm_byte_g[55:48])); |
| |
| //assign atm_byte_g[63:56] = |
| //lsu_atomic_pkt2_bsel_g[2] ? rs3_byte7[7:0] : |
| // lsu_atomic_pkt2_bsel_g[1] ? rs3_byte3[7:0] : |
| // lsu_atomic_pkt2_bsel_g[0] ? rs3_byte0[7:0] : 8'bxxxx_xxxx ; |
| |
| mux3ds #(8) mx_atm_byte_g_63_56 ( |
| .in0 (rs3_byte7[7:0]), |
| .in1 (rs3_byte3[7:0]), |
| .in2 (rs3_byte0[7:0]), |
| .sel0(lsu_atomic_pkt2_bsel_g[2]), |
| .sel1(lsu_atomic_pkt2_bsel_g[1]), |
| .sel2(lsu_atomic_pkt2_bsel_g[0]), |
| .dout(atm_byte_g[63:56])); |
| |
| //================================================================================================= |
| // STB/LDXA DATA BYPASSING |
| //================================================================================================= |
| |
| // Add STB to load bypass data flops. |
| // Attempt is made to bypass data in G-stage for load. If not |
| // possible then flop data and wait for next available bubble. |
| // Once bypass occurs then load can be considered resolved. |
| // Load Full Raw bypassing does not have to use DFQ. |
| |
| // ldxa data will reside in bypass flops until an opportunity |
| // is available to write to irf. ldxa's must write to lmq |
| // in order to provide information such as rd to irf. |
| |
| // ** The two conditions are mutually exclusive. ** |
| |
| // lsu_local_ldxa_data_w2 w/ lsu_misc_rdata_w2 for all 4 threads |
| |
| // 1-hot fix: 8/1/03 - can be multihot during scan |
| // grape mapper convert the 1 of the inverter used for the select to the logic below |
| wire [2:0] lmq_byp_ldxa_sel0_1hot ; |
| assign lmq_byp_ldxa_sel0_1hot[0] = lmq_byp_ldxa_sel0[0] & ~rst_tri_en; |
| assign lmq_byp_ldxa_sel0_1hot[1] = lmq_byp_ldxa_sel0[1] & ~rst_tri_en; |
| assign lmq_byp_ldxa_sel0_1hot[2] = lmq_byp_ldxa_sel0[2] | rst_tri_en; |
| |
| |
| // THREAD 0 |
| mux3ds #(64) ldbyp0_ldxa_mx ( |
| .in0 (ifu_lsu_ldxa_data_w2[63:0]), // ifu-ldxa bypass data |
| //.in1 (tlu_lsu_ldxa_data_w2[63:0]), // tlu-ldxa bypass data |
| .in1 (spu_lsu_ldxa_data_w2[63:0]), // spu-ldxa bypass data |
| .in2 (lsu_misc_rdata_w2[63:0]), // local asi bypass data |
| .sel0 (lmq_byp_ldxa_sel0_1hot[0]), |
| //.sel1 (lmq_byp_ldxa_sel0[1]), |
| .sel1 (lmq_byp_ldxa_sel0_1hot[1]), |
| .sel2 (lmq_byp_ldxa_sel0_1hot[2]), |
| .dout (lmq0_bypass_ldxa_data[63:0]) |
| ); |
| |
| // 1-hot fix: 8/1/03 - can be multihot during scan |
| // grape mapper convert the 1 of the inverter used for the select to the logic below |
| wire [3:0] lmq_byp_data_sel0_1hot ; |
| assign lmq_byp_data_sel0_1hot[0] = lmq_byp_data_sel0[0] ; |
| assign lmq_byp_data_sel0_1hot[1] = lmq_byp_data_sel0[1] ; |
| assign lmq_byp_data_sel0_1hot[2] = lmq_byp_data_sel0[2] ; |
| assign lmq_byp_data_sel0_1hot[3] = lmq_byp_data_sel0[3] ; |
| |
| wire [63:0] lmq0_bypass_misc_data ; |
| mux4ds #(64) ldbyp0_data_mx ( |
| .in0 (stb_rdata_ramd[63:0]), // stb bypass data |
| .in1 (exu_lsu_rs3_data_e[63:0]), // rs3 data |
| .in2 (atm_byte_g[63:0]), // cas formatted data |
| .in3 (lmq0_bypass_ldxa_data[63:0]), // ldxa bypass data |
| .sel0 (lmq_byp_data_sel0_1hot[0]), |
| .sel1 (lmq_byp_data_sel0_1hot[1]), |
| .sel2 (lmq_byp_data_sel0_1hot[2]), |
| .sel3 (lmq_byp_data_sel0_1hot[3]), |
| .dout (lmq0_bypass_misc_data[63:0]) |
| ); |
| |
| |
| // 2:1 mux for additional data bus from tlu. |
| // Grape : merge into mux-flop. |
| mux2ds #(64) ldbyp0_fmx ( |
| .in0 (lmq0_bypass_misc_data[63:0]), |
| .in1 (tlu_lsu_int_ldxa_data_w2[63:0]), |
| .sel0 (~lmq_byp_data_fmx_sel[0]), |
| .sel1 (lmq_byp_data_fmx_sel[0]), |
| .dout (lmq0_bypass_data_in[63:0]) |
| ); |
| |
| /* |
| dffe_s #(64) ldbyp0_data_ff ( |
| .din (lmq0_bypass_data_in[63:0]), |
| .q (lmq0_bypass_data[63:0]), |
| .en (lmq_byp_data_en_w2[0]), .clk (clk), |
| .se (1'b0), .si (), .so () |
| ); |
| */ |
| wire ldbyp0_data_clk; |
| `ifdef FPGA_SYN_CLK_EN |
| `else |
| clken_buf ldbyp0_data_clkbuf ( |
| .rclk (clk), |
| .enb_l (~lmq_byp_data_en_w2[0]), |
| .tmb_l (~se), |
| .clk (ldbyp0_data_clk) |
| ) ; |
| `endif |
| |
| `ifdef FPGA_SYN_CLK_DFF |
| dffe_s #(64) ldbyp0_data_ff ( |
| .din (lmq0_bypass_data_in[63:0]), |
| .q (lmq0_bypass_data[63:0]), |
| .en (~(~lmq_byp_data_en_w2[0])), .clk(clk), |
| .se (1'b0), .si (), .so () |
| ); |
| `else |
| dff_s #(64) ldbyp0_data_ff ( |
| .din (lmq0_bypass_data_in[63:0]), |
| .q (lmq0_bypass_data[63:0]), |
| .clk (ldbyp0_data_clk), |
| .se (1'b0), .si (), .so () |
| ); |
| `endif |
| |
| `ifdef FPGA_SYN_1THREAD |
| `else |
| |
| // THREAD 1 |
| // 1-hot fix: 8/1/03 - can be multihot during scan |
| // grape mapper convert the 1 of the inverter used for the select to the logic below |
| wire [2:0] lmq_byp_ldxa_sel1_1hot ; |
| assign lmq_byp_ldxa_sel1_1hot[0] = lmq_byp_ldxa_sel1[0] & ~rst_tri_en; |
| assign lmq_byp_ldxa_sel1_1hot[1] = lmq_byp_ldxa_sel1[1] & ~rst_tri_en; |
| assign lmq_byp_ldxa_sel1_1hot[2] = lmq_byp_ldxa_sel1[2] | rst_tri_en; |
| |
| |
| mux3ds #(64) ldbyp1_ldxa_mx ( |
| .in0 (ifu_lsu_ldxa_data_w2[63:0]), // ifu-ldxa bypass data |
| //.in1 (tlu_lsu_ldxa_data_w2[63:0]), // tlu-ldxa bypass data |
| .in1 (spu_lsu_ldxa_data_w2[63:0]), // spu-ldxa bypass data |
| .in2 (lsu_misc_rdata_w2[63:0]),// local asi bypass data |
| .sel0 (lmq_byp_ldxa_sel1_1hot[0]), |
| //.sel1 (lmq_byp_ldxa_sel1[1]), |
| .sel1 (lmq_byp_ldxa_sel1_1hot[1]), |
| .sel2 (lmq_byp_ldxa_sel1_1hot[2]), |
| .dout (lmq1_bypass_ldxa_data[63:0]) |
| ); |
| |
| // 1-hot fix: 8/1/03 - can be multihot during scan |
| // grape mapper convert the 1 of the inverter used for the select to the logic below |
| wire [3:0] lmq_byp_data_sel1_1hot ; |
| assign lmq_byp_data_sel1_1hot[0] = lmq_byp_data_sel1[0] ; |
| assign lmq_byp_data_sel1_1hot[1] = lmq_byp_data_sel1[1] ; |
| assign lmq_byp_data_sel1_1hot[2] = lmq_byp_data_sel1[2] ; |
| assign lmq_byp_data_sel1_1hot[3] = lmq_byp_data_sel1[3] ; |
| |
| |
| wire [63:0] lmq1_bypass_misc_data ; |
| mux4ds #(64) ldbyp1_data_mx ( |
| .in0 (stb_rdata_ramd[63:0]), // stb bypass data |
| .in1 (exu_lsu_rs3_data_e[63:0]), // rs3 data |
| .in2 (atm_byte_g[63:0]), // cas formatted data |
| .in3 (lmq1_bypass_ldxa_data[63:0]), // ldxa bypass data |
| .sel0 (lmq_byp_data_sel1_1hot[0]), |
| .sel1 (lmq_byp_data_sel1_1hot[1]), |
| .sel2 (lmq_byp_data_sel1_1hot[2]), |
| .sel3 (lmq_byp_data_sel1_1hot[3]), |
| .dout (lmq1_bypass_misc_data[63:0]) |
| ); |
| |
| // 2:1 mux for additional data bus from tlu. |
| // Grape : merge into mux-flop. |
| mux2ds #(64) ldbyp1_fmx ( |
| .in0 (lmq1_bypass_misc_data[63:0]), |
| .in1 (tlu_lsu_int_ldxa_data_w2[63:0]), |
| .sel0 (~lmq_byp_data_fmx_sel[1]), |
| .sel1 (lmq_byp_data_fmx_sel[1]), |
| .dout (lmq1_bypass_data_in[63:0]) |
| ); |
| |
| /* |
| dffe_s #(64) ldbyp1_data_ff ( |
| .din (lmq1_bypass_data_in[63:0]), |
| .q (lmq1_bypass_data[63:0]), |
| .en (lmq_byp_data_en_w2[1]), .clk (clk), |
| .se (1'b0), .si (), .so () |
| ); |
| */ |
| wire ldbyp1_data_clk; |
| `ifdef FPGA_SYN_CLK_EN |
| `else |
| clken_buf ldbyp1_data_clkbuf ( |
| .rclk (clk), |
| .enb_l (~lmq_byp_data_en_w2[1]), |
| .tmb_l (~se), |
| .clk (ldbyp1_data_clk) |
| ) ; |
| `endif |
| |
| `ifdef FPGA_SYN_CLK_DFF |
| dffe_s #(64) ldbyp1_data_ff ( |
| .din (lmq1_bypass_data_in[63:0]), |
| .q (lmq1_bypass_data[63:0]), |
| .en (~(~lmq_byp_data_en_w2[1])), .clk(clk), |
| .se (1'b0), .si (), .so () |
| ); |
| `else |
| dff_s #(64) ldbyp1_data_ff ( |
| .din (lmq1_bypass_data_in[63:0]), |
| .q (lmq1_bypass_data[63:0]), |
| .clk (ldbyp1_data_clk), |
| .se (1'b0), .si (), .so () |
| ); |
| `endif |
| |
| // THREAD 2 |
| // 1-hot fix: 8/1/03 - can be multihot during scan |
| // grape mapper convert the 1 of the inverter used for the select to the logic below |
| wire [2:0] lmq_byp_ldxa_sel2_1hot ; |
| assign lmq_byp_ldxa_sel2_1hot[0] = lmq_byp_ldxa_sel2[0] & ~rst_tri_en; |
| assign lmq_byp_ldxa_sel2_1hot[1] = lmq_byp_ldxa_sel2[1] & ~rst_tri_en; |
| assign lmq_byp_ldxa_sel2_1hot[2] = lmq_byp_ldxa_sel2[2] | rst_tri_en; |
| |
| |
| mux3ds #(64) ldbyp2_data_mx ( |
| .in0 (ifu_lsu_ldxa_data_w2[63:0]), // ifu-ldxa bypass data |
| //.in1 (tlu_lsu_ldxa_data_w2[63:0]), // tlu-ldxa bypass data |
| .in1 (spu_lsu_ldxa_data_w2[63:0]), // spu-ldxa bypass data |
| .in2 (lsu_misc_rdata_w2[63:0]),// local asi bypass data |
| .sel0 (lmq_byp_ldxa_sel2_1hot[0]), |
| //.sel1 (lmq_byp_ldxa_sel2[1]), |
| .sel1 (lmq_byp_ldxa_sel2_1hot[1]), |
| .sel2 (lmq_byp_ldxa_sel2_1hot[2]), |
| .dout (lmq2_bypass_ldxa_data[63:0]) |
| ); |
| |
| // 1-hot fix: 8/1/03 - can be multihot during scan |
| // grape mapper convert the 1 of the inverter used for the select to the logic below |
| wire [3:0] lmq_byp_data_sel2_1hot ; |
| assign lmq_byp_data_sel2_1hot[0] = lmq_byp_data_sel2[0] ; |
| assign lmq_byp_data_sel2_1hot[1] = lmq_byp_data_sel2[1] ; |
| assign lmq_byp_data_sel2_1hot[2] = lmq_byp_data_sel2[2] ; |
| assign lmq_byp_data_sel2_1hot[3] = lmq_byp_data_sel2[3] ; |
| |
| |
| wire [63:0] lmq2_bypass_misc_data ; |
| mux4ds #(64) ldbyp2_ldxa_mx ( |
| .in0 (stb_rdata_ramd[63:0]), // stb bypass data |
| .in1 (exu_lsu_rs3_data_e[63:0]), // rs3 data |
| .in2 (atm_byte_g[63:0]), // cas formatted data |
| .in3 (lmq2_bypass_ldxa_data[63:0]), // ldxa bypass data |
| .sel0 (lmq_byp_data_sel2_1hot[0]), |
| .sel1 (lmq_byp_data_sel2_1hot[1]), |
| .sel2 (lmq_byp_data_sel2_1hot[2]), |
| .sel3 (lmq_byp_data_sel2_1hot[3]), |
| .dout (lmq2_bypass_misc_data[63:0]) |
| ); |
| |
| // 2:1 mux for additional data bus from tlu. |
| // Grape : merge into mux-flop. |
| mux2ds #(64) ldbyp2_fmx ( |
| .in0 (lmq2_bypass_misc_data[63:0]), |
| .in1 (tlu_lsu_int_ldxa_data_w2[63:0]), |
| .sel0 (~lmq_byp_data_fmx_sel[2]), |
| .sel1 (lmq_byp_data_fmx_sel[2]), |
| .dout (lmq2_bypass_data_in[63:0]) |
| ); |
| |
| /* |
| dffe_s #(64) ldbyp2_data_ff ( |
| .din (lmq2_bypass_data_in[63:0]), |
| .q (lmq2_bypass_data[63:0]), |
| .en (lmq_byp_data_en_w2[2]), .clk (clk), |
| .se (1'b0), .si (), .so () |
| ); |
| */ |
| wire ldbyp2_data_clk; |
| `ifdef FPGA_SYN_CLK_EN |
| `else |
| clken_buf ldbyp2_data_clkbuf ( |
| .rclk (clk), |
| .enb_l (~lmq_byp_data_en_w2[2]), |
| .tmb_l (~se), |
| .clk (ldbyp2_data_clk) |
| ) ; |
| `endif |
| |
| `ifdef FPGA_SYN_CLK_DFF |
| dffe_s #(64) ldbyp2_data_ff ( |
| .din (lmq2_bypass_data_in[63:0]), |
| .q (lmq2_bypass_data[63:0]), |
| .en (~(~lmq_byp_data_en_w2[2])), .clk(clk), |
| .se (1'b0), .si (), .so () |
| ); |
| `else |
| dff_s #(64) ldbyp2_data_ff ( |
| .din (lmq2_bypass_data_in[63:0]), |
| .q (lmq2_bypass_data[63:0]), |
| .clk (ldbyp2_data_clk), |
| .se (1'b0), .si (), .so () |
| ); |
| `endif |
| |
| // THREAD 3 |
| // 1-hot fix: 8/1/03 - can be multihot during scan |
| // grape mapper convert the 1 of the inverter used for the select to the logic below |
| wire [2:0] lmq_byp_ldxa_sel3_1hot ; |
| assign lmq_byp_ldxa_sel3_1hot[0] = lmq_byp_ldxa_sel3[0] & ~rst_tri_en; |
| assign lmq_byp_ldxa_sel3_1hot[1] = lmq_byp_ldxa_sel3[1] & ~rst_tri_en; |
| assign lmq_byp_ldxa_sel3_1hot[2] = lmq_byp_ldxa_sel3[2] | rst_tri_en; |
| |
| |
| mux3ds #(64) ldbyp3_data_mx ( |
| .in0 (ifu_lsu_ldxa_data_w2[63:0]), // ifu-ldxa bypass data |
| //.in1 (tlu_lsu_ldxa_data_w2[63:0]), // tlu-ldxa bypass data |
| .in1 (spu_lsu_ldxa_data_w2[63:0]), // spu-ldxa bypass data |
| .in2 (lsu_misc_rdata_w2[63:0]),// local asi bypass data |
| .sel0 (lmq_byp_ldxa_sel3_1hot[0]), |
| //.sel1 (lmq_byp_ldxa_sel3[1]), |
| .sel1 (lmq_byp_ldxa_sel3_1hot[1]), |
| .sel2 (lmq_byp_ldxa_sel3_1hot[2]), |
| .dout (lmq3_bypass_ldxa_data[63:0]) |
| ); |
| |
| // 1-hot fix: 8/1/03 - can be multihot during scan |
| // grape mapper convert the 1 of the inverter used for the select to the logic below |
| wire [3:0] lmq_byp_data_sel3_1hot ; |
| assign lmq_byp_data_sel3_1hot[0] = lmq_byp_data_sel3[0] ; |
| assign lmq_byp_data_sel3_1hot[1] = lmq_byp_data_sel3[1] ; |
| assign lmq_byp_data_sel3_1hot[2] = lmq_byp_data_sel3[2] ; |
| assign lmq_byp_data_sel3_1hot[3] = lmq_byp_data_sel3[3] ; |
| |
| |
| wire [63:0] lmq3_bypass_misc_data ; |
| mux4ds #(64) ldbyp3_ldxa_mx ( |
| .in0 (stb_rdata_ramd[63:0]), // stb bypass data |
| .in1 (exu_lsu_rs3_data_e[63:0]), // rs3 data |
| .in2 (atm_byte_g[63:0]), // cas formatted data |
| .in3 (lmq3_bypass_ldxa_data[63:0]), // ldxa bypass data |
| .sel0 (lmq_byp_data_sel3_1hot[0]), |
| .sel1 (lmq_byp_data_sel3_1hot[1]), |
| .sel2 (lmq_byp_data_sel3_1hot[2]), |
| .sel3 (lmq_byp_data_sel3_1hot[3]), |
| .dout (lmq3_bypass_misc_data[63:0]) |
| ); |
| |
| // 2:1 mux for additional data bus from tlu. |
| // Grape : merge into mux-flop. |
| mux2ds #(64) ldbyp3_fmx ( |
| .in0 (lmq3_bypass_misc_data[63:0]), |
| .in1 (tlu_lsu_int_ldxa_data_w2[63:0]), |
| .sel0 (~lmq_byp_data_fmx_sel[3]), |
| .sel1 (lmq_byp_data_fmx_sel[3]), |
| .dout (lmq3_bypass_data_in[63:0]) |
| ); |
| |
| /* |
| dffe_s #(64) ldbyp3_data_ff ( |
| .din (lmq3_bypass_data_in[63:0]), |
| .q (lmq3_bypass_data[63:0]), |
| .en (lmq_byp_data_en_w2[3]), .clk (clk), |
| .se (1'b0), .si (), .so () |
| ); |
| */ |
| wire ldbyp3_data_clk; |
| `ifdef FPGA_SYN_CLK_EN |
| `else |
| clken_buf ldbyp3_data_clkbuf ( |
| .rclk (clk), |
| .enb_l (~lmq_byp_data_en_w2[3]), |
| .tmb_l (~se), |
| .clk (ldbyp3_data_clk) |
| ) ; |
| `endif |
| |
| `ifdef FPGA_SYN_CLK_DFF |
| dffe_s #(64) ldbyp3_data_ff ( |
| .din (lmq3_bypass_data_in[63:0]), |
| .q (lmq3_bypass_data[63:0]), |
| .en (~(~lmq_byp_data_en_w2[3])), .clk(clk), |
| .se (1'b0), .si (), .so () |
| ); |
| `else |
| dff_s #(64) ldbyp3_data_ff ( |
| .din (lmq3_bypass_data_in[63:0]), |
| .q (lmq3_bypass_data[63:0]), |
| .clk (ldbyp3_data_clk), |
| .se (1'b0), .si (), .so () |
| ); |
| `endif |
| |
| `endif |
| |
| `ifdef FPGA_SYN_1THREAD |
| assign cas_pkt2_data[63:0] = lmq0_bypass_data[63:0]; |
| assign tlb_st_data[63:0] = lmq0_bypass_data[63:0]; |
| `else |
| // This can be merged with above mux !!!! |
| mux4ds #(64) ld_byp_cas_mx ( |
| .in0 (lmq0_bypass_data[63:0]), |
| .in1 (lmq1_bypass_data[63:0]), |
| .in2 (lmq2_bypass_data[63:0]), |
| .in3 (lmq3_bypass_data[63:0]), |
| .sel0 (ld_pcx_rq_sel[0]), |
| .sel1 (ld_pcx_rq_sel[1]), |
| .sel2 (ld_pcx_rq_sel[2]), |
| .sel3 (ld_pcx_rq_sel[3]), |
| .dout (cas_pkt2_data[63:0]) |
| ); |
| |
| // Can this be merged with above muxes ? |
| mux4ds #(64) tlb_st_mx ( |
| .in0 (lmq0_bypass_data[63:0]), |
| .in1 (lmq1_bypass_data[63:0]), |
| .in2 (lmq2_bypass_data[63:0]), |
| .in3 (lmq3_bypass_data[63:0]), |
| .sel0 (lsu_tlb_st_sel_m[0]), |
| .sel1 (lsu_tlb_st_sel_m[1]), |
| .sel2 (lsu_tlb_st_sel_m[2]), |
| .sel3 (lsu_tlb_st_sel_m[3]), |
| .dout (tlb_st_data[63:0]) |
| ); |
| `endif |
| |
| /*mux4ds #(64) tlb_st_mx ( |
| .in0 (lmq0_bypass_data[63:0]), |
| .in1 (lmq1_bypass_data[63:0]), |
| .in2 (lmq2_bypass_data[63:0]), |
| .in3 (lmq3_bypass_data[63:0]), |
| .sel0 (lsu_tlb_st_sel_g[0]), |
| .sel1 (lsu_tlb_st_sel_g[1]), |
| .sel2 (lsu_tlb_st_sel_g[2]), |
| .sel3 (lsu_tlb_st_sel_g[3]), |
| .dout (tlb_st_data[63:0]) |
| );*/ |
| |
| wire [63:0] tlb_st_data_d1 ; |
| dff_s #(64) std_d1 ( |
| .din (tlb_st_data[63:0]), |
| .q (tlb_st_data_d1[63:0]), |
| .clk (clk), |
| .se (1'b0), .si (), .so () |
| ); |
| |
| // Begin - Bug3487. |
| |
| |
| wire asi_data_clk; |
| `ifdef FPGA_SYN_CLK_EN |
| `else |
| clken_buf asid_clkbuf ( |
| .rclk (clk), |
| .enb_l (lsu_ifu_asi_data_en_l), |
| .tmb_l (~se), |
| .clk (asi_data_clk) |
| ) ; |
| `endif |
| |
| `ifdef FPGA_SYN_CLK_DFF |
| dffe_s #(48) ifu_std_d1 ( |
| .din (tlb_st_data[47:0]), |
| .q (lsu_ifu_stxa_data[47:0]), |
| .en (~(lsu_ifu_asi_data_en_l)), .clk(clk), |
| .se (1'b0), .si (), .so () |
| ); |
| `else |
| dff_s #(48) ifu_std_d1 ( |
| .din (tlb_st_data[47:0]), |
| .q (lsu_ifu_stxa_data[47:0]), |
| .clk (asi_data_clk), |
| .se (1'b0), .si (), .so () |
| ); |
| `endif |
| |
| // select is now a stage earlier, which should be |
| // fine as selects stay constant. |
| //assign lsu_ifu_stxa_data[47:0] = tlb_st_data_d1[47:0] ; |
| |
| // End - Bug3487. |
| |
| |
| //wire [3:0] lsu_diag_access_sel_d1 ; |
| |
| //dff #(4) diagsel_stgd1 ( |
| // .din (lsu_diag_access_sel[3:0]), |
| // .q (lsu_diag_access_sel_d1[3:0]), |
| // .clk (clk), |
| // .se (1'b0), .si (), .so () |
| // ); |
| |
| //mux4ds #(64) diag_st_mx ( |
| // .in0 (lmq0_bypass_data[63:0]), |
| // .in1 (lmq1_bypass_data[63:0]), |
| // .in2 (lmq2_bypass_data[63:0]), |
| // .in3 (lmq3_bypass_data[63:0]), |
| // .sel0 (lsu_diag_access_sel_d1[0]), |
| // .sel1 (lsu_diag_access_sel_d1[1]), |
| // .sel2 (lsu_diag_access_sel_d1[2]), |
| // .sel3 (lsu_diag_access_sel_d1[3]), |
| // .dout (lsu_diagnstc_wr_data_e[63:0]) |
| //); |
| |
| // 1-hot fix: 8/1/03 - can be multihot during scan |
| // grape mapper convert the 1 of the inverter used for the select to the logic below |
| wire [3:0] lsu_diagnstc_data_sel_1hot ; |
| assign lsu_diagnstc_data_sel_1hot[0] = lsu_diagnstc_data_sel[0] & ~rst_tri_en; |
| assign lsu_diagnstc_data_sel_1hot[1] = lsu_diagnstc_data_sel[1] & ~rst_tri_en; |
| assign lsu_diagnstc_data_sel_1hot[2] = lsu_diagnstc_data_sel[2] & ~rst_tri_en; |
| assign lsu_diagnstc_data_sel_1hot[3] = lsu_diagnstc_data_sel[3] | rst_tri_en; |
| |
| |
| `ifdef FPGA_SYN_1THREAD |
| assign lsu_diagnstc_wr_data_e[63:0] = lmq0_bypass_data[63:0]; |
| `else |
| mux4ds #(64) diag_st_mx ( |
| .in0 (lmq0_bypass_data[63:0]), |
| .in1 (lmq1_bypass_data[63:0]), |
| .in2 (lmq2_bypass_data[63:0]), |
| .in3 (lmq3_bypass_data[63:0]), |
| .sel0 (lsu_diagnstc_data_sel_1hot[0]), |
| .sel1 (lsu_diagnstc_data_sel_1hot[1]), |
| .sel2 (lsu_diagnstc_data_sel_1hot[2]), |
| .sel3 (lsu_diagnstc_data_sel_1hot[3]), |
| .dout (lsu_diagnstc_wr_data_e[63:0]) |
| ); |
| `endif |
| |
| // Remove flops |
| /*dff #(64) dgndt_d1 ( |
| .din (tlb_st_data[63:0]), |
| .q (lsu_diagnstc_wr_data_e[63:0]), |
| .clk (clk), |
| .se (1'b0), .si (), .so () |
| ); */ |
| |
| assign lsu_diagnstc_wr_data_b0 = lsu_diagnstc_wr_data_e[0] ; |
| |
| // Move tte format and parity calc to tlbdp |
| |
| //assign lsu_tlu_st_rs3_data_g[63:0] = tlb_st_data_d1[63:0]; |
| assign lsu_tlu_st_rs3_data_g[47:3] = tlb_st_data_d1[47:3]; |
| assign lsu_mmu_rs3_data_g[63:0] = tlb_st_data_d1[63:0]; |
| assign lsu_tlu_rs3_data_g[63:0] = tlb_st_data_d1[63:0]; |
| |
| // Removed Fast bypass as penalty is negligible. |
| |
| //================================================================================================= |
| // STQ PKT2 DATA |
| //================================================================================================= |
| |
| //** stquad support removed ** |
| |
| //================================================================================================= |
| // IMISS/SPU DP |
| //================================================================================================= |
| |
| // Format of IFU pcx packet (50b) : |
| // b49 - valid |
| // b48:44 - req type |
| // b43:42 - rep way (for "eviction" - maintains directory consistency ) |
| // b41:40 - mil id |
| // b39:0 - imiss address |
| |
| |
| // Align ifu pkt with ldst pkt - temporary ! |
| // Does this need to be enabled ?!!!! No. |
| assign ifu_pcx_pkt_e[51:0] = ifu_pcx_pkt[51:0] ; |
| |
| // Form pcx-wide ifu request packet. |
| assign ifu_full_pcx_pkt_e[`PCX_VLD] = ifu_pcx_pkt_e[51] ; |
| assign ifu_full_pcx_pkt_e[`PCX_RQ_HI:`PCX_RQ_LO] = ifu_pcx_pkt_e[48:44]; |
| assign ifu_full_pcx_pkt_e[`PCX_NC] = ifu_pcx_pkt_e[49] ; |
| assign ifu_full_pcx_pkt_e[`PCX_CP_HI:`PCX_CP_LO] = const_cpuid[2:0] ; |
| // thread-id unused - use mil id instead. |
| assign ifu_full_pcx_pkt_e[`PCX_TH_HI:`PCX_TH_LO] = ifu_pcx_pkt_e[41:40] ; |
| assign ifu_full_pcx_pkt_e[`PCX_BF_HI] = ifu_pcx_pkt_e[50] ; |
| assign ifu_full_pcx_pkt_e[`PCX_BF_HI-1:`PCX_BF_LO] = 2'b00; |
| assign ifu_full_pcx_pkt_e[`PCX_WY_HI:`PCX_WY_LO] = ifu_pcx_pkt_e[43:42] ; |
| // unused - always infer 32b |
| assign ifu_full_pcx_pkt_e[`PCX_SZ_HI:`PCX_SZ_LO] = 3'b000 ; |
| assign ifu_full_pcx_pkt_e[`PCX_AD_HI:`PCX_AD_LO] = ifu_pcx_pkt_e[39:0] ; |
| // no data |
| assign ifu_full_pcx_pkt_e[`PCX_DA_HI:`PCX_DA_LO] = 64'd0 ; |
| |
| // Form pcx-wide interrupt request packet. |
| assign intrpt_full_pcxpkt[`PCX_VLD] = tlu_lsu_pcxpkt[25] ; |
| assign intrpt_full_pcxpkt[`PCX_RQ_HI:`PCX_RQ_LO] = tlu_lsu_pcxpkt[24:20]; |
| assign intrpt_full_pcxpkt[`PCX_NC] = 1'b0 ; |
| |
| //tlu_lsu_pcxpkt[12:8] is the 5 bit interrupt destination thread id, |
| //so [12:10] is the cpu id, and [9:8] is the thread id. |
| assign intrpt_full_pcxpkt[`PCX_CP_HI:`PCX_CP_LO] = tlu_lsu_pcxpkt[12:10]; |
| |
| // or should thread-id be 19:18 ? |
| assign intrpt_full_pcxpkt[`PCX_TH_HI:`PCX_TH_LO] = tlu_lsu_pcxpkt[19:18] ; |
| // May actually make undriven fields x. |
| assign intrpt_full_pcxpkt[`PCX_BF_HI:`PCX_BF_LO] = 3'b000; |
| assign intrpt_full_pcxpkt[`PCX_WY_HI:`PCX_WY_LO] = 2'b00 ; |
| assign intrpt_full_pcxpkt[`PCX_SZ_HI:`PCX_SZ_LO] = 3'b000 ; |
| assign intrpt_full_pcxpkt[`PCX_AD_HI:`PCX_AD_LO] = 40'd0 ; |
| assign intrpt_full_pcxpkt[`PCX_DA_HI:`PCX_DA_LO] = {46'd0,tlu_lsu_pcxpkt[17:0]} ; |
| |
| // Format fpop_full_pcxpkt. |
| |
| assign fpop_full_pcxpkt[`PCX_VLD] = ffu_lsu_data[80] ; |
| assign fpop_full_pcxpkt[`PCX_RQ_HI:`PCX_RQ_LO] = {4'b0101,ffu_lsu_data[78]} ; |
| assign fpop_full_pcxpkt[`PCX_NC] = 1'b0 ; |
| assign fpop_full_pcxpkt[`PCX_CP_HI:`PCX_CP_LO] = const_cpuid[2:0] ; |
| assign fpop_full_pcxpkt[`PCX_TH_HI:`PCX_TH_LO] = ffu_lsu_data[77:76] ; |
| assign fpop_full_pcxpkt[`PCX_BF_HI:`PCX_SZ_LO] = 8'd0 ; |
| assign fpop_full_pcxpkt[`PCX_AD_HI:`PCX_AD_LO+16] = 24'd0 ; |
| assign fpop_full_pcxpkt[`PCX_AD_LO+15:`PCX_AD_LO+8] = ffu_lsu_data[75:68]; // 79:72 |
| assign fpop_full_pcxpkt[`PCX_AD_LO+7:`PCX_AD_LO+4] = 4'b0000; // 71:68 |
| assign fpop_full_pcxpkt[`PCX_AD_LO+3:`PCX_AD_LO] = ffu_lsu_data[67:64] ; // 67:64 |
| assign fpop_full_pcxpkt[`PCX_DA_HI:`PCX_DA_LO] = ffu_lsu_data[63:0] ; |
| |
| |
| // RAMTest Data Merging. |
| wire cacherd_clk; |
| `ifdef FPGA_SYN_CLK_EN |
| `else |
| clken_buf cacherd_clkbuf ( |
| .rclk (clk), |
| .enb_l (~lsu_ramtest_rd_w), |
| .tmb_l (~se), |
| .clk (cacherd_clk) |
| ) ; |
| `endif |
| |
| wire [63:0] cache_rdata_w,cache_rdata_w2 ; |
| |
| mux2ds #(64) cacherd_sel ( |
| .in0 (ifu_lsu_ldxa_data_w2[63:0]), |
| .in1 (lsu_dcache_rdata_w[63:0]), |
| .sel0 (~lsu_dcache_iob_rd_w), |
| .sel1 (lsu_dcache_iob_rd_w), |
| .dout (cache_rdata_w[63:0]) |
| ); |
| |
| `ifdef FPGA_SYN_CLK_DFF |
| dffe_s #(64) cachedata ( |
| .din (cache_rdata_w[63:0]), |
| .q (cache_rdata_w2[63:0]), // references dcache rd staging |
| .en (~(~lsu_ramtest_rd_w)), .clk(clk), |
| .se (1'b0), .si (), .so () |
| ); |
| `else |
| dff_s #(64) cachedata ( |
| .din (cache_rdata_w[63:0]), |
| .q (cache_rdata_w2[63:0]), // references dcache rd staging |
| .clk (cacherd_clk), |
| .se (1'b0), .si (), .so () |
| ); |
| `endif |
| |
| assign fwd_full_pcxpkt[`PCX_VLD] = 1'b1 ; |
| assign fwd_full_pcxpkt[`PCX_RQ_HI:`PCX_RQ_LO] = {3'b011,lsu_pcx_fwd_reply,~lsu_pcx_fwd_reply} ; |
| assign fwd_full_pcxpkt[`PCX_NC] = lsu_pcx_fwd_pkt[107] ; |
| assign fwd_full_pcxpkt[`PCX_CP_HI:`PCX_CP_LO] = lsu_pcx_fwd_pkt[106:104] ; |
| assign fwd_full_pcxpkt[`PCX_TH_HI:`PCX_TH_LO] = 2'b00 ; |
| assign fwd_full_pcxpkt[`PCX_BF_HI:`PCX_SZ_LO] = |
| {6'b000000,lsu_fwd_rply_sz1_unc,1'b1} ; |
| // All address bits should not be required !!! |
| assign fwd_full_pcxpkt[`PCX_AD_HI:`PCX_AD_LO] = lsu_pcx_fwd_pkt[103:64] ; |
| |
| // Mux sources of TAP request data - margin,pc,defeature/debug/bist. |
| // Be careful about pc - could be a critical path. |
| // ** Assume read-data stays constant at output latches of dcache ** |
| //assign fwd_full_pcxpkt[`PCX_DA_HI:`PCX_DA_LO] = |
| //lsu_iobrdge_rply_data_sel[0] ? {20'd0,lsu_iobrdge_rd_data[43:0]} : |
| // lsu_iobrdge_rply_data_sel[1] ? cache_rdata_w2[63:0] : |
| // lsu_iobrdge_rply_data_sel[2] ? lsu_pcx_fwd_pkt[63:0] : |
| // 64'hxxxx_xxxx_xxxx_xxxx ; |
| |
| mux3ds #(64) mx_fwd_full_pcxpkt ( |
| .in0 ({20'd0,lsu_iobrdge_rd_data[43:0]}), |
| .in1 (cache_rdata_w2[63:0]), |
| .in2 (lsu_pcx_fwd_pkt[63:0]), |
| .sel0(lsu_iobrdge_rply_data_sel[0]), |
| .sel1(lsu_iobrdge_rply_data_sel[1]), |
| .sel2(lsu_iobrdge_rply_data_sel[2]), |
| .dout(fwd_full_pcxpkt[`PCX_DA_HI:`PCX_DA_LO])); |
| |
| |
| wire [`PCX_WIDTH-1:0] spu_lsu_ldst_pckt_d1 ; |
| dff_s #(`PCX_WIDTH) ff_spu_lsu_ldst_pckt_d1 ( |
| .din (spu_lsu_ldst_pckt[`PCX_WIDTH-1:0]), |
| .q (spu_lsu_ldst_pckt_d1[`PCX_WIDTH-1:0]), |
| .clk (clk), |
| .se (1'b0), .si (), .so () |
| ); |
| |
| assign imiss_strm_pcx_pkt[`PCX_WIDTH-1:0] = imiss_pcx_mx_sel ? |
| ifu_full_pcx_pkt_e[`PCX_WIDTH-1:0] : spu_lsu_ldst_pckt_d1[`PCX_WIDTH-1:0] ; |
| |
| wire [`PCX_WIDTH-1:0] fwd_int_fp_pcx_pkt ; |
| mux3ds #(`PCX_WIDTH) mux_fwd_int_fp_pcx_pkt ( |
| .in0 (fwd_full_pcxpkt[`PCX_WIDTH-1:0]), |
| .in1 (intrpt_full_pcxpkt[`PCX_WIDTH-1:0]), |
| .in2 (fpop_full_pcxpkt[`PCX_WIDTH-1:0]), |
| .sel0 (fwd_int_fp_pcx_mx_sel[0]), |
| .sel1 (fwd_int_fp_pcx_mx_sel[1]), |
| .sel2 (fwd_int_fp_pcx_mx_sel[2]), |
| .dout (fwd_int_fp_pcx_pkt [`PCX_WIDTH-1:0]) |
| ); |
| |
| //================================================================================================= |
| // PCX PKT SELECTION |
| //================================================================================================= |
| |
| assign stb_pcx_pkt[`STB_PCX_VLD] = lsu_stb_pcx_rvld_d1 ; // Valid |
| // Support stores for now. |
| assign stb_pcx_pkt[`STB_PCX_RQ_HI:`STB_PCX_RQ_LO] = stb_rdata_ramd[74:72] ; // Rq-type |
| assign stb_pcx_pkt[`STB_PCX_NC] = |
| // Mina the OR gate has been extended to a 3 input gate |
| stb_rdata_ramd[74] | stb_rdata_ramd[73] | // atomics |
| stb_rdata_ramd[71] ; // flush inst |
| // cpu-id will be inserted on way out of core. |
| assign stb_pcx_pkt[`STB_PCX_TH_HI:`STB_PCX_TH_LO] = lsu_stb_rd_tid[1:0] ; // TID |
| // bf-id is not required. |
| // mux will have to be placed elsewhere. (grape) |
| assign stb_pcx_pkt[`STB_PCX_FLSH] = stb_rdata_ramd[71] ; // flush |
| assign stb_pcx_pkt[`STB_PCX_FLSH-1] = 1'b0 ; |
| //assign stb_pcx_pkt[`STB_PCX_WY_HI:`STB_PCX_WY_LO] = 2'b00 ; |
| |
| //bug 2511 |
| assign stb_pcx_pkt[`STB_PCX_SZ_HI:`STB_PCX_SZ_LO] = |
| stb_rdata_ramd[69:68]; // Size |
| |
| //assign stb_pcx_pkt[`STB_PCX_AD_HI:`STB_PCX_AD_LO] = stb_pcx_pkt[`STB_PCX_FLSH] ? 40'b0 : |
| // {stb_rdata_ramc[44:9],stb_rdata_ramd[67:64]} ;// Addr |
| |
| assign stb_pcx_pkt[`STB_PCX_AD_HI:`STB_PCX_AD_LO] = |
| {stb_rdata_ramc[44:9],stb_rdata_ramd[67:64]} ;// Addr |
| |
| |
| assign stb_pcx_pkt[`STB_PCX_DA_HI:`STB_PCX_DA_LO] = |
| stb_rdata_ramd[63:0]; // Data |
| |
| assign store_pcx_pkt[`STB_PCX_WIDTH-1:0] = stb_pcx_pkt[`STB_PCX_WIDTH-1:0] ; |
| |
| // bld addr select. |
| wire [1:0] bld_addr_b54 ; |
| assign bld_addr_b54[1:0] = |
| lsu_bld_pcx_rq ? lsu_bld_rq_addr[1:0] : load_pcx_pkt[`LMQ_AD_LO+5:`LMQ_AD_LO+4] ; |
| |
| // Select between load and store outbound pkt. |
| // *** cpu-id currently hardwired in pkt |
| // *** Thrd id currently hardwired. |
| mux4ds #(124) pcx_pkt_src ( |
| .in0 ({load_pcx_pkt[`LMQ_VLD],2'b00, |
| load_pcx_pkt[`LMQ_RQ_HI: `LMQ_RQ_LO], |
| load_pcx_pkt[`LMQ_NC],const_cpuid[2:0], |
| ld_pcx_thrd[1:0],lsu_pcx_ld_dtag_perror_w2, |
| load_pcx_pkt[`LMQ_PREF],load_pcx_pkt[`LMQ_DFLUSH], |
| load_pcx_pkt[`LMQ_WY_HI:`LMQ_WY_LO],lsu_pcx_rq_sz_b3, |
| //load_pcx_pkt[`LMQ_WY_HI:`LMQ_WY_LO],1'b0, |
| //load_pcx_pkt[`LMQ_SZ_HI:0],cas_pkt2_data[63:0]}), // load |
| load_pcx_pkt[`LMQ_SZ_HI:`LMQ_AD_LO+6], bld_addr_b54[1:0], |
| load_pcx_pkt[`LMQ_AD_LO+3:`LMQ_AD_LO],cas_pkt2_data[63:0]}), // load |
| .in1 ({store_pcx_pkt[`STB_PCX_VLD],1'b0, |
| store_pcx_pkt[`STB_PCX_FLSH], // turn into interrupt request. |
| store_pcx_pkt[`STB_PCX_RQ_HI:`STB_PCX_RQ_LO], |
| store_pcx_pkt[`STB_PCX_NC], const_cpuid[2:0], |
| store_pcx_pkt[`STB_PCX_TH_HI:`STB_PCX_TH_LO], |
| 1'b0, |
| stb_rdata_ramd[70], // blk-st : Bug 3395 |
| stb_rdata_ramd[75], |
| 2'b00, |
| //store_pcx_pkt[`STB_PCX_WY_HI:`STB_PCX_WY_LO], |
| 1'b0,store_pcx_pkt[`STB_PCX_SZ_HI:0]}), // store |
| .in2 (imiss_strm_pcx_pkt[`PCX_WIDTH-1:0]), // alt src : imiss,stream. |
| .in3 (fwd_int_fp_pcx_pkt[`PCX_WIDTH-1:0]), // fwd, interrupt, fpop |
| .sel0 (pcx_pkt_src_sel[0]), |
| .sel1 (pcx_pkt_src_sel[1]), |
| .sel2 (pcx_pkt_src_sel[2]), |
| .sel3 (pcx_pkt_src_sel[3]), |
| .dout (pcx_pkt_data[`PCX_WIDTH-1:0]) |
| ); |
| |
| dff_s #(124) pcx_xmit_ff ( |
| .din (pcx_pkt_data[`PCX_WIDTH-1:0]), |
| .q (spc_pcx_data_pa[`PCX_WIDTH-1:0]), |
| .clk (clk), |
| .se (1'b0), .si (), .so () |
| ); |
| |
| // Stage to avoid critical path |
| /*assign lsu_ifu_ld_icache_index[11:5] = pcx_pkt_data[`PCX_AD_LO+11:`PCX_AD_LO+5] ; |
| assign lsu_ifu_ld_pcxpkt_tid[1:0] = pcx_pkt_data[`PCX_TH_HI:`PCX_TH_LO] ;*/ |
| |
| dff_s #(9) stg_icindx ( |
| .din ({pcx_pkt_data[`PCX_AD_LO+11:`PCX_AD_LO+5],pcx_pkt_data[`PCX_TH_HI:`PCX_TH_LO]}), |
| .q ({lsu_ifu_ld_icache_index[11:5],lsu_ifu_ld_pcxpkt_tid[1:0]}), |
| .clk (clk), |
| .se (1'b0), .si (), .so () |
| ); |
| |
| //========================================================================================= |
| // VA Watchpt Reg per thread |
| //========================================================================================= |
| |
| //VA_watchpoint_thread0 |
| wire va_wtchpt0_clk ; |
| wire [47:3] va_wtchpt0_addr; |
| |
| `ifdef FPGA_SYN_CLK_EN |
| `else |
| clken_buf clkbf_va_wtchpt0 ( |
| .rclk (clk), |
| .enb_l (lsu_va_wtchpt0_wr_en_l), |
| .tmb_l (~se), |
| .clk (va_wtchpt0_clk) |
| ) ; |
| `endif |
| |
| `ifdef FPGA_SYN_CLK_DFF |
| dffe_s #(45) va_wtchpt0_ff ( |
| .din (lsu_tlu_st_rs3_data_g[47:3]), |
| .q (va_wtchpt0_addr[47:3]), |
| .en (~(lsu_va_wtchpt0_wr_en_l)), .clk(clk), |
| .se (1'b0), .si (), .so () |
| ); |
| `else |
| dff_s #(45) va_wtchpt0_ff ( |
| .din (lsu_tlu_st_rs3_data_g[47:3]), |
| .q (va_wtchpt0_addr[47:3]), |
| .clk (va_wtchpt0_clk), |
| .se (1'b0), .si (), .so () |
| ); |
| `endif |
| |
| //VA_watchpoint_thread1 |
| wire va_wtchpt1_clk ; |
| wire [47:3] va_wtchpt1_addr; |
| |
| `ifdef FPGA_SYN_CLK_EN |
| `else |
| clken_buf clkbf_va_wtchpt1 ( |
| .rclk (clk), |
| .enb_l (lsu_va_wtchpt1_wr_en_l), |
| .tmb_l (~se), |
| .clk (va_wtchpt1_clk) |
| ) ; |
| `endif |
| |
| `ifdef FPGA_SYN_CLK_DFF |
| dffe_s #(45) va_wtchpt1_ff ( |
| .din (lsu_tlu_st_rs3_data_g[47:3]), |
| .q (va_wtchpt1_addr[47:3]), |
| .en (~(lsu_va_wtchpt1_wr_en_l)), .clk(clk), |
| .se (1'b0), .si (), .so () |
| ); |
| `else |
| dff_s #(45) va_wtchpt1_ff ( |
| .din (lsu_tlu_st_rs3_data_g[47:3]), |
| .q (va_wtchpt1_addr[47:3]), |
| .clk (va_wtchpt1_clk), |
| .se (1'b0), .si (), .so () |
| ); |
| `endif |
| |
| //VA_watchpoint_thread2 |
| wire va_wtchpt2_clk ; |
| wire [47:3] va_wtchpt2_addr; |
| |
| `ifdef FPGA_SYN_CLK_EN |
| `else |
| clken_buf clkbf_va_wtchpt2 ( |
| .rclk (clk), |
| .enb_l (lsu_va_wtchpt2_wr_en_l), |
| .tmb_l (~se), |
| .clk (va_wtchpt2_clk) |
| ) ; |
| `endif |
| |
| `ifdef FPGA_SYN_CLK_DFF |
| dffe_s #(45) va_wtchpt2_ff ( |
| .din (lsu_tlu_st_rs3_data_g[47:3]), |
| .q (va_wtchpt2_addr[47:3]), |
| .en (~(lsu_va_wtchpt2_wr_en_l)), .clk(clk), |
| .se (1'b0), .si (), .so () |
| ); |
| `else |
| dff_s #(45) va_wtchpt2_ff ( |
| .din (lsu_tlu_st_rs3_data_g[47:3]), |
| .q (va_wtchpt2_addr[47:3]), |
| .clk (va_wtchpt2_clk), |
| .se (1'b0), .si (), .so () |
| ); |
| `endif |
| |
| //VA_watchpoint_thread3 |
| wire va_wtchpt3_clk ; |
| wire [47:3] va_wtchpt3_addr; |
| |
| `ifdef FPGA_SYN_CLK_EN |
| `else |
| clken_buf clkbf_va_wtchpt3 ( |
| .rclk (clk), |
| .enb_l (lsu_va_wtchpt3_wr_en_l), |
| .tmb_l (~se), |
| .clk (va_wtchpt3_clk) |
| ) ; |
| `endif |
| |
| `ifdef FPGA_SYN_CLK_DFF |
| dffe_s #(45) va_wtchpt3_ff ( |
| .din (lsu_tlu_st_rs3_data_g[47:3]), |
| .q (va_wtchpt3_addr[47:3]), |
| .en (~(lsu_va_wtchpt3_wr_en_l)), .clk(clk), |
| .se (1'b0), .si (), .so () |
| ); |
| `else |
| dff_s #(45) va_wtchpt3_ff ( |
| .din (lsu_tlu_st_rs3_data_g[47:3]), |
| .q (va_wtchpt3_addr[47:3]), |
| .clk (va_wtchpt3_clk), |
| .se (1'b0), .si (), .so () |
| ); |
| `endif |
| |
| wire [47:3] va_wtchpt_addr; |
| |
| mux4ds #(45) va_wtchpt_mx_m ( |
| .in0 (va_wtchpt0_addr[47:3]), |
| .in1 (va_wtchpt1_addr[47:3]), |
| .in2 (va_wtchpt2_addr[47:3]), |
| .in3 (va_wtchpt3_addr[47:3]), |
| .sel0 (thread0_m), |
| .sel1 (thread1_m), |
| .sel2 (thread2_m), |
| .sel3 (thread3_m), |
| .dout (va_wtchpt_addr[47:3]) |
| ); |
| |
| mux4ds #(45) va_wtchpt_mx_g ( |
| .in0 (va_wtchpt0_addr[47:3]), |
| .in1 (va_wtchpt1_addr[47:3]), |
| .in2 (va_wtchpt2_addr[47:3]), |
| .in3 (va_wtchpt3_addr[47:3]), |
| .sel0 (thread0_g), |
| .sel1 (thread1_g), |
| .sel2 (thread2_g), |
| .sel3 (thread3_g), |
| .dout (lsu_va_wtchpt_addr[47:3]) |
| ); |
| |
| //VA wtchpt comparison at M stage |
| //assign lsu_va_match_m = (lsu_ldst_va_m[47:3] == va_wtchpt_addr[47:3]); |
| //bug6480/eco6623 |
| assign lsu_va_match_b47_b32_m = (lsu_ldst_va_m[47:32] == va_wtchpt_addr[47:32]); |
| assign lsu_va_match_b31_b3_m = (lsu_ldst_va_m[31:3 ] == va_wtchpt_addr[31:3 ]); |
| |
| //==================================================================== |
| //dc_fill CP |
| wire [63:0] l2fill_data_m; |
| |
| //dff #(64) stgm_l2fd ( |
| // .din (lsu_l2fill_data[63:0]), |
| // .q (l2fill_data_m[63:0]), |
| // .clk (clk), |
| // .se (se), .si (), .so () |
| // ); |
| assign l2fill_data_m[63:0] = lsu_l2fill_data[63:0]; |
| |
| |
| wire [63:0] ld_byp_data_m; |
| |
| `ifdef FPGA_SYN_1THREAD |
| assign ld_byp_data_m[63:0] = lmq0_bypass_data[63:0]; |
| `else |
| mux4ds #(64) ld_byp_mx ( |
| .in0 (lmq0_bypass_data[63:0]), |
| .in1 (lmq1_bypass_data[63:0]), |
| .in2 (lmq2_bypass_data[63:0]), |
| .in3 (lmq3_bypass_data[63:0]), |
| .sel0 (ld_thrd_byp_sel_m[0]), |
| .sel1 (ld_thrd_byp_sel_m[1]), |
| .sel2 (ld_thrd_byp_sel_m[2]), |
| .sel3 (ld_thrd_byp_sel_m[3]), |
| .dout (ld_byp_data_m[63:0]) |
| ); |
| `endif |
| |
| assign dcache_alt_data_w0_m[63:0] = |
| l2fill_vld_m ? l2fill_data_m[63:0] : |
| ld_byp_data_m[63:0]; |
| |
| //assign lsu_l2fill_or_byp_msb_m[7:0] |
| // = {lsu_l2fill_or_byp_data_m[63], |
| // lsu_l2fill_or_byp_data_m[55], |
| // lsu_l2fill_or_byp_data_m[47], |
| // lsu_l2fill_or_byp_data_m[39], |
| // lsu_l2fill_or_byp_data_m[31], |
| // lsu_l2fill_or_byp_data_m[23], |
| // lsu_l2fill_or_byp_data_m[15], |
| // lsu_l2fill_or_byp_data_m[07]} ; |
| //==================================================================== |
| |
| endmodule |