URL
https://opencores.org/ocsvn/sparc64soc/sparc64soc/trunk
Subversion Repositories sparc64soc
[/] [sparc64soc/] [trunk/] [T1-CPU/] [tlu/] [tlu_misctl.v] - Rev 2
Compare with Previous | Blame | View Log
// ========== Copyright Header Begin ========================================== // // OpenSPARC T1 Processor File: tlu_misctl.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: Block that contain most of miscellaneous // control and datapath components // to alleviate tdp and tcp congestions */ //////////////////////////////////////////////////////////////////////// // Global header file includes //////////////////////////////////////////////////////////////////////// `include "sys.h" // system level definition file which contains the // time scale definition `include "tlu.h" //////////////////////////////////////////////////////////////////////// // Local header file includes / local defines //////////////////////////////////////////////////////////////////////// module tlu_misctl (/*AUTOARG*/ // outputs tlu_exu_cwp_m, tlu_exu_ccr_m, tlu_lsu_asi_m, tlu_cwp_no_change_m, tlu_sscan_misctl_data, tlu_ifu_trappc_w2, tlu_ifu_trapnpc_w2, tlu_pc_new_w, tlu_npc_new_w, so, // PIC experiment tlu_exu_pic_onebelow_m, tlu_exu_pic_twobelow_m, // inputs ctu_sscan_tid, ifu_tlu_pc_m, exu_tlu_cwp0, exu_tlu_cwp1, exu_tlu_cwp2, exu_tlu_cwp3, tlu_final_ttype_w2, tsa_wr_tid, tlu_true_pc_sel_w, tsa1_wr_vld, tsa_ttype_en, tsa_rd_vld_e, tsa0_rdata_cwp, tsa0_rdata_pstate, tsa0_rdata_asi, tsa0_rdata_ccr, tsa0_rdata_gl, tsa0_rdata_pc, tsa1_rdata_ttype, tsa1_rdata_npc, tsa1_rdata_htstate, tlu_thrd_rsel_e, tlu_final_offset_w1, tlu_partial_trap_pc_w1, tlu_restore_pc_w1, tlu_restore_npc_w1, ifu_npc_w, tlu_restore_pc_sel_w1, tlu_pic_cnt_en_m, tlu_pic_onebelow_e, tlu_pic_twobelow_e, tlu_rst, si, se, rclk); // pich_threebelow_flg, pich_twobelow_flg, pich_onebelow_flg, //================================================= // output //================================================= output [`TSA_CCR_WIDTH-1:0] tlu_exu_ccr_m; // restored ccr output [`TSA_CWP_WIDTH-1:0] tlu_exu_cwp_m; // restored cwp output [`TLU_ASI_STATE_WIDTH-1:0] tlu_lsu_asi_m; // restored asi output tlu_cwp_no_change_m; // cwp change indicator // // sscan output output [`MISCTL_SSCAN_WIDTH-1:0] tlu_sscan_misctl_data; // // trap pc and npc output [48:0] tlu_ifu_trappc_w2, tlu_ifu_trapnpc_w2; output [48:0] tlu_pc_new_w, tlu_npc_new_w; // global nets output so; // PIC experiment output tlu_exu_pic_onebelow_m; // local traps send to exu output tlu_exu_pic_twobelow_m; // local traps send to exu //================================================= // input //================================================= // sscan related inputs input [`TLU_THRD_NUM-1:0] ctu_sscan_tid; input [`TSA_TTYPE_WIDTH-1:0] tlu_final_ttype_w2; input [1:0] tsa_wr_tid; input tsa1_wr_vld, tsa_rd_vld_e; input tsa_ttype_en; // // current cwp value from exu input [2:0] exu_tlu_cwp0; // cwp - thread0 input [2:0] exu_tlu_cwp1; // cwp - thread1 input [2:0] exu_tlu_cwp2; // cwp - thread2 input [2:0] exu_tlu_cwp3; // cwp - thread3 // // componets from trap stack arrays (tsas) input [`TSA_CWP_WIDTH-1:0] tsa0_rdata_cwp; input [`TSA_PSTATE_WIDTH-1:0] tsa0_rdata_pstate; input [`TSA_CCR_WIDTH-1:0] tsa0_rdata_ccr; input [`TLU_ASI_STATE_WIDTH-1:0] tsa0_rdata_asi; input [`TSA_GLOBAL_WIDTH-1:0] tsa0_rdata_gl; input [46:0] tsa0_rdata_pc; input [`TSA_TTYPE_WIDTH-1:0] tsa1_rdata_ttype; input [46:0] tsa1_rdata_npc; input [`TSA_HTSTATE_WIDTH-1:0] tsa1_rdata_htstate; // // trap pc calculations signals input [48:0] ifu_tlu_pc_m; // pc // input [48:0] ifu_tlu_npc_m; // npc input [`TSA_TTYPE_WIDTH-1:0] tlu_final_offset_w1; input [33:0] tlu_partial_trap_pc_w1; input [48:0] tlu_restore_pc_w1; input [48:0] tlu_restore_npc_w1; // input [48:0] ifu_pc_w; input [48:0] ifu_npc_w; input tlu_restore_pc_sel_w1; // // modified due to timing fix input [2:0] tlu_true_pc_sel_w; // input tlu_retry_inst_m; // input tlu_done_inst_m; // input tlu_dnrtry_inst_m_l; // input [`TLU_THRD_NUM-1:0] tlu_thrd_rsel_e; // global nets input si, se; // //clk input rclk; // // PIC trap experiment // input [`TLU_THRD_NUM-1:0] tlu_thread_inst_vld_w2; // valid inst for a thread // input [`TLU_THRD_NUM-1:0] pich_threebelow_flg; // input [`TLU_THRD_NUM-1:0] pich_twobelow_flg; // input [`TLU_THRD_NUM-1:0] pich_onebelow_flg; input tlu_pic_onebelow_e; input tlu_pic_twobelow_e; input tlu_pic_cnt_en_m; input tlu_rst; //================================================= // local wires //================================================= // local clock wire clk; // // staged thread id wire [`TLU_THRD_NUM-1:0] thrd_sel_m; wire [`TLU_THRD_NUM-1:0] tsa_wsel_thrd_w2; // // staged tsa_controls wire tsa_rd_vld_m; // tsa_rd_vld_e, // // components from tsas // tsa0 wire [`TLU_ASI_STATE_WIDTH-1:0] tsa0_asi_m; wire [`TSA_CWP_WIDTH-1:0] tsa0_cwp_m; wire [`TSA_CCR_WIDTH-1:0] tsa0_ccr_m; wire [`TSA_PSTATE_WIDTH-1:0] tsa0_pstate_m; wire [`TSA_GLOBAL_WIDTH-1:0] tsa0_gl_m; wire [46:0] tsa0_pc_m; // tsa1 wire [`TSA_TTYPE_WIDTH-1:0] tsa1_ttype_m; wire [`TSA_HTSTATE_WIDTH-1:0] tsa1_htstate_m; wire [46:0] tsa1_npc_m; // // modified for timing // wire [48:0] pc_new_m, npc_new_m; wire [48:0] pc_new_w, npc_new_w, ifu_pc_w; wire [46:0] tsa0_pc_w, tsa1_npc_w; // // sscan related signals wire [`TLU_THRD_NUM-1:0] sscan_tid_sel; wire [`TLU_THRD_NUM-1:0] sscan_ttype_en; wire [`TLU_THRD_NUM-1:0] sscan_tt_rd_sel; wire [`TLU_THRD_NUM-1:0] sscan_tt_wr_sel; wire [`TSA_TTYPE_WIDTH-1:0] sscan_tt0_data; wire [`TSA_TTYPE_WIDTH-1:0] sscan_tt1_data; wire [`TSA_TTYPE_WIDTH-1:0] sscan_tt2_data; wire [`TSA_TTYPE_WIDTH-1:0] sscan_tt3_data; wire [`TSA_TTYPE_WIDTH-1:0] sscan_tt0_din; wire [`TSA_TTYPE_WIDTH-1:0] sscan_tt1_din; wire [`TSA_TTYPE_WIDTH-1:0] sscan_tt2_din; wire [`TSA_TTYPE_WIDTH-1:0] sscan_tt3_din; wire [`MISCTL_SSCAN_WIDTH-1:0] misctl_sscan_test_data; // // cwp logic wire cwp_no_change_m; wire [`TSA_CWP_WIDTH-1:0] cwp_xor_m, trap_old_cwp_m; wire [48:0] normal_trap_pc_w1, normal_trap_npc_w1; wire [48:0] trap_pc_w1, trap_npc_w1; wire [48:0] trap_pc_w2, trap_npc_w2; // // PIC experiment wire tlu_pic_onebelow_m, tlu_pic_twobelow_m; // wire [`TLU_THRD_NUM-1:0] pic_onebelow_e, pic_twobelow_e; wire local_rst; // //========================================================================================= // local clock //========================================================================================= assign clk = rclk; //========================================================================================= // TSA data capture //========================================================================================= dff_s #(`TSA_CCR_WIDTH) dff_tsa0_ccr_m ( .din (tsa0_rdata_ccr[`TSA_CCR_WIDTH-1:0]), .q (tsa0_ccr_m[`TSA_CCR_WIDTH-1:0]), .clk (clk), .se (se), .si (), .so () ); dff_s #(`TSA_CWP_WIDTH) dff_tsa0_cwp_m ( .din (tsa0_rdata_cwp[`TSA_CWP_WIDTH-1:0]), .q (tsa0_cwp_m[`TSA_CWP_WIDTH-1:0]), .clk (clk), .se (se), .si (), .so () ); dff_s #(`TLU_ASI_STATE_WIDTH) dff_lsu_asi_m ( .din (tsa0_rdata_asi[`TLU_ASI_STATE_WIDTH-1:0]), .q (tsa0_asi_m[`TLU_ASI_STATE_WIDTH-1:0]), .clk (clk), .se (se), .si (), .so () ); dff_s #(`TSA_PSTATE_WIDTH) dff_tsa0_pstate_m ( .din (tsa0_rdata_pstate[`TSA_CCR_WIDTH-1:0]), .q (tsa0_pstate_m[`TSA_PSTATE_WIDTH-1:0]), .clk (clk), .se (se), .si (), .so () ); dff_s #(`TSA_GLOBAL_WIDTH) dff_tsa0_gl_m ( .din (tsa0_rdata_gl[`TSA_GLOBAL_WIDTH-1:0]), .q (tsa0_gl_m[`TSA_GLOBAL_WIDTH-1:0]), .clk (clk), .se (se), .si (), .so () ); dff_s #(47) dff_tsa0_pc_m ( .din (tsa0_rdata_pc[46:0]), .q (tsa0_pc_m[46:0]), .clk (clk), .se (se), .si (), .so () ); dff_s #(`TSA_TTYPE_WIDTH) dff_tsa1_ttype_m ( .din (tsa1_rdata_ttype[`TSA_TTYPE_WIDTH-1:0]), .q (tsa1_ttype_m[`TSA_TTYPE_WIDTH-1:0]), .clk (clk), .se (se), .si (), .so () ); dff_s #(`TSA_HTSTATE_WIDTH) dff_tsa1_htstate_m ( .din (tsa1_rdata_htstate[`TSA_HTSTATE_WIDTH-1:0]), .q (tsa1_htstate_m[`TSA_HTSTATE_WIDTH-1:0]), .clk (clk), .se (se), .si (), .so () ); dff_s #(47) dff_tsa1_npc_m ( .din (tsa1_rdata_npc[46:0]), .q (tsa1_npc_m[46:0]), .clk (clk), .se (se), .si (), .so () ); // //========================================================================================= // CWP/CCR restoration //========================================================================================= assign tlu_exu_ccr_m[`TSA_CCR_WIDTH-1:0] = tsa0_ccr_m[`TSA_CCR_WIDTH-1:0]; assign tlu_exu_cwp_m[`TSA_CWP_WIDTH-1:0] = tsa0_cwp_m[`TSA_CWP_WIDTH-1:0]; assign tlu_lsu_asi_m[`TLU_ASI_STATE_WIDTH-1:0] = tsa0_asi_m[`TLU_ASI_STATE_WIDTH-1:0]; // modified/added for timing violations // moved the logic from exu to tlu due to timing violations dff_s #(`TLU_THRD_NUM) dff_thrd_sel_m ( .din (tlu_thrd_rsel_e[`TLU_THRD_NUM-1:0]), .q (thrd_sel_m[`TLU_THRD_NUM-1:0]), .clk (clk), .se (se), .si (), .so () ); mux4ds #(`TSA_CWP_WIDTH) mux_trap_old_cwp_m( .in0(exu_tlu_cwp0[`TSA_CWP_WIDTH-1:0]), .in1(exu_tlu_cwp1[`TSA_CWP_WIDTH-1:0]), .in2(exu_tlu_cwp2[`TSA_CWP_WIDTH-1:0]), .in3(exu_tlu_cwp3[`TSA_CWP_WIDTH-1:0]), .sel0(thrd_sel_m[0]), .sel1(thrd_sel_m[1]), .sel2(thrd_sel_m[2]), .sel3(thrd_sel_m[3]), .dout(trap_old_cwp_m[`TSA_CWP_WIDTH-1:0]) ); assign cwp_xor_m[`TSA_CWP_WIDTH-1:0] = trap_old_cwp_m[`TSA_CWP_WIDTH-1:0] ^ tlu_exu_cwp_m[`TSA_CWP_WIDTH-1:0]; assign cwp_no_change_m = ~|(cwp_xor_m[`TSA_CWP_WIDTH-1:0]); assign tlu_cwp_no_change_m = cwp_no_change_m; //========================================================================================= // Generate TTYPE SSCAN data //========================================================================================= // // staging the tsa_rd_vld signal // moved to tlu_tcl for timing /* dff_s dff_tsa_rd_vld_e ( .din (tsa_rd_vld), .q (tsa_rd_vld_e), .clk (clk), .se (se), .si (), .so () ); */ dff_s dff_tsa_rd_vld_m ( .din (tsa_rd_vld_e), .q (tsa_rd_vld_m), .clk (clk), .se (se), .si (), .so () ); assign tsa_wsel_thrd_w2[0] = ~tsa_wr_tid[1] & ~tsa_wr_tid[0]; assign tsa_wsel_thrd_w2[1] = ~tsa_wr_tid[1] & tsa_wr_tid[0]; assign tsa_wsel_thrd_w2[2]= tsa_wr_tid[1] & ~tsa_wr_tid[0]; assign tsa_wsel_thrd_w2[3] = tsa_wr_tid[1] & tsa_wr_tid[0]; // generating write indicators of ttype to the tsa assign sscan_tt_wr_sel[0] = tsa_ttype_en & tsa1_wr_vld & tsa_wsel_thrd_w2[0]; assign sscan_tt_wr_sel[1] = tsa_ttype_en & tsa1_wr_vld & tsa_wsel_thrd_w2[1]; assign sscan_tt_wr_sel[2] = tsa_ttype_en & tsa1_wr_vld & tsa_wsel_thrd_w2[2]; assign sscan_tt_wr_sel[3] = tsa_ttype_en & tsa1_wr_vld & tsa_wsel_thrd_w2[3]; // // generating read indicators of ttype from the tsa assign sscan_tt_rd_sel[0] = tsa_rd_vld_m & thrd_sel_m[0]; assign sscan_tt_rd_sel[1] = tsa_rd_vld_m & thrd_sel_m[1]; assign sscan_tt_rd_sel[2] = tsa_rd_vld_m & thrd_sel_m[2]; assign sscan_tt_rd_sel[3] = tsa_rd_vld_m & thrd_sel_m[3]; assign sscan_ttype_en[0] = sscan_tt_rd_sel[0] | sscan_tt_wr_sel[0]; assign sscan_ttype_en[1] = sscan_tt_rd_sel[1] | sscan_tt_wr_sel[1]; assign sscan_ttype_en[2] = sscan_tt_rd_sel[2] | sscan_tt_wr_sel[2]; assign sscan_ttype_en[3] = sscan_tt_rd_sel[3] | sscan_tt_wr_sel[3]; // assign sscan_tt0_din[`TSA_TTYPE_WIDTH-1:0] = (sscan_tt_wr_sel[0]) ? tlu_final_ttype_w2[`TSA_TTYPE_WIDTH-1:0] : tsa1_ttype_m[`TSA_TTYPE_WIDTH-1:0]; assign sscan_tt1_din[`TSA_TTYPE_WIDTH-1:0] = (sscan_tt_wr_sel[1]) ? tlu_final_ttype_w2[`TSA_TTYPE_WIDTH-1:0] : tsa1_ttype_m[`TSA_TTYPE_WIDTH-1:0]; assign sscan_tt2_din[`TSA_TTYPE_WIDTH-1:0] = (sscan_tt_wr_sel[2]) ? tlu_final_ttype_w2[`TSA_TTYPE_WIDTH-1:0] : tsa1_ttype_m[`TSA_TTYPE_WIDTH-1:0]; assign sscan_tt3_din[`TSA_TTYPE_WIDTH-1:0] = (sscan_tt_wr_sel[3]) ? tlu_final_ttype_w2[`TSA_TTYPE_WIDTH-1:0] : tsa1_ttype_m[`TSA_TTYPE_WIDTH-1:0]; // dffe_s #(`TSA_TTYPE_WIDTH) dffe_sscan_tt0_data ( .din (sscan_tt0_din[`TSA_TTYPE_WIDTH-1:0]), .q (sscan_tt0_data[`TSA_TTYPE_WIDTH-1:0]), .en (sscan_ttype_en[0]), .clk (clk), .se (se), .si (), .so () ); dffe_s #(`TSA_TTYPE_WIDTH) dffe_sscan_tt1_data ( .din (sscan_tt1_din[`TSA_TTYPE_WIDTH-1:0]), .q (sscan_tt1_data[`TSA_TTYPE_WIDTH-1:0]), .en (sscan_ttype_en[1]), .clk (clk), .se (se), .si (), .so () ); dffe_s #(`TSA_TTYPE_WIDTH) dffe_sscan_tt2_data ( .din (sscan_tt2_din[`TSA_TTYPE_WIDTH-1:0]), .q (sscan_tt2_data[`TSA_TTYPE_WIDTH-1:0]), .en (sscan_ttype_en[2]), .clk (clk), .se (se), .si (), .so () ); dffe_s #(`TSA_TTYPE_WIDTH) dffe_sscan_tt3_data ( .din (sscan_tt3_din[`TSA_TTYPE_WIDTH-1:0]), .q (sscan_tt3_data[`TSA_TTYPE_WIDTH-1:0]), .en (sscan_ttype_en[3]), .clk (clk), .se (se), .si (), .so () ); assign sscan_tid_sel[`TLU_THRD_NUM-1:0] = ctu_sscan_tid[`TLU_THRD_NUM-1:0]; mux4ds #(`MISCTL_SSCAN_WIDTH) mx_sscan_test_data ( .in0 (sscan_tt0_data[`TSA_TTYPE_WIDTH-1:0]), .in1 (sscan_tt1_data[`TSA_TTYPE_WIDTH-1:0]), .in2 (sscan_tt2_data[`TSA_TTYPE_WIDTH-1:0]), .in3 (sscan_tt3_data[`TSA_TTYPE_WIDTH-1:0]), .sel0 (sscan_tid_sel[0]), .sel1 (sscan_tid_sel[1]), .sel2 (sscan_tid_sel[2]), .sel3 (sscan_tid_sel[3]), .dout (misctl_sscan_test_data[`MISCTL_SSCAN_WIDTH-1:0]) ); assign tlu_sscan_misctl_data[`MISCTL_SSCAN_WIDTH-1:0] = misctl_sscan_test_data[`MISCTL_SSCAN_WIDTH-1:0]; // // code moved from tlu_tcl - trap pc delivery logic // assign normal_trap_pc_w1[48:0] = {1'b0, tlu_partial_trap_pc_w1[33:0], tlu_final_offset_w1[`TSA_TTYPE_WIDTH-1:0], 5'b00000}; assign normal_trap_npc_w1[48:0] = {1'b0, tlu_partial_trap_pc_w1[33:0], tlu_final_offset_w1[`TSA_TTYPE_WIDTH-1:0], 5'b00100}; // // code moved from tlu_tdp mux2ds #(49) mx_trap_pc_w1 ( .in0 (normal_trap_pc_w1[48:0]), .in1 (tlu_restore_pc_w1[48:0]), .sel0 (~tlu_restore_pc_sel_w1), .sel1 (tlu_restore_pc_sel_w1), .dout (trap_pc_w1[48:0]) ); // dff_s #(49) dff_trap_pc_w2 ( .din (trap_pc_w1[48:0]), .q (trap_pc_w2[48:0]), .clk (clk), .se (se), .si (), .so () ); assign tlu_ifu_trappc_w2[48:0] = trap_pc_w2[48:0]; mux2ds #(49) mx_trap_npc_w1 ( .in0 (normal_trap_npc_w1[48:0]), .in1 (tlu_restore_npc_w1[48:0]), .sel0 (~tlu_restore_pc_sel_w1), .sel1 (tlu_restore_pc_sel_w1), .dout (trap_npc_w1[48:0]) ); // dff_s #(49) dff_trap_npc_w2 ( .din (trap_npc_w1[48:0]), .q (trap_npc_w2[48:0]), .clk (clk), .se (se), .si (), .so () ); assign tlu_ifu_trapnpc_w2[48:0] = trap_npc_w2[48:0]; //-------------------------------------------------------------------------------- // Recovery PC and NPC selection //-------------------------------------------------------------------------------- // On done, npc will become pc. // modified for timing // dff_s #(47) dff_tsa0_pc_w ( .din (tsa0_pc_m[46:0]), .q (tsa0_pc_w[46:0]), .clk (clk), .se (se), .si (), .so () ); dff_s #(49) dff_ifu_pc_w ( .din (ifu_tlu_pc_m[48:0]), .q (ifu_pc_w[48:0]), .clk (clk), .se (se), .si (), .so () ); mux3ds #(49) mux_pc_new_w ( .in0 ({tsa0_pc_w[46:0], 2'b00}), .in1 ({tsa1_npc_w[46:0], 2'b00}), .in2 (ifu_pc_w[48:0]), .sel0 (tlu_true_pc_sel_w[0]), .sel1 (tlu_true_pc_sel_w[1]), .sel2 (tlu_true_pc_sel_w[2]), .dout (pc_new_w[48:0]) ); assign tlu_pc_new_w[48:0] = pc_new_w[48:0]; // // On done, npc will become pc. // On done, npc will stay npc. The valid to the IFU will // not be signaled along with npc for a done. // modified for timing dff_s #(47) dff_tsa1_npc_w ( .din (tsa1_npc_m[46:0]), .q (tsa1_npc_w[46:0]), .clk (clk), .se (se), .si (), .so () ); mux2ds #(49) mux_npc_new_w ( .in0 ({tsa1_npc_w[46:0],2'b00}), .in1 (ifu_npc_w[48:0]), .sel0 (~tlu_true_pc_sel_w[2]), .sel1 (tlu_true_pc_sel_w[2]), .dout (npc_new_w[48:0]) ); assign tlu_npc_new_w[48:0] = npc_new_w[48:0]; //-------------------------------------------------------------------------------- // PIC trap experiment //-------------------------------------------------------------------------------- // added for bug 4785 assign local_rst = tlu_rst; dffr_s dffr_tlu_exu_pic_onebelow_m ( .din (tlu_pic_onebelow_e), .q (tlu_pic_onebelow_m), .rst (local_rst), .clk (clk), .se (se), .si (), .so () ); dffr_s dffr_tlu_exu_pic_twobelow_m ( .din (tlu_pic_twobelow_e), .q (tlu_pic_twobelow_m), .rst (local_rst), .clk (clk), .se (se), .si (), .so () ); assign tlu_exu_pic_onebelow_m = tlu_pic_onebelow_m & tlu_pic_cnt_en_m; assign tlu_exu_pic_twobelow_m = tlu_pic_twobelow_m & tlu_pic_cnt_en_m; /* assign pic_onebelow_e[0] = tlu_thread_inst_vld_w2[0]? pich_twobelow_flg[0]: pich_onebelow_flg[0]; assign pic_onebelow_e[1] = tlu_thread_inst_vld_w2[1]? pich_twobelow_flg[1]: pich_onebelow_flg[1]; assign pic_onebelow_e[2] = tlu_thread_inst_vld_w2[2]? pich_twobelow_flg[2]: pich_onebelow_flg[2]; assign pic_onebelow_e[3] = tlu_thread_inst_vld_w2[3]? pich_twobelow_flg[3]: pich_onebelow_flg[3]; assign tlu_pic_onebelow_e = (tlu_thrd_rsel_e[0]) ? pic_onebelow_e[0]: (tlu_thrd_rsel_e[1]) ? pic_onebelow_e[1]: (tlu_thrd_rsel_e[2]) ? pic_onebelow_e[2]: pic_onebelow_e[3]; assign pic_twobelow_e[0] = tlu_thread_inst_vld_w2[0]? pich_threebelow_flg[0]: pich_twobelow_flg[0]; assign pic_twobelow_e[1] = tlu_thread_inst_vld_w2[1]? pich_threebelow_flg[1]: pich_twobelow_flg[1]; assign pic_twobelow_e[2] = tlu_thread_inst_vld_w2[2]? pich_threebelow_flg[2]: pich_twobelow_flg[2]; assign pic_twobelow_e[3] = tlu_thread_inst_vld_w2[3]? pich_threebelow_flg[3]: pich_twobelow_flg[3]; assign tlu_pic_twobelow_e = (tlu_thrd_rsel_e[0]) ? pic_twobelow_e[0]: (tlu_thrd_rsel_e[1]) ? pic_twobelow_e[1]: (tlu_thrd_rsel_e[2]) ? pic_twobelow_e[2]: pic_twobelow_e[3]; */ endmodule