// SPDX-License-Identifier: Apache-2.0 // Copyright 2020 Western Digital Corporation or it's affiliates. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. module el2_dec_decode_ctl import el2_pkg::*; #( `include "el2_param.vh" ) ( input logic dec_tlu_flush_extint, input logic dec_tlu_force_halt, // invalidate nonblock load cam on a force halt event output logic dec_extint_stall, input logic [15:0] ifu_i0_cinst, // 16b compressed instruction output logic [31:0] dec_i0_inst_wb1, // 32b instruction at wb+1 for trace encoder output logic [31:1] dec_i0_pc_wb1, // 31b pc at wb+1 for trace encoder input logic lsu_nonblock_load_valid_m, // valid nonblock load at m input logic [pt.LSU_NUM_NBLOAD_WIDTH-1:0] lsu_nonblock_load_tag_m, // -> corresponding tag input logic lsu_nonblock_load_inv_r, // invalidate request for nonblock load r input logic [pt.LSU_NUM_NBLOAD_WIDTH-1:0] lsu_nonblock_load_inv_tag_r, // -> corresponding tag input logic lsu_nonblock_load_data_valid, // valid nonblock load data back input logic lsu_nonblock_load_data_error, // nonblock load bus error input logic [pt.LSU_NUM_NBLOAD_WIDTH-1:0] lsu_nonblock_load_data_tag, // -> corresponding tag input logic [31:0] lsu_nonblock_load_data, // nonblock load data input logic [3:0] dec_i0_trigger_match_d, // i0 decode trigger matches input logic dec_tlu_wr_pause_r, // pause instruction at r input logic dec_tlu_pipelining_disable, // pipeline disable - presync, i0 decode only input logic [3:0] lsu_trigger_match_m, // lsu trigger matches input logic lsu_pmu_misaligned_m, // perf mon: load/store misalign input logic dec_tlu_debug_stall, // debug stall decode input logic dec_tlu_flush_leak_one_r, // leak1 instruction input logic dec_debug_fence_d, // debug fence instruction input logic [1:0] dbg_cmd_wrdata, // disambiguate fence, fence_i input logic dec_i0_icaf_d, // icache access fault input logic dec_i0_icaf_f1_d, // i0 instruction access fault at decode for f1 fetch group input logic [1:0] dec_i0_icaf_type_d, // i0 instruction access fault type input logic dec_i0_dbecc_d, // icache/iccm double-bit error input el2_br_pkt_t dec_i0_brp, // branch packet input logic [pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] dec_i0_bp_index, // i0 branch index input logic [pt.BHT_GHR_SIZE-1:0] dec_i0_bp_fghr, // BP FGHR input logic [pt.BTB_BTAG_SIZE-1:0] dec_i0_bp_btag, // BP tag input logic [31:1] dec_i0_pc_d, // pc input logic lsu_idle_any, // lsu idle: if fence instr & ~lsu_idle then stall decode input logic lsu_load_stall_any, // stall any load at decode input logic lsu_store_stall_any, // stall any store at decode input logic dma_dccm_stall_any, // stall any load/store at decode input logic exu_div_wren, // nonblocking divide write enable to GPR. input logic dec_tlu_i0_kill_writeb_wb, // I0 is flushed, don't writeback any results to arch state input logic dec_tlu_flush_lower_wb, // trap lower flush input logic dec_tlu_i0_kill_writeb_r, // I0 is flushed, don't writeback any results to arch state input logic dec_tlu_flush_lower_r, // trap lower flush input logic dec_tlu_flush_pause_r, // don't clear pause state on initial lower flush input logic dec_tlu_presync_d, // CSR read needs to be presync'd input logic dec_tlu_postsync_d, // CSR ops that need to be postsync'd input logic dec_i0_pc4_d, // inst is 4B inst else 2B input logic [31:0] dec_csr_rddata_d, // csr read data at wb input logic dec_csr_legal_d, // csr indicates legal operation input logic [31:0] exu_csr_rs1_x, // rs1 for csr instr input logic [31:0] lsu_result_m, // load result input logic [31:0] lsu_result_corr_r, // load result - corrected data for writing gpr's, not for bypassing input logic exu_flush_final, // lower flush or i0 flush at X or D input logic [31:1] exu_i0_pc_x, // pcs at e1 input logic [31:0] dec_i0_instr_d, // inst at decode input logic dec_ib0_valid_d, // inst valid at decode input logic [31:0] exu_i0_result_x, // from primary alu's input logic clk, // for rvdffe's input logic free_clk, input logic active_clk, // clk except for halt / pause input logic clk_override, // test stuff input logic rst_l, output logic dec_i0_rs1_en_d, // rs1 enable at decode output logic dec_i0_rs2_en_d, output logic [4:0] dec_i0_rs1_d, // rs1 logical source output logic [4:0] dec_i0_rs2_d, output logic [31:0] dec_i0_immed_d, // 32b immediate data decode output logic [12:1] dec_i0_br_immed_d, // 12b branch immediate output el2_alu_pkt_t i0_ap, // alu packets output logic dec_i0_decode_d, // i0 decode output logic dec_i0_alu_decode_d, // decode to D-stage alu output logic [31:0] dec_i0_rs1_bypass_data_d, // i0 rs1 bypass data output logic [31:0] dec_i0_rs2_bypass_data_d, // i0 rs2 bypass data output logic [4:0] dec_i0_waddr_r, // i0 logical source to write to gpr's output logic dec_i0_wen_r, // i0 write enable output logic [31:0] dec_i0_wdata_r, // i0 write data output logic dec_i0_select_pc_d, // i0 select pc for rs1 - branches output logic [1:0] dec_i0_rs1_bypass_en_d, // i0 rs1 bypass enable output logic [1:0] dec_i0_rs2_bypass_en_d, // i0 rs2 bypass enable output el2_lsu_pkt_t lsu_p, // load/store packet output el2_mul_pkt_t mul_p, // multiply packet output el2_div_pkt_t div_p, // divide packet output logic [4:0] div_waddr_wb, // DIV write address to GPR output logic dec_div_cancel, // cancel the divide operation output logic dec_lsu_valid_raw_d, output logic [11:0] dec_lsu_offset_d, output logic dec_csr_ren_d, // valid csr decode output logic dec_csr_wen_unq_d, // valid csr with write - for csr legal output logic dec_csr_any_unq_d, // valid csr - for csr legal output logic [11:0] dec_csr_rdaddr_d, // read address for csr output logic dec_csr_wen_r, // csr write enable at r output logic [11:0] dec_csr_wraddr_r, // write address for csr output logic [31:0] dec_csr_wrdata_r, // csr write data at r output logic dec_csr_stall_int_ff, // csr is mie/mstatus output dec_tlu_i0_valid_r, // i0 valid inst at c output el2_trap_pkt_t dec_tlu_packet_r, // trap packet output logic [31:1] dec_tlu_i0_pc_r, // i0 trap pc output logic [31:0] dec_illegal_inst, // illegal inst output logic [31:1] pred_correct_npc_x, // npc e2 if the prediction is correct output el2_predict_pkt_t dec_i0_predict_p_d, // i0 predict packet decode output logic [pt.BHT_GHR_SIZE-1:0] i0_predict_fghr_d, // i0 predict fghr output logic [pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] i0_predict_index_d, // i0 predict index output logic [pt.BTB_BTAG_SIZE-1:0] i0_predict_btag_d, // i0_predict branch tag output logic [1:0] dec_data_en, // clock-gating logic output logic [1:0] dec_ctl_en, output logic dec_pmu_instr_decoded, // number of instructions decode this cycle encoded output logic dec_pmu_decode_stall, // decode is stalled output logic dec_pmu_presync_stall, // decode has presync stall output logic dec_pmu_postsync_stall, // decode has postsync stall output logic dec_nonblock_load_wen, // write enable for nonblock load output logic [4:0] dec_nonblock_load_waddr, // logical write addr for nonblock load output logic dec_pause_state, // core in pause state output logic dec_pause_state_cg, // pause state for clock-gating output logic dec_div_active, // non-block divide is active input logic scan_mode ); el2_dec_pkt_t i0_dp_raw, i0_dp; logic [31:0] i0; logic i0_valid_d; logic [31:0] i0_result_r; logic [2:0] i0_rs1bypass, i0_rs2bypass; logic i0_jalimm20; logic i0_uiimm20; logic lsu_decode_d; logic [31:0] i0_immed_d; logic i0_presync; logic i0_postsync; logic postsync_stall; logic ps_stall; logic prior_inflight, prior_inflight_wb; logic csr_clr_d, csr_set_d, csr_write_d; logic csr_clr_x,csr_set_x,csr_write_x,csr_imm_x; logic [31:0] csr_mask_x; logic [31:0] write_csr_data_x; logic [31:0] write_csr_data_in; logic [31:0] write_csr_data; logic csr_data_wen; logic [4:0] csrimm_x; logic [31:0] csr_rddata_x; logic mul_decode_d; logic div_decode_d; logic div_e1_to_r; logic div_flush; logic div_active_in; logic div_active; logic i0_nonblock_div_stall; logic i0_div_prior_div_stall; logic nonblock_div_cancel; logic i0_legal; logic shift_illegal; logic illegal_inst_en; logic illegal_lockout_in, illegal_lockout; logic i0_legal_decode_d; logic i0_exulegal_decode_d, i0_exudecode_d, i0_exublock_d; logic [12:1] last_br_immed_d; logic i0_rs1_depend_i0_x, i0_rs1_depend_i0_r; logic i0_rs2_depend_i0_x, i0_rs2_depend_i0_r; logic i0_div_decode_d; logic i0_load_block_d; logic [1:0] i0_rs1_depth_d, i0_rs2_depth_d; logic i0_load_stall_d; logic i0_store_stall_d; logic i0_predict_nt, i0_predict_t; logic i0_notbr_error, i0_br_toffset_error; logic i0_ret_error; logic i0_br_error; logic i0_br_error_all; logic [11:0] i0_br_offset; logic [20:1] i0_pcall_imm; // predicted jal's logic i0_pcall_12b_offset; logic i0_pcall_raw; logic i0_pcall_case; logic i0_pcall; logic i0_pja_raw; logic i0_pja_case; logic i0_pja; logic i0_pret_case; logic i0_pret_raw, i0_pret; logic i0_jal; // jal's that are not predicted logic i0_predict_br; logic store_data_bypass_d, store_data_bypass_m; el2_class_pkt_t i0_rs1_class_d, i0_rs2_class_d; el2_class_pkt_t i0_d_c, i0_x_c, i0_r_c; logic i0_ap_pc2, i0_ap_pc4; logic i0_rd_en_d; logic load_ldst_bypass_d; logic leak1_i0_stall_in, leak1_i0_stall; logic leak1_i1_stall_in, leak1_i1_stall; logic leak1_mode; logic i0_csr_write_only_d; logic prior_inflight_x, prior_inflight_eff; logic any_csr_d; logic prior_csr_write; logic [3:0] i0_pipe_en; logic i0_r_ctl_en, i0_x_ctl_en, i0_wb_ctl_en; logic i0_x_data_en, i0_r_data_en, i0_wb_data_en, i0_wb1_data_en; logic debug_fence_i; logic debug_fence; logic i0_csr_write; logic presync_stall; logic i0_instr_error; logic i0_icaf_d; logic clear_pause; logic pause_state_in, pause_state; logic pause_stall; logic i0_brp_valid; logic nonblock_load_cancel; logic lsu_idle; logic lsu_pmu_misaligned_r; logic csr_ren_qual_d; logic csr_read_x; logic i0_block_d; logic i0_block_raw_d; // This is use to create the raw valid logic ps_stall_in; logic [31:0] i0_result_x; el2_dest_pkt_t d_d, x_d, r_d, wbd; el2_dest_pkt_t x_d_in, r_d_in; el2_trap_pkt_t d_t, x_t, x_t_in, r_t_in, r_t; logic [3:0] lsu_trigger_match_r; logic [31:1] dec_i0_pc_r; logic csr_read, csr_write; logic i0_br_unpred; logic nonblock_load_valid_m_delay; logic i0_wen_r; logic tlu_wr_pause_r1; logic tlu_wr_pause_r2; logic flush_final_r; logic data_gate_en; logic data_gate_clk; localparam NBLOAD_SIZE = pt.LSU_NUM_NBLOAD; localparam NBLOAD_SIZE_MSB = int'(pt.LSU_NUM_NBLOAD)-1; localparam NBLOAD_TAG_MSB = pt.LSU_NUM_NBLOAD_WIDTH-1; logic cam_write, cam_inv_reset, cam_data_reset; logic [NBLOAD_TAG_MSB:0] cam_write_tag, cam_inv_reset_tag, cam_data_reset_tag; logic [NBLOAD_SIZE_MSB:0] cam_wen; logic [NBLOAD_TAG_MSB:0] load_data_tag; logic [NBLOAD_SIZE_MSB:0] nonblock_load_write; el2_load_cam_pkt_t [NBLOAD_SIZE_MSB:0] cam; el2_load_cam_pkt_t [NBLOAD_SIZE_MSB:0] cam_in; el2_load_cam_pkt_t [NBLOAD_SIZE_MSB:0] cam_raw; logic [4:0] nonblock_load_rd; logic i0_nonblock_load_stall; logic i0_nonblock_boundary_stall; logic i0_rs1_nonblock_load_bypass_en_d, i0_rs2_nonblock_load_bypass_en_d; logic i0_load_kill_wen_r; logic found; logic [NBLOAD_SIZE_MSB:0] cam_inv_reset_val, cam_data_reset_val; logic debug_fence_raw; logic [31:0] i0_result_r_raw; logic [31:0] i0_result_corr_r; logic [12:1] last_br_immed_x; logic [24:7] div_inst; logic [31:0] i0_inst_d; logic [31:0] i0_inst_x; logic [31:0] i0_inst_r; logic [31:0] i0_inst_wb_in; logic [31:0] i0_inst_wb; logic [31:1] i0_pc_wb; logic i0_wb_en; logic i0_wb1_en; el2_inst_pkt_t i0_itype; el2_reg_pkt_t i0r; // Start - Data gating {{ assign data_gate_en = (dec_tlu_wr_pause_r ^ tlu_wr_pause_r1 ) | // replaces free_clk (tlu_wr_pause_r1 ^ tlu_wr_pause_r2 ) | // replaces free_clk (dec_tlu_flush_extint ^ dec_extint_stall ) | (leak1_i1_stall_in ^ leak1_i1_stall ) | // replaces free_clk (leak1_i0_stall_in ^ leak1_i0_stall ) | // replaces free_clk (pause_state_in ^ pause_state ) | // replaces free_clk (ps_stall_in ^ ps_stall ) | // replaces free_clk (exu_flush_final ^ flush_final_r ) | // replaces free_clk (illegal_lockout_in ^ illegal_lockout ); // replaces active_clk rvclkhdr data_gated_cgc (.*, .en(data_gate_en), .l1clk(data_gate_clk)); // End - Data gating }} // branch prediction // in leak1_mode, ignore any predictions for i0, treat branch as if we haven't seen it before // in leak1 mode, also ignore branch errors for i0 assign i0_brp_valid = dec_i0_brp.valid & ~leak1_mode; assign dec_i0_predict_p_d.misp = '0; assign dec_i0_predict_p_d.ataken = '0; assign dec_i0_predict_p_d.boffset = '0; assign dec_i0_predict_p_d.pcall = i0_pcall; // don't mark as pcall if branch error assign dec_i0_predict_p_d.pja = i0_pja; assign dec_i0_predict_p_d.pret = i0_pret; assign dec_i0_predict_p_d.prett[31:1] = dec_i0_brp.prett[31:1]; assign dec_i0_predict_p_d.pc4 = dec_i0_pc4_d; assign dec_i0_predict_p_d.hist[1:0] = dec_i0_brp.hist[1:0]; assign dec_i0_predict_p_d.valid = i0_brp_valid & i0_legal_decode_d; assign i0_notbr_error = i0_brp_valid & ~(i0_dp_raw.condbr | i0_pcall_raw | i0_pja_raw | i0_pret_raw); // no toffset error for a pret assign i0_br_toffset_error = i0_brp_valid & dec_i0_brp.hist[1] & (dec_i0_brp.toffset[11:0] != i0_br_offset[11:0]) & ~i0_pret_raw; assign i0_ret_error = i0_brp_valid & dec_i0_brp.ret & ~i0_pret_raw; assign i0_br_error = dec_i0_brp.br_error | i0_notbr_error | i0_br_toffset_error | i0_ret_error; assign dec_i0_predict_p_d.br_error = i0_br_error & i0_legal_decode_d & ~leak1_mode; assign dec_i0_predict_p_d.br_start_error = dec_i0_brp.br_start_error & i0_legal_decode_d & ~leak1_mode; assign i0_predict_index_d[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] = dec_i0_bp_index; assign i0_predict_btag_d[pt.BTB_BTAG_SIZE-1:0] = dec_i0_bp_btag[pt.BTB_BTAG_SIZE-1:0]; assign i0_br_error_all = (i0_br_error | dec_i0_brp.br_start_error) & ~leak1_mode; assign dec_i0_predict_p_d.toffset[11:0] = i0_br_offset[11:0]; assign i0_predict_fghr_d[pt.BHT_GHR_SIZE-1:0] = dec_i0_bp_fghr[pt.BHT_GHR_SIZE-1:0]; assign dec_i0_predict_p_d.way = dec_i0_brp.way; // end // on br error turn anything into a nop // on i0 instruction fetch access fault turn anything into a nop // nop => alu rs1 imm12 rd lor assign i0_icaf_d = dec_i0_icaf_d | dec_i0_dbecc_d; assign i0_instr_error = i0_icaf_d; always_comb begin i0_dp = i0_dp_raw; if (i0_br_error_all | i0_instr_error) begin i0_dp = '0; i0_dp.alu = 1'b1; i0_dp.rs1 = 1'b1; i0_dp.rs2 = 1'b1; i0_dp.lor = 1'b1; i0_dp.legal = 1'b1; i0_dp.postsync = 1'b1; end end assign i0[31:0] = dec_i0_instr_d[31:0]; assign dec_i0_select_pc_d = i0_dp.pc; // branches that can be predicted assign i0_predict_br = i0_dp.condbr | i0_pcall | i0_pja | i0_pret; assign i0_predict_nt = ~(dec_i0_brp.hist[1] & i0_brp_valid) & i0_predict_br; assign i0_predict_t = (dec_i0_brp.hist[1] & i0_brp_valid) & i0_predict_br; assign i0_ap.add = i0_dp.add; assign i0_ap.sub = i0_dp.sub; assign i0_ap.land = i0_dp.land; assign i0_ap.lor = i0_dp.lor; assign i0_ap.lxor = i0_dp.lxor; assign i0_ap.sll = i0_dp.sll; assign i0_ap.srl = i0_dp.srl; assign i0_ap.sra = i0_dp.sra; assign i0_ap.slt = i0_dp.slt; assign i0_ap.unsign = i0_dp.unsign; assign i0_ap.beq = i0_dp.beq; assign i0_ap.bne = i0_dp.bne; assign i0_ap.blt = i0_dp.blt; assign i0_ap.bge = i0_dp.bge; assign i0_ap.csr_write = i0_csr_write_only_d; assign i0_ap.csr_imm = i0_dp.csr_imm; assign i0_ap.jal = i0_jal; assign i0_ap_pc2 = ~dec_i0_pc4_d; assign i0_ap_pc4 = dec_i0_pc4_d; assign i0_ap.predict_nt = i0_predict_nt; assign i0_ap.predict_t = i0_predict_t; // non block load cam logic always_comb begin found = 0; cam_wen[NBLOAD_SIZE_MSB:0] = '0; for (int i=0; i<32'(NBLOAD_SIZE); i++) begin if (~found) begin if (~cam[i].valid) begin cam_wen[i] = cam_write; found = 1'b1; end end end end assign cam_write = lsu_nonblock_load_valid_m; assign cam_write_tag[NBLOAD_TAG_MSB:0] = lsu_nonblock_load_tag_m[NBLOAD_TAG_MSB:0]; assign cam_inv_reset = lsu_nonblock_load_inv_r; assign cam_inv_reset_tag[NBLOAD_TAG_MSB:0] = lsu_nonblock_load_inv_tag_r[NBLOAD_TAG_MSB:0]; assign cam_data_reset = lsu_nonblock_load_data_valid | lsu_nonblock_load_data_error; assign cam_data_reset_tag[NBLOAD_TAG_MSB:0] = lsu_nonblock_load_data_tag[NBLOAD_TAG_MSB:0]; assign nonblock_load_rd[4:0] = (x_d.i0load) ? x_d.i0rd[4:0] : 5'b0; // rd data // checks `ifdef ASSERT_ON assert_dec_data_valid_data_error_onehot: assert #0 ($onehot0({lsu_nonblock_load_data_valid,lsu_nonblock_load_data_error})); assert_dec_cam_inv_reset_onehot: assert #0 ($onehot0(cam_inv_reset_val[NBLOAD_SIZE_MSB:0])); assert_dec_cam_data_reset_onehot: assert #0 ($onehot0(cam_data_reset_val[NBLOAD_SIZE_MSB:0])); `endif // case of multiple loads to same dest ie. x1 ... you have to invalidate the older one for (genvar i=0; i coredecode.e // 2) espresso -Dso -oeqntott coredecode.e | addassign -pre out. > equations // to generate the legal (32b instruction is legal) equation below: // 1) coredecode -in decode -legal > legal.e // 2) espresso -Dso -oeqntott legal.e | addassign -pre out. > legal_equation module el2_dec_dec_ctl import el2_pkg::*; ( input logic [31:0] inst, output el2_dec_pkt_t out ); logic [31:0] i; assign i[31:0] = inst[31:0]; assign out.alu = (i[2]) | (i[6]) | (!i[25]&i[4]) | (!i[5]&i[4]); assign out.rs1 = (!i[14]&!i[13]&!i[2]) | (!i[13]&i[11]&!i[2]) | (i[19]&i[13]&!i[2]) | ( !i[13]&i[10]&!i[2]) | (i[18]&i[13]&!i[2]) | (!i[13]&i[9]&!i[2]) | ( i[17]&i[13]&!i[2]) | (!i[13]&i[8]&!i[2]) | (i[16]&i[13]&!i[2]) | ( !i[13]&i[7]&!i[2]) | (i[15]&i[13]&!i[2]) | (!i[4]&!i[3]) | (!i[6] &!i[2]); assign out.rs2 = (i[5]&!i[4]&!i[2]) | (!i[6]&i[5]&!i[2]); assign out.imm12 = (!i[4]&!i[3]&i[2]) | (i[13]&!i[5]&i[4]&!i[2]) | (!i[13]&!i[12] &i[6]&i[4]) | (!i[12]&!i[5]&i[4]&!i[2]); assign out.rd = (!i[5]&!i[2]) | (i[5]&i[2]) | (i[4]); assign out.shimm5 = (!i[13]&i[12]&!i[5]&i[4]&!i[2]); assign out.imm20 = (i[5]&i[3]) | (i[4]&i[2]); assign out.pc = (!i[5]&!i[3]&i[2]) | (i[5]&i[3]); assign out.load = (!i[5]&!i[4]&!i[2]); assign out.store = (!i[6]&i[5]&!i[4]); assign out.lsu = (!i[6]&!i[4]&!i[2]); assign out.add = (!i[14]&!i[13]&!i[12]&!i[5]&i[4]) | (!i[5]&!i[3]&i[2]) | (!i[30] &!i[25]&!i[14]&!i[13]&!i[12]&!i[6]&i[4]&!i[2]); assign out.sub = (i[30]&!i[12]&!i[6]&i[5]&i[4]&!i[2]) | (!i[25]&!i[14]&i[13]&!i[6] &i[4]&!i[2]) | (!i[14]&i[13]&!i[5]&i[4]&!i[2]) | (i[6]&!i[4]&!i[2]); assign out.land = (i[14]&i[13]&i[12]&!i[5]&!i[2]) | (!i[25]&i[14]&i[13]&i[12]&!i[6] &!i[2]); assign out.lor = (!i[6]&i[3]) | (!i[25]&i[14]&i[13]&!i[12]&!i[6]&!i[2]) | (i[5]&i[4] &i[2]) | (!i[13]&!i[12]&i[6]&i[4]) | (i[14]&i[13]&!i[12]&!i[5]&!i[2]); assign out.lxor = (!i[25]&i[14]&!i[13]&!i[12]&i[4]&!i[2]) | (i[14]&!i[13]&!i[12] &!i[5]&i[4]&!i[2]); assign out.sll = (!i[25]&!i[14]&!i[13]&i[12]&!i[6]&i[4]&!i[2]); assign out.sra = (i[30]&!i[13]&i[12]&!i[6]&i[4]&!i[2]); assign out.srl = (!i[30]&!i[25]&i[14]&!i[13]&i[12]&!i[6]&i[4]&!i[2]); assign out.slt = (!i[25]&!i[14]&i[13]&!i[6]&i[4]&!i[2]) | (!i[14]&i[13]&!i[5]&i[4] &!i[2]); assign out.unsign = (!i[14]&i[13]&i[12]&!i[5]&!i[2]) | (i[13]&i[6]&!i[4]&!i[2]) | ( i[14]&!i[5]&!i[4]) | (!i[25]&!i[14]&i[13]&i[12]&!i[6]&!i[2]) | ( i[25]&i[14]&i[12]&!i[6]&i[5]&!i[2]); assign out.condbr = (i[6]&!i[4]&!i[2]); assign out.beq = (!i[14]&!i[12]&i[6]&!i[4]&!i[2]); assign out.bne = (!i[14]&i[12]&i[6]&!i[4]&!i[2]); assign out.bge = (i[14]&i[12]&i[5]&!i[4]&!i[2]); assign out.blt = (i[14]&!i[12]&i[5]&!i[4]&!i[2]); assign out.jal = (i[6]&i[2]); assign out.by = (!i[13]&!i[12]&!i[6]&!i[4]&!i[2]); assign out.half = (i[12]&!i[6]&!i[4]&!i[2]); assign out.word = (i[13]&!i[6]&!i[4]); assign out.csr_read = (i[13]&i[6]&i[4]) | (i[7]&i[6]&i[4]) | (i[8]&i[6]&i[4]) | ( i[9]&i[6]&i[4]) | (i[10]&i[6]&i[4]) | (i[11]&i[6]&i[4]); assign out.csr_clr = (i[15]&i[13]&i[12]&i[6]&i[4]) | (i[16]&i[13]&i[12]&i[6]&i[4]) | ( i[17]&i[13]&i[12]&i[6]&i[4]) | (i[18]&i[13]&i[12]&i[6]&i[4]) | ( i[19]&i[13]&i[12]&i[6]&i[4]); assign out.csr_set = (i[15]&!i[12]&i[6]&i[4]) | (i[16]&!i[12]&i[6]&i[4]) | (i[17] &!i[12]&i[6]&i[4]) | (i[18]&!i[12]&i[6]&i[4]) | (i[19]&!i[12]&i[6] &i[4]); assign out.csr_write = (!i[13]&i[12]&i[6]&i[4]); assign out.csr_imm = (i[14]&!i[13]&i[6]&i[4]) | (i[15]&i[14]&i[6]&i[4]) | (i[16] &i[14]&i[6]&i[4]) | (i[17]&i[14]&i[6]&i[4]) | (i[18]&i[14]&i[6]&i[4]) | ( i[19]&i[14]&i[6]&i[4]); assign out.presync = (!i[5]&i[3]) | (!i[13]&i[7]&i[6]&i[4]) | (!i[13]&i[8]&i[6]&i[4]) | ( !i[13]&i[9]&i[6]&i[4]) | (!i[13]&i[10]&i[6]&i[4]) | (!i[13]&i[11] &i[6]&i[4]) | (i[15]&i[13]&i[6]&i[4]) | (i[16]&i[13]&i[6]&i[4]) | ( i[17]&i[13]&i[6]&i[4]) | (i[18]&i[13]&i[6]&i[4]) | (i[19]&i[13]&i[6] &i[4]); assign out.postsync = (i[12]&!i[5]&i[3]) | (!i[22]&!i[13]&!i[12]&i[6]&i[4]) | ( !i[13]&i[7]&i[6]&i[4]) | (!i[13]&i[8]&i[6]&i[4]) | (!i[13]&i[9]&i[6] &i[4]) | (!i[13]&i[10]&i[6]&i[4]) | (!i[13]&i[11]&i[6]&i[4]) | ( i[15]&i[13]&i[6]&i[4]) | (i[16]&i[13]&i[6]&i[4]) | (i[17]&i[13]&i[6] &i[4]) | (i[18]&i[13]&i[6]&i[4]) | (i[19]&i[13]&i[6]&i[4]); assign out.ebreak = (!i[22]&i[20]&!i[13]&!i[12]&i[6]&i[4]); assign out.ecall = (!i[21]&!i[20]&!i[13]&!i[12]&i[6]&i[4]); assign out.mret = (i[29]&!i[13]&!i[12]&i[6]&i[4]); assign out.mul = (i[25]&!i[14]&!i[6]&i[5]&i[4]&!i[2]); assign out.rs1_sign = (i[25]&!i[14]&i[13]&!i[12]&!i[6]&i[5]&i[4]&!i[2]) | (i[25] &!i[14]&!i[13]&i[12]&!i[6]&i[4]&!i[2]); assign out.rs2_sign = (i[25]&!i[14]&!i[13]&i[12]&!i[6]&i[4]&!i[2]); assign out.low = (i[25]&!i[14]&!i[13]&!i[12]&i[5]&i[4]&!i[2]); assign out.div = (i[25]&i[14]&!i[6]&i[5]&!i[2]); assign out.rem = (i[25]&i[14]&i[13]&!i[6]&i[5]&!i[2]); assign out.fence = (!i[5]&i[3]); assign out.fence_i = (i[12]&!i[5]&i[3]); assign out.pm_alu = (i[28]&i[22]&!i[13]&!i[12]&i[4]) | (i[4]&i[2]) | (!i[25]&!i[6] &i[4]) | (!i[5]&i[4]); assign out.legal = (!i[31]&!i[30]&i[29]&i[28]&!i[27]&!i[26]&!i[25]&!i[24]&!i[23] &!i[22]&i[21]&!i[20]&!i[19]&!i[18]&!i[17]&!i[16]&!i[15]&!i[14]&!i[11] &!i[10]&!i[9]&!i[8]&!i[7]&i[6]&i[5]&i[4]&!i[3]&!i[2]&i[1]&i[0]) | ( !i[31]&!i[30]&!i[29]&i[28]&!i[27]&!i[26]&!i[25]&!i[24]&!i[23]&i[22] &!i[21]&i[20]&!i[19]&!i[18]&!i[17]&!i[16]&!i[15]&!i[14]&!i[11]&!i[10] &!i[9]&!i[8]&!i[7]&i[6]&i[5]&i[4]&!i[3]&!i[2]&i[1]&i[0]) | (!i[31] &!i[30]&!i[29]&!i[28]&!i[27]&!i[26]&!i[25]&!i[24]&!i[23]&!i[22]&!i[21] &!i[19]&!i[18]&!i[17]&!i[16]&!i[15]&!i[14]&!i[11]&!i[10]&!i[9]&!i[8] &!i[7]&i[5]&i[4]&!i[3]&!i[2]&i[1]&i[0]) | (!i[31]&!i[30]&!i[29]&!i[28] &!i[27]&!i[26]&!i[25]&!i[6]&i[4]&!i[3]&i[1]&i[0]) | (!i[31]&!i[29] &!i[28]&!i[27]&!i[26]&!i[25]&!i[14]&!i[13]&!i[12]&!i[6]&!i[3]&!i[2] &i[1]&i[0]) | (!i[31]&!i[29]&!i[28]&!i[27]&!i[26]&!i[25]&i[14]&!i[13] &i[12]&!i[6]&i[4]&!i[3]&i[1]&i[0]) | (!i[31]&!i[30]&!i[29]&!i[28] &!i[27]&!i[26]&!i[6]&i[5]&i[4]&!i[3]&i[1]&i[0]) | (!i[14]&!i[13] &!i[12]&i[6]&i[5]&!i[4]&!i[3]&i[1]&i[0]) | (i[14]&i[6]&i[5]&!i[4] &!i[3]&!i[2]&i[1]&i[0]) | (!i[12]&!i[6]&!i[5]&i[4]&!i[3]&i[1]&i[0]) | ( !i[14]&!i[13]&i[5]&!i[4]&!i[3]&!i[2]&i[1]&i[0]) | (i[12]&i[6]&i[5] &i[4]&!i[3]&!i[2]&i[1]&i[0]) | (!i[31]&!i[30]&!i[29]&!i[28]&!i[27] &!i[26]&!i[25]&!i[24]&!i[23]&!i[22]&!i[21]&!i[20]&!i[19]&!i[18]&!i[17] &!i[16]&!i[15]&!i[14]&!i[13]&!i[11]&!i[10]&!i[9]&!i[8]&!i[7]&!i[6] &!i[5]&!i[4]&i[3]&i[2]&i[1]&i[0]) | (!i[31]&!i[30]&!i[29]&!i[28] &!i[19]&!i[18]&!i[17]&!i[16]&!i[15]&!i[14]&!i[13]&!i[12]&!i[11]&!i[10] &!i[9]&!i[8]&!i[7]&!i[6]&!i[5]&!i[4]&i[3]&i[2]&i[1]&i[0]) | (i[13] &i[6]&i[5]&i[4]&!i[3]&!i[2]&i[1]&i[0]) | (!i[13]&!i[6]&!i[5]&!i[4] &!i[3]&!i[2]&i[1]&i[0]) | (i[6]&i[5]&!i[4]&i[3]&i[2]&i[1]&i[0]) | ( i[13]&!i[6]&!i[5]&i[4]&!i[3]&i[1]&i[0]) | (!i[14]&!i[12]&!i[6]&!i[4] &!i[3]&!i[2]&i[1]&i[0]) | (!i[6]&i[4]&!i[3]&i[2]&i[1]&i[0]); endmodule // el2_dec_dec_ctl