Project Full coverage report
Current view: Cores-VeeR-EL2—Cores-VeeR-EL2—design—dec—el2_dec_decode_ctl.sv Coverage Hit Total
Test Date: 19-09-2024 Toggle 85.1% 234 275
Test: all Branch 94.3% 99 105

            Line data    Source code
       1              : // SPDX-License-Identifier: Apache-2.0
       2              : // Copyright 2020 Western Digital Corporation or its affiliates.
       3              : //
       4              : // Licensed under the Apache License, Version 2.0 (the "License");
       5              : // you may not use this file except in compliance with the License.
       6              : // You may obtain a copy of the License at
       7              : //
       8              : // http://www.apache.org/licenses/LICENSE-2.0
       9              : //
      10              : // Unless required by applicable law or agreed to in writing, software
      11              : // distributed under the License is distributed on an "AS IS" BASIS,
      12              : // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      13              : // See the License for the specific language governing permissions and
      14              : // limitations under the License.
      15              : 
      16              : 
      17              : module el2_dec_decode_ctl
      18              : import el2_pkg::*;
      19              : #(
      20              : `include "el2_param.vh"
      21              :  )
      22              :   (
      23            0 :    input logic dec_tlu_trace_disable,
      24            0 :    input logic dec_debug_valid_d,
      25              : 
      26            0 :    input logic dec_tlu_flush_extint,         // Flush external interrupt
      27              : 
      28            0 :    input logic dec_tlu_force_halt,           // invalidate nonblock load cam on a force halt event
      29              : 
      30            0 :    output logic dec_extint_stall,            // Stall from external interrupt
      31              : 
      32      1427542 :    input  logic [15:0] ifu_i0_cinst,         // 16b compressed instruction
      33       579528 :    output logic [31:0] dec_i0_inst_wb,       // 32b instruction at wb+1 for trace encoder
      34          308 :    output logic [31:1] dec_i0_pc_wb,         // 31b pc at wb+1 for trace encoder
      35              : 
      36              : 
      37       881640 :    input logic                                lsu_nonblock_load_valid_m,       // valid nonblock load at m
      38       504869 :    input logic [pt.LSU_NUM_NBLOAD_WIDTH-1:0]  lsu_nonblock_load_tag_m,         // -> corresponding tag
      39            0 :    input logic                                lsu_nonblock_load_inv_r,         // invalidate request for nonblock load r
      40       504866 :    input logic [pt.LSU_NUM_NBLOAD_WIDTH-1:0]  lsu_nonblock_load_inv_tag_r,     // -> corresponding tag
      41       920896 :    input logic                                lsu_nonblock_load_data_valid,    // valid nonblock load data back
      42            0 :    input logic                                lsu_nonblock_load_data_error,    // nonblock load bus error
      43        36662 :    input logic [pt.LSU_NUM_NBLOAD_WIDTH-1:0]  lsu_nonblock_load_data_tag,      // -> corresponding tag
      44              : 
      45              : 
      46            0 :    input logic [3:0] dec_i0_trigger_match_d,          // i0 decode trigger matches
      47              : 
      48            0 :    input logic dec_tlu_wr_pause_r,                    // pause instruction at r
      49            0 :    input logic dec_tlu_pipelining_disable,            // pipeline disable - presync, i0 decode only
      50              : 
      51            0 :    input logic [3:0]  lsu_trigger_match_m,            // lsu trigger matches
      52              : 
      53        48786 :    input logic lsu_pmu_misaligned_m,                  // perf mon: load/store misalign
      54            0 :    input logic dec_tlu_debug_stall,                   // debug stall decode
      55            0 :    input logic dec_tlu_flush_leak_one_r,              // leak1 instruction
      56              : 
      57            0 :    input logic dec_debug_fence_d,                     // debug fence instruction
      58              : 
      59            0 :    input logic [1:0] dbg_cmd_wrdata,                  // disambiguate fence, fence_i
      60              : 
      61          196 :    input logic dec_i0_icaf_d,                         // icache access fault
      62           86 :    input logic dec_i0_icaf_second_d,                  // i0 instruction access fault on second 2B of 4B inst
      63          270 :    input logic [1:0] dec_i0_icaf_type_d,              // i0 instruction access fault type
      64              : 
      65            2 :    input logic dec_i0_dbecc_d,                        // icache/iccm double-bit error
      66              : 
      67       200759 :    input el2_br_pkt_t dec_i0_brp,                    // branch packet
      68       651076 :    input logic [pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] dec_i0_bp_index,   // i0 branch index
      69       631672 :    input logic [pt.BHT_GHR_SIZE-1:0] dec_i0_bp_fghr,  // BP FGHR
      70        21217 :    input logic [pt.BTB_BTAG_SIZE-1:0] dec_i0_bp_btag, // BP tag
      71            0 :    input logic [$clog2(pt.BTB_SIZE)-1:0] dec_i0_bp_fa_index,          // Fully associt btb index
      72              : 
      73      1346967 :    input logic lsu_idle_any,                          // lsu idle: if fence instr & ~lsu_idle then stall decode
      74              : 
      75        49050 :    input logic lsu_load_stall_any,                    // stall any load at decode
      76        59374 :    input logic lsu_store_stall_any,                   // stall any store at decode
      77            0 :    input logic dma_dccm_stall_any,                    // stall any load/store at decode
      78              : 
      79       156868 :    input logic exu_div_wren,                          // nonblocking divide write enable to GPR.
      80              : 
      81        29654 :    input logic dec_tlu_i0_kill_writeb_wb,             // I0 is flushed, don't writeback any results to arch state
      82        58638 :    input logic dec_tlu_flush_lower_wb,                // trap lower flush
      83        29654 :    input logic dec_tlu_i0_kill_writeb_r,              // I0 is flushed, don't writeback any results to arch state
      84        58638 :    input logic dec_tlu_flush_lower_r,                 // trap lower flush
      85            0 :    input logic dec_tlu_flush_pause_r,                 // don't clear pause state on initial lower flush
      86          510 :    input logic dec_tlu_presync_d,                     // CSR read needs to be presync'd
      87        20293 :    input logic dec_tlu_postsync_d,                    // CSR ops that need to be postsync'd
      88              : 
      89      5735369 :    input logic dec_i0_pc4_d,                          // inst is 4B inst else 2B
      90              : 
      91         6941 :    input logic [31:0] dec_csr_rddata_d,               // csr read data at wb
      92        83741 :    input logic dec_csr_legal_d,                       // csr indicates legal operation
      93              : 
      94         3978 :    input logic [31:0] exu_csr_rs1_x,                  // rs1 for csr instr
      95              : 
      96        38395 :    input logic [31:0] lsu_result_m,                   // load result
      97        29134 :    input logic [31:0] lsu_result_corr_r,              // load result - corrected data for writing gpr's, not for bypassing
      98              : 
      99       672565 :    input logic exu_flush_final,                       // lower flush or i0 flush at X or D
     100              : 
     101          308 :    input logic [31:1] exu_i0_pc_x,                    // pcs at e1
     102              : 
     103       468420 :    input logic [31:0] dec_i0_instr_d,                 // inst at decode
     104              : 
     105      6006883 :    input logic  dec_ib0_valid_d,                      // inst valid at decode
     106              : 
     107       614701 :    input logic [31:0] exu_i0_result_x,                // from primary alu's
     108              : 
     109     61843746 :    input logic  clk,                                  // Clock only while core active.  Through one clock header.  For flops with    second clock header built in.  Connected to ACTIVE_L2CLK.
     110     61843746 :    input logic  active_clk,                           // Clock only while core active.  Through two clock headers. For flops without second clock header built in.
     111     61843746 :    input logic  free_l2clk,                           // Clock always.                  Through one clock header.  For flops with    second header built in.
     112              : 
     113            0 :    input logic  clk_override,                         // Override non-functional clock gating
     114          316 :    input logic  rst_l,                                // Flop reset
     115              : 
     116              : 
     117              : 
     118      5130925 :    output logic        dec_i0_rs1_en_d,               // rs1 enable at decode
     119      3565563 :    output logic        dec_i0_rs2_en_d,               // rs2 enable at decode
     120              : 
     121      2497511 :    output logic [4:0]  dec_i0_rs1_d,                  // rs1 logical source
     122      4174324 :    output logic [4:0]  dec_i0_rs2_d,                  // rs2 logical source
     123              : 
     124      2134567 :    output logic [31:0] dec_i0_immed_d,                // 32b immediate data decode
     125              : 
     126              : 
     127       123446 :    output logic [12:1] dec_i0_br_immed_d,             // 12b branch immediate
     128              : 
     129         1460 :    output el2_alu_pkt_t i0_ap,                       // alu packets
     130              : 
     131      6190087 :    output logic        dec_i0_decode_d,               // i0 decode
     132              : 
     133      5393904 :    output logic        dec_i0_alu_decode_d,           // decode to D-stage alu
     134      3841554 :    output logic        dec_i0_branch_d,               // Branch in D-stage
     135              : 
     136      2809689 :    output logic [4:0]  dec_i0_waddr_r,                // i0 logical source to write to gpr's
     137      5678794 :    output logic        dec_i0_wen_r,                  // i0 write enable
     138       314049 :    output logic [31:0] dec_i0_wdata_r,                // i0 write data
     139              : 
     140       554879 :    output logic        dec_i0_select_pc_d,            // i0 select pc for rs1 - branches
     141              : 
     142        80872 :    output logic [3:0]    dec_i0_rs1_bypass_en_d,      // i0 rs1 bypass enable
     143         8634 :    output logic [3:0]    dec_i0_rs2_bypass_en_d,      // i0 rs2 bypass enable
     144       314049 :    output logic [31:0]   dec_i0_result_r,             // Result R-stage
     145              : 
     146       623945 :    output el2_lsu_pkt_t    lsu_p,                    // load/store packet
     147      5476447 :    output logic             dec_qual_lsu_d,           // LSU instruction at D.  Use to quiet LSU operands
     148              : 
     149            0 :    output el2_mul_pkt_t    mul_p,                    // multiply packet
     150              : 
     151        78138 :    output el2_div_pkt_t    div_p,                    // divide packet
     152        21351 :    output logic [4:0]       div_waddr_wb,             // DIV write address to GPR
     153         2628 :    output logic             dec_div_cancel,           // cancel the divide operation
     154              : 
     155      2276073 :    output logic        dec_lsu_valid_raw_d,
     156       270518 :    output logic [11:0] dec_lsu_offset_d,
     157              : 
     158        75092 :    output logic        dec_csr_ren_d,                 // valid csr decode
     159        41991 :    output logic        dec_csr_wen_unq_d,             // valid csr with write - for csr legal
     160        83863 :    output logic        dec_csr_any_unq_d,             // valid csr - for csr legal
     161          906 :    output logic [11:0] dec_csr_rdaddr_d,              // read address for csr
     162        41826 :    output logic        dec_csr_wen_r,                 // csr write enable at r
     163      1559962 :    output logic [11:0] dec_csr_rdaddr_r,              // read address for csr
     164          406 :    output logic [11:0] dec_csr_wraddr_r,              // write address for csr
     165         1640 :    output logic [31:0] dec_csr_wrdata_r,              // csr write data at r
     166         1346 :    output logic        dec_csr_stall_int_ff,          // csr is mie/mstatus
     167              : 
     168      6189442 :    output              dec_tlu_i0_valid_r,            // i0 valid inst at c
     169              : 
     170          264 :    output el2_trap_pkt_t   dec_tlu_packet_r,              // trap packet
     171              : 
     172          308 :    output logic [31:1] dec_tlu_i0_pc_r,               // i0 trap pc
     173              : 
     174           18 :    output logic [31:0] dec_illegal_inst,              // illegal inst
     175       138654 :    output logic [31:1] pred_correct_npc_x,            // npc e2 if the prediction is correct
     176              : 
     177       506364 :    output el2_predict_pkt_t dec_i0_predict_p_d,      // i0 predict packet decode
     178       631672 :    output logic [pt.BHT_GHR_SIZE-1:0] i0_predict_fghr_d, // i0 predict fghr
     179       651076 :    output logic [pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] i0_predict_index_d, // i0 predict index
     180        21217 :    output logic [pt.BTB_BTAG_SIZE-1:0] i0_predict_btag_d, // i0_predict branch tag
     181              : 
     182            0 :    output logic [$clog2(pt.BTB_SIZE)-1:0] dec_fa_error_index, // Fully associt btb error index
     183              : 
     184      6189473 :    output logic [1:0] dec_data_en,                    // clock-gating logic
     185      5991939 :    output logic [1:0] dec_ctl_en,
     186              : 
     187      6190087 :    output logic       dec_pmu_instr_decoded,          // number of instructions decode this cycle encoded
     188       238142 :    output logic       dec_pmu_decode_stall,           // decode is stalled
     189          264 :    output logic       dec_pmu_presync_stall,          // decode has presync stall
     190        14500 :    output logic       dec_pmu_postsync_stall,         // decode has postsync stall
     191              : 
     192       920884 :    output logic       dec_nonblock_load_wen,          // write enable for nonblock load
     193       368914 :    output logic [4:0] dec_nonblock_load_waddr,        // logical write addr for nonblock load
     194            0 :    output logic       dec_pause_state,                // core in pause state
     195            0 :    output logic       dec_pause_state_cg,             // pause state for clock-gating
     196              : 
     197       159496 :    output logic       dec_div_active,                 // non-block divide is active
     198              : 
     199            0 :    input  logic       scan_mode
     200              :    );
     201              : 
     202              : 
     203              : 
     204              : 
     205        13730 :    el2_dec_pkt_t           i0_dp_raw, i0_dp;
     206              : 
     207       468420 :    logic [31:0]        i0;
     208      6006883 :    logic               i0_valid_d;
     209              : 
     210       314049 :    logic [31:0]        i0_result_r;
     211              : 
     212        25118 :    logic [2:0]         i0_rs1bypass, i0_rs2bypass;
     213              : 
     214       442798 :    logic               i0_jalimm20;
     215       430821 :    logic               i0_uiimm20;
     216              : 
     217      2280185 :    logic               lsu_decode_d;
     218      2134567 :    logic [31:0]        i0_immed_d;
     219        70084 :    logic               i0_presync;
     220       120087 :    logic               i0_postsync;
     221              : 
     222       110610 :    logic               postsync_stall;
     223       110610 :    logic               ps_stall;
     224              : 
     225      5991939 :    logic               prior_inflight, prior_inflight_wb;
     226              : 
     227        10618 :    logic               csr_clr_d, csr_set_d, csr_write_d;
     228              : 
     229         7868 :    logic               csr_clr_x,csr_set_x,csr_write_x,csr_imm_x;
     230         4282 :    logic [31:0]        csr_mask_x;
     231         2652 :    logic [31:0]        write_csr_data_x;
     232         2652 :    logic [31:0]        write_csr_data_in;
     233         1318 :    logic [31:0]        write_csr_data;
     234        33070 :    logic               csr_data_wen;
     235              : 
     236        10844 :    logic [4:0]         csrimm_x;
     237              : 
     238         1554 :    logic [31:0]        csr_rddata_x;
     239              : 
     240       250948 :    logic               mul_decode_d;
     241       159496 :    logic               div_decode_d;
     242       159496 :    logic               div_e1_to_r;
     243         2628 :    logic               div_flush;
     244       159496 :    logic               div_active_in;
     245       159496 :    logic               div_active;
     246         8228 :    logic               i0_nonblock_div_stall;
     247         1472 :    logic               i0_div_prior_div_stall;
     248         2628 :    logic               nonblock_div_cancel;
     249              : 
     250      5997067 :    logic               i0_legal;
     251          258 :    logic               shift_illegal;
     252          258 :    logic               illegal_inst_en;
     253          258 :    logic               illegal_lockout_in, illegal_lockout;
     254      6189849 :    logic               i0_legal_decode_d;
     255       315576 :    logic               i0_exulegal_decode_d, i0_exudecode_d, i0_exublock_d;
     256              : 
     257      1376313 :    logic [12:1]        last_br_immed_d;
     258      1920488 :    logic               i0_rs1_depend_i0_x, i0_rs1_depend_i0_r;
     259       170364 :    logic               i0_rs2_depend_i0_x, i0_rs2_depend_i0_r;
     260              : 
     261       159496 :    logic               i0_div_decode_d;
     262            0 :    logic               i0_load_block_d;
     263       155352 :    logic [1:0]         i0_rs1_depth_d, i0_rs2_depth_d;
     264              : 
     265        27508 :    logic               i0_load_stall_d;
     266         6856 :    logic               i0_store_stall_d;
     267              : 
     268       767143 :    logic               i0_predict_nt, i0_predict_t;
     269              : 
     270        28608 :    logic               i0_notbr_error, i0_br_toffset_error;
     271          396 :    logic               i0_ret_error;
     272        38500 :    logic               i0_br_error;
     273        38510 :    logic               i0_br_error_all;
     274      1571805 :    logic [11:0]        i0_br_offset;
     275              : 
     276      1432006 :    logic [20:1]        i0_pcall_imm;                          // predicted jal's
     277      5586531 :    logic               i0_pcall_12b_offset;
     278       122488 :    logic               i0_pcall_raw;
     279       122818 :    logic               i0_pcall_case;
     280       122134 :    logic               i0_pcall;
     281              : 
     282       312544 :    logic               i0_pja_raw;
     283       321698 :    logic               i0_pja_case;
     284       311586 :    logic               i0_pja;
     285              : 
     286       167480 :    logic               i0_pret_case;
     287       167480 :    logic               i0_pret_raw, i0_pret;
     288              : 
     289       106068 :    logic               i0_jal;                                // jal's that are not predicted
     290              : 
     291              : 
     292      3700988 :    logic               i0_predict_br;
     293              : 
     294            0 :    logic               store_data_bypass_d, store_data_bypass_m;
     295              : 
     296         4226 :    el2_class_pkt_t         i0_rs1_class_d, i0_rs2_class_d;
     297              : 
     298       234134 :    el2_class_pkt_t         i0_d_c, i0_x_c, i0_r_c;
     299              : 
     300              : 
     301      5735369 :    logic               i0_ap_pc2, i0_ap_pc4;
     302              : 
     303      6449133 :    logic               i0_rd_en_d;
     304              : 
     305        69392 :    logic               load_ldst_bypass_d;
     306              : 
     307            0 :    logic               leak1_i0_stall_in, leak1_i0_stall;
     308            0 :    logic               leak1_i1_stall_in, leak1_i1_stall;
     309            0 :    logic               leak1_mode;
     310              : 
     311         8779 :    logic               i0_csr_write_only_d;
     312              : 
     313      5992087 :    logic               prior_inflight_x, prior_inflight_eff;
     314        83863 :    logic               any_csr_d;
     315              : 
     316         8776 :    logic               prior_csr_write;
     317              : 
     318      6189398 :    logic [3:0]        i0_pipe_en;
     319      5991905 :    logic              i0_r_ctl_en,  i0_x_ctl_en,  i0_wb_ctl_en;
     320      6189448 :    logic              i0_x_data_en, i0_r_data_en, i0_wb_data_en;
     321              : 
     322            0 :    logic              debug_fence_i;
     323            0 :    logic              debug_fence;
     324              : 
     325        25025 :    logic              i0_csr_write;
     326          264 :    logic              presync_stall;
     327              : 
     328          198 :    logic              i0_instr_error;
     329          198 :    logic              i0_icaf_d;
     330              : 
     331        58638 :    logic              clear_pause;
     332            0 :    logic              pause_state_in, pause_state;
     333            0 :    logic              pause_stall;
     334              : 
     335      3092343 :    logic              i0_brp_valid;
     336       737208 :    logic              nonblock_load_cancel;
     337      1346966 :    logic              lsu_idle;
     338        48786 :    logic              lsu_pmu_misaligned_r;
     339        74956 :    logic              csr_ren_qual_d;
     340        74956 :    logic              csr_read_x;
     341       349570 :    logic              i0_block_d;
     342       315576 :    logic              i0_block_raw_d;  // This is use to create the raw valid
     343       110611 :    logic              ps_stall_in;
     344       660429 :    logic [31:0]       i0_result_x;
     345              : 
     346        31368 :    el2_dest_pkt_t         d_d, x_d, r_d, wbd;
     347        31368 :    el2_dest_pkt_t         x_d_in, r_d_in;
     348              : 
     349            0 :    el2_trap_pkt_t         d_t, x_t, x_t_in, r_t_in, r_t;
     350              : 
     351            0 :    logic [3:0]        lsu_trigger_match_r;
     352              : 
     353          308 :    logic [31:1]       dec_i0_pc_r;
     354              : 
     355        41933 :    logic csr_read, csr_write;
     356       106068 :    logic i0_br_unpred;
     357              : 
     358       881494 :    logic nonblock_load_valid_m_delay;
     359      6514124 :    logic i0_wen_r;
     360              : 
     361            0 :    logic tlu_wr_pause_r1;
     362            0 :    logic tlu_wr_pause_r2;
     363              : 
     364       672564 :    logic flush_final_r;
     365              : 
     366          317 :    logic bitmanip_zbb_legal;
     367          317 :    logic bitmanip_zbs_legal;
     368          317 :    logic bitmanip_zbe_legal;
     369          317 :    logic bitmanip_zbc_legal;
     370          323 :    logic bitmanip_zbp_legal;
     371          317 :    logic bitmanip_zbr_legal;
     372          317 :    logic bitmanip_zbf_legal;
     373          317 :    logic bitmanip_zba_legal;
     374          317 :    logic bitmanip_zbb_zbp_legal;
     375          317 :    logic bitmanip_zbp_zbe_zbf_legal;
     376          317 :    logic bitmanip_zbb_zbp_zbe_zbf_legal;
     377          323 :    logic bitmanip_legal;
     378              : 
     379            0 :    logic              data_gate_en;
     380            0 :    logic              data_gate_clk;
     381              : 
     382              : 
     383              :    localparam NBLOAD_SIZE     = pt.LSU_NUM_NBLOAD;
     384              :    localparam NBLOAD_SIZE_MSB = int'(pt.LSU_NUM_NBLOAD)-1;
     385              :    localparam NBLOAD_TAG_MSB  = pt.LSU_NUM_NBLOAD_WIDTH-1;
     386              : 
     387              : 
     388       920896 :    logic                     cam_write, cam_inv_reset, cam_data_reset;
     389        36662 :    logic [NBLOAD_TAG_MSB:0]  cam_write_tag, cam_inv_reset_tag, cam_data_reset_tag;
     390         5812 :    logic [NBLOAD_SIZE_MSB:0] cam_wen;
     391              : 
     392        36662 :    logic [NBLOAD_TAG_MSB:0]  load_data_tag;
     393         6392 :    logic [NBLOAD_SIZE_MSB:0] nonblock_load_write;
     394              : 
     395         5811 :    el2_load_cam_pkt_t [NBLOAD_SIZE_MSB:0] cam;
     396         5811 :    el2_load_cam_pkt_t [NBLOAD_SIZE_MSB:0] cam_in;
     397         5811 :    el2_load_cam_pkt_t [NBLOAD_SIZE_MSB:0] cam_raw;
     398              : 
     399       531394 :    logic [4:0] nonblock_load_rd;
     400       190690 :    logic i0_nonblock_load_stall;
     401        89472 :    logic i0_nonblock_boundary_stall;
     402              : 
     403        26942 :    logic i0_rs1_nonblock_load_bypass_en_d, i0_rs2_nonblock_load_bypass_en_d;
     404              : 
     405       881494 :    logic i0_load_kill_wen_r;
     406              : 
     407         2411 :    logic found;
     408              : 
     409         5808 :    logic [NBLOAD_SIZE_MSB:0] cam_inv_reset_val, cam_data_reset_val;
     410              : 
     411            0 :    logic debug_fence_raw;
     412              : 
     413       314049 :    logic [31:0] i0_result_r_raw;
     414       314049 :    logic [31:0] i0_result_corr_r;
     415              : 
     416      1134323 :    logic [12:1] last_br_immed_x;
     417              : 
     418       897486 :    logic [31:0]        i0_inst_d;
     419       579534 :    logic [31:0]        i0_inst_x;
     420       579533 :    logic [31:0]        i0_inst_r;
     421       579533 :    logic [31:0]        i0_inst_wb_in;
     422       579528 :    logic [31:0]        i0_inst_wb;
     423              : 
     424          308 :    logic [31:1]        i0_pc_wb;
     425              : 
     426      6189448 :    logic               i0_wb_en;
     427              : 
     428          317 :    logic               trace_enable;
     429              : 
     430            0 :    logic               debug_valid_x;
     431              : 
     432      2152010 :    el2_inst_pkt_t i0_itype;
     433      2345922 :    el2_reg_pkt_t i0r;
     434              : 
     435              : 
     436              :    rvdffie  #(8) misc1ff (.*,
     437              :                           .clk(free_l2clk),
     438              :                           .din( {leak1_i1_stall_in,leak1_i0_stall_in,dec_tlu_flush_extint,pause_state_in ,dec_tlu_wr_pause_r, tlu_wr_pause_r1,illegal_lockout_in,ps_stall_in}),
     439              :                           .dout({leak1_i1_stall,   leak1_i0_stall,   dec_extint_stall,    pause_state,       tlu_wr_pause_r1,tlu_wr_pause_r2,illegal_lockout,   ps_stall   })
     440              :                           );
     441              : 
     442              :    rvdffie  #(8) misc2ff (.*,
     443              :                           .clk(free_l2clk),
     444              :                           .din( {lsu_trigger_match_m[3:0],lsu_pmu_misaligned_m,div_active_in,exu_flush_final,  dec_debug_valid_d}),
     445              :                           .dout({lsu_trigger_match_r[3:0],lsu_pmu_misaligned_r,div_active,       flush_final_r,    debug_valid_x})
     446              :                           );
     447              : 
     448              : if(pt.BTB_ENABLE==1) begin
     449              : // branch prediction
     450              : 
     451              : 
     452              :    // in leak1_mode, ignore any predictions for i0, treat branch as if we haven't seen it before
     453              :    // in leak1 mode, also ignore branch errors for i0
     454              :    assign i0_brp_valid                        =  dec_i0_brp.valid & ~leak1_mode & ~i0_icaf_d;
     455              : 
     456              :    assign dec_i0_predict_p_d.misp        =  '0;
     457              :    assign dec_i0_predict_p_d.ataken      =  '0;
     458              :    assign dec_i0_predict_p_d.boffset     =  '0;
     459              : 
     460              :    assign dec_i0_predict_p_d.pcall       =  i0_pcall;  // don't mark as pcall if branch error
     461              :    assign dec_i0_predict_p_d.pja         =  i0_pja;
     462              :    assign dec_i0_predict_p_d.pret        =  i0_pret;
     463              :    assign dec_i0_predict_p_d.prett[31:1] =  dec_i0_brp.prett[31:1];
     464              :    assign dec_i0_predict_p_d.pc4         =  dec_i0_pc4_d;
     465              :    assign dec_i0_predict_p_d.hist[1:0]   =  dec_i0_brp.hist[1:0];
     466              :    assign dec_i0_predict_p_d.valid       =  i0_brp_valid & i0_legal_decode_d;
     467              :    assign i0_notbr_error                 =  i0_brp_valid & ~(i0_dp_raw.condbr | i0_pcall_raw | i0_pja_raw | i0_pret_raw);
     468              : 
     469              :    // no toffset error for a pret
     470              :    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;
     471              :    assign i0_ret_error                                      =  i0_brp_valid & (dec_i0_brp.ret ^ i0_pret_raw);
     472              :    assign i0_br_error                                       =  dec_i0_brp.br_error | i0_notbr_error | i0_br_toffset_error | i0_ret_error;
     473              :    assign dec_i0_predict_p_d.br_error                       =  i0_br_error & i0_legal_decode_d & ~leak1_mode;
     474              :    assign dec_i0_predict_p_d.br_start_error                 =  dec_i0_brp.br_start_error & i0_legal_decode_d & ~leak1_mode;
     475              :    assign i0_predict_index_d[pt.BTB_ADDR_HI:pt.BTB_ADDR_LO] =  dec_i0_bp_index;
     476              : 
     477              :    assign i0_predict_btag_d[pt.BTB_BTAG_SIZE-1:0]           =  dec_i0_bp_btag[pt.BTB_BTAG_SIZE-1:0];
     478              :    assign i0_br_error_all                                   = (i0_br_error | dec_i0_brp.br_start_error) & ~leak1_mode;
     479              :    assign dec_i0_predict_p_d.toffset[11:0]                  =  i0_br_offset[11:0];
     480              :    assign i0_predict_fghr_d[pt.BHT_GHR_SIZE-1:0]            =  dec_i0_bp_fghr[pt.BHT_GHR_SIZE-1:0];
     481              :    assign dec_i0_predict_p_d.way                            =  dec_i0_brp.way;
     482              : 
     483              : 
     484              :    if(pt.BTB_FULLYA) begin : genblock
     485              :       logic btb_error_found, btb_error_found_f;
     486              :       logic [$clog2(pt.BTB_SIZE)-1:0] fa_error_index_ns;
     487              : 
     488              :       assign btb_error_found = (i0_br_error_all | btb_error_found_f) & ~dec_tlu_flush_lower_r;
     489              :       assign fa_error_index_ns = (i0_br_error_all & ~btb_error_found_f) ? dec_i0_bp_fa_index : dec_fa_error_index;
     490              : 
     491              :       rvdff #($clog2(pt.BTB_SIZE)+1) btberrorfa_f   (.*, .clk(active_clk),
     492              :                                                          .din({btb_error_found,    fa_error_index_ns}),
     493              :                                                          .dout({btb_error_found_f, dec_fa_error_index}));
     494              : 
     495              : 
     496              :    end
     497              :    else
     498              :      assign dec_fa_error_index = 'b0;
     499              : 
     500              : 
     501              :    //   end
     502              : end // if (pt.BTB_ENABLE==1)
     503              : else begin
     504              : 
     505              :    always_comb begin
     506              :       dec_i0_predict_p_d = '0;
     507              :       dec_i0_predict_p_d.pcall       =  i0_pcall;  // don't mark as pcall if branch error
     508              :       dec_i0_predict_p_d.pja         =  i0_pja;
     509              :       dec_i0_predict_p_d.pret        =  i0_pret;
     510              :       dec_i0_predict_p_d.pc4         =  dec_i0_pc4_d;
     511              :    end
     512              : 
     513              :    assign i0_br_error_all = '0;
     514              :    assign i0_predict_index_d = '0;
     515              :    assign i0_predict_btag_d = '0;
     516              :    assign i0_predict_fghr_d = '0;
     517              :    assign i0_brp_valid = '0;
     518              : end // else: !if(pt.BTB_ENABLE==1)
     519              : 
     520              :    // on br error turn anything into a nop
     521              :    // on i0 instruction fetch access fault turn anything into a nop
     522              :    // nop =>   alu rs1 imm12 rd lor
     523              : 
     524              :    assign i0_icaf_d = dec_i0_icaf_d | dec_i0_dbecc_d;
     525              : 
     526              :    assign i0_instr_error = i0_icaf_d;
     527              : 
     528          317 :    always_comb begin
     529          317 :       i0_dp = i0_dp_raw;
     530      1744660 :       if (i0_br_error_all | i0_instr_error) begin
     531        40180 :          i0_dp          =   '0;
     532        40180 :          i0_dp.alu      = 1'b1;
     533        40180 :          i0_dp.rs1      = 1'b1;
     534        40180 :          i0_dp.rs2      = 1'b1;
     535        40180 :          i0_dp.lor      = 1'b1;
     536        40180 :          i0_dp.legal    = 1'b1;
     537        40180 :          i0_dp.postsync = 1'b1;
     538              :       end
     539              :    end
     540              : 
     541              :    assign i0[31:0] = dec_i0_instr_d[31:0];
     542              : 
     543              :    assign dec_i0_select_pc_d = i0_dp.pc;
     544              : 
     545              :    // branches that can be predicted
     546              : 
     547              :    assign i0_predict_br =  i0_dp.condbr | i0_pcall | i0_pja | i0_pret;
     548              : 
     549              :    assign i0_predict_nt = ~(dec_i0_brp.hist[1] & i0_brp_valid) & i0_predict_br;
     550              :    assign i0_predict_t  =  (dec_i0_brp.hist[1] & i0_brp_valid) & i0_predict_br;
     551              : 
     552              :    assign i0_ap.add     =  i0_dp.add;
     553              :    assign i0_ap.sub     =  i0_dp.sub;
     554              :    assign i0_ap.land    =  i0_dp.land;
     555              :    assign i0_ap.lor     =  i0_dp.lor;
     556              :    assign i0_ap.lxor    =  i0_dp.lxor;
     557              :    assign i0_ap.sll     =  i0_dp.sll;
     558              :    assign i0_ap.srl     =  i0_dp.srl;
     559              :    assign i0_ap.sra     =  i0_dp.sra;
     560              :    assign i0_ap.slt     =  i0_dp.slt;
     561              :    assign i0_ap.unsign  =  i0_dp.unsign;
     562              :    assign i0_ap.beq     =  i0_dp.beq;
     563              :    assign i0_ap.bne     =  i0_dp.bne;
     564              :    assign i0_ap.blt     =  i0_dp.blt;
     565              :    assign i0_ap.bge     =  i0_dp.bge;
     566              : 
     567              :    assign i0_ap.clz     =  i0_dp.clz;
     568              :    assign i0_ap.ctz     =  i0_dp.ctz;
     569              :    assign i0_ap.cpop    =  i0_dp.cpop;
     570              :    assign i0_ap.sext_b  =  i0_dp.sext_b;
     571              :    assign i0_ap.sext_h  =  i0_dp.sext_h;
     572              :    assign i0_ap.sh1add  =  i0_dp.sh1add;
     573              :    assign i0_ap.sh2add  =  i0_dp.sh2add;
     574              :    assign i0_ap.sh3add  =  i0_dp.sh3add;
     575              :    assign i0_ap.zba     =  i0_dp.zba;
     576              :    assign i0_ap.min     =  i0_dp.min;
     577              :    assign i0_ap.max     =  i0_dp.max;
     578              :    assign i0_ap.pack    =  i0_dp.pack;
     579              :    assign i0_ap.packu   =  i0_dp.packu;
     580              :    assign i0_ap.packh   =  i0_dp.packh;
     581              :    assign i0_ap.rol     =  i0_dp.rol;
     582              :    assign i0_ap.ror     =  i0_dp.ror;
     583              :    assign i0_ap.grev    =  i0_dp.grev;
     584              :    assign i0_ap.gorc    =  i0_dp.gorc;
     585              :    assign i0_ap.zbb     =  i0_dp.zbb;
     586              :    assign i0_ap.bset    =  i0_dp.bset;
     587              :    assign i0_ap.bclr    =  i0_dp.bclr;
     588              :    assign i0_ap.binv    =  i0_dp.binv;
     589              :    assign i0_ap.bext    =  i0_dp.bext;
     590              : 
     591              :    assign i0_ap.csr_write =  i0_csr_write_only_d;
     592              :    assign i0_ap.csr_imm   =  i0_dp.csr_imm;
     593              :    assign i0_ap.jal       =  i0_jal;
     594              : 
     595              :    assign i0_ap_pc2 = ~dec_i0_pc4_d;
     596              :    assign i0_ap_pc4 =  dec_i0_pc4_d;
     597              : 
     598              :    assign i0_ap.predict_nt = i0_predict_nt;
     599              :    assign i0_ap.predict_t  = i0_predict_t;
     600              : 
     601              : 
     602              : // non block load cam logic
     603              : 
     604          317 :    always_comb begin
     605          317 :       found = 0;
     606          317 :       for (int i=0; i<NBLOAD_SIZE; i++) begin
     607        10974 :          if (~found) begin
     608      2573985 :             if (~cam[i].valid) begin
     609     23580095 :                cam_wen[i] = cam_write;
     610     23580095 :                found = 1'b1;
     611              :             end
     612      2573985 :             else begin
     613      2573985 :                cam_wen[i] = 0;
     614              :             end
     615              :          end
     616              :          else
     617     81057788 :             cam_wen[i] = 0;
     618              :       end
     619              :    end
     620              : 
     621              :    assign cam_write          = lsu_nonblock_load_valid_m;
     622              :    assign cam_write_tag[NBLOAD_TAG_MSB:0] = lsu_nonblock_load_tag_m[NBLOAD_TAG_MSB:0];
     623              : 
     624              :    assign cam_inv_reset          = lsu_nonblock_load_inv_r;
     625              :    assign cam_inv_reset_tag[NBLOAD_TAG_MSB:0] = lsu_nonblock_load_inv_tag_r[NBLOAD_TAG_MSB:0];
     626              : 
     627              :    assign cam_data_reset          = lsu_nonblock_load_data_valid | lsu_nonblock_load_data_error;
     628              :    assign cam_data_reset_tag[NBLOAD_TAG_MSB:0] = lsu_nonblock_load_data_tag[NBLOAD_TAG_MSB:0];
     629              : 
     630              :    assign nonblock_load_rd[4:0] = (x_d.i0load) ? x_d.i0rd[4:0] : 5'b0;  // rd data
     631              : 
     632              : 
     633              :    // checks
     634              : 
     635              : `ifdef RV_ASSERT_ON
     636              :    assert_dec_data_valid_data_error_onehot:    assert #0 ($onehot0({lsu_nonblock_load_data_valid,lsu_nonblock_load_data_error}));
     637              :    assert_dec_cam_inv_reset_onehot:            assert #0 ($onehot0(cam_inv_reset_val[NBLOAD_SIZE_MSB:0]));
     638              :    assert_dec_cam_data_reset_onehot:           assert #0 ($onehot0(cam_data_reset_val[NBLOAD_SIZE_MSB:0]));
     639              : `endif
     640              : 
     641              : 
     642              : 
     643              :     // case of multiple loads to same dest ie. x1 ... you have to invalidate the older one
     644              : 
     645            0 :    for (genvar i=0; i<NBLOAD_SIZE; i++) begin : cam_array
     646              : 
     647              :       assign cam_inv_reset_val[i] = cam_inv_reset   & (cam_inv_reset_tag[NBLOAD_TAG_MSB:0]  == cam[i].tag[NBLOAD_TAG_MSB:0]) & cam[i].valid;
     648              : 
     649              :       assign cam_data_reset_val[i] = cam_data_reset & (cam_data_reset_tag[NBLOAD_TAG_MSB:0] == cam_raw[i].tag[NBLOAD_TAG_MSB:0]) & cam_raw[i].valid;
     650              : 
     651         1268 :       always_comb begin
     652              : 
     653         1268 :          cam[i] = cam_raw[i];
     654              : 
     655     16946563 :          if (cam_data_reset_val[i])
     656       472907 :            cam[i].valid = 1'b0;
     657              : 
     658         1268 :          cam_in[i] = '0;
     659              : 
     660      1418800 :          if (cam_wen[i]) begin
     661      1418800 :             cam_in[i].valid    = 1'b1;
     662      1418800 :             cam_in[i].wb       = 1'b0;
     663      1418800 :             cam_in[i].tag[NBLOAD_TAG_MSB:0] = cam_write_tag[NBLOAD_TAG_MSB:0];
     664      1418800 :             cam_in[i].rd[4:0]  = nonblock_load_rd[4:0];
     665              :          end
     666     16654726 :          else if ( (cam_inv_reset_val[i]) |
     667              :                    (i0_wen_r & (r_d_in.i0rd[4:0] == cam[i].rd[4:0]) & cam[i].wb) )
     668        56444 :            cam_in[i].valid = 1'b0;
     669              :          else
     670    106615504 :            cam_in[i] = cam[i];
     671              : 
     672     17892695 :          if (nonblock_load_valid_m_delay & (lsu_nonblock_load_inv_tag_r[NBLOAD_TAG_MSB:0]==cam[i].tag[NBLOAD_TAG_MSB:0]) & cam[i].valid)
     673      1418727 :            cam_in[i].wb = 1'b1;
     674              : 
     675              :          // force debug halt forces cam valids to 0; highest priority
     676     97053128 :          if (dec_tlu_force_halt)
     677            0 :            cam_in[i].valid = 1'b0;
     678              :       end
     679              : 
     680              : 
     681              :    rvdffie #( $bits(el2_load_cam_pkt_t) ) cam_ff (.*, .din(cam_in[i]), .dout(cam_raw[i]));
     682              : 
     683              : 
     684              :    assign nonblock_load_write[i] = (load_data_tag[NBLOAD_TAG_MSB:0] == cam_raw[i].tag[NBLOAD_TAG_MSB:0]) & cam_raw[i].valid;
     685              : 
     686              : 
     687              : end : cam_array
     688              : 
     689              : 
     690              : 
     691              :    assign load_data_tag[NBLOAD_TAG_MSB:0] = lsu_nonblock_load_data_tag[NBLOAD_TAG_MSB:0];
     692              : 
     693              : `ifdef RV_ASSERT_ON
     694              :    assert_dec_cam_nonblock_load_write_onehot:   assert #0 ($onehot0(nonblock_load_write[NBLOAD_SIZE_MSB:0]));
     695              : `endif
     696              : 
     697              : 
     698              :    assign nonblock_load_cancel = ((r_d_in.i0rd[4:0] == dec_nonblock_load_waddr[4:0]) & i0_wen_r);     // cancel if any younger inst (including another nonblock) committing this cycle
     699              : 
     700              : 
     701              :    assign dec_nonblock_load_wen = lsu_nonblock_load_data_valid & |nonblock_load_write[NBLOAD_SIZE_MSB:0] & ~nonblock_load_cancel;
     702              : 
     703          317 :    always_comb begin
     704              : 
     705          317 :       dec_nonblock_load_waddr[4:0] = '0;
     706          317 :       i0_nonblock_load_stall = i0_nonblock_boundary_stall;
     707              : 
     708          317 :       for (int i=0; i<NBLOAD_SIZE; i++) begin
     709         1268 :          dec_nonblock_load_waddr[4:0] |= ({5{nonblock_load_write[i]}} & cam[i].rd[4:0]);
     710         1268 :          i0_nonblock_load_stall |= dec_i0_rs1_en_d & cam[i].valid & (cam[i].rd[4:0] == i0r.rs1[4:0]);
     711         1268 :          i0_nonblock_load_stall |= dec_i0_rs2_en_d & cam[i].valid & (cam[i].rd[4:0] == i0r.rs2[4:0]);
     712              :       end
     713              : 
     714              :    end
     715              : 
     716              :    assign i0_nonblock_boundary_stall = ((nonblock_load_rd[4:0]==i0r.rs1[4:0]) & lsu_nonblock_load_valid_m & dec_i0_rs1_en_d) |
     717              :                                        ((nonblock_load_rd[4:0]==i0r.rs2[4:0]) & lsu_nonblock_load_valid_m & dec_i0_rs2_en_d);
     718              : 
     719              : 
     720              : 
     721              : // don't writeback a nonblock load
     722              : 
     723              :    rvdffs #(1) wbnbloaddelayff (.*, .clk(active_clk), .en(i0_r_ctl_en ), .din(lsu_nonblock_load_valid_m),        .dout(nonblock_load_valid_m_delay) );
     724              : 
     725              :    assign i0_load_kill_wen_r = nonblock_load_valid_m_delay &  r_d.i0load;
     726              : 
     727              : 
     728              : 
     729              : // end non block load cam logic
     730              : 
     731              : // pmu start
     732              : 
     733              : 
     734              : 
     735              : 
     736              :    assign csr_read = csr_ren_qual_d;
     737              :    assign csr_write = dec_csr_wen_unq_d;
     738              : 
     739              :    assign i0_br_unpred = i0_dp.jal & ~i0_predict_br;
     740              : 
     741              :    // the classes must be mutually exclusive with one another
     742              : 
     743          317 :    always_comb begin
     744          317 :       i0_itype = NULL_OP;
     745              : 
     746      4523319 :       if (i0_legal_decode_d) begin
     747      1942801 :          if (i0_dp.mul)                  i0_itype = MUL;
     748      2801549 :          if (i0_dp.load)                 i0_itype = LOAD;
     749      2380807 :          if (i0_dp.store)                i0_itype = STORE;
     750      3778541 :          if (i0_dp.pm_alu)               i0_itype = ALU;
     751      8195979 :          if (i0_dp.zbb | i0_dp.zbs |
     752              :              i0_dp.zbe | i0_dp.zbc |
     753              :              i0_dp.zbp | i0_dp.zbr |
     754              :              i0_dp.zbf | i0_dp.zba)
     755        25713 :                                          i0_itype = BITMANIPU;
     756      2039335 :          if ( csr_read & ~csr_write)     i0_itype = CSRREAD;
     757       328213 :          if (~csr_read &  csr_write)     i0_itype = CSRWRITE;
     758      6967003 :          if ( csr_read &  csr_write)     i0_itype = CSRRW;
     759      8035924 :          if (i0_dp.ebreak)               i0_itype = EBREAK;
     760      4867703 :          if (i0_dp.ecall)                i0_itype = ECALL;
     761      6734755 :          if (i0_dp.fence)                i0_itype = FENCE;
     762      7048285 :          if (i0_dp.fence_i)              i0_itype = FENCEI;  // fencei will set this even with fence attribute
     763      4850509 :          if (i0_dp.mret)                 i0_itype = MRET;
     764      1799266 :          if (i0_dp.condbr)               i0_itype = CONDBR;
     765       419543 :          if (i0_dp.jal)                  i0_itype = JAL;
     766              :       end
     767              :    end
     768              : 
     769              : 
     770              : 
     771              : 
     772              : 
     773              : // end pmu
     774              : 
     775              : 
     776              :    el2_dec_dec_ctl i0_dec (.inst(i0[31:0]),.out(i0_dp_raw));
     777              : 
     778              : 
     779              : 
     780              : 
     781              :    rvdff #(1) lsu_idle_ff (.*, .clk(active_clk), .din(lsu_idle_any), .dout(lsu_idle));
     782              : 
     783              : 
     784              : 
     785              :    assign leak1_i1_stall_in = (dec_tlu_flush_leak_one_r | (leak1_i1_stall & ~dec_tlu_flush_lower_r));
     786              : 
     787              : 
     788              :    assign leak1_mode = leak1_i1_stall;
     789              : 
     790              :    assign leak1_i0_stall_in = ((dec_i0_decode_d & leak1_i1_stall) | (leak1_i0_stall & ~dec_tlu_flush_lower_r));
     791              : 
     792              : 
     793              : 
     794              : 
     795              :    // 12b jal's can be predicted - these are calls
     796              : 
     797              :    assign i0_pcall_imm[20:1] = {i0[31],i0[19:12],i0[20],i0[30:21]};
     798              : 
     799              :    assign i0_pcall_12b_offset = (i0_pcall_imm[12]) ? (i0_pcall_imm[20:13] == 8'hff) : (i0_pcall_imm[20:13] == 8'h0);
     800              : 
     801              :    assign i0_pcall_case  = i0_pcall_12b_offset & i0_dp_raw.imm20 &  (i0r.rd[4:0] == 5'd1 | i0r.rd[4:0] == 5'd5);
     802              :    assign i0_pja_case    = i0_pcall_12b_offset & i0_dp_raw.imm20 & ~(i0r.rd[4:0] == 5'd1 | i0r.rd[4:0] == 5'd5);
     803              : 
     804              :    assign i0_pcall_raw   = i0_dp_raw.jal &   i0_pcall_case;   // this includes ja
     805              :    assign i0_pcall       = i0_dp.jal     &   i0_pcall_case;
     806              : 
     807              :    assign i0_pja_raw     = i0_dp_raw.jal &   i0_pja_case;
     808              :    assign i0_pja         = i0_dp.jal     &   i0_pja_case;
     809              : 
     810              : 
     811              :    assign i0_br_offset[11:0] = (i0_pcall_raw | i0_pja_raw) ? i0_pcall_imm[12:1] : {i0[31],i0[7],i0[30:25],i0[11:8]};
     812              : 
     813              :    assign i0_pret_case = (i0_dp_raw.jal & i0_dp_raw.imm12 & (i0r.rd[4:0] == 5'b0) & (i0r.rs1[4:0] == 5'd1 | i0r.rs1[4:0] == 5'd5));  // jalr with rd==0, rs1==1 or rs1==5 is a ret
     814              : 
     815              :    assign i0_pret_raw = i0_dp_raw.jal &   i0_pret_case;
     816              :    assign i0_pret     = i0_dp.jal     &   i0_pret_case;
     817              : 
     818              :    assign i0_jal      = i0_dp.jal     &  ~i0_pcall_case & ~i0_pja_case & ~i0_pret_case;
     819              : 
     820              :    // lsu stuff
     821              :    // load/store mutually exclusive
     822              :    assign dec_lsu_offset_d[11:0] = ({12{ ~dec_extint_stall & i0_dp.lsu & i0_dp.load}} &               i0[31:20]) |
     823              :                                    ({12{ ~dec_extint_stall & i0_dp.lsu & i0_dp.store}} &             {i0[31:25],i0[11:7]});
     824              : 
     825              : 
     826              : 
     827              :    assign div_p.valid    =  div_decode_d;
     828              : 
     829              :    assign div_p.unsign   =  i0_dp.unsign;
     830              :    assign div_p.rem      =  i0_dp.rem;
     831              : 
     832              : 
     833              :    assign mul_p.valid    =  mul_decode_d;
     834              : 
     835              :    assign mul_p.rs1_sign     =  i0_dp.rs1_sign;
     836              :    assign mul_p.rs2_sign     =  i0_dp.rs2_sign;
     837              :    assign mul_p.low          =  i0_dp.low;
     838              :    assign mul_p.bcompress    =  i0_dp.bcompress;
     839              :    assign mul_p.bdecompress  =  i0_dp.bdecompress;
     840              :    assign mul_p.clmul        =  i0_dp.clmul;
     841              :    assign mul_p.clmulh       =  i0_dp.clmulh;
     842              :    assign mul_p.clmulr       =  i0_dp.clmulr;
     843              :    assign mul_p.grev         =  i0_dp.grev;
     844              :    assign mul_p.gorc         =  i0_dp.gorc;
     845              :    assign mul_p.shfl         =  i0_dp.shfl;
     846              :    assign mul_p.unshfl       =  i0_dp.unshfl;
     847              :    assign mul_p.xperm_n      =  i0_dp.xperm_n;
     848              :    assign mul_p.xperm_b      =  i0_dp.xperm_b;
     849              :    assign mul_p.xperm_h      =  i0_dp.xperm_h;
     850              :    assign mul_p.crc32_b      =  i0_dp.crc32_b;
     851              :    assign mul_p.crc32_h      =  i0_dp.crc32_h;
     852              :    assign mul_p.crc32_w      =  i0_dp.crc32_w;
     853              :    assign mul_p.crc32c_b     =  i0_dp.crc32c_b;
     854              :    assign mul_p.crc32c_h     =  i0_dp.crc32c_h;
     855              :    assign mul_p.crc32c_w     =  i0_dp.crc32c_w;
     856              :    assign mul_p.bfp          =  i0_dp.bfp;
     857              : 
     858              : 
     859          317 :    always_comb  begin
     860          317 :       lsu_p = '0;
     861              : 
     862     24263282 :       if (dec_extint_stall) begin
     863            0 :          lsu_p.load = 1'b1;
     864            0 :          lsu_p.word = 1'b1;
     865            0 :          lsu_p.fast_int = 1'b1;
     866            0 :          lsu_p.valid = 1'b1;
     867              :       end
     868     24263282 :       else begin
     869     24263282 :          lsu_p.valid = lsu_decode_d;
     870              : 
     871     24263282 :          lsu_p.load                         =  i0_dp.load ;
     872     24263282 :          lsu_p.store                        =  i0_dp.store;
     873     24263282 :          lsu_p.by                           =  i0_dp.by   ;
     874     24263282 :          lsu_p.half                         =  i0_dp.half ;
     875     24263282 :          lsu_p.word                         =  i0_dp.word ;
     876     24263282 :          lsu_p.stack                        = (i0r.rs1[4:0]==5'd2);   // stack reference
     877              : 
     878     24263282 :          lsu_p.load_ldst_bypass_d          =  load_ldst_bypass_d ;
     879     24263282 :          lsu_p.store_data_bypass_d         =  store_data_bypass_d;
     880     24263282 :          lsu_p.store_data_bypass_m         =  store_data_bypass_m;
     881              : 
     882     24263282 :          lsu_p.unsign  =  i0_dp.unsign;
     883              :       end
     884              :    end
     885              : 
     886              : 
     887              :    assign  dec_lsu_valid_raw_d    = (i0_valid_d & (i0_dp_raw.load | i0_dp_raw.store) & ~dma_dccm_stall_any & ~i0_block_raw_d) | dec_extint_stall;
     888              : 
     889              : 
     890              : 
     891              :    assign i0r.rs1[4:0] = i0[19:15];
     892              :    assign i0r.rs2[4:0] = i0[24:20];
     893              :    assign i0r.rd[4:0]  = i0[11:7];
     894              : 
     895              : 
     896              :    assign dec_i0_rs1_en_d   =  i0_dp.rs1 & (i0r.rs1[4:0] != 5'd0);  // if rs1_en=0 then read will be all 0's
     897              :    assign dec_i0_rs2_en_d   =  i0_dp.rs2 & (i0r.rs2[4:0] != 5'd0);
     898              :    assign i0_rd_en_d        =  i0_dp.rd  & (i0r.rd[4:0]  != 5'd0);
     899              : 
     900              :    assign dec_i0_rs1_d[4:0] =  i0r.rs1[4:0];
     901              :    assign dec_i0_rs2_d[4:0] =  i0r.rs2[4:0];
     902              : 
     903              : 
     904              :    assign i0_jalimm20       =  i0_dp.jal & i0_dp.imm20;   // jal
     905              :    assign i0_uiimm20        = ~i0_dp.jal & i0_dp.imm20;
     906              : 
     907              : 
     908              :    // csr logic
     909              : 
     910              :    assign dec_csr_ren_d  = i0_dp.csr_read & i0_valid_d;
     911              :    assign csr_ren_qual_d = i0_dp.csr_read & i0_legal_decode_d;
     912              : 
     913              :    assign csr_clr_d =   i0_dp.csr_clr   & i0_legal_decode_d;
     914              :    assign csr_set_d   = i0_dp.csr_set   & i0_legal_decode_d;
     915              :    assign csr_write_d = i0_csr_write    & i0_legal_decode_d;
     916              : 
     917              :    assign i0_csr_write_only_d = i0_csr_write & ~i0_dp.csr_read;
     918              : 
     919              :    assign dec_csr_wen_unq_d = (i0_dp.csr_clr | i0_dp.csr_set | i0_csr_write) & i0_valid_d;   // for csr legal, can't write read-only csr
     920              : 
     921              :    assign dec_csr_any_unq_d = any_csr_d & i0_valid_d;
     922              : 
     923              : 
     924              :    assign dec_csr_rdaddr_d[11:0] = {12{dec_csr_any_unq_d}} & i0[31:20];
     925              :    assign dec_csr_rdaddr_r[11:0] = {12{~r_d.csrwen & r_d.i0valid}} & r_d.csraddr[11:0];
     926              :    assign dec_csr_wraddr_r[11:0] = {12{r_d.csrwen & r_d.i0valid}} & r_d.csraddr[11:0];
     927              : 
     928              : 
     929              :    // make sure csr doesn't write same cycle as dec_tlu_flush_lower_wb
     930              :    // also use valid so it's flushable
     931              :    assign dec_csr_wen_r = r_d.csrwen & r_d.i0valid & ~dec_tlu_i0_kill_writeb_r;
     932              : 
     933              :    // If we are writing MIE or MSTATUS, hold off the external interrupt for a cycle on the write.
     934              :    assign dec_csr_stall_int_ff = ((r_d.csraddr[11:0] == 12'h300) | (r_d.csraddr[11:0] == 12'h304)) & r_d.csrwen & r_d.i0valid & ~dec_tlu_i0_kill_writeb_wb;
     935              : 
     936              : 
     937              :    rvdff #(5) csrmiscff (.*,
     938              :                         .clk (active_clk),
     939              :                         .din ({csr_ren_qual_d, csr_clr_d, csr_set_d, csr_write_d, i0_dp.csr_imm}),
     940              :                         .dout({csr_read_x,     csr_clr_x, csr_set_x, csr_write_x, csr_imm_x})
     941              :                        );
     942              : 
     943              : 
     944              : 
     945              : 
     946              :    // perform the update operation if any
     947              : 
     948              :    rvdffe #(37) csr_rddata_x_ff (.*, .en(i0_x_data_en & any_csr_d), .din( {i0[19:15],dec_csr_rddata_d[31:0]}), .dout({csrimm_x[4:0],csr_rddata_x[31:0]}));
     949              : 
     950              : 
     951              :    assign csr_mask_x[31:0]       = ({32{ csr_imm_x}} & {27'b0,csrimm_x[4:0]}) |
     952              :                                    ({32{~csr_imm_x}} &  exu_csr_rs1_x[31:0] );
     953              : 
     954              : 
     955              :    assign write_csr_data_x[31:0] = ({32{csr_clr_x}}   & (csr_rddata_x[31:0] & ~csr_mask_x[31:0])) |
     956              :                                    ({32{csr_set_x}}   & (csr_rddata_x[31:0] |  csr_mask_x[31:0])) |
     957              :                                    ({32{csr_write_x}} & (                      csr_mask_x[31:0]));
     958              : 
     959              : 
     960              : // pause instruction
     961              : 
     962              : 
     963              : 
     964              : 
     965              :    assign clear_pause = (dec_tlu_flush_lower_r & ~dec_tlu_flush_pause_r) |
     966              :                         (pause_state & (write_csr_data[31:1] == 31'b0));        // if 0 or 1 then exit pause state - 1 cycle pause
     967              : 
     968              :    assign pause_state_in = (dec_tlu_wr_pause_r | pause_state) & ~clear_pause;
     969              : 
     970              : 
     971              : 
     972              :    assign dec_pause_state = pause_state;
     973              : 
     974              : 
     975              : 
     976              :       assign dec_pause_state_cg = pause_state & ~tlu_wr_pause_r1 & ~tlu_wr_pause_r2;
     977              : 
     978              : // end pause
     979              : 
     980              : 
     981              :    assign csr_data_wen = ((csr_clr_x | csr_set_x | csr_write_x) & csr_read_x) | dec_tlu_wr_pause_r | pause_state;
     982              : 
     983              :    assign write_csr_data_in[31:0] = (pause_state)         ? (write_csr_data[31:0] - 32'b1) :
     984              :                                     (dec_tlu_wr_pause_r) ? dec_csr_wrdata_r[31:0] : write_csr_data_x[31:0];
     985              : 
     986              :    // will hold until write-back at which time the CSR will be updated while GPR is possibly written with prior CSR
     987              :    rvdffe #(32) write_csr_ff (.*, .clk(free_l2clk), .en(csr_data_wen), .din(write_csr_data_in[31:0]), .dout(write_csr_data[31:0]));
     988              : 
     989              :    assign pause_stall = pause_state;
     990              : 
     991              :    // for csr write only data is produced by the alu
     992              :    assign dec_csr_wrdata_r[31:0]  = (r_d.csrwonly & r_d.i0valid) ? i0_result_corr_r[31:0] : write_csr_data[31:0];
     993              : 
     994              : 
     995              : 
     996              :    assign dec_i0_immed_d[31:0] =  i0_immed_d[31:0];
     997              : 
     998              :    assign     i0_immed_d[31:0] = ({32{i0_dp.imm12}}                         & { {20{i0[31]}},i0[31:20] }) |  // jalr
     999              :                                  ({32{i0_dp.shimm5}}                        & {  27'b0,      i0[24:20] }) |
    1000              :                                  ({32{i0_jalimm20}}                         & { {12{i0[31]}},i0[19:12],i0[20],i0[30:21],1'b0}) |
    1001              :                                  ({32{i0_uiimm20}}                          & { i0[31:12],12'b0 }) |
    1002              :                                  ({32{i0_csr_write_only_d & i0_dp.csr_imm}} & {  27'b0,      i0[19:15]});  // for csr's that only write csr, dont read csr
    1003              : 
    1004              : 
    1005              :    // all conditional branches are currently predict_nt
    1006              :    // change this to generate the sequential address for all other cases for NPC requirements at commit
    1007              :    assign dec_i0_br_immed_d[12:1] = (i0_ap.predict_nt & ~i0_dp.jal) ? i0_br_offset[11:0] : {10'b0,i0_ap_pc4,i0_ap_pc2};
    1008              : 
    1009              : 
    1010              :    assign last_br_immed_d[12:1] = ((i0_ap.predict_nt) ? {10'b0,i0_ap_pc4,i0_ap_pc2} : i0_br_offset[11:0] );
    1011              : 
    1012              :    assign i0_valid_d = dec_ib0_valid_d;
    1013              : 
    1014              :    // load_stall includes bus_barrier
    1015              : 
    1016              :    assign i0_load_stall_d = (i0_dp.load ) & (lsu_load_stall_any | dma_dccm_stall_any);
    1017              : 
    1018              :    assign i0_store_stall_d =  i0_dp.store & (lsu_store_stall_any | dma_dccm_stall_any);
    1019              : 
    1020              : 
    1021              : 
    1022              : // some CSR reads need to be presync'd
    1023              :    assign i0_presync = i0_dp.presync | dec_tlu_presync_d | debug_fence_i | debug_fence_raw | dec_tlu_pipelining_disable;  // both fence's presync
    1024              : 
    1025              : // some CSR writes need to be postsync'd
    1026              :    assign i0_postsync = i0_dp.postsync | dec_tlu_postsync_d | debug_fence_i | // only fence_i postsync
    1027              :                         (i0_csr_write_only_d & (i0[31:20] == 12'h7c2));   // wr_pause must postsync
    1028              : 
    1029              : 
    1030              : // debug fence csr
    1031              :    assign debug_fence_i     = dec_debug_fence_d & dbg_cmd_wrdata[0];
    1032              :    assign debug_fence_raw   = dec_debug_fence_d & dbg_cmd_wrdata[1];
    1033              : 
    1034              :    assign debug_fence       = debug_fence_raw | debug_fence_i;    // fence_i causes a fence
    1035              : 
    1036              :    assign i0_csr_write = i0_dp.csr_write & ~dec_debug_fence_d;
    1037              : // end debug
    1038              : 
    1039              : 
    1040              :    // lets make ebreak, ecall, mret postsync, so break sync into pre and post
    1041              : 
    1042              :    assign presync_stall      = (i0_presync & prior_inflight_eff);
    1043              : 
    1044              :    assign prior_inflight_eff = (i0_dp.div)  ?  prior_inflight_x  :  prior_inflight;
    1045              : 
    1046              :    assign i0_div_prior_div_stall = i0_dp.div & div_active;
    1047              : 
    1048              :    // Raw block has everything excepts the stalls coming from the lsu
    1049              :    assign i0_block_raw_d = (i0_dp.csr_read & prior_csr_write) |
    1050              :                             dec_extint_stall |
    1051              :                             pause_stall |
    1052              :                             leak1_i0_stall |
    1053              :                             dec_tlu_debug_stall |
    1054              :                             postsync_stall |
    1055              :                             presync_stall  |
    1056              :                             ((i0_dp.fence | debug_fence) & ~lsu_idle) |
    1057              :                             i0_nonblock_load_stall |
    1058              :                             i0_load_block_d |
    1059              :                             i0_nonblock_div_stall |
    1060              :                             i0_div_prior_div_stall;
    1061              : 
    1062              :    assign i0_block_d    = i0_block_raw_d | i0_store_stall_d | i0_load_stall_d;
    1063              :    assign i0_exublock_d = i0_block_raw_d;
    1064              : 
    1065              : 
    1066              :    // block reads if there is a prior csr write in the pipeline
    1067              :    assign prior_csr_write = x_d.csrwonly |
    1068              :                             r_d.csrwonly |
    1069              :                             wbd.csrwonly;
    1070              : 
    1071              : 
    1072              : 
    1073              :    if       (pt.BITMANIP_ZBB == 1)
    1074              :      assign bitmanip_zbb_legal              =  1'b1;
    1075              :    else
    1076              :      assign bitmanip_zbb_legal              = ~(i0_dp.zbb & ~i0_dp.zbp);
    1077              : 
    1078              :    if       (pt.BITMANIP_ZBS == 1)
    1079              :      assign bitmanip_zbs_legal              =  1'b1;
    1080              :    else
    1081              :      assign bitmanip_zbs_legal              = ~i0_dp.zbs;
    1082              : 
    1083              :    if       (pt.BITMANIP_ZBE == 1)
    1084              :      assign bitmanip_zbe_legal              =  1'b1;
    1085              :    else
    1086              :      assign bitmanip_zbe_legal              = ~(i0_dp.zbe & ~i0_dp.zbp & ~i0_dp.zbf);
    1087              : 
    1088              :    if       (pt.BITMANIP_ZBC == 1)
    1089              :      assign bitmanip_zbc_legal              =  1'b1;
    1090              :    else
    1091              :      assign bitmanip_zbc_legal              = ~i0_dp.zbc;
    1092              : 
    1093              :    if       (pt.BITMANIP_ZBP == 1)
    1094              :      assign bitmanip_zbp_legal              =  1'b1;
    1095              :    else
    1096              :      assign bitmanip_zbp_legal              = ~(i0_dp.zbp & ~i0_dp.zbb & ~i0_dp.zbe & ~i0_dp.zbf);
    1097              : 
    1098              :    if       (pt.BITMANIP_ZBR == 1)
    1099              :      assign bitmanip_zbr_legal              =  1'b1;
    1100              :    else
    1101              :      assign bitmanip_zbr_legal              = ~i0_dp.zbr;
    1102              : 
    1103              :    if       (pt.BITMANIP_ZBF == 1)
    1104              :      assign bitmanip_zbf_legal              =  1'b1;
    1105              :    else
    1106              :      assign bitmanip_zbf_legal              = ~(i0_dp.zbf & ~i0_dp.zbp & ~i0_dp.zbe);
    1107              : 
    1108              :    if (pt.BITMANIP_ZBA == 1)
    1109              :      assign bitmanip_zba_legal              =  1'b1;
    1110              :    else
    1111              :      assign bitmanip_zba_legal              = ~i0_dp.zba;
    1112              : 
    1113              :    if     ( (pt.BITMANIP_ZBB == 1) | (pt.BITMANIP_ZBP == 1) )
    1114              :      assign bitmanip_zbb_zbp_legal          =  1'b1;
    1115              :    else
    1116              :      assign bitmanip_zbb_zbp_legal          = ~(i0_dp.zbb & i0_dp.zbp & ~i0_dp.zbf);                                  // added ~ZBF to exclude ZEXT.H
    1117              : 
    1118              :    if     ( (pt.BITMANIP_ZBP == 1) | (pt.BITMANIP_ZBE == 1)  | (pt.BITMANIP_ZBF == 1))
    1119              :      assign bitmanip_zbp_zbe_zbf_legal      =  1'b1;
    1120              :    else
    1121              :      assign bitmanip_zbp_zbe_zbf_legal      = ~(i0_dp.zbp & i0_dp.zbe &  i0_dp.zbf & ~i0_dp.zbb);                     // added ~ZBB to exclude ZEXT.H
    1122              : 
    1123              :    if     ( (pt.BITMANIP_ZBB == 1) | (pt.BITMANIP_ZBP == 1) | (pt.BITMANIP_ZBE == 1)  | (pt.BITMANIP_ZBF == 1))
    1124              :      assign bitmanip_zbb_zbp_zbe_zbf_legal  =  1'b1;
    1125              :    else
    1126              :      assign bitmanip_zbb_zbp_zbe_zbf_legal  = ~(i0_dp.zbp & i0_dp.zbe &  i0_dp.zbf &  i0_dp.zbb);                     // added only for ZEXT.H
    1127              : 
    1128              : 
    1129              :    assign any_csr_d      =  i0_dp.csr_read | i0_csr_write;
    1130              :    assign bitmanip_legal =  bitmanip_zbb_legal & bitmanip_zbs_legal & bitmanip_zbe_legal & bitmanip_zbc_legal & bitmanip_zbp_legal & bitmanip_zbr_legal & bitmanip_zbf_legal & bitmanip_zba_legal & bitmanip_zbb_zbp_legal & bitmanip_zbp_zbe_zbf_legal &  bitmanip_zbb_zbp_zbe_zbf_legal;
    1131              : 
    1132              :    assign i0_legal       =  i0_dp.legal & (~any_csr_d | dec_csr_legal_d) & bitmanip_legal;
    1133              : 
    1134              : 
    1135              : 
    1136              :    // illegal inst handling
    1137              : 
    1138              : 
    1139              :    assign shift_illegal      = dec_i0_decode_d & ~i0_legal;
    1140              : 
    1141              :    assign illegal_inst_en    = shift_illegal & ~illegal_lockout;
    1142              : 
    1143              :    rvdffe #(32) illegal_any_ff (.*, .en(illegal_inst_en), .din(i0_inst_d[31:0]), .dout(dec_illegal_inst[31:0]));
    1144              : 
    1145              :    assign illegal_lockout_in = (shift_illegal | illegal_lockout) & ~flush_final_r;
    1146              : 
    1147              : 
    1148              : 
    1149              :    // allow illegals to flow down the pipe
    1150              :    assign dec_i0_decode_d = i0_valid_d & ~i0_block_d    & ~dec_tlu_flush_lower_r & ~flush_final_r;
    1151              :    assign i0_exudecode_d  = i0_valid_d & ~i0_exublock_d & ~dec_tlu_flush_lower_r & ~flush_final_r;
    1152              : 
    1153              :    // define i0 legal decode
    1154              :    assign i0_legal_decode_d    = dec_i0_decode_d & i0_legal;
    1155              :    assign i0_exulegal_decode_d = i0_exudecode_d  & i0_legal;
    1156              : 
    1157              : 
    1158              :    // performance monitor signals
    1159              :    assign dec_pmu_instr_decoded = dec_i0_decode_d;
    1160              : 
    1161              :    assign dec_pmu_decode_stall = i0_valid_d & ~dec_i0_decode_d;
    1162              : 
    1163              :    assign dec_pmu_postsync_stall = postsync_stall & i0_valid_d;
    1164              :    assign dec_pmu_presync_stall  = presync_stall & i0_valid_d;
    1165              : 
    1166              : 
    1167              : 
    1168              :    // illegals will postsync
    1169              :    assign ps_stall_in =  ( dec_i0_decode_d & (i0_postsync | ~i0_legal) ) |
    1170              :                          ( ps_stall & prior_inflight_x                 );
    1171              : 
    1172              : 
    1173              : 
    1174              :    assign postsync_stall =  ps_stall;
    1175              : 
    1176              : 
    1177              :    assign prior_inflight_x    =  x_d.i0valid;
    1178              :    assign prior_inflight_wb   =  r_d.i0valid;
    1179              : 
    1180              :    assign prior_inflight = prior_inflight_x | prior_inflight_wb;
    1181              : 
    1182              :    assign dec_i0_alu_decode_d = i0_exulegal_decode_d & i0_dp.alu;
    1183              :    assign dec_i0_branch_d     = i0_dp.condbr | i0_dp.jal | i0_br_error_all;
    1184              : 
    1185              :    assign lsu_decode_d = i0_legal_decode_d    & i0_dp.lsu;
    1186              :    assign mul_decode_d = i0_exulegal_decode_d & i0_dp.mul;
    1187              :    assign div_decode_d = i0_exulegal_decode_d & i0_dp.div;
    1188              : 
    1189              :    assign dec_qual_lsu_d = i0_dp.lsu;
    1190              : 
    1191              : 
    1192              : 
    1193              : 
    1194              : 
    1195              : // scheduling logic for alu
    1196              : 
    1197              :    assign i0_rs1_depend_i0_x  = dec_i0_rs1_en_d & x_d.i0v & (x_d.i0rd[4:0] == i0r.rs1[4:0]);
    1198              :    assign i0_rs1_depend_i0_r  = dec_i0_rs1_en_d & r_d.i0v & (r_d.i0rd[4:0] == i0r.rs1[4:0]);
    1199              : 
    1200              :    assign i0_rs2_depend_i0_x  = dec_i0_rs2_en_d & x_d.i0v & (x_d.i0rd[4:0] == i0r.rs2[4:0]);
    1201              :    assign i0_rs2_depend_i0_r  = dec_i0_rs2_en_d & r_d.i0v & (r_d.i0rd[4:0] == i0r.rs2[4:0]);
    1202              : 
    1203              : 
    1204              : // order the producers as follows:  , i0_x, i0_r, i0_wb
    1205              : 
    1206              :    assign {i0_rs1_class_d, i0_rs1_depth_d[1:0]} = (i0_rs1_depend_i0_x ) ? { i0_x_c,  2'd1  } :
    1207              :                                                   (i0_rs1_depend_i0_r ) ? { i0_r_c,  2'd2  } : '0;
    1208              : 
    1209              :    assign {i0_rs2_class_d, i0_rs2_depth_d[1:0]} = (i0_rs2_depend_i0_x ) ? { i0_x_c,  2'd1  } :
    1210              :                                                   (i0_rs2_depend_i0_r ) ? { i0_r_c,  2'd2  } : '0;
    1211              : 
    1212              : 
    1213              : // stores will bypass load data in the lsu pipe
    1214              : 
    1215              :    if (pt.LOAD_TO_USE_PLUS1 == 1) begin : genblock
    1216              :       assign i0_load_block_d = (i0_rs1_class_d.load & i0_rs1_depth_d[0]) |
    1217              :                                (i0_rs2_class_d.load & i0_rs2_depth_d[0] & ~i0_dp.store);
    1218              : 
    1219              :       assign load_ldst_bypass_d    =  (i0_dp.load | i0_dp.store) & i0_rs1_depth_d[1] & i0_rs1_class_d.load;
    1220              : 
    1221              :       assign store_data_bypass_d =                  i0_dp.store  & i0_rs2_depth_d[1] & i0_rs2_class_d.load;
    1222              : 
    1223              :       assign store_data_bypass_m =                  i0_dp.store  & i0_rs2_depth_d[0] & i0_rs2_class_d.load;
    1224              :    end
    1225              :    else begin : genblock
    1226              : 
    1227              :       assign i0_load_block_d = 1'b0;
    1228              : 
    1229              :       assign load_ldst_bypass_d    =  (i0_dp.load | i0_dp.store) & i0_rs1_depth_d[0] & i0_rs1_class_d.load;
    1230              : 
    1231              :       assign store_data_bypass_d =                  i0_dp.store  & i0_rs2_depth_d[0] & i0_rs2_class_d.load;
    1232              : 
    1233              :       assign store_data_bypass_m = 1'b0;
    1234              :    end
    1235              : 
    1236              : 
    1237              : 
    1238              : 
    1239              : 
    1240              : 
    1241              :    assign dec_tlu_i0_valid_r     =  r_d.i0valid & ~dec_tlu_flush_lower_wb;
    1242              : 
    1243              : 
    1244              :    assign d_t.legal              =  i0_legal_decode_d;
    1245              :    assign d_t.icaf               =  i0_icaf_d & i0_legal_decode_d;                // dbecc is icaf exception
    1246              :    assign d_t.icaf_second        =  dec_i0_icaf_second_d & i0_legal_decode_d;     // this includes icaf and dbecc
    1247              :    assign d_t.icaf_type[1:0]     =  dec_i0_icaf_type_d[1:0];
    1248              : 
    1249              :    assign d_t.fence_i            = (i0_dp.fence_i | debug_fence_i) & i0_legal_decode_d;
    1250              : 
    1251              : // put pmu info into the trap packet
    1252              :    assign d_t.pmu_i0_itype       =  i0_itype;
    1253              :    assign d_t.pmu_i0_br_unpred   =  i0_br_unpred;
    1254              :    assign d_t.pmu_divide         =  1'b0;
    1255              :    assign d_t.pmu_lsu_misaligned =  1'b0;
    1256              : 
    1257              :    assign d_t.i0trigger[3:0]     =  dec_i0_trigger_match_d[3:0] & {4{dec_i0_decode_d}};
    1258              : 
    1259              : 
    1260              : 
    1261              :    rvdfflie #( .WIDTH($bits(el2_trap_pkt_t)),.LEFT(9) ) trap_xff (.*, .en(i0_x_ctl_en), .din(d_t),  .dout(x_t));
    1262              : 
    1263          317 :    always_comb begin
    1264          317 :       x_t_in = x_t;
    1265          317 :       x_t_in.i0trigger[3:0] = x_t.i0trigger & ~{4{dec_tlu_flush_lower_wb}};
    1266              :    end
    1267              : 
    1268              : 
    1269              :    rvdfflie  #( .WIDTH($bits(el2_trap_pkt_t)),.LEFT(9) ) trap_r_ff (.*, .en(i0_x_ctl_en), .din(x_t_in),  .dout(r_t));
    1270              : 
    1271              : 
    1272          317 :     always_comb begin
    1273              : 
    1274          317 :       r_t_in                             =  r_t;
    1275              : 
    1276          317 :       r_t_in.i0trigger[3:0]              = ({4{(r_d.i0load | r_d.i0store)}} & lsu_trigger_match_r[3:0]) | r_t.i0trigger[3:0];
    1277          317 :       r_t_in.pmu_lsu_misaligned          = lsu_pmu_misaligned_r;   // only valid if a load/store is valid in DC3 stage
    1278              : 
    1279        29372 :       if (dec_tlu_flush_lower_wb) r_t_in = '0 ;
    1280              : 
    1281              :    end
    1282              : 
    1283              : 
    1284          317 :    always_comb begin
    1285              : 
    1286          317 :       dec_tlu_packet_r                 =  r_t_in;
    1287          317 :       dec_tlu_packet_r.pmu_divide      =  r_d.i0div & r_d.i0valid;
    1288              : 
    1289              :    end
    1290              : 
    1291              : 
    1292              : // end tlu stuff
    1293              : 
    1294              : 
    1295              :    assign i0_d_c.mul                =  i0_dp.mul  & i0_legal_decode_d;
    1296              :    assign i0_d_c.load               =  i0_dp.load & i0_legal_decode_d;
    1297              :    assign i0_d_c.alu                =  i0_dp.alu  & i0_legal_decode_d;
    1298              : 
    1299              :    rvdffs #( $bits(el2_class_pkt_t) ) i0_x_c_ff   (.*, .en(i0_x_ctl_en),  .clk(active_clk), .din(i0_d_c),  .dout(i0_x_c));
    1300              :    rvdffs #( $bits(el2_class_pkt_t) ) i0_r_c_ff   (.*, .en(i0_r_ctl_en),  .clk(active_clk), .din(i0_x_c),  .dout(i0_r_c));
    1301              : 
    1302              : 
    1303              :    assign d_d.i0rd[4:0]             =  i0r.rd[4:0];
    1304              :    assign d_d.i0v                   =  i0_rd_en_d  & i0_legal_decode_d;
    1305              :    assign d_d.i0valid               =  dec_i0_decode_d;  // has flush_final_r
    1306              : 
    1307              :    assign d_d.i0load                =  i0_dp.load  & i0_legal_decode_d;
    1308              :    assign d_d.i0store               =  i0_dp.store & i0_legal_decode_d;
    1309              :    assign d_d.i0div                 =  i0_dp.div   & i0_legal_decode_d;
    1310              : 
    1311              : 
    1312              :    assign d_d.csrwen        =  dec_csr_wen_unq_d   & i0_legal_decode_d;
    1313              :    assign d_d.csrwonly      =  i0_csr_write_only_d & dec_i0_decode_d;
    1314              :    assign d_d.csraddr[11:0] =  i0[31:20]; // csr read/write address
    1315              : 
    1316              : 
    1317              :    rvdff  #(3) i0cgff               (.*, .clk(active_clk),            .din(i0_pipe_en[3:1]), .dout(i0_pipe_en[2:0]));
    1318              : 
    1319              :    assign i0_pipe_en[3]             =  dec_i0_decode_d;
    1320              : 
    1321              :    assign i0_x_ctl_en               = (|i0_pipe_en[3:2] | clk_override);
    1322              :    assign i0_r_ctl_en               = (|i0_pipe_en[2:1] | clk_override);
    1323              :    assign i0_wb_ctl_en              = (|i0_pipe_en[1:0] | clk_override);
    1324              :    assign i0_x_data_en              = ( i0_pipe_en[3]   | clk_override);
    1325              :    assign i0_r_data_en              = ( i0_pipe_en[2]   | clk_override);
    1326              :    assign i0_wb_data_en             = ( i0_pipe_en[1]   | clk_override);
    1327              : 
    1328              :    assign dec_data_en[1:0]          = {i0_x_data_en, i0_r_data_en};
    1329              :    assign dec_ctl_en[1:0]           = {i0_x_ctl_en,  i0_r_ctl_en};
    1330              : 
    1331              : 
    1332              : 
    1333              :    rvdfflie #( .WIDTH($bits(el2_dest_pkt_t)),.LEFT(15) ) e1ff (.*, .en(i0_x_ctl_en), .din(d_d),  .dout(x_d));
    1334              : 
    1335          317 :    always_comb begin
    1336          317 :       x_d_in = x_d;
    1337              : 
    1338          317 :       x_d_in.i0v         = x_d.i0v     & ~dec_tlu_flush_lower_wb & ~dec_tlu_flush_lower_r;
    1339          317 :       x_d_in.i0valid     = x_d.i0valid & ~dec_tlu_flush_lower_wb & ~dec_tlu_flush_lower_r;
    1340              :    end
    1341              : 
    1342              :    rvdfflie #( .WIDTH($bits(el2_dest_pkt_t)), .LEFT(15) ) r_d_ff (.*, .en(i0_r_ctl_en), .din(x_d_in), .dout(r_d));
    1343              : 
    1344              : 
    1345          317 :    always_comb begin
    1346              : 
    1347          317 :         r_d_in = r_d;
    1348              : 
    1349              : 
    1350              :       // for the bench
    1351          317 :       r_d_in.i0rd[4:0]   =  r_d.i0rd[4:0];
    1352              : 
    1353          317 :       r_d_in.i0v         = (r_d.i0v      & ~dec_tlu_flush_lower_wb);
    1354          317 :       r_d_in.i0valid     = (r_d.i0valid  & ~dec_tlu_flush_lower_wb);
    1355              : 
    1356          317 :       r_d_in.i0load      =  r_d.i0load   & ~dec_tlu_flush_lower_wb;
    1357          317 :       r_d_in.i0store     =  r_d.i0store  & ~dec_tlu_flush_lower_wb;
    1358              : 
    1359              :    end
    1360              : 
    1361              : 
    1362              :    rvdfflie #(.WIDTH($bits(el2_dest_pkt_t)), .LEFT(15)) wbff (.*, .en(i0_wb_ctl_en), .din(r_d_in), .dout(wbd));
    1363              : 
    1364              :    assign dec_i0_waddr_r[4:0]       =  r_d_in.i0rd[4:0];
    1365              : 
    1366              :    assign     i0_wen_r              =  r_d_in.i0v & ~dec_tlu_i0_kill_writeb_r;
    1367              :    assign dec_i0_wen_r              =  i0_wen_r   & ~r_d_in.i0div & ~i0_load_kill_wen_r;  // don't write a nonblock load 1st time down the pipe
    1368              :    assign dec_i0_wdata_r[31:0]      =  i0_result_corr_r[31:0];
    1369              : 
    1370              : 
    1371              :    // divide stuff
    1372              :    assign div_e1_to_r         = (x_d.i0div & x_d.i0valid) |
    1373              :                                 (r_d.i0div & r_d.i0valid);
    1374              : 
    1375              :    assign div_active_in = i0_div_decode_d | (div_active & ~exu_div_wren & ~nonblock_div_cancel);
    1376              : 
    1377              : 
    1378              :    assign dec_div_active = div_active;
    1379              : 
    1380              :    // nonblocking div scheme
    1381              : 
    1382              :    assign i0_nonblock_div_stall  = (dec_i0_rs1_en_d & div_active & (div_waddr_wb[4:0] == i0r.rs1[4:0])) |
    1383              :                                    (dec_i0_rs2_en_d & div_active & (div_waddr_wb[4:0] == i0r.rs2[4:0]));
    1384              : 
    1385              : 
    1386              :    assign div_flush              = (x_d.i0div & x_d.i0valid & (x_d.i0rd[4:0]==5'b0)                           ) |
    1387              :                                    (x_d.i0div & x_d.i0valid & dec_tlu_flush_lower_r                           ) |
    1388              :                                    (r_d.i0div & r_d.i0valid & dec_tlu_flush_lower_r & dec_tlu_i0_kill_writeb_r);
    1389              : 
    1390              : 
    1391              :    // cancel if any younger inst committing this cycle to same dest as nonblock divide
    1392              :    assign nonblock_div_cancel    = (div_active &  div_flush) |
    1393              :                                    (div_active & ~div_e1_to_r & (r_d.i0rd[4:0] == div_waddr_wb[4:0]) & i0_wen_r);
    1394              : 
    1395              :    assign dec_div_cancel         =  nonblock_div_cancel;
    1396              : 
    1397              : 
    1398              : 
    1399              :    assign i0_div_decode_d            =  i0_legal_decode_d & i0_dp.div;
    1400              : 
    1401              : // for load_to_use_plus1, the load result data is merged in R stage instead of D
    1402              : 
    1403              :    if ( pt.LOAD_TO_USE_PLUS1 == 1 ) begin : genblock1
    1404              :       assign i0_result_x[31:0]          = exu_i0_result_x[31:0];
    1405              :       assign i0_result_r[31:0]          = (r_d.i0v & r_d.i0load) ? lsu_result_m[31:0] : i0_result_r_raw[31:0];
    1406              :    end
    1407              :    else begin : genblock1
    1408              :       assign i0_result_x[31:0]          = (x_d.i0v & x_d.i0load) ? lsu_result_m[31:0] : exu_i0_result_x[31:0];
    1409              :       assign i0_result_r[31:0]          = i0_result_r_raw[31:0];
    1410              :    end
    1411              : 
    1412              : 
    1413              :    rvdffe #(32) i0_result_r_ff       (.*, .en(i0_r_data_en & (x_d.i0v | x_d.csrwen | debug_valid_x)),  .din(i0_result_x[31:0]),       .dout(i0_result_r_raw[31:0]));
    1414              : 
    1415              :    // correct lsu load data - don't use for bypass, do pass down the pipe
    1416              :    assign i0_result_corr_r[31:0]     = (r_d.i0v & r_d.i0load) ? lsu_result_corr_r[31:0] : i0_result_r_raw[31:0];
    1417              : 
    1418              : 
    1419              :    rvdffe #(12) e1brpcff             (.*, .en(i0_x_data_en), .din(last_br_immed_d[12:1] ), .dout(last_br_immed_x[12:1]));
    1420              : 
    1421              : 
    1422              : 
    1423              :    assign i0_wb_en                   =  i0_wb_data_en;
    1424              : 
    1425              :    assign i0_inst_wb_in[31:0]        =  i0_inst_r[31:0];
    1426              :    assign i0_inst_d[31:0]            = (dec_i0_pc4_d)    ?  i0[31:0]                                  :  {16'b0, ifu_i0_cinst[15:0]};
    1427              : 
    1428              : 
    1429              :    assign trace_enable = ~dec_tlu_trace_disable;
    1430              : 
    1431              : 
    1432              :    rvdffe #(.WIDTH(5),.OVERRIDE(1))  i0rdff  (.*, .en(i0_div_decode_d),        .din(i0r.rd[4:0]),             .dout(div_waddr_wb[4:0]));
    1433              : 
    1434              :    rvdffe #(32) i0xinstff            (.*, .en(i0_x_data_en & trace_enable),    .din(i0_inst_d[31:0]),         .dout(i0_inst_x[31:0]));
    1435              :    rvdffe #(32) i0cinstff            (.*, .en(i0_r_data_en & trace_enable),    .din(i0_inst_x[31:0]),         .dout(i0_inst_r[31:0]));
    1436              : 
    1437              :    rvdffe #(32) i0wbinstff           (.*, .en(i0_wb_en & trace_enable),        .din(i0_inst_wb_in[31:0]),     .dout(i0_inst_wb[31:0]));
    1438              :    rvdffe #(31) i0wbpcff             (.*, .en(i0_wb_en & trace_enable),        .din(dec_tlu_i0_pc_r[31:1]),   .dout(  i0_pc_wb[31:1]));
    1439              : 
    1440              :    assign dec_i0_inst_wb[31:0] = i0_inst_wb[31:0];
    1441              :    assign dec_i0_pc_wb[31:1] = i0_pc_wb[31:1];
    1442              : 
    1443              : 
    1444              : 
    1445              :    rvdffpcie #(31) i0_pc_r_ff           (.*, .en(i0_r_data_en), .din(exu_i0_pc_x[31:1]), .dout(dec_i0_pc_r[31:1]));
    1446              : 
    1447              :    assign dec_tlu_i0_pc_r[31:1]      = dec_i0_pc_r[31:1];
    1448              : 
    1449              : 
    1450              :    rvbradder ibradder_correct (
    1451              :                      .pc(exu_i0_pc_x[31:1]),
    1452              :                      .offset(last_br_immed_x[12:1]),
    1453              :                      .dout(pred_correct_npc_x[31:1]));
    1454              : 
    1455              : 
    1456              : 
    1457              :    // add nonblock load rs1/rs2 bypass cases
    1458              : 
    1459              :    assign i0_rs1_nonblock_load_bypass_en_d  = dec_i0_rs1_en_d & dec_nonblock_load_wen & (dec_nonblock_load_waddr[4:0] == i0r.rs1[4:0]);
    1460              : 
    1461              :    assign i0_rs2_nonblock_load_bypass_en_d  = dec_i0_rs2_en_d & dec_nonblock_load_wen & (dec_nonblock_load_waddr[4:0] == i0r.rs2[4:0]);
    1462              : 
    1463              : 
    1464              : 
    1465              :    // bit 2 is priority match, bit 0 lowest priority, i0_x, i0_r
    1466              : 
    1467              :    assign i0_rs1bypass[2]                =  i0_rs1_depth_d[0] & (i0_rs1_class_d.alu | i0_rs1_class_d.mul                      );
    1468              :    assign i0_rs1bypass[1]                =  i0_rs1_depth_d[0] & (                                          i0_rs1_class_d.load);
    1469              :    assign i0_rs1bypass[0]                =  i0_rs1_depth_d[1] & (i0_rs1_class_d.alu | i0_rs1_class_d.mul | i0_rs1_class_d.load);
    1470              : 
    1471              :    assign i0_rs2bypass[2]                =  i0_rs2_depth_d[0] & (i0_rs2_class_d.alu | i0_rs2_class_d.mul                      );
    1472              :    assign i0_rs2bypass[1]                =  i0_rs2_depth_d[0] & (                                          i0_rs2_class_d.load);
    1473              :    assign i0_rs2bypass[0]                =  i0_rs2_depth_d[1] & (i0_rs2_class_d.alu | i0_rs2_class_d.mul | i0_rs2_class_d.load);
    1474              : 
    1475              : 
    1476              :    assign dec_i0_rs1_bypass_en_d[3]      =  i0_rs1_nonblock_load_bypass_en_d & ~i0_rs1bypass[0] & ~i0_rs1bypass[1] & ~i0_rs1bypass[2];
    1477              :    assign dec_i0_rs1_bypass_en_d[2]      =  i0_rs1bypass[2];
    1478              :    assign dec_i0_rs1_bypass_en_d[1]      =  i0_rs1bypass[1];
    1479              :    assign dec_i0_rs1_bypass_en_d[0]      =  i0_rs1bypass[0];
    1480              : 
    1481              :    assign dec_i0_rs2_bypass_en_d[3]      =  i0_rs2_nonblock_load_bypass_en_d & ~i0_rs2bypass[0] & ~i0_rs2bypass[1] & ~i0_rs2bypass[2];
    1482              :    assign dec_i0_rs2_bypass_en_d[2]      =  i0_rs2bypass[2];
    1483              :    assign dec_i0_rs2_bypass_en_d[1]      =  i0_rs2bypass[1];
    1484              :    assign dec_i0_rs2_bypass_en_d[0]      =  i0_rs2bypass[0];
    1485              : 
    1486              : 
    1487              :    assign dec_i0_result_r[31:0]          =  i0_result_r[31:0];
    1488              : 
    1489              : 
    1490              : endmodule // el2_dec_decode_ctl
    1491              : 
    1492              : // file "decode" is human readable file that has all of the instruction decodes
    1493              : // defined and is part of git repo. Modify this file as needed.
    1494              : //
    1495              : // The tools needed are "coredecode", "addasign" and "espresso". The first two
    1496              : // can be found in this repo under /tools. Espresso can be found in another
    1497              : // repo (https://github.com/chipsalliance/espresso).
    1498              : //  IMPORTANT: use Espresso v2.4 (git tag v2.4)
    1499              : //
    1500              : // To generate instruction decoding equations do:
    1501              : //  1) coredecode -in decode > coredecode.e
    1502              : //  2) espresso -Dso -oeqntott < coredecode.e | addassign -pre out. > equations
    1503              : //  3) copy-paste assignments from the file "equations" and replace ones below.
    1504              : //
    1505              : // To generate instruction legality check equation do:
    1506              : //  1) coredecode -in decode -legal > legal.e
    1507              : //  2) espresso -Dso -oeqntott < legal.e | addassign -pre out. > legal
    1508              : //  3) copy-paste assignment from the file "legal" and replace the one below.
    1509              : 
    1510              : module el2_dec_dec_ctl
    1511              :   import el2_pkg::*;
    1512              : (
    1513       468420 :     input logic [31:0] inst,
    1514         7440 :     output el2_dec_pkt_t out
    1515              : );
    1516              : 
    1517       468420 :   logic [31:0] i;
    1518              : 
    1519              :   assign i[31:0] = inst[31:0];
    1520              : 
    1521              :   assign out.alu = (i[30]&i[24]&i[23]&!i[22]&!i[21]&!i[20]&i[14]&!i[5]&i[4]) | (i[30]
    1522              :     &!i[27]&!i[24]&i[4]) | (!i[30]&!i[25]&i[13]&i[12]) | (!i[29]&!i[27]
    1523              :     &!i[5]&i[4]) | (i[27]&i[25]&i[14]&i[4]) | (!i[29]&!i[25]&!i[13]&!i[12]
    1524              :     &i[4]) | (i[29]&i[27]&!i[14]&i[12]&i[4]) | (!i[27]&i[14]&!i[5]&i[4]) | (
    1525              :     i[30]&!i[29]&!i[13]&i[4]) | (!i[27]&!i[25]&i[5]&i[4]) | (i[13]&!i[5]
    1526              :     &i[4]) | (i[6]) | (!i[30]&i[29]&!i[24]&!i[23]&i[22]&i[21]&i[20]&!i[5]
    1527              :     &i[4]) | (i[2]) | (!i[12]&!i[5]&i[4]);
    1528              : 
    1529              :   assign out.rs1 = (!i[13]&i[11]&!i[2]) | (!i[13]&i[10]&!i[2]) | (i[19]&i[13]&!i[2]) | (
    1530              :     !i[13]&i[9]&!i[2]) | (i[18]&i[13]&!i[2]) | (!i[13]&i[8]&!i[2]) | (
    1531              :     i[17]&i[13]&!i[2]) | (!i[13]&i[7]&!i[2]) | (i[16]&i[13]&!i[2]) | (
    1532              :     i[15]&i[13]&!i[2]) | (!i[4]&!i[2]) | (!i[14]&!i[13]&i[6]&!i[3]) | (
    1533              :     !i[6]&!i[2]);
    1534              : 
    1535              :   assign out.rs2 = (i[5] & !i[4] & !i[2]) | (!i[6] & i[5] & !i[2]);
    1536              : 
    1537              :   assign out.imm12 = (!i[4]&!i[3]&i[2]) | (i[13]&!i[5]&i[4]&!i[2]) | (!i[13]&!i[12]
    1538              :     &i[6]&i[4]) | (!i[12]&!i[5]&i[4]&!i[2]);
    1539              : 
    1540              :   assign out.rd = (!i[5] & !i[2]) | (i[5] & i[2]) | (i[4]);
    1541              : 
    1542              :   assign out.shimm5 = (!i[29]&!i[13]&i[12]&!i[5]&i[4]&!i[2]) | (i[27]&!i[13]&i[12]
    1543              :     &!i[5]&i[4]&!i[2]) | (i[14]&!i[13]&i[12]&!i[5]&i[4]&!i[2]);
    1544              : 
    1545              :   assign out.imm20 = (i[5] & i[3]) | (i[4] & i[2]);
    1546              : 
    1547              :   assign out.pc = (!i[5] & !i[3] & i[2]) | (i[5] & i[3]);
    1548              : 
    1549              :   assign out.load = (!i[5] & !i[4] & !i[2]);
    1550              : 
    1551              :   assign out.store = (!i[6] & i[5] & !i[4]);
    1552              : 
    1553              :   assign out.lsu = (!i[6] & !i[4] & !i[2]);
    1554              : 
    1555              :   assign out.add = (!i[14]&!i[13]&!i[12]&!i[5]&i[4]) | (!i[5]&!i[3]&i[2]) | (!i[30]
    1556              :     &!i[25]&!i[14]&!i[13]&!i[12]&!i[6]&i[4]&!i[2]);
    1557              : 
    1558              :   assign out.sub = (i[30]&!i[14]&!i[12]&!i[6]&i[5]&i[4]&!i[2]) | (!i[29]&!i[25]&!i[14]
    1559              :     &i[13]&!i[6]&i[4]&!i[2]) | (i[27]&i[25]&i[14]&!i[6]&i[5]&!i[2]) | (
    1560              :     !i[14]&i[13]&!i[5]&i[4]&!i[2]) | (i[6]&!i[4]&!i[2]);
    1561              : 
    1562              :   assign out.land = (!i[27]&!i[25]&i[14]&i[13]&i[12]&!i[6]&!i[2]) | (i[14]&i[13]&i[12]
    1563              :     &!i[5]&!i[2]);
    1564              : 
    1565              :   assign out.lor = (!i[29]&!i[27]&!i[25]&i[14]&i[13]&!i[12]&!i[6]&!i[2]) | (!i[6]&i[3]) | (
    1566              :     i[5]&i[4]&i[2]) | (!i[13]&!i[12]&i[6]&i[4]) | (i[14]&i[13]&!i[12]
    1567              :     &!i[5]&!i[2]);
    1568              : 
    1569              :   assign out.lxor = (!i[29]&!i[27]&!i[25]&i[14]&!i[13]&!i[12]&i[4]&!i[2]) | (i[14]
    1570              :     &!i[13]&!i[12]&!i[5]&i[4]&!i[2]);
    1571              : 
    1572              :   assign out.sll = (!i[29] & !i[27] & !i[25] & !i[14] & !i[13] & i[12] & !i[6] & i[4] & !i[2]);
    1573              : 
    1574              :   assign out.sra = (i[30] & !i[29] & !i[27] & !i[13] & i[12] & !i[6] & i[4] & !i[2]);
    1575              : 
    1576              :   assign out.srl = (!i[30] & !i[27] & !i[25] & i[14] & !i[13] & i[12] & !i[6] & i[4] & !i[2]);
    1577              : 
    1578              :   assign out.slt = (!i[29]&!i[25]&!i[14]&i[13]&!i[6]&i[4]&!i[2]) | (!i[14]&i[13]&!i[5]
    1579              :     &i[4]&!i[2]);
    1580              : 
    1581              :   assign out.unsign = (!i[14]&i[13]&i[12]&!i[5]&!i[2]) | (i[13]&i[6]&!i[4]&!i[2]) | (
    1582              :     i[14]&!i[5]&!i[4]) | (!i[25]&!i[14]&i[13]&i[12]&!i[6]&!i[2]) | (
    1583              :     i[25]&i[14]&i[12]&!i[6]&i[5]&!i[2]);
    1584              : 
    1585              :   assign out.condbr = (i[6] & !i[4] & !i[2]);
    1586              : 
    1587              :   assign out.beq = (!i[14] & !i[12] & i[6] & !i[4] & !i[2]);
    1588              : 
    1589              :   assign out.bne = (!i[14] & i[12] & i[6] & !i[4] & !i[2]);
    1590              : 
    1591              :   assign out.bge = (i[14] & i[12] & i[5] & !i[4] & !i[2]);
    1592              : 
    1593              :   assign out.blt = (i[14] & !i[12] & i[5] & !i[4] & !i[2]);
    1594              : 
    1595              :   assign out.jal = (i[6] & i[2]);
    1596              : 
    1597              :   assign out.by = (!i[13] & !i[12] & !i[6] & !i[4] & !i[2]);
    1598              : 
    1599              :   assign out.half = (i[12] & !i[6] & !i[4] & !i[2]);
    1600              : 
    1601              :   assign out.word = (i[13] & !i[6] & !i[4]);
    1602              : 
    1603              :   assign out.csr_read = (i[13]&i[6]&i[4]) | (i[7]&i[6]&i[4]) | (i[8]&i[6]&i[4]) | (
    1604              :     i[9]&i[6]&i[4]) | (i[10]&i[6]&i[4]) | (i[11]&i[6]&i[4]);
    1605              : 
    1606              :   assign out.csr_clr = (i[15]&i[13]&i[12]&i[6]&i[4]) | (i[16]&i[13]&i[12]&i[6]&i[4]) | (
    1607              :     i[17]&i[13]&i[12]&i[6]&i[4]) | (i[18]&i[13]&i[12]&i[6]&i[4]) | (
    1608              :     i[19]&i[13]&i[12]&i[6]&i[4]);
    1609              : 
    1610              :   assign out.csr_set = (i[15]&!i[12]&i[6]&i[4]) | (i[16]&!i[12]&i[6]&i[4]) | (i[17]
    1611              :     &!i[12]&i[6]&i[4]) | (i[18]&!i[12]&i[6]&i[4]) | (i[19]&!i[12]&i[6]
    1612              :     &i[4]);
    1613              : 
    1614              :   assign out.csr_write = (!i[13] & i[12] & i[6] & i[4]);
    1615              : 
    1616              :   assign out.csr_imm = (i[14]&!i[13]&i[6]&i[4]) | (i[15]&i[14]&i[6]&i[4]) | (i[16]
    1617              :     &i[14]&i[6]&i[4]) | (i[17]&i[14]&i[6]&i[4]) | (i[18]&i[14]&i[6]&i[4]) | (
    1618              :     i[19]&i[14]&i[6]&i[4]);
    1619              : 
    1620              :   assign out.presync = (!i[5]&i[3]) | (!i[13]&i[7]&i[6]&i[4]) | (!i[13]&i[8]&i[6]&i[4]) | (
    1621              :     !i[13]&i[9]&i[6]&i[4]) | (!i[13]&i[10]&i[6]&i[4]) | (!i[13]&i[11]
    1622              :     &i[6]&i[4]) | (i[15]&i[13]&i[6]&i[4]) | (i[16]&i[13]&i[6]&i[4]) | (
    1623              :     i[17]&i[13]&i[6]&i[4]) | (i[18]&i[13]&i[6]&i[4]) | (i[19]&i[13]&i[6]
    1624              :     &i[4]);
    1625              : 
    1626              :   assign out.postsync = (!i[22]&!i[13]&!i[12]&i[6]&i[4]) | (i[12]&!i[5]&i[3]) | (
    1627              :     !i[13]&i[7]&i[6]&i[4]) | (!i[13]&i[8]&i[6]&i[4]) | (!i[13]&i[9]&i[6]
    1628              :     &i[4]) | (!i[13]&i[10]&i[6]&i[4]) | (!i[13]&i[11]&i[6]&i[4]) | (
    1629              :     i[15]&i[13]&i[6]&i[4]) | (i[16]&i[13]&i[6]&i[4]) | (i[17]&i[13]&i[6]
    1630              :     &i[4]) | (i[18]&i[13]&i[6]&i[4]) | (i[19]&i[13]&i[6]&i[4]);
    1631              : 
    1632              :   assign out.ebreak = (!i[22] & i[20] & !i[13] & !i[12] & i[6] & i[4]);
    1633              : 
    1634              :   assign out.ecall = (!i[21] & !i[20] & !i[13] & !i[12] & i[6] & i[4]);
    1635              : 
    1636              :   assign out.mret = (i[29] & !i[13] & !i[12] & i[6] & i[4]);
    1637              : 
    1638              :   assign out.mul = (i[29]&!i[27]&i[24]&!i[14]&!i[13]&i[12]&!i[5]&i[4]&!i[2]) | (i[30]
    1639              :     &i[27]&i[13]&!i[6]&i[5]&i[4]&!i[2]) | (i[29]&i[27]&!i[23]&!i[20]
    1640              :     &i[14]&!i[13]&i[12]&!i[5]&i[4]&!i[2]) | (i[29]&i[27]&!i[21]&i[20]
    1641              :     &i[14]&!i[13]&i[12]&!i[5]&i[4]&!i[2]) | (i[29]&i[27]&i[24]&i[21]
    1642              :     &i[14]&!i[13]&i[12]&!i[5]&i[4]&!i[2]) | (i[29]&i[27]&!i[24]&!i[22]
    1643              :     &i[14]&!i[13]&i[12]&!i[5]&i[4]&!i[2]) | (!i[30]&i[29]&i[23]&i[14]
    1644              :     &!i[13]&i[12]&!i[5]&i[4]&!i[2]) | (i[30]&i[29]&i[27]&i[22]&i[14]
    1645              :     &!i[13]&i[12]&!i[5]&i[4]&!i[2]) | (i[27]&!i[25]&i[13]&!i[12]&!i[6]
    1646              :     &i[5]&i[4]&!i[2]) | (!i[30]&!i[29]&i[27]&!i[25]&!i[13]&i[12]&!i[6]
    1647              :     &i[4]&!i[2]) | (i[25]&!i[14]&!i[6]&i[5]&i[4]&!i[2]) | (i[29]&i[27]
    1648              :     &i[14]&!i[6]&i[5]&!i[2]);
    1649              : 
    1650              :   assign out.rs1_sign = (!i[27]&i[25]&!i[14]&i[13]&!i[12]&!i[6]&i[5]&i[4]&!i[2]) | (
    1651              :     !i[27]&i[25]&!i[14]&!i[13]&i[12]&!i[6]&i[4]&!i[2]);
    1652              : 
    1653              :   assign out.rs2_sign = (!i[27] & i[25] & !i[14] & !i[13] & i[12] & !i[6] & i[4] & !i[2]);
    1654              : 
    1655              :   assign out.low = (i[25] & !i[14] & !i[13] & !i[12] & i[5] & i[4] & !i[2]);
    1656              : 
    1657              :   assign out.div = (!i[27] & i[25] & i[14] & !i[6] & i[5] & !i[2]);
    1658              : 
    1659              :   assign out.rem = (!i[27] & i[25] & i[14] & i[13] & !i[6] & i[5] & !i[2]);
    1660              : 
    1661              :   assign out.fence = (!i[5] & i[3]);
    1662              : 
    1663              :   assign out.fence_i = (i[12] & !i[5] & i[3]);
    1664              : 
    1665              :   assign out.clz = (i[29]&!i[27]&!i[24]&!i[22]&!i[21]&!i[20]&!i[14]&!i[13]&i[12]&!i[5]
    1666              :     &i[4]&!i[2]);
    1667              : 
    1668              :   assign out.ctz = (i[29]&!i[27]&!i[24]&!i[22]&i[20]&!i[14]&!i[13]&i[12]&!i[5]&i[4]
    1669              :     &!i[2]);
    1670              : 
    1671              :   assign out.cpop = (i[29]&!i[27]&!i[24]&i[21]&!i[14]&!i[13]&i[12]&!i[5]&i[4]&!i[2]);
    1672              : 
    1673              :   assign out.sext_b = (i[29]&!i[27]&i[22]&!i[20]&!i[14]&!i[13]&i[12]&!i[5]&i[4]&!i[2]);
    1674              : 
    1675              :   assign out.sext_h = (i[29]&!i[27]&i[22]&i[20]&!i[14]&!i[13]&i[12]&!i[5]&i[4]&!i[2]);
    1676              : 
    1677              :   assign out.min = (i[27] & i[25] & i[14] & !i[13] & !i[6] & i[5] & !i[2]);
    1678              : 
    1679              :   assign out.max = (i[27] & i[25] & i[14] & i[13] & !i[6] & i[5] & !i[2]);
    1680              : 
    1681              :   assign out.pack = (!i[30] & !i[29] & i[27] & !i[25] & !i[13] & !i[12] & i[5] & i[4] & !i[2]);
    1682              : 
    1683              :   assign out.packu = (i[30] & i[27] & !i[13] & !i[12] & i[5] & i[4] & !i[2]);
    1684              : 
    1685              :   assign out.packh = (!i[30] & i[27] & !i[25] & i[13] & i[12] & !i[6] & i[5] & !i[2]);
    1686              : 
    1687              :   assign out.rol = (i[29] & !i[27] & !i[14] & i[12] & !i[6] & i[5] & i[4] & !i[2]);
    1688              : 
    1689              :   assign out.ror = (i[29] & !i[27] & i[14] & !i[13] & i[12] & !i[6] & i[4] & !i[2]);
    1690              : 
    1691              :   assign out.zbb = (!i[30]&!i[29]&i[27]&!i[24]&!i[23]&!i[22]&!i[21]&!i[20]&!i[13]
    1692              :     &!i[12]&i[5]&i[4]&!i[2]) | (i[29]&!i[27]&!i[24]&!i[13]&i[12]&!i[5]
    1693              :     &i[4]&!i[2]) | (i[29]&!i[27]&i[14]&!i[13]&i[12]&!i[5]&i[4]&!i[2]) | (
    1694              :     i[30]&!i[27]&i[14]&!i[12]&!i[6]&i[5]&!i[2]) | (i[30]&!i[27]&i[13]
    1695              :     &!i[6]&i[5]&i[4]&!i[2]) | (i[29]&!i[27]&i[12]&!i[6]&i[5]&i[4]&!i[2]) | (
    1696              :     !i[30]&i[29]&!i[24]&!i[23]&i[22]&i[21]&i[20]&i[14]&!i[13]&i[12]&!i[5]
    1697              :     &i[4]&!i[2]) | (i[30]&i[29]&i[24]&i[23]&!i[22]&!i[21]&!i[20]&i[14]
    1698              :     &!i[13]&i[12]&!i[5]&i[4]&!i[2]) | (i[27]&i[25]&i[14]&!i[6]&i[5]&!i[2]);
    1699              : 
    1700              :   assign out.bset = (!i[30] & i[29] & !i[14] & !i[13] & i[12] & !i[6] & i[4] & !i[2]);
    1701              : 
    1702              :   assign out.bclr = (i[30] & !i[29] & !i[14] & !i[13] & i[12] & !i[6] & i[4] & !i[2]);
    1703              : 
    1704              :   assign out.binv = (i[30] & i[29] & i[27] & !i[14] & !i[13] & i[12] & !i[6] & i[4] & !i[2]);
    1705              : 
    1706              :   assign out.bext = (i[30] & !i[29] & i[27] & i[14] & !i[13] & i[12] & !i[6] & i[4] & !i[2]);
    1707              : 
    1708              :   assign out.zbs = (i[29]&i[27]&!i[14]&!i[13]&i[12]&!i[6]&i[4]&!i[2]) | (i[30]&!i[29]
    1709              :     &i[27]&!i[13]&i[12]&!i[6]&i[4]&!i[2]);
    1710              : 
    1711              :   assign out.bcompress = (!i[30]&!i[29]&i[27]&!i[25]&i[13]&!i[12]&!i[6]&i[5]&i[4]&!i[2]);
    1712              : 
    1713              :   assign out.bdecompress = (i[30] & i[27] & i[13] & !i[12] & !i[6] & i[5] & i[4] & !i[2]);
    1714              : 
    1715              :   assign out.zbe = (i[30]&i[27]&i[14]&i[13]&!i[12]&!i[6]&i[5]&!i[2]) | (!i[30]&i[27]
    1716              :     &!i[25]&i[13]&i[12]&!i[6]&i[5]&!i[2]) | (!i[30]&!i[29]&i[27]&!i[25]
    1717              :     &!i[12]&!i[6]&i[5]&i[4]&!i[2]);
    1718              : 
    1719              :   assign out.clmul = (i[27] & i[25] & !i[14] & !i[13] & !i[6] & i[5] & i[4] & !i[2]);
    1720              : 
    1721              :   assign out.clmulh = (i[27] & !i[14] & i[13] & i[12] & !i[6] & i[5] & !i[2]);
    1722              : 
    1723              :   assign out.clmulr = (i[27] & i[25] & !i[14] & !i[12] & !i[6] & i[5] & i[4] & !i[2]);
    1724              : 
    1725              :   assign out.zbc = (i[27] & i[25] & !i[14] & !i[6] & i[5] & i[4] & !i[2]);
    1726              : 
    1727              :   assign out.grev = (i[30] & i[29] & i[27] & i[14] & !i[13] & i[12] & !i[6] & i[4] & !i[2]);
    1728              : 
    1729              :   assign out.gorc = (!i[30] & i[29] & i[14] & !i[13] & i[12] & !i[6] & i[4] & !i[2]);
    1730              : 
    1731              :   assign out.shfl = (!i[30]&!i[29]&i[27]&!i[25]&!i[14]&!i[13]&i[12]&!i[6]&i[4]&!i[2]);
    1732              : 
    1733              :   assign out.unshfl = (!i[30]&!i[29]&i[27]&!i[25]&i[14]&!i[13]&i[12]&!i[6]&i[4]&!i[2]);
    1734              : 
    1735              :   assign out.xperm_n = (i[29] & i[27] & !i[14] & !i[12] & !i[6] & i[5] & i[4] & !i[2]);
    1736              : 
    1737              :   assign out.xperm_b = (i[29] & i[27] & !i[13] & !i[12] & i[5] & i[4] & !i[2]);
    1738              : 
    1739              :   assign out.xperm_h = (i[29] & i[27] & i[14] & i[13] & !i[6] & i[5] & !i[2]);
    1740              : 
    1741              :   assign out.zbp = (i[30]&!i[27]&!i[14]&i[12]&!i[6]&i[5]&i[4]&!i[2]) | (!i[30]&i[27]
    1742              :     &!i[25]&i[13]&i[12]&!i[6]&i[5]&!i[2]) | (i[30]&!i[27]&i[13]&!i[6]
    1743              :     &i[5]&i[4]&!i[2]) | (i[27]&!i[25]&!i[13]&!i[12]&i[5]&i[4]&!i[2]) | (
    1744              :     i[30]&i[14]&!i[13]&!i[12]&i[5]&i[4]&!i[2]) | (i[29]&i[27]&!i[12]&!i[6]
    1745              :     &i[5]&i[4]&!i[2]) | (!i[30]&!i[29]&i[27]&!i[25]&!i[13]&i[12]&!i[6]
    1746              :     &i[4]&!i[2]) | (i[29]&i[14]&!i[13]&i[12]&!i[6]&i[4]&!i[2]);
    1747              : 
    1748              :   assign out.crc32_b = (i[29]&!i[27]&i[24]&!i[23]&!i[21]&!i[20]&!i[14]&!i[13]&i[12]
    1749              :     &!i[5]&i[4]&!i[2]);
    1750              : 
    1751              :   assign out.crc32_h = (i[29]&!i[27]&i[24]&!i[23]&i[20]&!i[14]&!i[13]&i[12]&!i[5]&i[4]
    1752              :     &!i[2]);
    1753              : 
    1754              :   assign out.crc32_w = (i[29]&!i[27]&i[24]&!i[23]&i[21]&!i[14]&!i[13]&i[12]&!i[5]&i[4]
    1755              :     &!i[2]);
    1756              : 
    1757              :   assign out.crc32c_b = (i[29]&!i[27]&i[23]&!i[21]&!i[20]&!i[14]&!i[13]&i[12]&!i[5]
    1758              :     &i[4]&!i[2]);
    1759              : 
    1760              :   assign out.crc32c_h = (i[29]&!i[27]&i[23]&i[20]&!i[14]&!i[13]&i[12]&!i[5]&i[4]&!i[2]);
    1761              : 
    1762              :   assign out.crc32c_w = (i[29]&!i[27]&i[23]&i[21]&!i[14]&!i[13]&i[12]&!i[5]&i[4]&!i[2]);
    1763              : 
    1764              :   assign out.zbr = (i[29] & !i[27] & i[24] & !i[14] & !i[13] & i[12] & !i[5] & i[4] & !i[2]);
    1765              : 
    1766              :   assign out.bfp = (i[30] & i[27] & i[13] & i[12] & !i[6] & i[5] & !i[2]);
    1767              : 
    1768              :   assign out.zbf = (!i[30]&!i[29]&i[27]&!i[25]&!i[13]&!i[12]&i[5]&i[4]&!i[2]) | (
    1769              :     i[27]&!i[25]&i[13]&i[12]&!i[6]&i[5]&!i[2]);
    1770              : 
    1771              :   assign out.sh1add = (i[29] & !i[27] & !i[14] & !i[12] & !i[6] & i[5] & i[4] & !i[2]);
    1772              : 
    1773              :   assign out.sh2add = (i[29] & !i[27] & i[14] & !i[13] & !i[12] & i[5] & i[4] & !i[2]);
    1774              : 
    1775              :   assign out.sh3add = (i[29] & !i[27] & i[14] & i[13] & !i[6] & i[5] & !i[2]);
    1776              : 
    1777              :   assign out.zba = (i[29] & !i[27] & !i[12] & !i[6] & i[5] & i[4] & !i[2]);
    1778              : 
    1779              :   assign out.pm_alu = (i[28]&i[20]&!i[13]&!i[12]&i[4]) | (!i[30]&!i[29]&!i[27]&!i[25]
    1780              :     &!i[6]&i[4]) | (!i[29]&!i[27]&!i[25]&!i[13]&i[12]&!i[6]&i[4]) | (
    1781              :     !i[29]&!i[27]&!i[25]&!i[14]&!i[6]&i[4]) | (i[13]&!i[5]&i[4]) | (i[4]
    1782              :     &i[2]) | (!i[12]&!i[5]&i[4]);
    1783              : 
    1784              : 
    1785              :   assign out.legal = (!i[31]&!i[30]&i[29]&i[28]&!i[27]&!i[26]&!i[25]&!i[24]&!i[23]
    1786              :     &!i[22]&i[21]&!i[20]&!i[19]&!i[18]&!i[17]&!i[16]&!i[15]&!i[14]&!i[11]
    1787              :     &!i[10]&!i[9]&!i[8]&!i[7]&i[6]&i[5]&i[4]&!i[3]&!i[2]&i[1]&i[0]) | (
    1788              :     !i[31]&!i[30]&!i[29]&i[28]&!i[27]&!i[26]&!i[25]&!i[24]&!i[23]&i[22]
    1789              :     &!i[21]&i[20]&!i[19]&!i[18]&!i[17]&!i[16]&!i[15]&!i[14]&!i[11]&!i[10]
    1790              :     &!i[9]&!i[8]&!i[7]&i[6]&i[5]&i[4]&!i[3]&!i[2]&i[1]&i[0]) | (!i[31]
    1791              :     &!i[30]&!i[29]&!i[28]&!i[27]&!i[26]&!i[25]&!i[24]&!i[23]&!i[22]&!i[21]
    1792              :     &!i[19]&!i[18]&!i[17]&!i[16]&!i[15]&!i[14]&!i[11]&!i[10]&!i[9]&!i[8]
    1793              :     &!i[7]&i[5]&i[4]&!i[3]&!i[2]&i[1]&i[0]) | (!i[31]&i[30]&i[29]&!i[28]
    1794              :     &!i[26]&!i[25]&i[24]&!i[22]&!i[20]&!i[6]&!i[5]&i[4]&!i[3]&i[1]&i[0]) | (
    1795              :     !i[31]&i[30]&i[29]&!i[28]&!i[26]&!i[25]&i[24]&!i[22]&!i[21]&!i[6]
    1796              :     &!i[5]&i[4]&!i[3]&i[1]&i[0]) | (!i[31]&i[30]&i[29]&!i[28]&!i[26]
    1797              :     &!i[25]&!i[23]&!i[22]&!i[20]&!i[6]&!i[5]&i[4]&!i[3]&i[1]&i[0]) | (
    1798              :     !i[31]&i[30]&i[29]&!i[28]&!i[26]&!i[25]&!i[24]&!i[23]&!i[21]&!i[6]
    1799              :     &!i[5]&i[4]&!i[3]&i[1]&i[0]) | (!i[31]&!i[30]&!i[29]&!i[28]&!i[26]
    1800              :     &i[25]&i[13]&!i[6]&i[4]&!i[3]&i[1]&i[0]) | (!i[31]&!i[28]&i[27]&!i[26]
    1801              :     &!i[25]&!i[24]&!i[6]&!i[5]&i[4]&!i[3]&i[1]&i[0]) | (!i[31]&!i[30]
    1802              :     &i[29]&!i[28]&!i[26]&!i[25]&i[13]&!i[12]&!i[6]&i[4]&!i[3]&i[1]&i[0]) | (
    1803              :     !i[31]&!i[29]&!i[28]&!i[27]&!i[26]&!i[25]&!i[13]&!i[12]&!i[6]&i[4]
    1804              :     &!i[3]&i[1]&i[0]) | (!i[31]&i[30]&!i[28]&!i[26]&!i[25]&i[14]&!i[6]
    1805              :     &!i[5]&i[4]&!i[3]&i[1]&i[0]) | (!i[31]&!i[30]&!i[29]&!i[28]&!i[26]
    1806              :     &!i[13]&i[12]&i[5]&i[4]&!i[3]&!i[2]&i[1]&i[0]) | (!i[31]&!i[30]&!i[29]
    1807              :     &!i[28]&!i[27]&!i[26]&!i[25]&!i[6]&i[4]&!i[3]&i[1]&i[0]) | (!i[31]
    1808              :     &i[30]&i[29]&!i[28]&!i[26]&!i[25]&!i[13]&i[12]&i[5]&i[4]&!i[3]&!i[2]
    1809              :     &i[1]&i[0]) | (!i[31]&i[30]&!i[28]&i[27]&!i[26]&!i[25]&!i[13]&i[12]
    1810              :     &!i[6]&i[4]&!i[3]&i[1]&i[0]) | (!i[31]&!i[29]&!i[28]&!i[26]&!i[25]
    1811              :     &i[14]&!i[6]&i[5]&i[4]&!i[3]&i[1]&i[0]) | (!i[31]&i[29]&!i[28]&i[27]
    1812              :     &!i[26]&!i[25]&!i[13]&i[12]&!i[6]&i[4]&!i[3]&i[1]&i[0]) | (!i[31]
    1813              :     &!i[30]&!i[29]&!i[28]&!i[27]&!i[26]&!i[6]&i[5]&i[4]&!i[3]&i[1]&i[0]) | (
    1814              :     !i[31]&!i[30]&!i[29]&!i[28]&!i[26]&i[14]&!i[6]&i[5]&i[4]&!i[3]&i[1]
    1815              :     &i[0]) | (!i[14]&!i[13]&!i[12]&i[6]&i[5]&!i[4]&!i[3]&i[1]&i[0]) | (
    1816              :     i[14]&i[6]&i[5]&!i[4]&!i[3]&!i[2]&i[1]&i[0]) | (!i[14]&!i[13]&i[5]
    1817              :     &!i[4]&!i[3]&!i[2]&i[1]&i[0]) | (!i[12]&!i[6]&!i[5]&i[4]&!i[3]&i[1]
    1818              :     &i[0]) | (!i[13]&i[12]&i[6]&i[5]&!i[3]&!i[2]&i[1]&i[0]) | (i[13]&i[6]
    1819              :     &i[5]&i[4]&!i[3]&!i[2]&i[1]&i[0]) | (!i[30]&!i[29]&!i[28]&!i[14]
    1820              :     &!i[13]&!i[6]&!i[5]&!i[4]&i[3]&i[2]&i[1]&i[0]) | (!i[31]&!i[30]&!i[28]
    1821              :     &!i[26]&!i[25]&i[14]&!i[12]&!i[6]&i[4]&!i[3]&i[1]&i[0]) | (!i[14]
    1822              :     &!i[13]&i[12]&!i[6]&!i[5]&!i[4]&i[3]&i[2]&i[1]&i[0]) | (i[6]&i[5]
    1823              :     &!i[4]&i[3]&i[2]&i[1]&i[0]) | (!i[14]&!i[12]&!i[6]&!i[4]&!i[3]&!i[2]
    1824              :     &i[1]&i[0]) | (!i[13]&!i[6]&!i[5]&!i[4]&!i[3]&!i[2]&i[1]&i[0]) | (
    1825              :     i[13]&!i[6]&!i[5]&i[4]&!i[3]&i[1]&i[0]) | (!i[6]&i[4]&!i[3]&i[2]&i[1]
    1826              :     &i[0]);
    1827              : 
    1828              : endmodule  // el2_dec_dec_ctl