// © IBM Corp. 2020
// Licensed under the Apache License, Version 2.0 (the "License"), as modified by
// the terms below; you may not use the files in this repository except in
// compliance with the License as modified.
// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
//
// Modified Terms:
//
//    1) For the purpose of the patent license granted to you in Section 3 of the
//    License, the "Work" hereby includes implementations of the work of authorship
//    in physical form.
//
//    2) Notwithstanding any terms to the contrary in the License, any licenses
//    necessary for implementation of the Work that are available from OpenPOWER
//    via the Power ISA End User License Agreement (EULA) are explicitly excluded
//    hereunder, and may be obtained from OpenPOWER under the terms and conditions
//    of the EULA.
//
// Unless required by applicable law or agreed to in writing, the reference design
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
// for the specific language governing permissions and limitations under the License.
//
// Additional rights, including the ability to physically implement a softcore that
// is compliant with the required sections of the Power ISA Specification, are
// available at no cost under the terms of the OpenPOWER Power ISA EULA, which can be
// obtained (along with the Power ISA) here: https://openpowerfoundation.org.

// VHDL 1076 Macro Expander C version 07/11/00
// job was run on Tue Apr 19 13:45:22 2011

//INCLUDES : FILE mmu_config.cfg
//********************************************************************
//* TITLE: Memory Management Unit Invalidate Control Logic
//*********************************************************************

`timescale 1 ns / 1 ns

`include "tri_a2o.vh"
`include "mmu_a2o.vh"
`define            MMQ_INVAL_TTYPE_WIDTH   6
`define            MMQ_INVAL_STATE_WIDTH   2
`define            INV_SEQ_WIDTH           6
`define            BUS_SNOOP_SEQ_WIDTH     2


module mmq_inval(

   inout                          vdd,
   inout                          gnd,
   (* pin_data ="PIN_FUNCTION=/G_CLK/" *)
   input [0:`NCLK_WIDTH-1]        nclk,

   input                          tc_ccflush_dc,
   input                          tc_scan_dis_dc_b,
   input                          tc_scan_diag_dc,
   input                          tc_lbist_en_dc,

   input                          lcb_d_mode_dc,
   input                          lcb_clkoff_dc_b,
   input                          lcb_act_dis_dc,
   input [0:4]                    lcb_mpw1_dc_b,
   input                          lcb_mpw2_dc_b,
   input [0:4]                    lcb_delay_lclkr_dc,

(* pin_data="PIN_FUNCTION=/SCAN_IN/" *)
   input                          ac_func_scan_in,
(* pin_data="PIN_FUNCTION=/SCAN_OUT/" *)
   output                         ac_func_scan_out,

   input                          pc_sg_2,
   input                          pc_func_sl_thold_2,
   input                          pc_func_slp_sl_thold_2,
   input                          pc_func_slp_nsl_thold_2,
   input                          pc_fce_2,
   input                          mmucr2_act_override,
   input                          xu_mm_ccr2_notlb,
   output [1:12]                  xu_mm_ccr2_notlb_b,

   output                         mm_iu_ierat_snoop_coming,
   output                         mm_iu_ierat_snoop_val,
   output [0:25]                  mm_iu_ierat_snoop_attr,
   output [52-`EPN_WIDTH:51]       mm_iu_ierat_snoop_vpn,
   input                          iu_mm_ierat_snoop_ack,

   output                         mm_xu_derat_snoop_coming,
   output                         mm_xu_derat_snoop_val,
   output [0:25]                  mm_xu_derat_snoop_attr,
   output [52-`EPN_WIDTH:51]       mm_xu_derat_snoop_vpn,
   input                          xu_mm_derat_snoop_ack,
   output                         tlb_snoop_coming,
   output                         tlb_snoop_val,
   output [0:34]                  tlb_snoop_attr,
   output [52-`EPN_WIDTH:51]       tlb_snoop_vpn,
   input                          tlb_snoop_ack,
   input                          an_ac_back_inv,
   input                          an_ac_back_inv_target,
   input                          an_ac_back_inv_local,
   input                          an_ac_back_inv_lbit,
   input                          an_ac_back_inv_gs,
   input                          an_ac_back_inv_ind,
   input [64-`REAL_ADDR_WIDTH:63]  an_ac_back_inv_addr,
   input [0:`LPID_WIDTH-1]         an_ac_back_inv_lpar_id,
   input                          ac_an_power_managed,
   output                         ac_an_back_inv_reject,

   input [0:`LPID_WIDTH-1]         lpidr,
   input                          mas5_0_sgs,
   input [0:7]                    mas5_0_slpid,
   input [0:13]                   mas6_0_spid,
   input [0:3]                    mas6_0_isize,
   input                          mas6_0_sind,
   input                          mas6_0_sas,
   input [2:19]                   mmucr0_0,
`ifdef MM_THREADS2
   input                          mas5_1_sgs,
   input [0:7]                    mas5_1_slpid,
   input [0:13]                   mas6_1_spid,
   input [0:3]                    mas6_1_isize,
   input                          mas6_1_sind,
   input                          mas6_1_sas,
   input [2:19]                   mmucr0_1,
`endif
   input [12:19]                  mmucr1,
   input [0:1]                    mmucr1_csinv,
   input                          mmucsr0_tlb0fi,
   output                         mmq_inval_tlb0fi_done,

   input [0:`MM_THREADS-1]        xu_mm_rf1_val,
   input                          xu_mm_rf1_is_tlbivax,
   input                          xu_mm_rf1_is_tlbilx,
   input                          xu_mm_rf1_is_erativax,
   input                          xu_mm_rf1_is_eratilx,
   input [0:`RS_IS_WIDTH-1]        xu_mm_ex1_rs_is,
   input                          xu_mm_ex1_is_isync,
   input                          xu_mm_ex1_is_csync,
   input [64-`RS_DATA_WIDTH:63]   xu_mm_ex2_eff_addr,
   input [0:`T_WIDTH-1]           xu_mm_rf1_t,
   input [0:`ITAG_SIZE_ENC-1]     xu_mm_rf1_itag,
   input [0:`MM_THREADS-1]        xu_mm_msr_gs,
   input [0:`MM_THREADS-1]        xu_mm_msr_pr,
   input [0:`MM_THREADS-1]        xu_mm_spr_epcr_dgtmi,
   output [0:`MM_THREADS-1]        xu_mm_epcr_dgtmi,
   input [0:`MM_THREADS-1]        xu_rf1_flush,
   input [0:`MM_THREADS-1]        xu_ex1_flush,
   input [0:`MM_THREADS-1]        xu_ex2_flush,
   input [0:`MM_THREADS-1]        xu_ex3_flush,
   input [0:`MM_THREADS-1]        xu_ex4_flush,
   input [0:`MM_THREADS-1]        xu_ex5_flush,
   input                          xu_mm_lmq_stq_empty,
   input                          iu_mm_lmq_empty,
   input [0:`MM_THREADS-1]        tlb_ctl_barrier_done,
   input [0:`MM_THREADS-1]        tlb_ctl_ex2_flush_req,
   input [0:`MM_THREADS-1]        tlb_ctl_ex2_illeg_instr,
   input [0:`MM_THREADS-1]        tlb_ctl_ex6_illeg_instr,
   input [0:`ITAG_SIZE_ENC-1]     tlb_ctl_ex2_itag,
   input [0:2]                    tlb_ctl_ord_type,
   input [0:`ITAG_SIZE_ENC-1]     tlb_tag4_itag,
   input [0:`MM_THREADS-1]        tlb_tag5_except,
   input [0:`MM_THREADS-1]        tlb_ctl_quiesce,
   input [0:`MM_THREADS-1]        tlb_req_quiesce,
   output [0:`MM_THREADS-1]        mm_xu_quiesce,
   output [0:`MM_THREADS-1]        mm_pc_tlb_req_quiesce,
   output [0:`MM_THREADS-1]        mm_pc_tlb_ctl_quiesce,
   output [0:`MM_THREADS-1]        mm_pc_htw_quiesce,
   output [0:`MM_THREADS-1]        mm_pc_inval_quiesce,

   output [0:`MM_THREADS-1]        mm_xu_ex3_flush_req,
   output [0:`MM_THREADS-1]        mm_xu_illeg_instr,
   output [0:`MM_THREADS-1]        mm_xu_local_snoop_reject,

   input [0:`MM_THREADS-1]         iu_mm_hold_ack,
   output [0:`MM_THREADS-1]        mm_iu_hold_req,
   output [0:`MM_THREADS-1]        mm_iu_hold_done,
   output [0:`MM_THREADS-1]        mm_iu_flush_req,
   input [0:`MM_THREADS-1]         iu_mm_bus_snoop_hold_ack,
   output [0:`MM_THREADS-1]        mm_iu_bus_snoop_hold_req,
   output [0:`MM_THREADS-1]        mm_iu_bus_snoop_hold_done,
   output [0:`MM_THREADS-1]        mm_iu_tlbi_complete,

   output [0:`MM_THREADS-1]        mm_xu_ord_n_flush_req,
   output [0:`MM_THREADS-1]        mm_xu_ord_np1_flush_req,
   output [0:`MM_THREADS-1]        mm_xu_ord_read_done,
   output [0:`MM_THREADS-1]        mm_xu_ord_write_done,
   output [0:`ITAG_SIZE_ENC-1]     mm_xu_itag,
   output                         mm_xu_ord_n_flush_req_ored,
   output                         mm_xu_ord_np1_flush_req_ored,
   output                         mm_xu_ord_read_done_ored,
   output                         mm_xu_ord_write_done_ored,
   output                         mm_xu_illeg_instr_ored,
   output                         mm_pc_local_snoop_reject_ored,

   output                         inval_perf_tlbilx,
   output                         inval_perf_tlbivax,
   output                         inval_perf_tlbivax_snoop,
   output                         inval_perf_tlb_flush,

   input                          htw_lsu_req_valid,
   input [0:`MM_THREADS-1]        htw_lsu_thdid,
   input [0:1]                    htw_lsu_ttype,
   input [0:4]                    htw_lsu_wimge,
   input [0:3]                    htw_lsu_u,
   input [64-`REAL_ADDR_WIDTH:63]  htw_lsu_addr,
   output                         htw_lsu_req_taken,
   input [0:`MM_THREADS-1]        htw_quiesce,
   input                          tlbwe_back_inv_valid,
   input [0:`MM_THREADS-1]        tlbwe_back_inv_thdid,
   input [52-`EPN_WIDTH:51]        tlbwe_back_inv_addr,
   input [0:34]                   tlbwe_back_inv_attr,
   input                          tlb_tag5_write,
   output                         tlbwe_back_inv_pending,

   output [0:`MM_THREADS-1]                   mm_xu_lsu_req,
   output [0:1]                   mm_xu_lsu_ttype,
   output [0:4]                   mm_xu_lsu_wimge,
   output [0:3]                   mm_xu_lsu_u,
   output [64-`REAL_ADDR_WIDTH:63] mm_xu_lsu_addr,
   output [0:7]                   mm_xu_lsu_lpid,
   output                         mm_xu_lsu_gs,
   output                         mm_xu_lsu_ind,
   output                         mm_xu_lsu_lbit,
   input                          xu_mm_lsu_token,

   output [0:4]                   inval_dbg_seq_q,
   output                         inval_dbg_seq_idle,
   output                         inval_dbg_seq_snoop_inprogress,
   output                         inval_dbg_seq_snoop_done,
   output                         inval_dbg_seq_local_done,
   output                         inval_dbg_seq_tlb0fi_done,
   output                         inval_dbg_seq_tlbwe_snoop_done,
   output                         inval_dbg_ex6_valid,
   output [0:1]                   inval_dbg_ex6_thdid,   // encoded
   output [0:2]                   inval_dbg_ex6_ttype,   // encoded
   output                         inval_dbg_snoop_forme,
   output                         inval_dbg_snoop_local_reject,
   output [2:8]                   inval_dbg_an_ac_back_inv_q,
   output [0:7]                   inval_dbg_an_ac_back_inv_lpar_id_q,
   output [22:63]                 inval_dbg_an_ac_back_inv_addr_q,
   output [0:2]                   inval_dbg_snoop_valid_q,
   output [0:2]                   inval_dbg_snoop_ack_q,
   output [0:34]                  inval_dbg_snoop_attr_q,
   output [18:19]                 inval_dbg_snoop_attr_tlb_spec_q,
   output [17:51]                 inval_dbg_snoop_vpn_q,
   output [0:1]                   inval_dbg_lsu_tokens_q

);


      // chicken switches
      //  0 - override lsu empty requirement for sending tlbivax
      //  1 - override lsu empty requirement for processing incoming tlbivax snoop
      //  2 - override wait for tlbwe back_inv erat snoop complete before issuing barrier_done, ord_read_done
      //  3 - override i-fetch miss queue empty requirement for processing incoming tlbivax snoop
      parameter                      MMQ_INVAL_CSWITCH_0TO3 = 0;

      parameter                      MMU_Mode_Value = 1'b0;
      parameter                      ERAT_Mode_Value = 1'b1;
      parameter [0:1]                TlbSel_Tlb = 2'b00;
      parameter [0:1]                TlbSel_IErat = 2'b10;
      parameter [0:1]                TlbSel_DErat = 2'b11;
      parameter [0:3]                TLB_PgSize_1GB = 4'b1010;
      parameter [0:3]                TLB_PgSize_16MB = 4'b0111;
      parameter [0:3]                TLB_PgSize_1MB = 4'b0101;
      parameter [0:3]                TLB_PgSize_64KB = 4'b0011;
      parameter [0:3]                TLB_PgSize_4KB = 4'b0001;
      parameter [0:3]                TLB_PgSize_256MB = 4'b1001;
      parameter [0:5]                InvSeq_Idle = 6'b000000;
      parameter [0:5]                InvSeq_Stg1 = 6'b000001;
      parameter [0:5]                InvSeq_Stg2 = 6'b000011;
      parameter [0:5]                InvSeq_Stg3 = 6'b000010;
      parameter [0:5]                InvSeq_Stg4 = 6'b000110;
      parameter [0:5]                InvSeq_Stg5 = 6'b000100;
      parameter [0:5]                InvSeq_Stg6 = 6'b000101;
      parameter [0:5]                InvSeq_Stg7 = 6'b000111;
      parameter [0:5]                InvSeq_Stg8 = 6'b001000;
      parameter [0:5]                InvSeq_Stg9 = 6'b001001;
      parameter [0:5]                InvSeq_Stg10 = 6'b001011;
      parameter [0:5]                InvSeq_Stg11 = 6'b001010;
      parameter [0:5]                InvSeq_Stg12 = 6'b001110;
      parameter [0:5]                InvSeq_Stg13 = 6'b001100;
      parameter [0:5]                InvSeq_Stg14 = 6'b001101;
      parameter [0:5]                InvSeq_Stg15 = 6'b001111;
      parameter [0:5]                InvSeq_Stg16 = 6'b010000;
      parameter [0:5]                InvSeq_Stg17 = 6'b010001;
      parameter [0:5]                InvSeq_Stg18 = 6'b010011;
      parameter [0:5]                InvSeq_Stg19 = 6'b010010;
      parameter [0:5]                InvSeq_Stg20 = 6'b010110;
      parameter [0:5]                InvSeq_Stg21 = 6'b010100;
      parameter [0:5]                InvSeq_Stg22 = 6'b010101;
      parameter [0:5]                InvSeq_Stg23 = 6'b010111;
      parameter [0:5]                InvSeq_Stg24 = 6'b011000;
      parameter [0:5]                InvSeq_Stg25 = 6'b011001;
      parameter [0:5]                InvSeq_Stg26 = 6'b011011;
      parameter [0:5]                InvSeq_Stg27 = 6'b011010;
      parameter [0:5]                InvSeq_Stg28 = 6'b011110;
      parameter [0:5]                InvSeq_Stg29 = 6'b011100;
      parameter [0:5]                InvSeq_Stg30 = 6'b011101;
      parameter [0:5]                InvSeq_Stg31 = 6'b011111;
      parameter [0:5]                InvSeq_Stg32 = 6'b100000;
      parameter [0:1]                SnoopSeq_Idle = 2'b00;
      parameter [0:1]                SnoopSeq_Stg1 = 2'b01;
      parameter [0:1]                SnoopSeq_Stg2 = 2'b10;
      parameter [0:1]                SnoopSeq_Stg3 = 2'b11;

      // mmucr1 bits:  12:13-ICTID/ITTID,14:15-DCTID/DTTID,16:17-resv, TLBI_MSB/TLBI_REJ
      parameter                      pos_ictid = 12;
      parameter                      pos_ittid = 13;
      parameter                      pos_dctid = 14;
      parameter                      pos_dttid = 15;
      parameter                      pos_tlbi_msb = 18;
      parameter                      pos_tlbi_rej = 19;
      parameter                      ex1_valid_offset = 0;
      parameter                      ex1_ttype_offset = ex1_valid_offset + `MM_THREADS;
      parameter                      ex1_state_offset = ex1_ttype_offset + `MMQ_INVAL_TTYPE_WIDTH - 2;
      parameter                      ex1_t_offset = ex1_state_offset + `MMQ_INVAL_STATE_WIDTH;
      parameter                      ex2_valid_offset = ex1_t_offset + `T_WIDTH;
      parameter                      ex2_ttype_offset = ex2_valid_offset + `MM_THREADS;
      parameter                      ex2_rs_is_offset = ex2_ttype_offset + `MMQ_INVAL_TTYPE_WIDTH;
      parameter                      ex2_state_offset = ex2_rs_is_offset + `RS_IS_WIDTH;
      parameter                      ex2_t_offset = ex2_state_offset + `MMQ_INVAL_STATE_WIDTH;
      parameter                      ex3_valid_offset = ex2_t_offset + `T_WIDTH;
      parameter                      ex3_ttype_offset = ex3_valid_offset + `MM_THREADS;
      parameter                      ex3_rs_is_offset = ex3_ttype_offset + `MMQ_INVAL_TTYPE_WIDTH;
      parameter                      ex3_state_offset = ex3_rs_is_offset + `RS_IS_WIDTH;
      parameter                      ex3_t_offset = ex3_state_offset + `MMQ_INVAL_STATE_WIDTH;
      parameter                      ex3_flush_req_offset = ex3_t_offset + `T_WIDTH;
      parameter                      ex3_ea_offset = ex3_flush_req_offset + `MM_THREADS;
      parameter                      ex4_valid_offset = ex3_ea_offset + `EPN_WIDTH + 12;
      parameter                      ex4_ttype_offset = ex4_valid_offset + `MM_THREADS;
      parameter                      ex4_rs_is_offset = ex4_ttype_offset + `MMQ_INVAL_TTYPE_WIDTH;
      parameter                      ex4_state_offset = ex4_rs_is_offset + `RS_IS_WIDTH;
      parameter                      ex4_t_offset = ex4_state_offset + `MMQ_INVAL_STATE_WIDTH;
      parameter                      ex5_valid_offset = ex4_t_offset + `T_WIDTH;
      parameter                      ex5_ttype_offset = ex5_valid_offset + `MM_THREADS;
      parameter                      ex5_rs_is_offset = ex5_ttype_offset + `MMQ_INVAL_TTYPE_WIDTH;
      parameter                      ex5_state_offset = ex5_rs_is_offset + `RS_IS_WIDTH;
      parameter                      ex5_t_offset = ex5_state_offset + `MMQ_INVAL_STATE_WIDTH;
      parameter                      ex6_valid_offset = ex5_t_offset + `T_WIDTH;
      parameter                      ex6_ttype_offset = ex6_valid_offset + `MM_THREADS;
      parameter                      ex6_isel_offset = ex6_ttype_offset + `MMQ_INVAL_TTYPE_WIDTH;
      parameter                      ex6_size_offset = ex6_isel_offset + 3;
      parameter                      ex6_gs_offset = ex6_size_offset + 4;
      parameter                      ex6_ts_offset = ex6_gs_offset + 1;
      parameter                      ex6_ind_offset = ex6_ts_offset + 1;
      parameter                      ex6_pid_offset = ex6_ind_offset + 1;
      parameter                      ex6_lpid_offset = ex6_pid_offset + `PID_WIDTH;
      parameter                      ex1_itag_offset = ex6_lpid_offset + `LPID_WIDTH;
      parameter                      ex2_itag_offset = ex1_itag_offset + `ITAG_SIZE_ENC;
      parameter                      ex3_itag_offset = ex2_itag_offset + `ITAG_SIZE_ENC;
      parameter                      ex4_itag_offset = ex3_itag_offset + `ITAG_SIZE_ENC;
      parameter                      ex5_itag_offset = ex4_itag_offset + `ITAG_SIZE_ENC;
      parameter                      ex6_itag_offset = ex5_itag_offset + `ITAG_SIZE_ENC;
      parameter                      mm_xu_itag_offset = ex6_itag_offset + `ITAG_SIZE_ENC;
      parameter                      ord_read_done_offset = mm_xu_itag_offset + `ITAG_SIZE_ENC;
      parameter                      ord_write_done_offset = ord_read_done_offset + `MM_THREADS;
      parameter                      ord_np1_flush_offset = ord_write_done_offset + `MM_THREADS;
      parameter                      inv_seq_offset = ord_np1_flush_offset + `MM_THREADS;
      parameter                      hold_req_offset = inv_seq_offset + `INV_SEQ_WIDTH;
      parameter                      hold_ack_offset = hold_req_offset + `MM_THREADS;
      parameter                      hold_done_offset = hold_ack_offset + `MM_THREADS;
      parameter                      local_barrier_offset = hold_done_offset + `MM_THREADS;
      parameter                      global_barrier_offset = local_barrier_offset + `MM_THREADS;
      parameter                      ex3_illeg_instr_offset = global_barrier_offset + `MM_THREADS;
      parameter                      ex4_illeg_instr_offset = ex3_illeg_instr_offset + `MM_THREADS;
      parameter                      ex5_illeg_instr_offset = ex4_illeg_instr_offset + `MM_THREADS;
      parameter                      ex6_illeg_instr_offset = ex5_illeg_instr_offset + `MM_THREADS;
      parameter                      ex7_illeg_instr_offset = ex6_illeg_instr_offset + `MM_THREADS;
      parameter                      ex3_ivax_lpid_reject_offset = ex7_illeg_instr_offset + `MM_THREADS;
      parameter                      ex4_ivax_lpid_reject_offset = ex3_ivax_lpid_reject_offset + `MM_THREADS;
      parameter                      bus_snoop_seq_offset = ex4_ivax_lpid_reject_offset + `MM_THREADS;
      parameter                      bus_snoop_hold_req_offset = bus_snoop_seq_offset + `BUS_SNOOP_SEQ_WIDTH;
      parameter                      bus_snoop_hold_ack_offset = bus_snoop_hold_req_offset + `MM_THREADS;
      parameter                      bus_snoop_hold_done_offset = bus_snoop_hold_ack_offset + `MM_THREADS;
      parameter                      tlbi_complete_offset = bus_snoop_hold_done_offset + `MM_THREADS;
      parameter                      iu_flush_req_offset = tlbi_complete_offset + `MM_THREADS;
      parameter                      local_snoop_reject_offset = iu_flush_req_offset + `MM_THREADS;
      parameter                      snoop_valid_offset = local_snoop_reject_offset + `MM_THREADS;
      parameter                      snoop_attr_offset = snoop_valid_offset + 3;
      parameter                      snoop_vpn_offset = snoop_attr_offset + 35;
      parameter                      snoop_attr_clone_offset = snoop_vpn_offset + `EPN_WIDTH;
      parameter                      snoop_attr_tlb_spec_offset = snoop_attr_clone_offset + 26;
      parameter                      snoop_vpn_clone_offset = snoop_attr_tlb_spec_offset + 2;
      parameter                      snoop_ack_offset = snoop_vpn_clone_offset + `EPN_WIDTH;
      parameter                      snoop_coming_offset = snoop_ack_offset + 3;
      parameter                      mm_xu_quiesce_offset = snoop_coming_offset + 5;
      parameter                      mm_pc_quiesce_offset = mm_xu_quiesce_offset + `MM_THREADS;
      parameter                      inv_seq_inprogress_offset = mm_pc_quiesce_offset + 4*`MM_THREADS;
      parameter                      xu_mm_ccr2_notlb_offset = inv_seq_inprogress_offset + 6;
      parameter                      spare_offset = xu_mm_ccr2_notlb_offset + 13;
      parameter                      an_ac_back_inv_offset = spare_offset + 16;
      parameter                      an_ac_back_inv_addr_offset = an_ac_back_inv_offset + 9;
      parameter                      an_ac_back_inv_lpar_id_offset = an_ac_back_inv_addr_offset + `REAL_ADDR_WIDTH;
      parameter                      lsu_tokens_offset = an_ac_back_inv_lpar_id_offset + `LPID_WIDTH;
      parameter                      lsu_req_offset = lsu_tokens_offset + 2;
      parameter                      lsu_ttype_offset = lsu_req_offset + `MM_THREADS;
      parameter                      lsu_ubits_offset = lsu_ttype_offset + 2;
      parameter                      lsu_wimge_offset = lsu_ubits_offset + 4;
      parameter                      lsu_addr_offset = lsu_wimge_offset + 5;
      parameter                      lsu_lpid_offset = lsu_addr_offset + `REAL_ADDR_WIDTH;
      parameter                      lsu_ind_offset = lsu_lpid_offset + `LPID_WIDTH;
      parameter                      lsu_gs_offset = lsu_ind_offset + 1;
      parameter                      lsu_lbit_offset = lsu_gs_offset + 1;
      parameter                      power_managed_offset = lsu_lbit_offset + 1;
      parameter                      cswitch_offset = power_managed_offset + 4;
      parameter                      tlbwe_back_inv_offset = cswitch_offset + 4;
      parameter                      tlbwe_back_inv_addr_offset = tlbwe_back_inv_offset + `MM_THREADS + 2;
      parameter                      tlbwe_back_inv_attr_offset = tlbwe_back_inv_addr_offset + `EPN_WIDTH;
      parameter                      scan_right = tlbwe_back_inv_attr_offset + 35 - 1;

`ifdef MM_THREADS2
      parameter                      BUGSP_MM_THREADS = 2;
`else
      parameter                      BUGSP_MM_THREADS = 1;
`endif

      wire [0:`MM_THREADS-1]          ex1_valid_d;
      wire [0:`MM_THREADS-1]          ex1_valid_q;
      wire [0:`MMQ_INVAL_TTYPE_WIDTH-3]         ex1_ttype_d;
      wire [0:`MMQ_INVAL_TTYPE_WIDTH-3]         ex1_ttype_q;
      wire [0:`MMQ_INVAL_STATE_WIDTH-1]         ex1_state_d;
      wire [0:`MMQ_INVAL_STATE_WIDTH-1]         ex1_state_q;
      wire [0:`T_WIDTH-1]             ex1_t_d;
      wire [0:`T_WIDTH-1]             ex1_t_q;
      wire [0:`MM_THREADS-1]          ex2_valid_d;
      wire [0:`MM_THREADS-1]          ex2_valid_q;
      wire [0:`MMQ_INVAL_TTYPE_WIDTH-1]         ex2_ttype_d;
      wire [0:`MMQ_INVAL_TTYPE_WIDTH-1]         ex2_ttype_q;
      wire [0:`RS_IS_WIDTH-1]         ex2_rs_is_d;
      wire [0:`RS_IS_WIDTH-1]         ex2_rs_is_q;
      wire [0:`MMQ_INVAL_STATE_WIDTH-1]         ex2_state_d;
      wire [0:`MMQ_INVAL_STATE_WIDTH-1]         ex2_state_q;
      wire [0:`T_WIDTH-1]             ex2_t_d;
      wire [0:`T_WIDTH-1]             ex2_t_q;
      wire [64-`RS_DATA_WIDTH:63]     ex3_ea_d;
      wire [64-`RS_DATA_WIDTH:63]     ex3_ea_q;
      wire [0:`MM_THREADS-1]          ex3_valid_d;
      wire [0:`MM_THREADS-1]          ex3_valid_q;
      wire [0:`MMQ_INVAL_TTYPE_WIDTH-1]         ex3_ttype_d;
      wire [0:`MMQ_INVAL_TTYPE_WIDTH-1]         ex3_ttype_q;
      wire [0:`RS_IS_WIDTH-1]         ex3_rs_is_d;
      wire [0:`RS_IS_WIDTH-1]         ex3_rs_is_q;
      wire [0:`MMQ_INVAL_STATE_WIDTH-1]         ex3_state_d;
      wire [0:`MMQ_INVAL_STATE_WIDTH-1]         ex3_state_q;
      wire [0:`T_WIDTH-1]             ex3_t_d;
      wire [0:`T_WIDTH-1]             ex3_t_q;
      wire [0:`MM_THREADS-1]          ex3_flush_req_d;
      wire [0:`MM_THREADS-1]          ex3_flush_req_q;
      wire [0:`MM_THREADS-1]          ex4_valid_d;
      wire [0:`MM_THREADS-1]          ex4_valid_q;
      wire [0:`MMQ_INVAL_TTYPE_WIDTH-1]         ex4_ttype_d;
      wire [0:`MMQ_INVAL_TTYPE_WIDTH-1]         ex4_ttype_q;
      wire [0:`RS_IS_WIDTH-1]         ex4_rs_is_d;
      wire [0:`RS_IS_WIDTH-1]         ex4_rs_is_q;
      wire [0:`MMQ_INVAL_STATE_WIDTH-1]         ex4_state_d;
      wire [0:`MMQ_INVAL_STATE_WIDTH-1]         ex4_state_q;
      wire [0:`T_WIDTH-1]             ex4_t_d;
      wire [0:`T_WIDTH-1]             ex4_t_q;
      wire [0:`MM_THREADS-1]          ex5_valid_d;
      wire [0:`MM_THREADS-1]          ex5_valid_q;
      wire [0:`MMQ_INVAL_TTYPE_WIDTH-1]         ex5_ttype_d;
      wire [0:`MMQ_INVAL_TTYPE_WIDTH-1]         ex5_ttype_q;
      wire [0:`RS_IS_WIDTH-1]         ex5_rs_is_d;
      wire [0:`RS_IS_WIDTH-1]         ex5_rs_is_q;
      wire [0:`MMQ_INVAL_STATE_WIDTH-1]         ex5_state_d;
      wire [0:`MMQ_INVAL_STATE_WIDTH-1]         ex5_state_q;
      wire [0:`T_WIDTH-1]             ex5_t_d;
      wire [0:`T_WIDTH-1]             ex5_t_q;
      wire [0:`MM_THREADS-1]          ex6_valid_d;
      wire [0:`MM_THREADS-1]          ex6_valid_q;
      wire [0:`MMQ_INVAL_TTYPE_WIDTH-1]         ex6_ttype_d;
      wire [0:`MMQ_INVAL_TTYPE_WIDTH-1]         ex6_ttype_q;
      wire [0:2]                      ex6_isel_d;
      wire [0:2]                      ex6_isel_q;
      wire [0:3]                      ex6_size_d;
      wire [0:3]                      ex6_size_q;
      wire                            ex6_gs_d;
      wire                            ex6_gs_q;
      wire                            ex6_ts_d;
      wire                            ex6_ts_q;
      wire                            ex6_ind_d;
      wire                            ex6_ind_q;
      wire [0:`PID_WIDTH-1]           ex6_pid_d;
      wire [0:`PID_WIDTH-1]           ex6_pid_q;
      wire [0:`LPID_WIDTH-1]          ex6_lpid_d;
      wire [0:`LPID_WIDTH-1]          ex6_lpid_q;
      wire [0:`ITAG_SIZE_ENC-1]       ex1_itag_d;
      wire [0:`ITAG_SIZE_ENC-1]       ex1_itag_q;
      wire [0:`ITAG_SIZE_ENC-1]       ex2_itag_d;
      wire [0:`ITAG_SIZE_ENC-1]       ex2_itag_q;
      wire [0:`ITAG_SIZE_ENC-1]       ex3_itag_d;
      wire [0:`ITAG_SIZE_ENC-1]       ex3_itag_q;
      wire [0:`ITAG_SIZE_ENC-1]       ex4_itag_d;
      wire [0:`ITAG_SIZE_ENC-1]       ex4_itag_q;
      wire [0:`ITAG_SIZE_ENC-1]       ex5_itag_d;
      wire [0:`ITAG_SIZE_ENC-1]       ex5_itag_q;
      wire [0:`ITAG_SIZE_ENC-1]       ex6_itag_d;
      wire [0:`ITAG_SIZE_ENC-1]       ex6_itag_q;
      wire [0:`ITAG_SIZE_ENC-1]       mm_xu_itag_d;
      wire [0:`ITAG_SIZE_ENC-1]       mm_xu_itag_q;
      wire [0:`MM_THREADS-1]          ord_read_done_d;
      wire [0:`MM_THREADS-1]          ord_read_done_q;
      wire [0:`MM_THREADS-1]          ord_write_done_d;
      wire [0:`MM_THREADS-1]          ord_write_done_q;
      wire [0:`MM_THREADS-1]          ord_np1_flush_d;
      wire [0:`MM_THREADS-1]          ord_np1_flush_q;
      reg [0:`INV_SEQ_WIDTH-1]       inv_seq_d;
      wire [0:`INV_SEQ_WIDTH-1]       inv_seq_q;
      wire [0:`MM_THREADS-1]          hold_req_d;
      wire [0:`MM_THREADS-1]          hold_req_q;
      wire [0:`MM_THREADS-1]          hold_ack_d;
      wire [0:`MM_THREADS-1]          hold_ack_q;
      wire [0:`MM_THREADS-1]          hold_done_d;
      wire [0:`MM_THREADS-1]          hold_done_q;
      wire [0:`MM_THREADS-1]          local_barrier_d;
      wire [0:`MM_THREADS-1]          local_barrier_q;
      wire [0:`MM_THREADS-1]          global_barrier_d;
      wire [0:`MM_THREADS-1]          global_barrier_q;
      wire [0:`MM_THREADS-1]          ex3_illeg_instr_d;
      wire [0:`MM_THREADS-1]          ex3_illeg_instr_q;
      wire [0:`MM_THREADS-1]          ex3_ivax_lpid_reject_d, ex3_ivax_lpid_reject_q;
      wire [0:`MM_THREADS-1]          ex4_ivax_lpid_reject_d, ex4_ivax_lpid_reject_q;
      reg  [0:`BUS_SNOOP_SEQ_WIDTH-1]          bus_snoop_seq_d;
      wire [0:`BUS_SNOOP_SEQ_WIDTH-1]          bus_snoop_seq_q;
      wire [0:`MM_THREADS-1]          bus_snoop_hold_req_d;
      wire [0:`MM_THREADS-1]          bus_snoop_hold_req_q;
      wire [0:`MM_THREADS-1]          bus_snoop_hold_ack_d;
      wire [0:`MM_THREADS-1]          bus_snoop_hold_ack_q;
      wire [0:`MM_THREADS-1]          bus_snoop_hold_done_d;
      wire [0:`MM_THREADS-1]          bus_snoop_hold_done_q;
      wire [0:`MM_THREADS-1]          tlbi_complete_d;
      wire [0:`MM_THREADS-1]          tlbi_complete_q;
      wire [0:`MM_THREADS-1]          iu_flush_req_d;
      wire [0:`MM_THREADS-1]          iu_flush_req_q;
      wire [0:`MM_THREADS-1]          ex4_illeg_instr_d;
      wire [0:`MM_THREADS-1]          ex4_illeg_instr_q;
      wire [0:`MM_THREADS-1]          ex5_illeg_instr_d;
      wire [0:`MM_THREADS-1]          ex5_illeg_instr_q;
      wire [0:`MM_THREADS-1]          ex6_illeg_instr_d;
      wire [0:`MM_THREADS-1]          ex6_illeg_instr_q;
      wire [0:`MM_THREADS-1]          ex7_illeg_instr_d;
      wire [0:`MM_THREADS-1]          ex7_illeg_instr_q;
      wire                           local_snoop_reject_ored;
      wire [0:`MM_THREADS-1]          local_snoop_reject_d, local_snoop_reject_q;
      wire [0:5]                     inv_seq_inprogress_d;
      wire [0:5]                     inv_seq_inprogress_q;
      wire [0:2]                     snoop_valid_d;
      wire [0:2]                     snoop_valid_q;
      wire [0:34]                    snoop_attr_d;
      wire [0:34]                    snoop_attr_q;
      wire [52-`EPN_WIDTH:51]         snoop_vpn_d;
      wire [52-`EPN_WIDTH:51]         snoop_vpn_q;
      wire [0:25]                    snoop_attr_clone_d;
      wire [0:25]                    snoop_attr_clone_q;
      wire [18:19]                   snoop_attr_tlb_spec_d;
      wire [18:19]                   snoop_attr_tlb_spec_q;
      wire [52-`EPN_WIDTH:51]         snoop_vpn_clone_d;
      wire [52-`EPN_WIDTH:51]         snoop_vpn_clone_q;
      wire [0:2]                     snoop_ack_d;
      wire [0:2]                     snoop_ack_q;
      wire [0:4]                     snoop_coming_d /*verilator split_var*/;
      wire [0:4]                     snoop_coming_q;
      wire [0:8]                     an_ac_back_inv_d;
      wire [0:8]                     an_ac_back_inv_q;
      wire [64-`REAL_ADDR_WIDTH:63]   an_ac_back_inv_addr_d;
      wire [64-`REAL_ADDR_WIDTH:63]   an_ac_back_inv_addr_q;
      wire [0:`LPID_WIDTH-1]          an_ac_back_inv_lpar_id_d;
      wire [0:`LPID_WIDTH-1]          an_ac_back_inv_lpar_id_q;
      wire [0:1]                     lsu_tokens_d;
      wire [0:1]                     lsu_tokens_q;
      wire [0:`MM_THREADS-1]                     lsu_req_d;
      wire [0:`MM_THREADS-1]                     lsu_req_q;
      wire [0:1]                     lsu_ttype_d;
      wire [0:1]                     lsu_ttype_q;
      wire [0:3]                     lsu_ubits_d;
      wire [0:3]                     lsu_ubits_q;
      wire [0:4]                     lsu_wimge_d;
      wire [0:4]                     lsu_wimge_q;
      wire [64-`REAL_ADDR_WIDTH:63]   lsu_addr_d;
      wire [64-`REAL_ADDR_WIDTH:63]   lsu_addr_q;
      wire [0:`LPID_WIDTH-1]          lsu_lpid_d;
      wire [0:`LPID_WIDTH-1]          lsu_lpid_q;
      wire                           lsu_ind_d;
      wire                           lsu_ind_q;
      wire                           lsu_gs_d;
      wire                           lsu_gs_q;
      wire                           lsu_lbit_d;
      wire                           lsu_lbit_q;
      wire [0:12]                    xu_mm_ccr2_notlb_d;
      wire [0:12]                    xu_mm_ccr2_notlb_q;
      wire [0:`MM_THREADS-1]         xu_mm_epcr_dgtmi_q;
      wire [0:`LPID_WIDTH-1]          lpidr_q;
      wire [12:19]                   mmucr1_q;
      wire [0:1]                     mmucr1_csinv_q;
      wire [0:15]                    spare_q;
      wire [0:3]                     power_managed_d;
      wire [0:3]                     power_managed_q;
      wire [0:3]                     cswitch_q;
      wire [0:`MM_THREADS-1]         mm_xu_quiesce_d;
      wire [0:`MM_THREADS-1]         mm_xu_quiesce_q;
      wire [0:`MM_THREADS-1]         inval_quiesce_b;
      wire [0:4*`MM_THREADS-1]       mm_pc_quiesce_d, mm_pc_quiesce_q;

      reg                            inv_seq_local_done;
      reg                            inv_seq_snoop_done;
      reg [0:`MM_THREADS-1]                      inv_seq_hold_req;
      reg [0:`MM_THREADS-1]                      inv_seq_hold_done;
      reg                            inv_seq_tlbi_load;
      reg                            inv_seq_tlbi_complete;
      reg                            inv_seq_tlb_snoop_val;
      reg                            inv_seq_htw_load;
      reg                            inv_seq_ierat_snoop_val;
      reg                            inv_seq_derat_snoop_val;
      reg                            inv_seq_snoop_inprogress;
      wire [0:1]                     inv_seq_snoop_inprogress_q;
      reg                            inv_seq_local_inprogress;
      reg                            inv_seq_local_barrier_set;
      reg                            inv_seq_global_barrier_set;
      reg                            inv_seq_local_barrier_done;
      reg                            inv_seq_global_barrier_done;
      reg                            inv_seq_idle;
      reg                            bus_snoop_seq_idle;
      reg                            bus_snoop_seq_hold_req;
      reg                            bus_snoop_seq_ready;
      reg                            bus_snoop_seq_done;
      wire                           inval_snoop_forme;
      wire                           inval_snoop_local_reject;
      wire                           ex6_size_large;
      reg                            inv_seq_tlb0fi_inprogress;
      wire [0:1]                    inv_seq_tlb0fi_inprogress_q;
      reg                            inv_seq_tlb0fi_done;
      wire                           ex3_ea_hold;
      reg                            htw_lsu_req_taken_sig;
      reg                            inv_seq_tlbwe_inprogress;
      wire [0:1]                    inv_seq_tlbwe_inprogress_q;
      reg                            inv_seq_tlbwe_snoop_done;
      wire                           tlbwe_back_inv_tid_nz;
      wire [0:`MM_THREADS+1]         tlbwe_back_inv_d;
      wire [0:`MM_THREADS+1]         tlbwe_back_inv_q;
      wire [52-`EPN_WIDTH:51]         tlbwe_back_inv_addr_d;
      wire [52-`EPN_WIDTH:51]         tlbwe_back_inv_addr_q;
      wire [0:34]                    tlbwe_back_inv_attr_d;
      wire [0:34]                    tlbwe_back_inv_attr_q;
      wire                           back_inv_tid_nz;
      wire                           ex6_tid_nz;
      wire                           ex2_rs_pgsize_not_supp;
      wire [0:`MM_THREADS-1]         mas6_isize_not_supp;
      wire [0:`MM_THREADS-1]         mas5_slpid_neq_lpidr;
      wire                           ex2_hv_state;
      wire                           ex2_priv_state;
      wire                           ex2_dgtmi_state;
      wire                           ex5_hv_state;
      wire                           ex5_priv_state;
      wire                           ex5_dgtmi_state;
      (* analysis_not_referenced="true" *)
      wire [0:16]                    unused_dc;

      // Pervasive
      wire                           pc_sg_1;
      wire                           pc_sg_0;
      wire                           pc_fce_1;
      wire                           pc_fce_0;
      wire                           pc_func_sl_thold_1;
      wire                           pc_func_sl_thold_0;
      wire                           pc_func_sl_thold_0_b;
      wire                           pc_func_slp_sl_thold_1;
      wire                           pc_func_slp_sl_thold_0;
      wire                           pc_func_slp_sl_thold_0_b;
      wire                           pc_func_slp_nsl_thold_1;
      wire                           pc_func_slp_nsl_thold_0;
      wire                           pc_func_slp_nsl_thold_0_b;
      wire                           pc_func_sl_force;
      wire                           pc_func_slp_sl_force;
      wire                           pc_func_slp_nsl_force;
      wire [0:scan_right]            siv;
      wire [0:scan_right]            sov;
      wire                           tidn;
      wire                           tiup;

      //!! Bugspray Include: mmq_inval;

      assign tidn = 1'b0;
      assign tiup = 1'b1;

      assign xu_mm_ccr2_notlb_d = {13{xu_mm_ccr2_notlb}};

      assign power_managed_d[0] = ac_an_power_managed;
      assign power_managed_d[1] = power_managed_q[1];
      assign power_managed_d[2] = power_managed_q[2];
      assign power_managed_d[3] = power_managed_q[3];
      assign mm_xu_quiesce = mm_xu_quiesce_q;
      assign mm_xu_quiesce_d = tlb_req_quiesce & tlb_ctl_quiesce & htw_quiesce & (~inval_quiesce_b);
      // not quiesced
      assign inval_quiesce_b = ex6_valid_q |
                                 ({`MM_THREADS{inv_seq_tlbwe_inprogress}} & tlbwe_back_inv_q[0:`MM_THREADS-1]);

      assign mm_pc_quiesce_d[0:`MM_THREADS-1]               = tlb_req_quiesce;
      assign mm_pc_quiesce_d[`MM_THREADS:2*`MM_THREADS-1]   = tlb_ctl_quiesce;
      assign mm_pc_quiesce_d[2*`MM_THREADS:3*`MM_THREADS-1] = htw_quiesce;
      assign mm_pc_quiesce_d[3*`MM_THREADS:4*`MM_THREADS-1] = (~inval_quiesce_b);
      assign mm_pc_tlb_req_quiesce = mm_pc_quiesce_q[0:`MM_THREADS-1];
      assign mm_pc_tlb_ctl_quiesce = mm_pc_quiesce_q[`MM_THREADS:2*`MM_THREADS-1];
      assign mm_pc_htw_quiesce = mm_pc_quiesce_q[2*`MM_THREADS:3*`MM_THREADS-1];
      assign mm_pc_inval_quiesce = mm_pc_quiesce_q[3*`MM_THREADS:4*`MM_THREADS-1];

      assign ex1_valid_d = xu_mm_rf1_val & (~(xu_rf1_flush));
      assign ex1_ttype_d[0:`MMQ_INVAL_TTYPE_WIDTH - 3] = {xu_mm_rf1_is_tlbilx, xu_mm_rf1_is_tlbivax, xu_mm_rf1_is_eratilx, xu_mm_rf1_is_erativax};
      assign ex1_state_d[0] = |(xu_mm_msr_gs & xu_mm_rf1_val);
      assign ex1_state_d[1] = |(xu_mm_msr_pr & xu_mm_rf1_val);
      assign ex1_t_d = xu_mm_rf1_t;

      assign ex2_valid_d = ex1_valid_q & (~(xu_ex1_flush));
      assign ex2_ttype_d[0:`MMQ_INVAL_TTYPE_WIDTH - 3] = ex1_ttype_q[0:`MMQ_INVAL_TTYPE_WIDTH - 3];
      assign ex2_ttype_d[`MMQ_INVAL_TTYPE_WIDTH - 2:`MMQ_INVAL_TTYPE_WIDTH - 1] = {xu_mm_ex1_is_csync, xu_mm_ex1_is_isync};
      assign ex2_rs_is_d = xu_mm_ex1_rs_is;
      // RS(55)    -> Local  rs_is(0)
      // RS(56:57) -> IS     rs_is(1 to 2)
      // RS(58:59) -> Class  rs_is(3 to 4)
      // RS(60:63) -> Size   rs_is(5 to 8)
      assign ex2_state_d = ex1_state_q;
      assign ex2_t_d = ex1_t_q;
      // ex2 effective addr capture latch.. hold addr until inv_seq done with it
      assign ex3_ea_hold = (|(ex3_valid_q) & |(ex3_ttype_q[0:3])) | (|(ex4_valid_q) & |(ex4_ttype_q[0:3])) | (|(ex5_valid_q) & |(ex5_ttype_q[0:3])) | (|(ex6_valid_q) & |(ex6_ttype_q[0:3]));
      assign ex3_ea_d = (ex3_ea_q & {`RS_DATA_WIDTH{ex3_ea_hold}}) | (xu_mm_ex2_eff_addr & {`RS_DATA_WIDTH{~ex3_ea_hold}});
      assign ex2_hv_state = (~ex2_state_q[0]) & (~ex2_state_q[1]);
      assign ex2_priv_state = (~ex2_state_q[1]);
      assign ex2_dgtmi_state = |(ex2_valid_q & xu_mm_epcr_dgtmi_q);

      assign ex3_valid_d = ex2_valid_q & (~(xu_ex2_flush));
      assign ex3_ttype_d[0:`MMQ_INVAL_TTYPE_WIDTH - 3] = ex2_ttype_q[0:`MMQ_INVAL_TTYPE_WIDTH - 3];
      assign ex3_ttype_d[`MMQ_INVAL_TTYPE_WIDTH - 2] = (ex2_ttype_q[`MMQ_INVAL_TTYPE_WIDTH - 2] & (~mmucr1_csinv_q[0]));
      assign ex3_ttype_d[`MMQ_INVAL_TTYPE_WIDTH - 1] = (ex2_ttype_q[`MMQ_INVAL_TTYPE_WIDTH - 1] & (~mmucr1_csinv_q[1]));
      assign ex3_rs_is_d = ex2_rs_is_q;
      assign ex3_state_d = ex2_state_q;
      assign ex3_t_d = ex2_t_q;

      assign ex3_flush_req_d = ((ex2_ttype_q[0:3] != 4'b0000 & (inv_seq_idle == 1'b0 |
                                    (|(ex3_valid_q) == 1'b1 & |(ex3_ttype_q[0:3]) == 1'b1) |
                                    (|(ex4_valid_q) == 1'b1 & |(ex4_ttype_q[0:3]) == 1'b1) |
                                    (|(ex5_valid_q) == 1'b1 & |(ex5_ttype_q[0:3]) == 1'b1) |
                                    (|(ex6_valid_q) == 1'b1 & |(ex6_ttype_q[0:3]) == 1'b1)))) ? (ex2_valid_q & (~(xu_ex2_flush))) :
                               tlb_ctl_ex2_flush_req;

      assign ex4_valid_d = ex3_valid_q & (~(xu_ex3_flush)) & (~(ex3_flush_req_q)) & (~(ex3_illeg_instr_q)) & (~(ex3_ivax_lpid_reject_q));
      assign ex4_ttype_d = ex3_ttype_q;
      assign ex4_rs_is_d = ex3_rs_is_q;
      assign ex4_state_d = ex3_state_q;
      assign ex4_t_d = ex3_t_q;

      assign ex5_valid_d = ex4_valid_q & (~(xu_ex4_flush));
      assign ex5_ttype_d = ex4_ttype_q;
      assign ex5_rs_is_d = ex4_rs_is_q;
      assign ex5_state_d = ex4_state_q;
      assign ex5_t_d = ex4_t_q;
      assign ex5_hv_state = (~ex5_state_q[0]) & (~ex5_state_q[1]);
      assign ex5_priv_state = (~ex5_state_q[1]);
      assign ex5_dgtmi_state = |(ex5_valid_q & xu_mm_epcr_dgtmi_q);

      // these are ex6 capture latches.. hold invalidate op until inv_seq done with it
      assign ex6_valid_d = (inv_seq_local_done == 1'b1) ? {`MM_THREADS{1'b0}} :
                           ((|(ex6_valid_q) == 1'b0 & ((ex5_ttype_q[0] == 1'b1 & ex5_priv_state == 1'b1 & ex5_dgtmi_state == 1'b0) | (ex5_ttype_q[0] == 1'b1 & ex5_hv_state == 1'b1 & ex5_dgtmi_state == 1'b1) | (|(ex5_ttype_q[1:3]) == 1'b1 & ex5_hv_state == 1'b1)))) ? (ex5_valid_q & (~(xu_ex5_flush))) :
                           ex6_valid_q;
      //ttype <= tlbilx & tlbivax & eratilx & erativax & csync & isync;
      assign ex6_ttype_d = ((|(ex5_valid_q) == 1'b1 & |(ex5_ttype_q[0:3]) == 1'b1 & |(ex6_valid_q) == 1'b0)) ? ex5_ttype_q :
                           ex6_ttype_q;
      //                            ttype ->    0        1         2          3
      //                sources for ttype -> tlbilx   tlbivax   eratilx   erativax
      // RS(55)    -> Local  rs_is(0)           1        0         1          0
      // RS(56:57) -> IS     rs_is(1 to 2)    f(T)      11        f(T)    RS(56:57)
      // RS(58:59) -> Class  rs_is(3 to 4)    g(T)      00        g(T)    RS(58:59)
      // RS(60:63) -> Size   rs_is(5 to 8)    mas6     mas6       n/a     RS(60:63)
      //              TS (state(1))           mas6     mas6      mmucr0    mmucr0
      //              TID                     mas6     mas6      mmucr0    mmucr0
      //              GS (state(0))           mas5     mas5      mmucr0    mmucr0
      //              LPID                    mas5     mas5      lpidr     lpidr
      //              IND                     mas6     mas6        0         0
      assign ex6_isel_d = ((|(ex5_valid_q) == 1'b1 & ex5_ttype_q[3] == 1'b1 & ex5_rs_is_q[1:2] == 2'b10 & |(ex6_valid_q) == 1'b0)) ? {1'b1, ex5_rs_is_q[3:4]} :
                          ((|(ex5_valid_q) == 1'b1 & ex5_ttype_q[3] == 1'b1 & ex5_rs_is_q[1:2] != 2'b10 & |(ex6_valid_q) == 1'b0)) ? {1'b0, ex5_rs_is_q[1:2]} :
                          ((|(ex5_valid_q) == 1'b1 & ex5_ttype_q[2] == 1'b1 & |(ex6_valid_q) == 1'b0)) ? ex5_t_q[0:2] :
                          ((|(ex5_valid_q) == 1'b1 & ex5_ttype_q[1] == 1'b1 & |(ex6_valid_q) == 1'b0)) ? 3'b011 :
                          ((|(ex5_valid_q) == 1'b1 & ex5_ttype_q[0] == 1'b1 & |(ex6_valid_q) == 1'b0)) ? ex5_t_q[0:2] :
                          ex6_isel_q;
      // T field from tlbilx/eratilx is  0=all, 1=pid, 2=resvd/GS, 3=address, 4-7=class
      // ex1_rs_is(0 to 9) from erativax instr.
      //   RS(55)    -> ex1_rs_is(0)   -> snoop_attr(0)     -> Local
      //   RS(56:57) -> ex1_rs_is(1:2) -> snoop_attr(0:1)   -> IS
      //   RS(58:59) -> ex1_rs_is(3:4) -> snoop_attr(2:3)   -> Class
      //   n/a       ->  n/a           -> snoop_attr(4:5)   -> State
      //   n/a       ->  n/a           -> snoop_attr(6:13)  -> TID(6:13)
      //   RS(60:63) -> ex1_rs_is(5:8) -> snoop_attr(14:17) -> Size
      //   n/a       ->  n/a           -> snoop_attr(20:25) -> TID(0:5)
      // erat snoop_attr:
      //          0 -> Local
      //        1:3 -> IS/Class: 0=all, 1=tid, 2=gs, 3=epn, 4=class0, 5=class1, 6=class2, 7=class3
      //        4:5 -> GS/TS
      //       6:13 -> TID(6:13)
      //      14:17 -> Size
      //      18    -> TID_NZ
      //      19    -> mmucsr0.tlb0fi
      //      20:25 -> TID(0:5)
      assign ex6_size_d = ((|(ex5_valid_q) == 1'b1 & ex5_ttype_q[3] == 1'b1 & |(ex6_valid_q) == 1'b0)) ? ex5_rs_is_q[5:8] :
                            ((|(ex5_valid_q) == 1'b1 & ex5_ttype_q[2] == 1'b1 & |(ex6_valid_q) == 1'b0)) ? 4'b0000 :
                            ((ex5_valid_q[0] == 1'b1 & ex5_ttype_q[0:1] != 2'b00 & |(ex6_valid_q) == 1'b0)) ? mas6_0_isize :
                          `ifdef MM_THREADS2
                            ((ex5_valid_q[1] == 1'b1 & ex5_ttype_q[0:1] != 2'b00 & |(ex6_valid_q) == 1'b0)) ? mas6_1_isize :
                          `endif
                            ex6_size_q;
      assign ex6_size_large = ((ex6_size_q == TLB_PgSize_64KB | ex6_size_q == TLB_PgSize_1MB | ex6_size_q == TLB_PgSize_16MB | ex6_size_q == TLB_PgSize_256MB | ex6_size_q == TLB_PgSize_1GB)) ? 1'b1 :
                              1'b0;
      // mmucr0: 0:1-ExtClass, 2:3-TGS/TS, 4:5-TLBSel, 6:19-TID,
      // ttype <= tlbilx & tlbivax & eratilx & erativax & csync & isync;
      assign ex6_gs_d = ((ex5_valid_q[0] == 1'b1 & |(ex5_ttype_q[2:3]) == 1'b1 & |(ex6_valid_q) == 1'b0)) ? mmucr0_0[2] :
                          ((ex5_valid_q[0] == 1'b1 & |(ex5_ttype_q[0:1]) == 1'b1 & |(ex6_valid_q) == 1'b0)) ? mas5_0_sgs :
                        `ifdef MM_THREADS2
                          ((ex5_valid_q[1] == 1'b1 & |(ex5_ttype_q[2:3]) == 1'b1 & |(ex6_valid_q) == 1'b0)) ? mmucr0_1[2] :
                          ((ex5_valid_q[1] == 1'b1 & |(ex5_ttype_q[0:1]) == 1'b1 & |(ex6_valid_q) == 1'b0)) ? mas5_1_sgs :
                        `endif
                          ex6_gs_q;
      assign ex6_ts_d = ((ex5_valid_q[0] == 1'b1 & |(ex5_ttype_q[2:3]) == 1'b1 & |(ex6_valid_q) == 1'b0)) ? mmucr0_0[3] :
                          ((ex5_valid_q[0] == 1'b1 & |(ex5_ttype_q[0:1]) == 1'b1 & |(ex6_valid_q) == 1'b0)) ? mas6_0_sas :
                        `ifdef MM_THREADS2
                          ((ex5_valid_q[1] == 1'b1 & |(ex5_ttype_q[2:3]) == 1'b1 & |(ex6_valid_q) == 1'b0)) ? mmucr0_1[3] :
                          ((ex5_valid_q[1] == 1'b1 & |(ex5_ttype_q[0:1]) == 1'b1 & |(ex6_valid_q) == 1'b0)) ? mas6_1_sas :
                        `endif
                          ex6_ts_q;
      //ttype <= tlbilx & tlbivax & eratilx & erativax & csync & isync;
      assign ex6_ind_d = ((ex5_valid_q[0] == 1'b1 & |(ex5_ttype_q[2:3]) == 1'b1 & |(ex6_valid_q) == 1'b0)) ? 1'b0 :
                           ((ex5_valid_q[0] == 1'b1 & |(ex5_ttype_q[0:1]) == 1'b1 & |(ex6_valid_q) == 1'b0)) ? mas6_0_sind :
                        `ifdef MM_THREADS2
                           ((ex5_valid_q[1] == 1'b1 & |(ex5_ttype_q[2:3]) == 1'b1 & |(ex6_valid_q) == 1'b0)) ? 1'b0 :
                           ((ex5_valid_q[1] == 1'b1 & |(ex5_ttype_q[0:1]) == 1'b1 & |(ex6_valid_q) == 1'b0)) ? mas6_1_sind :
                        `endif
                           ex6_ind_q;
      assign ex6_pid_d = ((ex5_valid_q[0] == 1'b1 & |(ex5_ttype_q[2:3]) == 1'b1 & |(ex6_valid_q) == 1'b0)) ? mmucr0_0[6:19] :
                           ((ex5_valid_q[0] == 1'b1 & |(ex5_ttype_q[0:1]) == 1'b1 & |(ex6_valid_q) == 1'b0)) ? mas6_0_spid :
                        `ifdef MM_THREADS2
                           ((ex5_valid_q[1] == 1'b1 & |(ex5_ttype_q[2:3]) == 1'b1 & |(ex6_valid_q) == 1'b0)) ? mmucr0_1[6:19] :
                           ((ex5_valid_q[1] == 1'b1 & |(ex5_ttype_q[0:1]) == 1'b1 & |(ex6_valid_q) == 1'b0)) ? mas6_1_spid :
                        `endif
                           ex6_pid_q;
      assign ex6_lpid_d = ((|(ex5_valid_q) == 1'b1 & |(ex5_ttype_q[2:3]) == 1'b1 & |(ex6_valid_q) == 1'b0)) ? lpidr_q :
                            ((ex5_valid_q[0] == 1'b1 & |(ex5_ttype_q[0:1]) == 1'b1 & |(ex6_valid_q) == 1'b0)) ? mas5_0_slpid :
                        `ifdef MM_THREADS2
                            ((ex5_valid_q[1] == 1'b1 & |(ex5_ttype_q[0:1]) == 1'b1 & |(ex6_valid_q) == 1'b0)) ? mas5_1_slpid :
                        `endif
                            ex6_lpid_q;

      assign ex1_itag_d = xu_mm_rf1_itag;
      assign ex2_itag_d = ex1_itag_q;
      assign ex3_itag_d = ex2_itag_q;
      assign ex4_itag_d = ex3_itag_q;
      assign ex5_itag_d = ex4_itag_q;
      assign ex6_itag_d = ((|(ex5_valid_q) == 1'b1 & |(ex5_ttype_q[0:3]) == 1'b1 & |(ex6_valid_q) == 1'b0)) ? ex5_itag_q :
                          ex6_itag_q;
      // an_ac_back_inv_q: 0=valid b-1, 1=target b-1, 2=valid b, 3=target b, 4=L, 5=GS, 6=IND, 7=local, 8=reject
      // iu barrier op shadow status
      assign local_barrier_d = (inv_seq_local_barrier_done == 1'b1) ? (local_barrier_q & (~(ex6_valid_q))) :
                               (inv_seq_local_barrier_set == 1'b1) ? (ex6_valid_q | local_barrier_q) :
                               local_barrier_q;
      assign global_barrier_d = (((inv_seq_global_barrier_done == 1'b1 & an_ac_back_inv_q[7] == 1'b1) | inval_snoop_local_reject == 1'b1)) ? {`MM_THREADS{1'b0}} :
                                (inv_seq_global_barrier_set == 1'b1) ? (ex6_valid_q | global_barrier_q) :
                                global_barrier_q;
      assign ord_np1_flush_d = (inv_seq_local_done == 1'b1) ? ex6_valid_q :
                               {`MM_THREADS{1'b0}};
      // tlb_ctl ordered types: 0-tlbre, 1-tlbwe, 2-tlbsx/tlbsrx
      assign ord_read_done_d = (inv_seq_local_barrier_done == 1'b1) ? (local_barrier_q & ex6_valid_q) :
                               ((inv_seq_tlbi_load == 1'b1)) ? ex6_valid_q :
                               (((tlbwe_back_inv_q[`MM_THREADS] == 1'b1 & inv_seq_tlbwe_snoop_done == 1'b1 & cswitch_q[2] == 1'b0) |
                                 (tlbwe_back_inv_q[`MM_THREADS] == 1'b1 & tlbwe_back_inv_q[`MM_THREADS+1] == 1'b0 & tlb_tag5_write == 1'b0 & cswitch_q[2] == 1'b0))) ? tlbwe_back_inv_q[0:`MM_THREADS-1] :
                               ((tlb_ctl_ord_type[1] == 1'b1 & (tlbwe_back_inv_valid == 1'b0 | cswitch_q[2] == 1'b1))) ? tlb_ctl_barrier_done :
                               {`MM_THREADS{1'b0}};
      assign ord_write_done_d = (((tlb_ctl_ord_type[0] == 1'b1 | tlb_ctl_ord_type[2] == 1'b1) & (tlbwe_back_inv_valid == 1'b0 | cswitch_q[2] == 1'b1))) ? tlb_ctl_barrier_done :
                                {`MM_THREADS{1'b0}};
      assign tlbi_complete_d = (((inv_seq_global_barrier_done == 1'b1 & an_ac_back_inv_q[7] == 1'b1) | inval_snoop_local_reject == 1'b1)) ? global_barrier_q :
                                {`MM_THREADS{1'b0}};
      // Illegal instr logic
      assign ex2_rs_pgsize_not_supp = ((ex2_rs_is_q[5:8] == TLB_PgSize_4KB | ex2_rs_is_q[5:8] == TLB_PgSize_64KB | ex2_rs_is_q[5:8] == TLB_PgSize_1MB | ex2_rs_is_q[5:8] == TLB_PgSize_16MB | ex2_rs_is_q[5:8] == TLB_PgSize_1GB)) ? 1'b0 :
                                      1'b1;
      assign mas6_isize_not_supp[0] = (((mas6_0_isize == TLB_PgSize_4KB | mas6_0_isize == TLB_PgSize_64KB | mas6_0_isize == TLB_PgSize_1MB | mas6_0_isize == TLB_PgSize_16MB | mas6_0_isize == TLB_PgSize_1GB) & mas6_0_sind == 1'b0) | ((mas6_0_isize == TLB_PgSize_1MB | mas6_0_isize == TLB_PgSize_256MB) & mas6_0_sind == 1'b1)) ? 1'b0 :
                                      1'b1;
`ifdef MM_THREADS2
      assign mas6_isize_not_supp[1] = (((mas6_1_isize == TLB_PgSize_4KB | mas6_1_isize == TLB_PgSize_64KB | mas6_1_isize == TLB_PgSize_1MB | mas6_1_isize == TLB_PgSize_16MB | mas6_1_isize == TLB_PgSize_1GB) & mas6_1_sind == 1'b0) | ((mas6_1_isize == TLB_PgSize_1MB | mas6_1_isize == TLB_PgSize_256MB) & mas6_1_sind == 1'b1)) ? 1'b0 :
                                      1'b1;
`endif

      assign mas5_slpid_neq_lpidr[0] = ~(mas5_0_slpid == lpidr_q);
`ifdef MM_THREADS2
      assign mas5_slpid_neq_lpidr[1] = ~(mas5_1_slpid == lpidr_q);
`endif

      //ttype <= tlbilx & tlbivax & eratilx & erativax;
      // T field from tlbilx/eratilx is  0=all, 1=pid, 2=resvd/GS, 3=address, 4-7=class
      // ex2_hv_state   <= not ex2_state_q(0) and not ex2_state_q(1); -- gs=0, pr=0
      // ex2_priv_state <= not ex2_state_q(1); -- pr=0
      // ex2_dgtmi_state <= |(ex2_valid_q and xu_mm_epcr_dgtmi_q); -- disable guest tlb mgmt instr's
      assign ex3_illeg_instr_d = ( ex2_valid_q & mas6_isize_not_supp & {`MM_THREADS{ex2_ttype_q[1] & ex2_hv_state}} ) |
                                   ( ex2_valid_q & mas6_isize_not_supp & ({`MM_THREADS{ex2_ttype_q[0] & (ex2_t_q == 3'b011)}} & {`MM_THREADS{ex2_hv_state | (ex2_priv_state & (~ex2_dgtmi_state))}}) ) |
                                   ( ex2_valid_q & {`MM_THREADS{ex2_ttype_q[3] & ex2_hv_state & ex2_rs_pgsize_not_supp}} ) |
                                   ( ex2_valid_q & {`MM_THREADS{ex2_ttype_q[2] & ex2_hv_state & ex2_t_q[0] & mmucr1_q[pos_ictid] & mmucr1_q[pos_dctid]}} ) |
                                   (tlb_ctl_ex2_illeg_instr);

      assign ex4_illeg_instr_d = ex3_illeg_instr_q & (~(ex3_flush_req_q));
      assign ex5_illeg_instr_d = ex4_illeg_instr_q;
      assign ex6_illeg_instr_d = ex5_illeg_instr_q;
      assign ex7_illeg_instr_d = ex6_illeg_instr_q | tlb_ctl_ex6_illeg_instr;

      assign ex3_ivax_lpid_reject_d = ( ex2_valid_q & mas5_slpid_neq_lpidr & ~mas6_isize_not_supp & {`MM_THREADS{ex2_ttype_q[1] & ex2_hv_state &
                                              (xu_mm_ccr2_notlb_q[0] == MMU_Mode_Value) & mmucr1_q[pos_tlbi_rej]}} );
                                     // for erativax, this would be a nonsensical check for outgoing ivax because
                                     // source (lpidr) is same thing we check incoming snoop lpid value against
                                     //   ( ex2_valid_q & lpidr_neq_lpidr & {`MM_THREADS{ex2_ttype_q[3] & ex2_hv_state &
                                     //     ~ex2_rs_pgsize_not_supp & (xu_mm_ccr2_notlb_q[0] == ERAT_Mode_Value)}} );

      assign ex4_ivax_lpid_reject_d = (ex3_ivax_lpid_reject_q & ~ex3_illeg_instr_q & ~ex3_flush_req_q & ~xu_ex3_flush);

      // invalidate sequencer
      //Inv_Sequencer: PROCESS (inv_seq_q, por_seq_q, an_ac_back_inv, an_ac_back_inv_target,
      //                           ex6_valid_q, ex6_ttype_q)

      always @(inv_seq_q or xu_mm_lmq_stq_empty or iu_mm_lmq_empty or hold_ack_q or lsu_tokens_q or xu_mm_ccr2_notlb_q[0] or snoop_ack_q or ex6_valid_q or ex6_ttype_q[0:3] or ex6_ind_q or ex6_isel_q or bus_snoop_seq_ready or mmucsr0_tlb0fi or tlbwe_back_inv_q[`MM_THREADS+1] or an_ac_back_inv_q[6] or an_ac_back_inv_addr_q[54:55] or htw_lsu_req_valid or lsu_req_q or cswitch_q[0:1] or cswitch_q[3] or power_managed_q[0] or power_managed_q[2] or power_managed_q[3])
      begin: Inv_Sequencer
         inv_seq_idle = 1'b0;
         inv_seq_snoop_inprogress = 1'b0;
         inv_seq_local_inprogress = 1'b0;
         inv_seq_local_barrier_set = 1'b0;
         inv_seq_global_barrier_set = 1'b0;
         inv_seq_local_barrier_done = 1'b0;
         inv_seq_global_barrier_done = 1'b0;
         inv_seq_snoop_done = 1'b0;
         inv_seq_local_done = 1'b0;
         inv_seq_tlbi_load = 1'b0;
         inv_seq_tlbi_complete = 1'b0;
         inv_seq_htw_load = 1'b0;
         htw_lsu_req_taken_sig = 1'b0;
         inv_seq_hold_req = {`MM_THREADS{1'b0}};
         inv_seq_hold_done = {`MM_THREADS{1'b0}};
         inv_seq_tlb_snoop_val = 1'b0;
         inv_seq_ierat_snoop_val = 1'b0;
         inv_seq_derat_snoop_val = 1'b0;
         inv_seq_tlb0fi_inprogress = 1'b0;
         inv_seq_tlb0fi_done = 1'b0;
         inv_seq_tlbwe_snoop_done = 1'b0;
         inv_seq_tlbwe_inprogress = 1'b0;

         case (inv_seq_q)
         // wait for an invalidation to service
         // ttype = tlbilx & tlbivax & eratilx & erativax;

            InvSeq_Idle :
               begin
                  inv_seq_idle = 1'b1;
                  if (bus_snoop_seq_ready == 1'b1)
                  // invalidate snoop from bus
                  begin
                     inv_seq_snoop_inprogress = 1'b1;
                     inv_seq_hold_req = {`MM_THREADS{1'b1}};
                     inv_seq_d = InvSeq_Stg8;
                  end
                  else if (htw_lsu_req_valid == 1'b1)
                  // table walk load from htw
                     inv_seq_d = InvSeq_Stg31;
                  else if (|(ex6_valid_q) == 1'b1 & (ex6_ttype_q[1] == 1'b1 | ex6_ttype_q[3] == 1'b1))
                  // locally sourced global invalidate from instr
                  begin
                     inv_seq_local_inprogress = 1'b1;
                     inv_seq_global_barrier_set = 1'b1;
                     inv_seq_d = InvSeq_Stg1;
                  end
                  else if (|(ex6_valid_q) == 1'b1 & (ex6_ttype_q[0] == 1'b1 | ex6_ttype_q[2] == 1'b1))
                  // locally sourced local invalidate from instr
                  begin
                     inv_seq_hold_req = {`MM_THREADS{1'b1}};
                     inv_seq_local_inprogress = 1'b1;
                     inv_seq_local_barrier_set = 1'b1;
                     inv_seq_d = InvSeq_Stg2;
                  end
                  else if (mmucsr0_tlb0fi == 1'b1)
                  // locally sourced full invalidate from mmucsr0.tlb0fi
                  begin
                     inv_seq_hold_req = {`MM_THREADS{1'b1}};
                     inv_seq_tlb0fi_inprogress = 1'b1;
                     inv_seq_d = InvSeq_Stg16;
                  end
                  else if (tlbwe_back_inv_q[`MM_THREADS+1] == 1'b1)
                  // locally sourced tlbwe back invalidate for erats
                  begin
                     inv_seq_hold_req = {`MM_THREADS{1'b1}};
                     inv_seq_tlbwe_inprogress = 1'b1;
                     inv_seq_d = InvSeq_Stg24;
                  end
                  else
                     inv_seq_d = InvSeq_Idle;
               end

            InvSeq_Stg1 :
            // locally sourced global invalidate action 1
            //   go idle and see global invalidate snoop from bus later..
            //     ttype = tlbilx & tlbivax & eratilx & erativax;
               begin
                  inv_seq_local_inprogress = 1'b1;
                  if (lsu_tokens_q != 2'b00 & (xu_mm_lmq_stq_empty == 1'b1 | cswitch_q[0] == 1'b1))
                  begin
                     inv_seq_tlbi_load = 1'b1;
                     inv_seq_local_done = 1'b1;
                     inv_seq_d = InvSeq_Idle;
                  end
                  else
                     inv_seq_d = InvSeq_Stg1;
               end

            InvSeq_Stg2 :
            // locally sourced local invalidate action 1
            //  let hold_req be asserted
               begin
                  inv_seq_local_inprogress = 1'b1;
                  if (&(hold_ack_q | ex6_valid_q) == 1'b1)
                     // this thread held, other threads held and flushed
                     inv_seq_d = InvSeq_Stg3;
                  else if (htw_lsu_req_valid == 1'b1)
                     // table walk load request from htw; could be ucode, so service it
                     inv_seq_d = InvSeq_Stg23;
                  else
                     inv_seq_d = InvSeq_Stg2;
               end

            InvSeq_Stg3 :
            // locally sourced local invalidate action 2
            // ttype = tlbilx & tlbivax & eratilx & erativax;
               begin
                  inv_seq_local_inprogress = 1'b1;
                  if (iu_mm_lmq_empty == 1'b1 & xu_mm_lmq_stq_empty == 1'b1 & xu_mm_ccr2_notlb_q[0] == MMU_Mode_Value & ex6_ttype_q[0] == 1'b1)
                     //  invalidate the TLB first, assuming it exists
                     inv_seq_d = InvSeq_Stg4;
                  else if (iu_mm_lmq_empty == 1'b1 & xu_mm_lmq_stq_empty == 1'b1)
                     //  invalidate the ERAT's
                     inv_seq_d = InvSeq_Stg6;
                  else if (htw_lsu_req_valid == 1'b1)
                     // table walk load request from htw; could hang waiting on empty, so service it
                     inv_seq_d = InvSeq_Stg23;
                  else
                     inv_seq_d = InvSeq_Stg3;
               end

            InvSeq_Stg4 :
            // locally sourced local invalidate action 3
            //  invalidate the TLB
               begin
                  inv_seq_local_inprogress = 1'b1;
                  inv_seq_tlb_snoop_val = 1'b1;
                  inv_seq_d = InvSeq_Stg5;
               end

            InvSeq_Stg5 :
            // locally sourced local invalidate action 4
               begin
                  inv_seq_local_inprogress = 1'b1;
                  if (snoop_ack_q[2] == 1'b1)
                     inv_seq_d = InvSeq_Stg6;
                  else
                     inv_seq_d = InvSeq_Stg5;
               end

            InvSeq_Stg6 :
            // locally sourced local invalidate action 5
             //  invalidate the ERAT's after TLB copy(s) destroyed
             //    but don't invalidate erats for T=3, ind=1 snoops
               begin
                  inv_seq_local_inprogress = 1'b1;
                  if ( (~(ex6_ind_q & (ex6_isel_q == 3'b011))) == 1'b1 )
                  begin
                    inv_seq_ierat_snoop_val = 1'b1;
                    inv_seq_derat_snoop_val = 1'b1;
                  end
                  inv_seq_d = InvSeq_Stg7;
               end

            InvSeq_Stg7 :
            // locally sourced local invalidate action 6
               begin
                  inv_seq_local_inprogress = 1'b1;
                  if (snoop_ack_q[0:1] == 2'b11 | (ex6_ind_q & (ex6_isel_q == 3'b011)) == 1'b1)
                  begin
                     inv_seq_local_done = 1'b1;
                     inv_seq_local_barrier_done = 1'b1;
                     inv_seq_hold_done = {`MM_THREADS{1'b1}};
                     inv_seq_d = InvSeq_Idle;
                  end
                  else
                     inv_seq_d = InvSeq_Stg7;
               end

           //------------ incoming snoop from bus -------
           // power_managed_q(0) = power managed state
           // power_managed_q(1) = reject snoops from bus when in power managed state
           // power_managed_q(2) = inval_seq bus snoops: bypass handshakes and ack's when in power managed state
           // power_managed_q(3) = inval_seq bus snoops: skip erat and tlb snoops when in power managed state
            InvSeq_Stg8 :
            // global invalidate snoop action 1
               begin
                  //  bus_snoop_hold_req/ack has been completed by side sequencer
                  inv_seq_snoop_inprogress = 1'b1;
                  if (htw_lsu_req_valid == 1'b1)
                     // table walk load request from htw; could be ucode, so service it
                     inv_seq_d = InvSeq_Stg28;
                  else
                     inv_seq_d = InvSeq_Stg9;
               end

            InvSeq_Stg9 :
            // global invalidate snoop action 2
            //  let XU drive flushes, etc.
               begin
                  inv_seq_snoop_inprogress = 1'b1;
                  inv_seq_d = InvSeq_Stg10;
               end

            InvSeq_Stg10 :
            // global invalidate snoop action 3
               begin
                  inv_seq_snoop_inprogress = 1'b1;
                  if (power_managed_q[0] == 1'b1 & power_managed_q[3] == 1'b1)
                     //  sleep mode, bit 3 skip the snoops
                     inv_seq_d = InvSeq_Stg14;
                  else if ((iu_mm_lmq_empty == 1'b1 | cswitch_q[3] == 1'b1 | power_managed_q[0] == 1'b1) & (xu_mm_lmq_stq_empty == 1'b1 | cswitch_q[1] == 1'b1 | (power_managed_q[0] == 1'b1 & power_managed_q[2] == 1'b1)) & xu_mm_ccr2_notlb_q[0] == MMU_Mode_Value)
                     //  invalidate the TLB first, assuming it exists
                     inv_seq_d = InvSeq_Stg11;
                  else if ((iu_mm_lmq_empty == 1'b1 | cswitch_q[3] == 1'b1 | power_managed_q[0] == 1'b1) &
                              // sleep mode, skip the iu status
                             (xu_mm_lmq_stq_empty == 1'b1 | cswitch_q[1] == 1'b1 | (power_managed_q[0] == 1'b1 & power_managed_q[2] == 1'b1)))
                              // sleep mode, bit 2 skip the xu status
                     //  invalidate the ERAT's
                     inv_seq_d = InvSeq_Stg13;
                  else if (htw_lsu_req_valid == 1'b1)
                     // table walk load request from htw; could hang waiting on empty, so service it
                     inv_seq_d = InvSeq_Stg28;
                  else
                     inv_seq_d = InvSeq_Stg10;
               end

            InvSeq_Stg11 :
            // global invalidate snoop action 4
            //  invalidate the TLB
               begin
                  inv_seq_snoop_inprogress = 1'b1;
                  inv_seq_tlb_snoop_val = 1'b1;
                  inv_seq_d = InvSeq_Stg12;
               end

            InvSeq_Stg12 :
            // global invalidate snoop action 5
               begin
                  inv_seq_snoop_inprogress = 1'b1;
                  if (snoop_ack_q[2] == 1'b1 | (power_managed_q[0] == 1'b1 & power_managed_q[2] == 1'b1))
                     inv_seq_d = InvSeq_Stg13;
                  else
                     inv_seq_d = InvSeq_Stg12;
               end

            InvSeq_Stg13 :
            // global invalidate snoop action 6
            //  invalidate the ERAT's after TLB copy(s) destroyed
            //    but don't invalidate erats for ind=1 entries
               begin
                  inv_seq_snoop_inprogress = 1'b1;
                  if ( (~(an_ac_back_inv_q[6] & (an_ac_back_inv_addr_q[54:55] == 2'b11))) == 1'b1 )
                  begin
                    inv_seq_ierat_snoop_val = 1'b1;
                    inv_seq_derat_snoop_val = 1'b1;
                  end
                  inv_seq_d = InvSeq_Stg14;
               end

            InvSeq_Stg14 :
           // global invalidate snoop action 7
               begin
                  inv_seq_snoop_inprogress = 1'b1;
                  if (power_managed_q[0] == 1'b1 & power_managed_q[2] == 1'b1)
                  // sleep mode, bit 2 skip the acks
                  begin
                     inv_seq_tlbi_complete = 1'b1;  // send tlbi_complete
                     inv_seq_d = InvSeq_Stg15;
                  end
                  else if (lsu_tokens_q != 2'b00 & (snoop_ack_q[0:1] == 2'b11 | (an_ac_back_inv_q[6] & (an_ac_back_inv_addr_q[54:55] == 2'b11)) == 1'b1))
                  // wait for tokens and (erat acks or ind=1)
                  begin
                     inv_seq_tlbi_complete = 1'b1;  // send tlbi_complete
                     inv_seq_d = InvSeq_Stg15;
                  end
                  else
                     inv_seq_d = InvSeq_Stg14;
               end

            InvSeq_Stg15 :
            // global invalidate snoop action 8
             // wait until lsu request was sent and token is returned, meaning the tlbi complete has been sent to L2
             //  or we are in sleep mode and bit 2 skip the handshakes
               if ((|(lsu_req_q) == 1'b0 & lsu_tokens_q != 2'b00) | (power_managed_q[0] == 1'b1 & power_managed_q[2] == 1'b1))
               begin
                  inv_seq_snoop_inprogress = 1'b0;
                  inv_seq_snoop_done = 1'b1;
                  inv_seq_hold_done = {`MM_THREADS{1'b1}};
                  inv_seq_global_barrier_done = 1'b1;
                  inv_seq_d = InvSeq_Idle;  // all done.. go idle
               end
               else
               begin
                  inv_seq_snoop_inprogress = 1'b1;
                  inv_seq_d = InvSeq_Stg15;
               end

            //---------  Local MMUCSR0 tlb0fi bit set for full invalidates
            InvSeq_Stg16 :
            // locally sourced full invalidate action 1
            //  let hold_req be asserted
               begin
                  inv_seq_tlb0fi_inprogress = 1'b1;
                  if (&(hold_ack_q) == 1'b1)
                     inv_seq_d = InvSeq_Stg17;
                  else if (htw_lsu_req_valid == 1'b1)
                     // table walk load request from htw; could be ucode, so service it
                     inv_seq_d = InvSeq_Stg22;
                  else
                     inv_seq_d = InvSeq_Stg16;
               end

            InvSeq_Stg17 :
            // locally sourced full invalidate action 2
               begin
                  inv_seq_tlb0fi_inprogress = 1'b1;
                  if (iu_mm_lmq_empty == 1'b1 & xu_mm_lmq_stq_empty == 1'b1 & xu_mm_ccr2_notlb_q[0] == MMU_Mode_Value)
                     //  invalidate the TLB
                     inv_seq_d = InvSeq_Stg18;
                  else if (iu_mm_lmq_empty == 1'b1 & xu_mm_lmq_stq_empty == 1'b1)
                     //  invalidate the ERATs only
                     inv_seq_d = InvSeq_Stg20;
                  else if (htw_lsu_req_valid == 1'b1)
                     // table walk load request from htw; could hang waiting on empty, so service it
                     inv_seq_d = InvSeq_Stg22;
                  else
                     inv_seq_d = InvSeq_Stg17;   // let fetches/loads/stores drain
               end

            InvSeq_Stg18 :
            // locally sourced full invalidate action 3
            //  invalidate the TLB
               begin
                  inv_seq_tlb0fi_inprogress = 1'b1;
                  inv_seq_tlb_snoop_val = 1'b1;
                  inv_seq_d = InvSeq_Stg19;
               end

            InvSeq_Stg19 :
            // locally sourced full invalidate action 4
               begin
                  inv_seq_tlb0fi_inprogress = 1'b1;
                  if (snoop_ack_q[2] == 1'b1)
                     inv_seq_d = InvSeq_Stg20;
                  else
                     inv_seq_d = InvSeq_Stg19;
               end

            InvSeq_Stg20 :
            // locally sourced full invalidate action 5
             //  invalidate the ERAT's after TLB copy(s) destroyed
               begin
                  inv_seq_tlb0fi_inprogress = 1'b1;
                  inv_seq_ierat_snoop_val = 1'b1;
                  inv_seq_derat_snoop_val = 1'b1;
                  inv_seq_d = InvSeq_Stg21;
               end

            InvSeq_Stg21 :
            // locally sourced full invalidate action 6
               if (snoop_ack_q[0:1] == 2'b11)
               begin
                  inv_seq_tlb0fi_inprogress = 1'b0;
                  inv_seq_tlb0fi_done = 1'b1;
                  inv_seq_hold_done = {`MM_THREADS{1'b1}};
                  inv_seq_d = InvSeq_Idle;  // go idle..
               end
               else
               begin
                  inv_seq_tlb0fi_inprogress = 1'b1;
                  inv_seq_d = InvSeq_Stg21;
               end

            InvSeq_Stg22 :
               // locally sourced table walker load request overlaps with locally sourced full invalidate service from Stg16
               begin
                  inv_seq_tlb0fi_inprogress = 1'b1;
                  if (lsu_tokens_q != 2'b00)
                  begin
                     inv_seq_htw_load = 1'b1;
                     htw_lsu_req_taken_sig = 1'b1;
                     inv_seq_d = InvSeq_Stg16;  // back to where you came from
                  end
                  else
                     inv_seq_d = InvSeq_Stg22; // wait for tokens
               end

            InvSeq_Stg23 :
               // locally sourced table walker load request overlaps with locally sourced local invalidate service from Stg2
               begin
                  inv_seq_local_inprogress = 1'b1;
                  if (lsu_tokens_q != 2'b00)
                  begin
                     inv_seq_htw_load = 1'b1;
                     htw_lsu_req_taken_sig = 1'b1;
                     inv_seq_d = InvSeq_Stg2;  // back to where you came from
                  end
                  else
                     inv_seq_d = InvSeq_Stg23; // wait for tokens
               end

            //---------  Local tlbwe from tlb_cmp for erat back invalidates
            InvSeq_Stg24 :
            // locally sourced tlbwe erat back invalidate action 1
            //  let hold_req be asserted
               begin
                  inv_seq_tlbwe_inprogress = 1'b1;
                  if (&(hold_ack_q | tlbwe_back_inv_q[0:`MM_THREADS-1]) == 1'b1)
                     // this thread held, other threads held and flushed
                     inv_seq_d = InvSeq_Stg25;
                  else if (htw_lsu_req_valid == 1'b1)
                     // table walk load request from htw; could be ucode, so service it
                     inv_seq_d = InvSeq_Stg29;
                  else
                     inv_seq_d = InvSeq_Stg24;
               end

            InvSeq_Stg25 :
            // locally sourced tlbwe erat back invalidate action 2
               begin
                  inv_seq_tlbwe_inprogress = 1'b1;
                  if (iu_mm_lmq_empty == 1'b1 & xu_mm_lmq_stq_empty == 1'b1)
                     //  invalidate the erats
                     inv_seq_d = InvSeq_Stg26;
                  else if (htw_lsu_req_valid == 1'b1)
                     // table walk load request from htw; could hang waiting on empty, so service it
                     inv_seq_d = InvSeq_Stg29;
                  else
                     inv_seq_d = InvSeq_Stg25; // let fetches/loads/stores drain
               end

            InvSeq_Stg26 :
            // locally sourced tlbwe erat back invalidate action 3
             //  invalidate the ERAT's after TLB copy(s) destroyed
               begin
                  inv_seq_tlbwe_inprogress = 1'b1;
                  inv_seq_ierat_snoop_val = 1'b1;
                  inv_seq_derat_snoop_val = 1'b1;
                  inv_seq_d = InvSeq_Stg27;
               end

            InvSeq_Stg27 :
            // locally sourced tlbwe erat back invalidate action 4
               if (snoop_ack_q[0:1] == 2'b11)
               begin
                  inv_seq_tlbwe_inprogress = 1'b0;
                  inv_seq_tlbwe_snoop_done = 1'b1;
                  inv_seq_hold_done = {`MM_THREADS{1'b1}};
                  inv_seq_d = InvSeq_Idle;
               end
               else
               begin
                  inv_seq_tlbwe_inprogress = 1'b1;
                  inv_seq_d = InvSeq_Stg27;
               end

            InvSeq_Stg28 :
            // locally sourced table walker load request overlaps with bus snoop service from Stg8
               begin
                  inv_seq_snoop_inprogress = 1'b1;
                  if (lsu_tokens_q != 2'b00)  // have tokens
                  begin
                     inv_seq_htw_load = 1'b1;
                     htw_lsu_req_taken_sig = 1'b1;
                     inv_seq_d = InvSeq_Stg8;  // back to where you came from
                  end
                  else
                     inv_seq_d = InvSeq_Stg28; // wait for tokens
               end

            InvSeq_Stg29 :
            // locally sourced table walker load request overlaps with locally sourced tlbwe erat back invalidate service from Stg24
               begin
                  inv_seq_tlbwe_inprogress = 1'b1;
                  if (lsu_tokens_q != 2'b00)  // have tokens
                  begin
                     inv_seq_htw_load = 1'b1;
                     htw_lsu_req_taken_sig = 1'b1;
                     inv_seq_d = InvSeq_Stg24;  // back to where you came from
                  end
                  else
                     inv_seq_d = InvSeq_Stg29; // wait for tokens
               end

            //-------- Hardware Table Walker requests to LSU
            InvSeq_Stg31 :
               if (lsu_tokens_q != 2'b00)  // have tokens
               begin
                  inv_seq_htw_load = 1'b1;
                  htw_lsu_req_taken_sig = 1'b1;
                  inv_seq_d = InvSeq_Idle;
               end
               else
                  inv_seq_d = InvSeq_Stg31; // wait for tokens
            default :
               inv_seq_d = InvSeq_Idle;
         endcase
      end

      assign hold_req_d = inv_seq_hold_req;
      assign hold_done_d = inv_seq_hold_done;
      // added
      //  1. locally sourced local invalidate - hold all threads, flush other threads, not thread doing current op
      //  2. locally sourced tlbwe with back invalidate - hold all threads, flush other threads, not thread doing current op
      //  3. locally sourced mmucsr0.tlb0fi spr bit set - hold and flush all threads
      //  4. bus snoop handled elsewhere by dedicated bus_snoop_hold interface to do early hold and flush all threads
      assign iu_flush_req_d[0] = ((~(ex6_valid_q[0])) & inv_seq_local_barrier_set) | ((~(tlbwe_back_inv_q[0])) & inv_seq_hold_req[0] & inv_seq_tlbwe_inprogress) | (inv_seq_hold_req[0] & inv_seq_tlb0fi_inprogress);
`ifdef MM_THREADS2
      assign iu_flush_req_d[1] = ((~(ex6_valid_q[1])) & inv_seq_local_barrier_set) | ((~(tlbwe_back_inv_q[1])) & inv_seq_hold_req[1] & inv_seq_tlbwe_inprogress) | (inv_seq_hold_req[1] & inv_seq_tlb0fi_inprogress);
`endif
      assign inv_seq_inprogress_d[0] = inv_seq_snoop_inprogress;
      assign inv_seq_inprogress_d[1] = inv_seq_snoop_inprogress;
      assign inv_seq_inprogress_d[2] = inv_seq_tlb0fi_inprogress;
      assign inv_seq_inprogress_d[3] = inv_seq_tlb0fi_inprogress;
      assign inv_seq_inprogress_d[4] = inv_seq_tlbwe_inprogress;
      assign inv_seq_inprogress_d[5] = inv_seq_tlbwe_inprogress;
      assign inv_seq_snoop_inprogress_q[0] = inv_seq_inprogress_q[0];
      assign inv_seq_snoop_inprogress_q[1] = inv_seq_inprogress_q[1];
      assign inv_seq_tlb0fi_inprogress_q[0] = inv_seq_inprogress_q[2];
      assign inv_seq_tlb0fi_inprogress_q[1] = inv_seq_inprogress_q[3];
      assign inv_seq_tlbwe_inprogress_q[0] = inv_seq_inprogress_q[4];
      assign inv_seq_tlbwe_inprogress_q[1] = inv_seq_inprogress_q[5];
      assign hold_ack_d[0] = ((inv_seq_local_done == 1'b1 | inv_seq_tlb0fi_done == 1'b1 | inv_seq_tlbwe_snoop_done == 1'b1)) ? 1'b0 :
                             (hold_ack_q[0] == 1'b0) ? iu_mm_hold_ack[0] :
                             hold_ack_q[0];
`ifdef MM_THREADS2
      assign hold_ack_d[1] = ((inv_seq_local_done == 1'b1 | inv_seq_tlb0fi_done == 1'b1 | inv_seq_tlbwe_snoop_done == 1'b1)) ? 1'b0 :
                             (hold_ack_q[1] == 1'b0) ? iu_mm_hold_ack[1] :
                             hold_ack_q[1];
`endif

      always @(bus_snoop_seq_q or inval_snoop_forme or bus_snoop_hold_ack_q or inv_seq_snoop_done or power_managed_q)
      begin: Bus_Snoop_Sequencer
         bus_snoop_seq_idle = 1'b0;
         bus_snoop_seq_hold_req = 1'b0;
         bus_snoop_seq_ready = 1'b0;
         bus_snoop_seq_done = 1'b0;
         case (bus_snoop_seq_q)
            SnoopSeq_Idle :
               if (inval_snoop_forme == 1'b1)
               begin
                  bus_snoop_seq_idle = 1'b0;
                  bus_snoop_seq_hold_req = 1'b1;
                  bus_snoop_seq_d = SnoopSeq_Stg1;
               end
               else
               begin
                  bus_snoop_seq_idle = 1'b1;
                  bus_snoop_seq_d = SnoopSeq_Idle;
               end
            SnoopSeq_Stg1 :
               if (&(bus_snoop_hold_ack_q) == 1'b1 | (power_managed_q[0] == 1'b1 & power_managed_q[2] == 1'b1))
                  bus_snoop_seq_d = SnoopSeq_Stg3;
               else
                  bus_snoop_seq_d = SnoopSeq_Stg1;

            SnoopSeq_Stg3 :
               begin
                  bus_snoop_seq_ready = 1'b1;
                  if (inv_seq_snoop_done == 1'b1)
                     bus_snoop_seq_d = SnoopSeq_Stg2;
                  else
                     bus_snoop_seq_d = SnoopSeq_Stg3;
               end

            SnoopSeq_Stg2 :
               begin
                  bus_snoop_seq_done = 1'b1;
                  bus_snoop_seq_d = SnoopSeq_Idle;
               end

            default :
               bus_snoop_seq_d = SnoopSeq_Idle;
         endcase
      end
      assign bus_snoop_hold_req_d[0] = bus_snoop_seq_hold_req;
      assign bus_snoop_hold_done_d[0] = bus_snoop_seq_done;
      assign bus_snoop_hold_ack_d[0] = ((inv_seq_snoop_done == 1'b1)) ? 1'b0 :
                                       (bus_snoop_hold_ack_q[0] == 1'b0) ? iu_mm_bus_snoop_hold_ack[0] :
                                       bus_snoop_hold_ack_q[0];
`ifdef MM_THREADS2
      assign bus_snoop_hold_req_d[1] = bus_snoop_seq_hold_req;
      assign bus_snoop_hold_done_d[1] = bus_snoop_seq_done;
      assign bus_snoop_hold_ack_d[1] = ((inv_seq_snoop_done == 1'b1)) ? 1'b0 :
                                       (bus_snoop_hold_ack_q[1] == 1'b0) ? iu_mm_bus_snoop_hold_ack[1] :
                                       bus_snoop_hold_ack_q[1];
`endif
      assign mm_iu_hold_req = hold_req_q;
      assign mm_iu_hold_done = hold_done_q;
      assign mm_iu_flush_req = iu_flush_req_q;
      assign mm_iu_bus_snoop_hold_req = bus_snoop_hold_req_q;
      assign mm_iu_bus_snoop_hold_done = bus_snoop_hold_done_q;
      assign mm_iu_tlbi_complete = tlbi_complete_q;
      assign mm_xu_illeg_instr = ex7_illeg_instr_q;
      assign mm_xu_illeg_instr_ored = |(ex7_illeg_instr_q);
      assign mm_xu_ex3_flush_req = ex3_flush_req_q;
      assign mm_xu_local_snoop_reject = ex4_ivax_lpid_reject_q;
      assign mmq_inval_tlb0fi_done = inv_seq_tlb0fi_done;
      assign mm_xu_ord_n_flush_req = ex3_flush_req_q;
      assign mm_xu_ord_np1_flush_req = ord_np1_flush_q;
      assign mm_xu_ord_read_done = ord_read_done_q;
      assign mm_xu_ord_write_done = ord_write_done_q;
      assign mm_xu_ord_n_flush_req_ored = |(ex3_flush_req_q);
      assign mm_xu_ord_np1_flush_req_ored = |(ord_np1_flush_q);
      assign mm_xu_ord_read_done_ored = |(ord_read_done_q);
      assign mm_xu_ord_write_done_ored = |(ord_write_done_q);
      assign mm_xu_itag_d = ((|(ex2_ttype_q[0:3]) == 1'b1 & (inv_seq_idle == 1'b0 | (|(ex3_valid_q) == 1'b1 & |(ex3_ttype_q[0:3]) == 1'b1) | (|(ex4_valid_q) == 1'b1 & |(ex4_ttype_q[0:3]) == 1'b1) | (|(ex5_valid_q) == 1'b1 & |(ex5_ttype_q[0:3]) == 1'b1) | (|(ex6_valid_q) == 1'b1 & |(ex6_ttype_q[0:3]) == 1'b1)))) ? ex2_itag_q :
                            (|(tlb_ctl_ex2_flush_req) == 1'b1) ? tlb_ctl_ex2_itag :
                            ((tlbwe_back_inv_q[`MM_THREADS] == 1'b1 & cswitch_q[2] == 1'b0)) ? mm_xu_itag_q :
                            tlb_tag4_itag;
      assign mm_xu_itag = mm_xu_itag_q;

      //---------------------------------------------------------------------
      // L2 snoop invalidate capture latch signals
      //---------------------------------------------------------------------
      // seeing an active mmu target snoop with my lpar id
      assign inval_snoop_forme = ( an_ac_back_inv_q[2] & an_ac_back_inv_q[3] & (~(power_managed_q[0] & power_managed_q[1])) & (xu_mm_ccr2_notlb_q[0] == MMU_Mode_Value) & ~mmucr1_q[pos_tlbi_rej] ) |
                                   ( an_ac_back_inv_q[2] & an_ac_back_inv_q[3] & (~(power_managed_q[0] & power_managed_q[1])) & (an_ac_back_inv_lpar_id_q == lpidr_q) );

      // ttype <= tlbilx & tlbivax & eratilx & erativax;
      assign inval_snoop_local_reject = ( an_ac_back_inv_q[2] & an_ac_back_inv_q[3] & (~(power_managed_q[0] & power_managed_q[1])) & an_ac_back_inv_q[7] &
                                            (~(an_ac_back_inv_lpar_id_q == lpidr_q)) & ((xu_mm_ccr2_notlb_q[0] == ERAT_Mode_Value) | mmucr1_q[pos_tlbi_rej]) );

      // local snoop reject mcheck to xu and pc fir's, local core caused snoop, but rejected due to lpid mismatch
      assign local_snoop_reject_d = (global_barrier_q & {`MM_THREADS{inval_snoop_local_reject}}) |
                                       (ex3_ivax_lpid_reject_q & ~ex3_illeg_instr_q & ~ex3_flush_req_q);

      assign local_snoop_reject_ored = |(local_snoop_reject_q);

      //---------------------------------------------------------------------
      // FIR error reporting macro
      //---------------------------------------------------------------------

      tri_direct_err_rpt #(.WIDTH(1)) tlb_snoop_reject_err_rpt(
         .vd(vdd),
         .gd(gnd),
         .err_in(local_snoop_reject_ored),
         .err_out(mm_pc_local_snoop_reject_ored)
      );

      // an_ac_back_inv_q: 0=valid b-1, 1=target b-1, 2=valid b, 3=target b, 4=L, 5=GS, 6=IND, 7=local, 8=reject
      assign an_ac_back_inv_d[0] = an_ac_back_inv;
      assign an_ac_back_inv_d[1] = an_ac_back_inv_target;
      assign an_ac_back_inv_d[2] = (inval_snoop_forme == 1'b0) ? an_ac_back_inv_q[0] :
                                   (inv_seq_snoop_done == 1'b1) ? 1'b0 :
                                   an_ac_back_inv_q[2];
      assign an_ac_back_inv_d[3] = (inval_snoop_forme == 1'b0) ? an_ac_back_inv_q[1] :
                                   (inv_seq_snoop_done == 1'b1) ? 1'b0 :
                                   an_ac_back_inv_q[3];
      assign an_ac_back_inv_d[4] = (inval_snoop_forme == 1'b0) ? an_ac_back_inv_lbit :
                                   an_ac_back_inv_q[4];
      assign an_ac_back_inv_d[5] = (inval_snoop_forme == 1'b0) ? an_ac_back_inv_gs :
                                   an_ac_back_inv_q[5];
      assign an_ac_back_inv_d[6] = (inval_snoop_forme == 1'b0) ? an_ac_back_inv_ind :
                                   an_ac_back_inv_q[6];
      assign an_ac_back_inv_d[7] = (inval_snoop_forme == 1'b0) ? an_ac_back_inv_local :
                                   an_ac_back_inv_q[7];

      // bit 8 is reject back to L2 (b phase) mmu targetted, but lpar id doesn't match (for local or remote snoops)
      assign an_ac_back_inv_d[8] = ( an_ac_back_inv_q[2] & an_ac_back_inv_q[3] & (~(an_ac_back_inv_lpar_id_q == lpidr_q)) & ((xu_mm_ccr2_notlb_q[0] == ERAT_Mode_Value) | mmucr1_q[pos_tlbi_rej]) ) |
                                     ( an_ac_back_inv_q[2] & an_ac_back_inv_q[3] & power_managed_q[0] & power_managed_q[1] );

      assign an_ac_back_inv_addr_d = (inval_snoop_forme == 1'b0) ? an_ac_back_inv_addr :
                                     an_ac_back_inv_addr_q;
      assign an_ac_back_inv_lpar_id_d = (inval_snoop_forme == 1'b0) ? an_ac_back_inv_lpar_id :
                                        an_ac_back_inv_lpar_id_q;
      assign ac_an_back_inv_reject = an_ac_back_inv_q[8];
      // tlbwe back-invalidate to erats request from tlb_cmp
      assign tlbwe_back_inv_d[0:`MM_THREADS-1] = (tlbwe_back_inv_q[`MM_THREADS] == 1'b0) ? tlbwe_back_inv_thdid :
                                     ((tlbwe_back_inv_q[`MM_THREADS] == 1'b1 & tlbwe_back_inv_q[`MM_THREADS+1] == 1'b0 & tlb_tag5_write == 1'b0)) ? {`MM_THREADS{1'b0}} :
                                     (inv_seq_tlbwe_snoop_done == 1'b1) ? {`MM_THREADS{1'b0}} :
                                     tlbwe_back_inv_q[0:`MM_THREADS-1];
      assign tlbwe_back_inv_d[`MM_THREADS] = (tlbwe_back_inv_q[`MM_THREADS] == 1'b0) ? tlbwe_back_inv_valid :
                                               ((tlbwe_back_inv_q[`MM_THREADS] == 1'b1 & tlbwe_back_inv_q[`MM_THREADS+1] == 1'b0 & tlb_tag5_write == 1'b0)) ? 1'b0 :
                                               (inv_seq_tlbwe_snoop_done == 1'b1) ? 1'b0 :
                                                tlbwe_back_inv_q[`MM_THREADS];
      assign tlbwe_back_inv_d[`MM_THREADS+1] = (tlbwe_back_inv_q[`MM_THREADS+1] == 1'b0) ? (tlbwe_back_inv_q[`MM_THREADS] & tlb_tag5_write) :
                                                 (inv_seq_tlbwe_snoop_done == 1'b1) ? 1'b0 :
                                                 tlbwe_back_inv_q[`MM_THREADS+1];
      assign tlbwe_back_inv_addr_d = (tlbwe_back_inv_q[`MM_THREADS] == 1'b0) ? tlbwe_back_inv_addr :
                                        tlbwe_back_inv_addr_q;
      assign tlbwe_back_inv_attr_d = (tlbwe_back_inv_q[`MM_THREADS] == 1'b0) ? tlbwe_back_inv_attr :
                                     tlbwe_back_inv_attr_q;
      assign tlbwe_back_inv_pending = |(tlbwe_back_inv_q[`MM_THREADS:`MM_THREADS+1]);
      //---------------------------------------------------------------------
      // Load/Store unit request interface
      //---------------------------------------------------------------------
      assign htw_lsu_req_taken = htw_lsu_req_taken_sig;
      //  lsu reserves 1 token for mmu.. lsu_tokens_q initialized to 1, this logic provides for expansion >1
      assign lsu_tokens_d = ((xu_mm_lsu_token == 1'b1 & lsu_tokens_q == 2'b00)) ? 2'b01 :
                            ((xu_mm_lsu_token == 1'b1 & lsu_tokens_q == 2'b01)) ? 2'b10 :
                            ((xu_mm_lsu_token == 1'b1 & lsu_tokens_q == 2'b10)) ? 2'b11 :
                            ((|(lsu_req_q) == 1'b1 & lsu_tokens_q == 2'b11)) ? 2'b10 :
                            ((|(lsu_req_q) == 1'b1 & lsu_tokens_q == 2'b10)) ? 2'b01 :
                            ((|(lsu_req_q) == 1'b1 & lsu_tokens_q == 2'b01)) ? 2'b00 :
                            lsu_tokens_q;
      assign lsu_req_d = (lsu_tokens_q == 2'b00) ? {`MM_THREADS{1'b0}} :
                      `ifdef MM_THREADS2
                         (inv_seq_tlbi_complete == 1'b1) ? {1'b1, {`MM_THREADS-1{1'b0}}} :
                      `else
                         (inv_seq_tlbi_complete == 1'b1) ? {1'b1} :
                      `endif
                         (inv_seq_htw_load == 1'b1) ? htw_lsu_thdid :
                         (inv_seq_tlbi_load == 1'b1) ? ex6_valid_q :
                         {`MM_THREADS{1'b0}};
      assign lsu_ttype_d = (inv_seq_tlbi_complete == 1'b1) ? 2'b01 :
                           (inv_seq_htw_load == 1'b1) ? htw_lsu_ttype :
                           {2'b0};
      assign lsu_wimge_d = (inv_seq_htw_load == 1'b1) ? htw_lsu_wimge :
                           {5'b0};
      assign lsu_ubits_d = (inv_seq_htw_load == 1'b1) ? htw_lsu_u :
                           {4'b0};
      //                                            A2 to L2 interface req_ra epn bits for tlbivax op
      //  page size  mmucr1.tlbi_msb    27:30     31:33     34:35     36:39     40:43     44:47     48:51   TLB  w  value
      //      4K           0         EA(27:30) EA(31:33) EA(34:35) EA(36:39) EA(40:43) EA(44:47) EA(48:51)     31
      //     64K           0         EA(27:30) EA(31:33) EA(34:35) EA(36:39) EA(40:43) EA(44:47)  0b0011       31
      //      1M           0         EA(27:30) EA(31:33) EA(34:35) EA(36:39) EA(40:43) EA(27:30)  0b0101       27
      //     16M           0         EA(27:30) EA(31:33) EA(34:35) EA(36:39) EA(23:26) EA(27:30)  0b0111       23
      //    256M           0         EA(27:30) EA(31:33) EA(34:35) EA(19:22) EA(23:26) EA(27:30)  0b1001       19
      //      1G           0         EA(27:30) EA(31:33) EA(17:18) EA(19:22) EA(23:26) EA(27:30)  0b1010       17
      //      4K           1         EA(27:30) EA(31:33) EA(34:35) EA(36:39) EA(40:43) EA(44:47) EA(48:51)     27
      //     64K           1         EA(27:30) EA(31:33) EA(34:35) EA(36:39) EA(40:43) EA(44:47)  0b0011       27
      //      1M           1         EA(27:30) EA(31:33) EA(34:35) EA(36:39) EA(40:43) EA(23:26)  0b0101       23
      //     16M           1         EA(27:30) EA(31:33) EA(34:35) EA(36:39) EA(19:22) EA(23:26)  0b0111       19
      //    256M           1         EA(27:30) EA(31:33) EA(34:35) EA(15:18) EA(19:22) EA(23:26)  0b1001       15
      //      1G           1         EA(27:30) EA(31:33) EA(13:14) EA(15:18) EA(19:22) EA(23:26)  0b1010       13
      //  A2 to L2 interface req_ra for tlbivax op:
      //    22:26 TID(1:5)
      //    27:51 EPN
      //       52 TS
      //       53 TID(0)
      //    54:55 attributes
      //    56:63 TID(6:13)
      assign lsu_addr_d[64 - `REAL_ADDR_WIDTH:64 - `REAL_ADDR_WIDTH + 4] = (inv_seq_htw_load == 1'b1) ? htw_lsu_addr[64 - `REAL_ADDR_WIDTH:64 - `REAL_ADDR_WIDTH + 4] :
                                                                         (inv_seq_tlbi_load == 1'b1) ? ex6_pid_q[`PID_WIDTH - 13:`PID_WIDTH - 9] :
                                                                         lsu_addr_q[64 - `REAL_ADDR_WIDTH:64 - `REAL_ADDR_WIDTH + 4];
      assign lsu_addr_d[64 - `REAL_ADDR_WIDTH + 5:33] = (inv_seq_htw_load == 1'b1) ? htw_lsu_addr[64 - `REAL_ADDR_WIDTH + 5:33] :
                                                       (inv_seq_tlbi_load == 1'b1) ? ex3_ea_q[64 - `REAL_ADDR_WIDTH + 5:33] :
                                                       lsu_addr_q[64 - `REAL_ADDR_WIDTH + 5:33];
      assign lsu_addr_d[34:35] = (inv_seq_htw_load == 1'b1) ? htw_lsu_addr[34:35] :
                                 ((inv_seq_tlbi_load == 1'b1 & mmucr1[pos_tlbi_msb] == 1'b1 & ex6_size_q == TLB_PgSize_1GB)) ? ex3_ea_q[13:14] :
                                 ((inv_seq_tlbi_load == 1'b1 & mmucr1[pos_tlbi_msb] == 1'b0 & ex6_size_q == TLB_PgSize_1GB)) ? ex3_ea_q[17:18] :
                                 (inv_seq_tlbi_load == 1'b1) ? ex3_ea_q[34:35] :
                                 lsu_addr_q[34:35];
      assign lsu_addr_d[36:39] = (inv_seq_htw_load == 1'b1) ? htw_lsu_addr[36:39] :
                                 ((inv_seq_tlbi_load == 1'b1 & mmucr1[pos_tlbi_msb] == 1'b1 & (ex6_size_q == TLB_PgSize_1GB | ex6_size_q == TLB_PgSize_256MB))) ? ex3_ea_q[15:18] :
                                 ((inv_seq_tlbi_load == 1'b1 & mmucr1[pos_tlbi_msb] == 1'b0 & (ex6_size_q == TLB_PgSize_1GB | ex6_size_q == TLB_PgSize_256MB))) ? ex3_ea_q[19:22] :
                                 (inv_seq_tlbi_load == 1'b1) ? ex3_ea_q[36:39] :
                                 lsu_addr_q[36:39];
      assign lsu_addr_d[40:41] = (inv_seq_htw_load == 1'b1) ? htw_lsu_addr[40:41] :
                                 ((inv_seq_tlbi_load == 1'b1 & mmucr1[pos_tlbi_msb] == 1'b1 & (ex6_size_q == TLB_PgSize_1GB | ex6_size_q == TLB_PgSize_256MB | ex6_size_q == TLB_PgSize_16MB))) ? ex3_ea_q[19:20] :
                                 ((inv_seq_tlbi_load == 1'b1 & mmucr1[pos_tlbi_msb] == 1'b0 & (ex6_size_q == TLB_PgSize_1GB | ex6_size_q == TLB_PgSize_256MB | ex6_size_q == TLB_PgSize_16MB))) ? ex3_ea_q[23:24] :
                                 (inv_seq_tlbi_load == 1'b1) ? ex3_ea_q[40:41] :
                                 lsu_addr_q[40:41];
      assign lsu_addr_d[42:43] = (inv_seq_htw_load == 1'b1) ? htw_lsu_addr[42:43] :
                                 ((ex6_isel_q[0] == 1'b1 & inv_seq_tlbi_load == 1'b1)) ? ex6_isel_q[1:2] :
                                 ((ex6_isel_q[0] == 1'b0 & inv_seq_tlbi_load == 1'b1 & mmucr1[pos_tlbi_msb] == 1'b1 & (ex6_size_q == TLB_PgSize_1GB | ex6_size_q == TLB_PgSize_256MB | ex6_size_q == TLB_PgSize_16MB))) ? ex3_ea_q[21:22] :
                                 ((ex6_isel_q[0] == 1'b0 & inv_seq_tlbi_load == 1'b1 & mmucr1[pos_tlbi_msb] == 1'b0 & (ex6_size_q == TLB_PgSize_1GB | ex6_size_q == TLB_PgSize_256MB | ex6_size_q == TLB_PgSize_16MB))) ? ex3_ea_q[25:26] :
                                 ((ex6_isel_q[0] == 1'b0 & inv_seq_tlbi_load == 1'b1)) ? ex3_ea_q[42:43] :
                                 lsu_addr_q[42:43];
      assign lsu_addr_d[44:47] = (inv_seq_htw_load == 1'b1) ? htw_lsu_addr[44:47] :
                                 ((inv_seq_tlbi_load == 1'b1 & mmucr1[pos_tlbi_msb] == 1'b1 & (ex6_size_q == TLB_PgSize_1GB | ex6_size_q == TLB_PgSize_256MB | ex6_size_q == TLB_PgSize_16MB | ex6_size_q == TLB_PgSize_1MB))) ? ex3_ea_q[23:26] :
                                 ((inv_seq_tlbi_load == 1'b1 & mmucr1[pos_tlbi_msb] == 1'b0 & (ex6_size_q == TLB_PgSize_1GB | ex6_size_q == TLB_PgSize_256MB | ex6_size_q == TLB_PgSize_16MB | ex6_size_q == TLB_PgSize_1MB))) ? ex3_ea_q[27:30] :
                                 (inv_seq_tlbi_load == 1'b1) ? ex3_ea_q[44:47] :
                                 lsu_addr_q[44:47];
      assign lsu_addr_d[48:51] = (inv_seq_htw_load == 1'b1) ? htw_lsu_addr[48:51] :
                                 (inv_seq_tlbi_load == 1'b1 & ex6_size_large == 1'b1) ? ex6_size_q[0:3] :
                                 (inv_seq_tlbi_load == 1'b1 & ex6_size_large == 1'b0) ? ex3_ea_q[48:51] :
                                 lsu_addr_q[48:51];
      assign lsu_addr_d[52] = (inv_seq_htw_load == 1'b1) ? htw_lsu_addr[52] :
                              (inv_seq_tlbi_load == 1'b1) ? ex6_ts_q :
                              lsu_addr_q[52];
      assign lsu_addr_d[53] = (inv_seq_htw_load == 1'b1) ? htw_lsu_addr[53] :
                              (inv_seq_tlbi_load == 1'b1) ? ex6_pid_q[0] :
                              lsu_addr_q[53];
      assign lsu_addr_d[54:55] = (inv_seq_htw_load == 1'b1) ? htw_lsu_addr[54:55] :
                                 ((ex6_isel_q[0] == 1'b0 & inv_seq_tlbi_load == 1'b1)) ? ex6_isel_q[1:2] :
                                 ((ex6_isel_q[0] == 1'b1 & inv_seq_tlbi_load == 1'b1)) ? 2'b10 :
                                 lsu_addr_q[54:55];
      assign lsu_addr_d[56:63] = (inv_seq_htw_load == 1'b1) ? htw_lsu_addr[56:63] :
                                 (inv_seq_tlbi_load == 1'b1) ? ex6_pid_q[`PID_WIDTH - 8:`PID_WIDTH - 1] :
                                 lsu_addr_q[56:63];
      assign lsu_lpid_d = (inv_seq_tlbi_load == 1'b1) ? ex6_lpid_q :
                          lsu_lpid_q;
      assign lsu_ind_d = (inv_seq_tlbi_load == 1'b1) ? ex6_ind_q :
                         lsu_ind_q;
      assign lsu_gs_d = (inv_seq_tlbi_load == 1'b1) ? ex6_gs_q :
                        lsu_gs_q;
      assign lsu_lbit_d = ((inv_seq_tlbi_load == 1'b1 & ex6_size_large == 1'b1)) ? 1'b1 :
                          ((inv_seq_tlbi_load == 1'b1 & ex6_size_large == 1'b0)) ? 1'b0 :
                          lsu_lbit_q;
      assign mm_xu_lsu_req = lsu_req_q;
      assign mm_xu_lsu_ttype = lsu_ttype_q;
      assign mm_xu_lsu_wimge = lsu_wimge_q;
      assign mm_xu_lsu_u = lsu_ubits_q;
      assign mm_xu_lsu_addr = lsu_addr_q;
      assign mm_xu_lsu_lpid = lsu_lpid_q;
      assign mm_xu_lsu_ind = lsu_ind_q;
      assign mm_xu_lsu_gs = lsu_gs_q;
      assign mm_xu_lsu_lbit = lsu_lbit_q;
      //---------------------------------------------------------------------
      // Snoop interfaces to erats and tlb
      //---------------------------------------------------------------------
      assign snoop_valid_d[0] = inv_seq_ierat_snoop_val;
      assign snoop_valid_d[1] = inv_seq_derat_snoop_val;
      assign snoop_valid_d[2] = inv_seq_tlb_snoop_val;
      assign snoop_coming_d[0] = inv_seq_tlb0fi_inprogress | inv_seq_tlbwe_inprogress | inv_seq_local_inprogress | inv_seq_snoop_inprogress;
      assign snoop_coming_d[1] = snoop_coming_d[0];
      assign snoop_coming_d[2] = snoop_coming_d[0];
      assign snoop_coming_d[3] = snoop_coming_d[0] | mmucr2_act_override;
      assign snoop_coming_d[4] = snoop_coming_d[0] | mmucr2_act_override;
      generate
         if (`REAL_ADDR_WIDTH > 32)
         begin : gen64_snoop_attr
            assign ex6_tid_nz = |(ex6_pid_q[0:`PID_WIDTH - 1]);
            assign back_inv_tid_nz = |({an_ac_back_inv_addr_q[53], an_ac_back_inv_addr_q[22:26], an_ac_back_inv_addr_q[56:63]});
            assign tlbwe_back_inv_tid_nz = |({tlbwe_back_inv_attr_q[20:25], tlbwe_back_inv_attr_q[6:13]});
            assign snoop_attr_d[0] = (~inv_seq_snoop_inprogress_q[0]);
            assign snoop_attr_d[1:3] = (inv_seq_snoop_inprogress_q[0] == 1'b1 & an_ac_back_inv_addr_q[54:55] == 2'b10) ? {1'b1, an_ac_back_inv_addr_q[42:43]} :
                                       (inv_seq_snoop_inprogress_q[0] == 1'b1 & an_ac_back_inv_addr_q[54:55] != 2'b10) ? {1'b0, an_ac_back_inv_addr_q[54:55]} :
                                       (inv_seq_tlbwe_inprogress_q[0] == 1'b1) ? 3'b011 :
                                       (ex6_isel_q[0:2] & {3{(~inv_seq_tlb0fi_inprogress_q[0])}});
            assign snoop_attr_d[4:13] = (inv_seq_snoop_inprogress_q[0] == 1'b1) ? {an_ac_back_inv_q[5], an_ac_back_inv_addr_q[52], an_ac_back_inv_addr_q[56:63]} :
                                        (inv_seq_tlbwe_inprogress_q[0] == 1'b1) ? tlbwe_back_inv_attr_q[4:13] :
                                        {ex6_gs_q, ex6_ts_q, ex6_pid_q[`PID_WIDTH - 8:`PID_WIDTH - 1]};
            assign snoop_attr_d[14:17] = (inv_seq_snoop_inprogress_q[0] == 1'b1 & an_ac_back_inv_q[4] == 1'b0) ? 4'b0001 :
                                         (inv_seq_snoop_inprogress_q[0] == 1'b1 & an_ac_back_inv_q[4] == 1'b1) ? an_ac_back_inv_addr_q[48:51] :
                                         (inv_seq_tlbwe_inprogress_q[0] == 1'b1) ? tlbwe_back_inv_attr_q[14:17] :
                                         ex6_size_q[0:3];
            assign snoop_attr_d[18] = (~inv_seq_tlbwe_inprogress_q[0]) | (~tlbwe_back_inv_attr_q[18]);
            assign snoop_attr_d[19] = (inv_seq_snoop_inprogress_q[0] == 1'b1) ? back_inv_tid_nz :
                                      (inv_seq_tlbwe_inprogress_q[0] == 1'b1) ? tlbwe_back_inv_tid_nz :
                                      ex6_tid_nz;
            assign snoop_attr_tlb_spec_d[18] = 1'b0;
            assign snoop_attr_tlb_spec_d[19] = inv_seq_tlb0fi_inprogress_q[0];
            assign snoop_attr_d[20:25] = (inv_seq_snoop_inprogress_q[0] == 1'b1) ? {an_ac_back_inv_addr_q[53], an_ac_back_inv_addr_q[22:26]} :
                                         (inv_seq_tlbwe_inprogress_q[0] == 1'b1) ? tlbwe_back_inv_attr_q[20:25] :
                                         ex6_pid_q[`PID_WIDTH - 14:`PID_WIDTH - 9];
            assign snoop_attr_d[26:33] = (inv_seq_snoop_inprogress_q[0] == 1'b1) ? an_ac_back_inv_lpar_id_q :
                                         (inv_seq_tlbwe_inprogress_q[0] == 1'b1) ? tlbwe_back_inv_attr_q[26:33] :
                                         (inv_seq_tlb0fi_inprogress_q[0] == 1'b1) ? lpidr_q :
                                         ex6_lpid_q;
            assign snoop_attr_d[34] = (inv_seq_snoop_inprogress_q[0] == 1'b1) ? an_ac_back_inv_q[6] :
                                      (inv_seq_tlbwe_inprogress_q[0] == 1'b1) ? tlbwe_back_inv_attr_q[34] :
                                      ex6_ind_q;
            assign snoop_attr_clone_d[0] = (~inv_seq_snoop_inprogress_q[1]);
            assign snoop_attr_clone_d[1:3] = (inv_seq_snoop_inprogress_q[1] == 1'b1 & an_ac_back_inv_addr_q[54:55] == 2'b10) ? {1'b1, an_ac_back_inv_addr_q[42:43]} :
                                             (inv_seq_snoop_inprogress_q[1] == 1'b1 & an_ac_back_inv_addr_q[54:55] != 2'b10) ? {1'b0, an_ac_back_inv_addr_q[54:55]} :
                                             (inv_seq_tlbwe_inprogress_q[1] == 1'b1) ? 3'b011 :
                                             (ex6_isel_q[0:2] & {3{(~inv_seq_tlb0fi_inprogress_q[1])}});
            assign snoop_attr_clone_d[4:13] = (inv_seq_snoop_inprogress_q[1] == 1'b1) ? {an_ac_back_inv_q[5], an_ac_back_inv_addr_q[52], an_ac_back_inv_addr_q[56:63]} :
                                              (inv_seq_tlbwe_inprogress_q[1] == 1'b1) ? tlbwe_back_inv_attr_q[4:13] :
                                              {ex6_gs_q, ex6_ts_q, ex6_pid_q[`PID_WIDTH - 8:`PID_WIDTH - 1]};
            assign snoop_attr_clone_d[14:17] = (inv_seq_snoop_inprogress_q[1] == 1'b1 & an_ac_back_inv_q[4] == 1'b0) ? 4'b0001 :
                                               (inv_seq_snoop_inprogress_q[1] == 1'b1 & an_ac_back_inv_q[4] == 1'b1) ? an_ac_back_inv_addr_q[48:51] :
                                               (inv_seq_tlbwe_inprogress_q[1] == 1'b1) ? tlbwe_back_inv_attr_q[14:17] :
                                               ex6_size_q[0:3];
            assign snoop_attr_clone_d[18] = (~inv_seq_tlbwe_inprogress_q[1]) | (~tlbwe_back_inv_attr_q[18]);
            assign snoop_attr_clone_d[19] = (inv_seq_snoop_inprogress_q[1] == 1'b1) ? back_inv_tid_nz :
                                            (inv_seq_tlbwe_inprogress_q[1] == 1'b1) ? tlbwe_back_inv_tid_nz :
                                            ex6_tid_nz;
            assign snoop_attr_clone_d[20:25] = (inv_seq_snoop_inprogress_q[1] == 1'b1) ? {an_ac_back_inv_addr_q[53], an_ac_back_inv_addr_q[22:26]} :
                                               (inv_seq_tlbwe_inprogress_q[1] == 1'b1) ? tlbwe_back_inv_attr_q[20:25] :
                                               ex6_pid_q[`PID_WIDTH - 14:`PID_WIDTH - 9];
         end
      endgenerate
      generate
         if (`REAL_ADDR_WIDTH < 33)
         begin : gen32_snoop_attr
            assign ex6_tid_nz = |(ex6_pid_q[0:`PID_WIDTH - 1]);
            assign back_inv_tid_nz = |(an_ac_back_inv_addr_q[56:63]);
            assign tlbwe_back_inv_tid_nz = |({tlbwe_back_inv_attr_q[20:25], tlbwe_back_inv_attr_q[6:13]});
            assign snoop_attr_d[0] = (~inv_seq_snoop_inprogress_q[0]);
            assign snoop_attr_d[1:3] = (inv_seq_snoop_inprogress_q[0] == 1'b1 & an_ac_back_inv_addr_q[54:55] == 2'b10) ? {1'b1, an_ac_back_inv_addr_q[42:43]} :
                                       (inv_seq_snoop_inprogress_q[0] == 1'b1 & an_ac_back_inv_addr_q[54:55] != 2'b10) ? {1'b0, an_ac_back_inv_addr_q[54:55]} :
                                       (inv_seq_tlbwe_inprogress_q[0] == 1'b1) ? 3'b011 :
                                       ex6_isel_q[0:2];
            assign snoop_attr_d[4:13] = (inv_seq_snoop_inprogress_q[0] == 1'b1) ? {an_ac_back_inv_q[5], an_ac_back_inv_addr_q[52], an_ac_back_inv_addr_q[56:63]} :
                                        (inv_seq_tlbwe_inprogress_q[0] == 1'b1) ? tlbwe_back_inv_attr_q[4:13] :
                                        {ex6_gs_q, ex6_ts_q, ex6_pid_q[`PID_WIDTH - 8:`PID_WIDTH - 1]};
            assign snoop_attr_d[14:17] = (inv_seq_snoop_inprogress_q[0] == 1'b1 & an_ac_back_inv_q[4] == 1'b0) ? 4'b0001 :
                                         (inv_seq_snoop_inprogress_q[0] == 1'b1 & an_ac_back_inv_q[4] == 1'b1) ? an_ac_back_inv_addr_q[48:51] :
                                         (inv_seq_tlbwe_inprogress_q[0] == 1'b1) ? tlbwe_back_inv_attr_q[14:17] :
                                         ex6_size_q[0:3];
            assign snoop_attr_d[18] = (~inv_seq_tlbwe_inprogress_q[0]) | (~tlbwe_back_inv_attr_q[18]);
            assign snoop_attr_d[19] = (inv_seq_snoop_inprogress_q[0] == 1'b1) ? back_inv_tid_nz :
                                      (inv_seq_tlbwe_inprogress_q[0] == 1'b1) ? tlbwe_back_inv_tid_nz :
                                      ex6_tid_nz;
            assign snoop_attr_tlb_spec_d[18] = 1'b0;
            assign snoop_attr_tlb_spec_d[19] = inv_seq_tlb0fi_inprogress_q[0];
            assign snoop_attr_d[20:25] = (inv_seq_snoop_inprogress_q[0] == 1'b1) ? {6{1'b0}} :
                                         (inv_seq_tlbwe_inprogress_q[0] == 1'b1) ? tlbwe_back_inv_attr_q[20:25] :
                                         ex6_pid_q[`PID_WIDTH - 14:`PID_WIDTH - 9];
            assign snoop_attr_d[26:33] = (inv_seq_snoop_inprogress_q[0] == 1'b1) ? an_ac_back_inv_lpar_id_q :
                                         (inv_seq_tlbwe_inprogress_q[0] == 1'b1) ? tlbwe_back_inv_attr_q[26:33] :
                                         (inv_seq_tlb0fi_inprogress_q[0] == 1'b1) ? lpidr_q :
                                         ex6_lpid_q;
            assign snoop_attr_d[34] = (inv_seq_snoop_inprogress_q[0] == 1'b1) ? an_ac_back_inv_q[6] :
                                      (inv_seq_tlbwe_inprogress_q[0] == 1'b1) ? tlbwe_back_inv_attr_q[34] :
                                      ex6_ind_q;
            assign snoop_attr_clone_d[0] = (~inv_seq_snoop_inprogress_q[1]);
            assign snoop_attr_clone_d[1:3] = (inv_seq_snoop_inprogress_q[1] == 1'b1 & an_ac_back_inv_addr_q[54:55] == 2'b10) ? {1'b1, an_ac_back_inv_addr_q[42:43]} :
                                             (inv_seq_snoop_inprogress_q[1] == 1'b1 & an_ac_back_inv_addr_q[54:55] != 2'b10) ? {1'b0, an_ac_back_inv_addr_q[54:55]} :
                                             (inv_seq_tlbwe_inprogress_q[1] == 1'b1) ? 3'b011 :
                                             ex6_isel_q[0:2];
            assign snoop_attr_clone_d[4:13] = (inv_seq_snoop_inprogress_q[1] == 1'b1) ? {an_ac_back_inv_q[5], an_ac_back_inv_addr_q[52], an_ac_back_inv_addr_q[56:63]} :
                                              (inv_seq_tlbwe_inprogress_q[1] == 1'b1) ? tlbwe_back_inv_attr_q[4:13] :
                                              {ex6_gs_q, ex6_ts_q, ex6_pid_q[`PID_WIDTH - 8:`PID_WIDTH - 1]};
            assign snoop_attr_clone_d[14:17] = (inv_seq_snoop_inprogress_q[1] == 1'b1 & an_ac_back_inv_q[4] == 1'b0) ? 4'b0001 :
                                               (inv_seq_snoop_inprogress_q[1] == 1'b1 & an_ac_back_inv_q[4] == 1'b1) ? an_ac_back_inv_addr_q[48:51] :
                                               (inv_seq_tlbwe_inprogress_q[1] == 1'b1) ? tlbwe_back_inv_attr_q[14:17] :
                                               ex6_size_q[0:3];
            assign snoop_attr_clone_d[18] = (~inv_seq_tlbwe_inprogress_q[1]) | (~tlbwe_back_inv_attr_q[18]);
            assign snoop_attr_clone_d[19] = (inv_seq_snoop_inprogress_q[1] == 1'b1) ? back_inv_tid_nz :
                                            (inv_seq_tlbwe_inprogress_q[1] == 1'b1) ? tlbwe_back_inv_tid_nz :
                                            ex6_tid_nz;
            assign snoop_attr_clone_d[20:25] = (inv_seq_snoop_inprogress_q[1] == 1'b1) ? {6{1'b0}} :
                                               (inv_seq_tlbwe_inprogress_q[1] == 1'b1) ? tlbwe_back_inv_attr_q[20:25] :
                                               ex6_pid_q[`PID_WIDTH - 14:`PID_WIDTH - 9];
         end
      endgenerate
      //                                            A2 to L2 interface req_ra epn bits for tlbivax op
      //  page size  mmucr1.tlbi_msb    27:30     31:33     34:35     36:39     40:43     44:47     48:51   TLB  w  value
      //      4K           0         EA(27:30) EA(31:33) EA(34:35) EA(36:39) EA(40:43) EA(44:47) EA(48:51)     31
      //     64K           0         EA(27:30) EA(31:33) EA(34:35) EA(36:39) EA(40:43) EA(44:47)  0b0011       31
      //      1M           0         EA(27:30) EA(31:33) EA(34:35) EA(36:39) EA(40:43) EA(27:30)  0b0101       27
      //     16M           0         EA(27:30) EA(31:33) EA(34:35) EA(36:39) EA(23:26) EA(27:30)  0b0111       23
      //    256M           0         EA(27:30) EA(31:33) EA(34:35) EA(19:22) EA(23:26) EA(27:30)  0b1001       19
      //      1G           0         EA(27:30) EA(31:33) EA(17:18) EA(19:22) EA(23:26) EA(27:30)  0b1010       17
      //      4K           1         EA(27:30) EA(31:33) EA(34:35) EA(36:39) EA(40:43) EA(44:47) EA(48:51)     27
      //     64K           1         EA(27:30) EA(31:33) EA(34:35) EA(36:39) EA(40:43) EA(44:47)  0b0011       27
      //      1M           1         EA(27:30) EA(31:33) EA(34:35) EA(36:39) EA(40:43) EA(23:26)  0b0101       23
      //     16M           1         EA(27:30) EA(31:33) EA(34:35) EA(36:39) EA(19:22) EA(23:26)  0b0111       19
      //    256M           1         EA(27:30) EA(31:33) EA(34:35) EA(15:18) EA(19:22) EA(23:26)  0b1001       15
      //      1G           1         EA(27:30) EA(31:33) EA(13:14) EA(15:18) EA(19:22) EA(23:26)  0b1010       13
      //  A2 to L2 interface req_ra for tlbivax op:
      //    22:26 TID(1:5)
      //    27:51 EPN
      //       52 TS
      //       53 TID(0)
      //    54:55 attributes
      //    56:63 TID(6:13)
      generate
         if ((`RS_DATA_WIDTH > `EPN_WIDTH - 1) & (`EPN_WIDTH > `REAL_ADDR_WIDTH))
         begin : gen_rs_gte_epn_snoop_vpn
            assign snoop_vpn_d[52 - `EPN_WIDTH:12] = (inv_seq_snoop_inprogress_q[0] == 1'b1) ? {13{1'b0}} :
                                                    (inv_seq_tlbwe_inprogress_q[0] == 1'b1) ? tlbwe_back_inv_addr_q[0:12] :
                                                    ex3_ea_q[52 - `EPN_WIDTH:12];
            assign snoop_vpn_d[13:14] = ((inv_seq_snoop_inprogress_q[0] == 1'b1 & an_ac_back_inv_q[4] == 1'b1 & mmucr1_q[pos_tlbi_msb] == 1'b1 & an_ac_back_inv_addr_q[48:51] == TLB_PgSize_1GB)) ? an_ac_back_inv_addr_q[34:35] :
                                        (inv_seq_snoop_inprogress_q[0] == 1'b1) ? {2{1'b0}} :
                                        (inv_seq_tlbwe_inprogress_q[0] == 1'b1) ? tlbwe_back_inv_addr_q[13:14] :
                                        ex3_ea_q[13:14];
            assign snoop_vpn_d[15:16] = ((inv_seq_snoop_inprogress_q[0] == 1'b1 & an_ac_back_inv_q[4] == 1'b1 & mmucr1_q[pos_tlbi_msb] == 1'b1 & (an_ac_back_inv_addr_q[48:51] == TLB_PgSize_1GB | an_ac_back_inv_addr_q[48:51] == TLB_PgSize_256MB))) ? an_ac_back_inv_addr_q[36:37] :
                                        (inv_seq_snoop_inprogress_q[0] == 1'b1) ? {2{1'b0}} :
                                        (inv_seq_tlbwe_inprogress_q[0] == 1'b1) ? tlbwe_back_inv_addr_q[15:16] :
                                        ex3_ea_q[15:16];
            assign snoop_vpn_d[17:18] = ((inv_seq_snoop_inprogress_q[0] == 1'b1 & an_ac_back_inv_q[4] == 1'b1 & mmucr1_q[pos_tlbi_msb] == 1'b1 & (an_ac_back_inv_addr_q[48:51] == TLB_PgSize_1GB | an_ac_back_inv_addr_q[48:51] == TLB_PgSize_256MB))) ? an_ac_back_inv_addr_q[38:39] :
                                        ((inv_seq_snoop_inprogress_q[0] == 1'b1 & an_ac_back_inv_q[4] == 1'b1 & mmucr1_q[pos_tlbi_msb] == 1'b0 & an_ac_back_inv_addr_q[48:51] == TLB_PgSize_1GB)) ? an_ac_back_inv_addr_q[34:35] :
                                        (inv_seq_snoop_inprogress_q[0] == 1'b1) ? {2{1'b0}} :
                                        (inv_seq_tlbwe_inprogress_q[0] == 1'b1) ? tlbwe_back_inv_addr_q[17:18] :
                                        ex3_ea_q[17:18];
            assign snoop_vpn_d[19:22] = ((inv_seq_snoop_inprogress_q[0] == 1'b1 & an_ac_back_inv_q[4] == 1'b1 & mmucr1_q[pos_tlbi_msb] == 1'b1 & (an_ac_back_inv_addr_q[48:51] == TLB_PgSize_1GB | an_ac_back_inv_addr_q[48:51] == TLB_PgSize_256MB | an_ac_back_inv_addr_q[48:51] == TLB_PgSize_16MB))) ? an_ac_back_inv_addr_q[40:43] :
                                        ((inv_seq_snoop_inprogress_q[0] == 1'b1 & an_ac_back_inv_q[4] == 1'b1 & mmucr1_q[pos_tlbi_msb] == 1'b0 & (an_ac_back_inv_addr_q[48:51] == TLB_PgSize_1GB | an_ac_back_inv_addr_q[48:51] == TLB_PgSize_256MB))) ? an_ac_back_inv_addr_q[36:39] :
                                        (inv_seq_snoop_inprogress_q[0] == 1'b1) ? {4{1'b0}} :
                                        (inv_seq_tlbwe_inprogress_q[0] == 1'b1) ? tlbwe_back_inv_addr_q[19:22] :
                                        ex3_ea_q[19:22];
            assign snoop_vpn_d[23:26] = ((inv_seq_snoop_inprogress_q[0] == 1'b1 & an_ac_back_inv_q[4] == 1'b1 & mmucr1_q[pos_tlbi_msb] == 1'b1 & (an_ac_back_inv_addr_q[48:51] == TLB_PgSize_1GB | an_ac_back_inv_addr_q[48:51] == TLB_PgSize_256MB | an_ac_back_inv_addr_q[48:51] == TLB_PgSize_16MB | an_ac_back_inv_addr_q[48:51] == TLB_PgSize_1MB))) ? an_ac_back_inv_addr_q[44:47] :
                                        ((inv_seq_snoop_inprogress_q[0] == 1'b1 & an_ac_back_inv_q[4] == 1'b1 & mmucr1_q[pos_tlbi_msb] == 1'b0 & (an_ac_back_inv_addr_q[48:51] == TLB_PgSize_1GB | an_ac_back_inv_addr_q[48:51] == TLB_PgSize_256MB | an_ac_back_inv_addr_q[48:51] == TLB_PgSize_16MB))) ? an_ac_back_inv_addr_q[40:43] :
                                        (inv_seq_snoop_inprogress_q[0] == 1'b1) ? {4{1'b0}} :
                                        (inv_seq_tlbwe_inprogress_q[0] == 1'b1) ? tlbwe_back_inv_addr_q[23:26] :
                                        ex3_ea_q[23:26];
            assign snoop_vpn_d[27:30] = ((inv_seq_snoop_inprogress_q[0] == 1'b1 & an_ac_back_inv_q[4] == 1'b1 & mmucr1_q[pos_tlbi_msb] == 1'b0 & (an_ac_back_inv_addr_q[48:51] == TLB_PgSize_1GB | an_ac_back_inv_addr_q[48:51] == TLB_PgSize_256MB | an_ac_back_inv_addr_q[48:51] == TLB_PgSize_16MB | an_ac_back_inv_addr_q[48:51] == TLB_PgSize_1MB))) ? an_ac_back_inv_addr_q[44:47] :
                                        (inv_seq_snoop_inprogress_q[0] == 1'b1) ? an_ac_back_inv_addr_q[27:30] :
                                        (inv_seq_tlbwe_inprogress_q[0] == 1'b1) ? tlbwe_back_inv_addr_q[27:30] :
                                        ex3_ea_q[27:30];
            assign snoop_vpn_d[31] = (inv_seq_snoop_inprogress_q[0] == 1'b1) ? an_ac_back_inv_addr_q[31] :
                                     (inv_seq_tlbwe_inprogress_q[0] == 1'b1) ? tlbwe_back_inv_addr_q[31] :
                                     ex3_ea_q[31];
            assign snoop_vpn_clone_d[52 - `EPN_WIDTH:12] = (inv_seq_snoop_inprogress_q[1] == 1'b1) ? {13{1'b0}} :
                                                          (inv_seq_tlbwe_inprogress_q[1] == 1'b1) ? tlbwe_back_inv_addr_q[0:12] :
                                                          ex3_ea_q[52 - `EPN_WIDTH:12];
            assign snoop_vpn_clone_d[13:14] = ((inv_seq_snoop_inprogress_q[1] == 1'b1 & an_ac_back_inv_q[4] == 1'b1 & mmucr1_q[pos_tlbi_msb] == 1'b1 & an_ac_back_inv_addr_q[48:51] == TLB_PgSize_1GB)) ? an_ac_back_inv_addr_q[34:35] :
                                              (inv_seq_snoop_inprogress_q[1] == 1'b1) ? {2{1'b0}} :
                                              (inv_seq_tlbwe_inprogress_q[1] == 1'b1) ? tlbwe_back_inv_addr_q[13:14] :
                                              ex3_ea_q[13:14];
            assign snoop_vpn_clone_d[15:16] = ((inv_seq_snoop_inprogress_q[1] == 1'b1 & an_ac_back_inv_q[4] == 1'b1 & mmucr1_q[pos_tlbi_msb] == 1'b1 & (an_ac_back_inv_addr_q[48:51] == TLB_PgSize_1GB | an_ac_back_inv_addr_q[48:51] == TLB_PgSize_256MB))) ? an_ac_back_inv_addr_q[36:37] :
                                              (inv_seq_snoop_inprogress_q[1] == 1'b1) ? {2{1'b0}} :
                                              (inv_seq_tlbwe_inprogress_q[1] == 1'b1) ? tlbwe_back_inv_addr_q[15:16] :
                                              ex3_ea_q[15:16];
            assign snoop_vpn_clone_d[17:18] = ((inv_seq_snoop_inprogress_q[1] == 1'b1 & an_ac_back_inv_q[4] == 1'b1 & mmucr1_q[pos_tlbi_msb] == 1'b1 & (an_ac_back_inv_addr_q[48:51] == TLB_PgSize_1GB | an_ac_back_inv_addr_q[48:51] == TLB_PgSize_256MB))) ? an_ac_back_inv_addr_q[38:39] :
                                              ((inv_seq_snoop_inprogress_q[1] == 1'b1 & an_ac_back_inv_q[4] == 1'b1 & mmucr1_q[pos_tlbi_msb] == 1'b0 & an_ac_back_inv_addr_q[48:51] == TLB_PgSize_1GB)) ? an_ac_back_inv_addr_q[34:35] :
                                              (inv_seq_snoop_inprogress_q[1] == 1'b1) ? {2{1'b0}} :
                                              (inv_seq_tlbwe_inprogress_q[1] == 1'b1) ? tlbwe_back_inv_addr_q[17:18] :
                                              ex3_ea_q[17:18];
            assign snoop_vpn_clone_d[19:22] = ((inv_seq_snoop_inprogress_q[1] == 1'b1 & an_ac_back_inv_q[4] == 1'b1 & mmucr1_q[pos_tlbi_msb] == 1'b1 & (an_ac_back_inv_addr_q[48:51] == TLB_PgSize_1GB | an_ac_back_inv_addr_q[48:51] == TLB_PgSize_256MB | an_ac_back_inv_addr_q[48:51] == TLB_PgSize_16MB))) ? an_ac_back_inv_addr_q[40:43] :
                                              ((inv_seq_snoop_inprogress_q[1] == 1'b1 & an_ac_back_inv_q[4] == 1'b1 & mmucr1_q[pos_tlbi_msb] == 1'b0 & (an_ac_back_inv_addr_q[48:51] == TLB_PgSize_1GB | an_ac_back_inv_addr_q[48:51] == TLB_PgSize_256MB))) ? an_ac_back_inv_addr_q[36:39] :
                                              (inv_seq_snoop_inprogress_q[1] == 1'b1) ? {4{1'b0}} :
                                              (inv_seq_tlbwe_inprogress_q[1] == 1'b1) ? tlbwe_back_inv_addr_q[19:22] :
                                              ex3_ea_q[19:22];
            assign snoop_vpn_clone_d[23:26] = ((inv_seq_snoop_inprogress_q[1] == 1'b1 & an_ac_back_inv_q[4] == 1'b1 & mmucr1_q[pos_tlbi_msb] == 1'b1 & (an_ac_back_inv_addr_q[48:51] == TLB_PgSize_1GB | an_ac_back_inv_addr_q[48:51] == TLB_PgSize_256MB | an_ac_back_inv_addr_q[48:51] == TLB_PgSize_16MB | an_ac_back_inv_addr_q[48:51] == TLB_PgSize_1MB))) ? an_ac_back_inv_addr_q[44:47] :
                                              ((inv_seq_snoop_inprogress_q[1] == 1'b1 & an_ac_back_inv_q[4] == 1'b1 & mmucr1_q[pos_tlbi_msb] == 1'b0 & (an_ac_back_inv_addr_q[48:51] == TLB_PgSize_1GB | an_ac_back_inv_addr_q[48:51] == TLB_PgSize_256MB | an_ac_back_inv_addr_q[48:51] == TLB_PgSize_16MB))) ? an_ac_back_inv_addr_q[40:43] :
                                              (inv_seq_snoop_inprogress_q[1] == 1'b1) ? {4{1'b0}} :
                                              (inv_seq_tlbwe_inprogress_q[1] == 1'b1) ? tlbwe_back_inv_addr_q[23:26] :
                                              ex3_ea_q[23:26];
            assign snoop_vpn_clone_d[27:30] = ((inv_seq_snoop_inprogress_q[1] == 1'b1 & an_ac_back_inv_q[4] == 1'b1 & mmucr1_q[pos_tlbi_msb] == 1'b0 & (an_ac_back_inv_addr_q[48:51] == TLB_PgSize_1GB | an_ac_back_inv_addr_q[48:51] == TLB_PgSize_256MB | an_ac_back_inv_addr_q[48:51] == TLB_PgSize_16MB | an_ac_back_inv_addr_q[48:51] == TLB_PgSize_1MB))) ? an_ac_back_inv_addr_q[44:47] :
                                              (inv_seq_snoop_inprogress_q[1] == 1'b1) ? an_ac_back_inv_addr_q[27:30] :
                                              (inv_seq_tlbwe_inprogress_q[1] == 1'b1) ? tlbwe_back_inv_addr_q[27:30] :
                                              ex3_ea_q[27:30];
            assign snoop_vpn_clone_d[31] = (inv_seq_snoop_inprogress_q[1] == 1'b1) ? an_ac_back_inv_addr_q[31] :
                                           (inv_seq_tlbwe_inprogress_q[1] == 1'b1) ? tlbwe_back_inv_addr_q[31] :
                                           ex3_ea_q[31];
         end
      endgenerate
      generate
         if (`RS_DATA_WIDTH > `REAL_ADDR_WIDTH - 1)
         begin : gen_rs_gte_ra_snoop_vpn
            assign snoop_vpn_d[32:51] = (inv_seq_snoop_inprogress_q[0] == 1'b1) ? an_ac_back_inv_addr_q[32:51] :
                                        (inv_seq_tlbwe_inprogress_q[0] == 1'b1) ? tlbwe_back_inv_addr_q[32:51] :
                                        ex3_ea_q[32:51];
            assign snoop_vpn_clone_d[32:51] = (inv_seq_snoop_inprogress_q[1] == 1'b1) ? an_ac_back_inv_addr_q[32:51] :
                                              (inv_seq_tlbwe_inprogress_q[1] == 1'b1) ? tlbwe_back_inv_addr_q[32:51] :
                                              ex3_ea_q[32:51];
         end
      endgenerate
      generate
         if (`RS_DATA_WIDTH < `REAL_ADDR_WIDTH)
         begin : gen_ra_gt_rs_snoop_vpn
            assign snoop_vpn_d[64 - `REAL_ADDR_WIDTH:51] = (inv_seq_snoop_inprogress_q[0] == 1'b1) ? an_ac_back_inv_addr_q[64 - `REAL_ADDR_WIDTH:51] :
                                                          (inv_seq_tlbwe_inprogress_q[0] == 1'b1) ? tlbwe_back_inv_addr_q[64 - `REAL_ADDR_WIDTH:51] :
                                                          {1'b0, ex3_ea_q[64 - `RS_DATA_WIDTH:51]};
            assign snoop_vpn_clone_d[64 - `REAL_ADDR_WIDTH:51] = (inv_seq_snoop_inprogress_q[1] == 1'b1) ? an_ac_back_inv_addr_q[64 - `REAL_ADDR_WIDTH:51] :
                                                                (inv_seq_tlbwe_inprogress_q[1] == 1'b1) ? tlbwe_back_inv_addr_q[64 - `REAL_ADDR_WIDTH:51] :
                                                                {1'b0, ex3_ea_q[64 - `RS_DATA_WIDTH:51]};
         end
      endgenerate
      generate
         if ((`EPN_WIDTH > `REAL_ADDR_WIDTH) & (`RS_DATA_WIDTH < `EPN_WIDTH))
         begin : gen_epn_gt_rs_snoop_vpn
            assign snoop_vpn_d[52 - `EPN_WIDTH:63 - `REAL_ADDR_WIDTH] = {22{1'b0}};
            assign snoop_vpn_clone_d[52 - `EPN_WIDTH:63 - `REAL_ADDR_WIDTH] = {22{1'b0}};
         end
      endgenerate
      assign snoop_ack_d[0] = (snoop_ack_q[0] == 1'b0) ? iu_mm_ierat_snoop_ack :
                              ((inv_seq_snoop_done == 1'b1 | inv_seq_local_done == 1'b1 | inv_seq_tlb0fi_done == 1'b1 | inv_seq_tlbwe_snoop_done == 1'b1)) ? 1'b0 :
                              snoop_ack_q[0];
      assign snoop_ack_d[1] = (snoop_ack_q[1] == 1'b0) ? xu_mm_derat_snoop_ack :
                              ((inv_seq_snoop_done == 1'b1 | inv_seq_local_done == 1'b1 | inv_seq_tlb0fi_done == 1'b1 | inv_seq_tlbwe_snoop_done == 1'b1)) ? 1'b0 :
                              snoop_ack_q[1];
      assign snoop_ack_d[2] = (snoop_ack_q[2] == 1'b0) ? tlb_snoop_ack :
                              ((inv_seq_snoop_done == 1'b1 | inv_seq_local_done == 1'b1 | inv_seq_tlb0fi_done == 1'b1 | inv_seq_tlbwe_snoop_done == 1'b1)) ? 1'b0 :
                              snoop_ack_q[2];
      assign mm_iu_ierat_snoop_coming = snoop_coming_q[0];
      assign mm_iu_ierat_snoop_val = snoop_valid_q[0];
      assign mm_iu_ierat_snoop_attr = snoop_attr_q[0:25];
      assign mm_iu_ierat_snoop_vpn = snoop_vpn_q;
      assign mm_xu_derat_snoop_coming = snoop_coming_q[1];
      assign mm_xu_derat_snoop_val = snoop_valid_q[1];
      assign mm_xu_derat_snoop_attr = snoop_attr_clone_q[0:25];
      assign mm_xu_derat_snoop_vpn = snoop_vpn_clone_q;
      assign tlb_snoop_coming = snoop_coming_q[2];
      assign tlb_snoop_val = snoop_valid_q[2];
      assign tlb_snoop_attr[0:17] = snoop_attr_q[0:17];
      assign tlb_snoop_attr[18:19] = snoop_attr_tlb_spec_q[18:19];
      assign tlb_snoop_attr[20:34] = snoop_attr_q[20:34];
      assign tlb_snoop_vpn = snoop_vpn_q;
      assign xu_mm_ccr2_notlb_b = (~xu_mm_ccr2_notlb_q[1:12]);
      assign xu_mm_epcr_dgtmi = xu_mm_epcr_dgtmi_q;
      assign inval_perf_tlbilx = inv_seq_local_done & (~inv_seq_tlbi_load);
      assign inval_perf_tlbivax = inv_seq_local_done & inv_seq_tlbi_load;
      assign inval_perf_tlbivax_snoop = inv_seq_snoop_done;
      assign inval_perf_tlb_flush = |(ex3_flush_req_q);
      assign inval_dbg_seq_q = inv_seq_q[1:5];
      assign inval_dbg_seq_idle = inv_seq_idle;
      assign inval_dbg_seq_snoop_inprogress = inv_seq_snoop_inprogress;
      assign inval_dbg_seq_snoop_done = inv_seq_snoop_done;
      assign inval_dbg_seq_local_done = inv_seq_local_done;
      assign inval_dbg_seq_tlb0fi_done = inv_seq_tlb0fi_done;
      assign inval_dbg_seq_tlbwe_snoop_done = inv_seq_tlbwe_snoop_done;
      assign inval_dbg_ex6_valid = |(ex6_valid_q);
    `ifdef MM_THREADS2
      assign inval_dbg_ex6_thdid[0] = 1'b0;
      assign inval_dbg_ex6_thdid[1] = ex6_valid_q[1];
    `else
      assign inval_dbg_ex6_thdid[0] = 1'b0;
      assign inval_dbg_ex6_thdid[1] = 1'b0;
    `endif
      assign inval_dbg_ex6_ttype[0] = (ex6_ttype_q[4] | ex6_ttype_q[5]);
      assign inval_dbg_ex6_ttype[1] = (ex6_ttype_q[2] | ex6_ttype_q[3]);
      assign inval_dbg_ex6_ttype[2] = (ex6_ttype_q[1] | ex6_ttype_q[3] | ex6_ttype_q[5]);
      assign inval_dbg_snoop_forme = inval_snoop_forme;
      assign inval_dbg_snoop_local_reject = inval_snoop_local_reject | |(ex3_ivax_lpid_reject_q);
      assign inval_dbg_an_ac_back_inv_q = an_ac_back_inv_q[2:8];
      assign inval_dbg_an_ac_back_inv_lpar_id_q = an_ac_back_inv_lpar_id_q;
      assign inval_dbg_an_ac_back_inv_addr_q = an_ac_back_inv_addr_q;
      assign inval_dbg_snoop_valid_q = snoop_valid_q;
      assign inval_dbg_snoop_ack_q = snoop_ack_q;
      assign inval_dbg_snoop_attr_q = snoop_attr_q;
      assign inval_dbg_snoop_attr_tlb_spec_q = snoop_attr_tlb_spec_q;
      assign inval_dbg_snoop_vpn_q = snoop_vpn_q[17:51];
      assign inval_dbg_lsu_tokens_q = lsu_tokens_q;
      // unused spare signal assignments
      assign unused_dc[0] = |(lcb_delay_lclkr_dc[1:4]);
      assign unused_dc[1] = |(lcb_mpw1_dc_b[1:4]);
      assign unused_dc[2] = pc_func_sl_force;
      assign unused_dc[3] = pc_func_sl_thold_0_b;
      assign unused_dc[4] = tc_scan_dis_dc_b;
      assign unused_dc[5] = tc_scan_diag_dc;
      assign unused_dc[6] = tc_lbist_en_dc;
      `ifdef MM_THREADS2
      assign unused_dc[7] = mmucr0_0[4] | mmucr0_1[4];
      assign unused_dc[8] = mmucr0_0[5] | mmucr0_1[5];
      `else
      assign unused_dc[7] = mmucr0_0[4];
      assign unused_dc[8] = mmucr0_0[5];
      `endif
      assign unused_dc[9] = |(tlb_tag5_except);
      assign unused_dc[10] = mmucr1_q[13];
      assign unused_dc[11] = |(mmucr1_q[15:17]);
      assign unused_dc[12] = ex5_rs_is_q[0] | bus_snoop_seq_idle;

      //------------------------------------------------
      // latches
      //------------------------------------------------

      tri_rlmreg_p #(.WIDTH(`MM_THREADS), .INIT(0), .NEEDS_SRESET(1)) ex1_valid_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex1_valid_offset:ex1_valid_offset + `MM_THREADS - 1]),
         .scout(sov[ex1_valid_offset:ex1_valid_offset + `MM_THREADS - 1]),
         .din(ex1_valid_d),
         .dout(ex1_valid_q)
      );

      tri_rlmreg_p #(.WIDTH((`MMQ_INVAL_TTYPE_WIDTH-2)), .INIT(0), .NEEDS_SRESET(1)) ex1_ttype_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex1_ttype_offset:ex1_ttype_offset + (`MMQ_INVAL_TTYPE_WIDTH-2) - 1]),
         .scout(sov[ex1_ttype_offset:ex1_ttype_offset + (`MMQ_INVAL_TTYPE_WIDTH-2) - 1]),
         .din(ex1_ttype_d),
         .dout(ex1_ttype_q)
      );

      tri_rlmreg_p #(.WIDTH(`MMQ_INVAL_STATE_WIDTH), .INIT(0), .NEEDS_SRESET(1)) ex1_state_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex1_state_offset:ex1_state_offset + `MMQ_INVAL_STATE_WIDTH - 1]),
         .scout(sov[ex1_state_offset:ex1_state_offset + `MMQ_INVAL_STATE_WIDTH - 1]),
         .din(ex1_state_d[0:`MMQ_INVAL_STATE_WIDTH - 1]),
         .dout(ex1_state_q[0:`MMQ_INVAL_STATE_WIDTH - 1])
      );

      tri_rlmreg_p #(.WIDTH(`T_WIDTH), .INIT(0), .NEEDS_SRESET(1)) ex1_t_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex1_t_offset:ex1_t_offset + `T_WIDTH - 1]),
         .scout(sov[ex1_t_offset:ex1_t_offset + `T_WIDTH - 1]),
         .din(ex1_t_d[0:`T_WIDTH - 1]),
         .dout(ex1_t_q[0:`T_WIDTH - 1])
      );

      tri_rlmreg_p #(.WIDTH(`ITAG_SIZE_ENC), .INIT(0), .NEEDS_SRESET(1)) ex1_itag_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex1_itag_offset:ex1_itag_offset + `ITAG_SIZE_ENC - 1]),
         .scout(sov[ex1_itag_offset:ex1_itag_offset + `ITAG_SIZE_ENC - 1]),
         .din(ex1_itag_d),
         .dout(ex1_itag_q)
      );
      //-----------------------------------------------------------------------------

      tri_rlmreg_p #(.WIDTH(`MM_THREADS), .INIT(0), .NEEDS_SRESET(1)) ex2_valid_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex2_valid_offset:ex2_valid_offset + `MM_THREADS - 1]),
         .scout(sov[ex2_valid_offset:ex2_valid_offset + `MM_THREADS - 1]),
         .din(ex2_valid_d),
         .dout(ex2_valid_q)
      );

      tri_rlmreg_p #(.WIDTH(`MMQ_INVAL_TTYPE_WIDTH), .INIT(0), .NEEDS_SRESET(1)) ex2_ttype_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex2_ttype_offset:ex2_ttype_offset + `MMQ_INVAL_TTYPE_WIDTH - 1]),
         .scout(sov[ex2_ttype_offset:ex2_ttype_offset + `MMQ_INVAL_TTYPE_WIDTH - 1]),
         .din(ex2_ttype_d[0:`MMQ_INVAL_TTYPE_WIDTH - 1]),
         .dout(ex2_ttype_q[0:`MMQ_INVAL_TTYPE_WIDTH - 1])
      );

      tri_rlmreg_p #(.WIDTH(`RS_IS_WIDTH), .INIT(0), .NEEDS_SRESET(1)) ex2_rs_is_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex2_rs_is_offset:ex2_rs_is_offset + `RS_IS_WIDTH - 1]),
         .scout(sov[ex2_rs_is_offset:ex2_rs_is_offset + `RS_IS_WIDTH - 1]),
         .din(ex2_rs_is_d[0:`RS_IS_WIDTH - 1]),
         .dout(ex2_rs_is_q[0:`RS_IS_WIDTH - 1])
      );

      tri_rlmreg_p #(.WIDTH(`MMQ_INVAL_STATE_WIDTH), .INIT(0), .NEEDS_SRESET(1)) ex2_state_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex2_state_offset:ex2_state_offset + `MMQ_INVAL_STATE_WIDTH - 1]),
         .scout(sov[ex2_state_offset:ex2_state_offset + `MMQ_INVAL_STATE_WIDTH - 1]),
         .din(ex2_state_d[0:`MMQ_INVAL_STATE_WIDTH - 1]),
         .dout(ex2_state_q[0:`MMQ_INVAL_STATE_WIDTH - 1])
      );

      tri_rlmreg_p #(.WIDTH(`T_WIDTH), .INIT(0), .NEEDS_SRESET(1)) ex2_t_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex2_t_offset:ex2_t_offset + `T_WIDTH - 1]),
         .scout(sov[ex2_t_offset:ex2_t_offset + `T_WIDTH - 1]),
         .din(ex2_t_d[0:`T_WIDTH - 1]),
         .dout(ex2_t_q[0:`T_WIDTH - 1])
      );

      tri_rlmreg_p #(.WIDTH(`ITAG_SIZE_ENC), .INIT(0), .NEEDS_SRESET(1)) ex2_itag_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex2_itag_offset:ex2_itag_offset + `ITAG_SIZE_ENC - 1]),
         .scout(sov[ex2_itag_offset:ex2_itag_offset + `ITAG_SIZE_ENC - 1]),
         .din(ex2_itag_d),
         .dout(ex2_itag_q)
      );
      //-----------------------------------------------------------------------------

      tri_rlmreg_p #(.WIDTH(`MM_THREADS), .INIT(0), .NEEDS_SRESET(1)) ex3_valid_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex3_valid_offset:ex3_valid_offset + `MM_THREADS - 1]),
         .scout(sov[ex3_valid_offset:ex3_valid_offset + `MM_THREADS - 1]),
         .din(ex3_valid_d),
         .dout(ex3_valid_q)
      );

      tri_rlmreg_p #(.WIDTH(`MMQ_INVAL_TTYPE_WIDTH), .INIT(0), .NEEDS_SRESET(1)) ex3_ttype_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex3_ttype_offset:ex3_ttype_offset + `MMQ_INVAL_TTYPE_WIDTH - 1]),
         .scout(sov[ex3_ttype_offset:ex3_ttype_offset + `MMQ_INVAL_TTYPE_WIDTH - 1]),
         .din(ex3_ttype_d[0:`MMQ_INVAL_TTYPE_WIDTH - 1]),
         .dout(ex3_ttype_q[0:`MMQ_INVAL_TTYPE_WIDTH - 1])
      );

      tri_rlmreg_p #(.WIDTH(`RS_IS_WIDTH), .INIT(0), .NEEDS_SRESET(1)) ex3_rs_is_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex3_rs_is_offset:ex3_rs_is_offset + `RS_IS_WIDTH - 1]),
         .scout(sov[ex3_rs_is_offset:ex3_rs_is_offset + `RS_IS_WIDTH - 1]),
         .din(ex3_rs_is_d[0:`RS_IS_WIDTH - 1]),
         .dout(ex3_rs_is_q[0:`RS_IS_WIDTH - 1])
      );

      tri_rlmreg_p #(.WIDTH(`MMQ_INVAL_STATE_WIDTH), .INIT(0), .NEEDS_SRESET(1)) ex3_state_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex3_state_offset:ex3_state_offset + `MMQ_INVAL_STATE_WIDTH - 1]),
         .scout(sov[ex3_state_offset:ex3_state_offset + `MMQ_INVAL_STATE_WIDTH - 1]),
         .din(ex3_state_d[0:`MMQ_INVAL_STATE_WIDTH - 1]),
         .dout(ex3_state_q[0:`MMQ_INVAL_STATE_WIDTH - 1])
      );

      tri_rlmreg_p #(.WIDTH(`T_WIDTH), .INIT(0), .NEEDS_SRESET(1)) ex3_t_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex3_t_offset:ex3_t_offset + `T_WIDTH - 1]),
         .scout(sov[ex3_t_offset:ex3_t_offset + `T_WIDTH - 1]),
         .din(ex3_t_d[0:`T_WIDTH - 1]),
         .dout(ex3_t_q[0:`T_WIDTH - 1])
      );

      tri_rlmreg_p #(.WIDTH(`MM_THREADS), .INIT(0), .NEEDS_SRESET(1)) ex3_flush_req_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex3_flush_req_offset:ex3_flush_req_offset + `MM_THREADS - 1]),
         .scout(sov[ex3_flush_req_offset:ex3_flush_req_offset + `MM_THREADS - 1]),
         .din(ex3_flush_req_d),
         .dout(ex3_flush_req_q)
      );

      tri_rlmreg_p #(.WIDTH(`RS_DATA_WIDTH), .INIT(0), .NEEDS_SRESET(1)) ex3_ea_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex3_ea_offset:ex3_ea_offset + `RS_DATA_WIDTH - 1]),
         .scout(sov[ex3_ea_offset:ex3_ea_offset + `RS_DATA_WIDTH - 1]),
         .din(ex3_ea_d[64 - `RS_DATA_WIDTH:63]),
         .dout(ex3_ea_q[64 - `RS_DATA_WIDTH:63])
      );

      tri_rlmreg_p #(.WIDTH(`ITAG_SIZE_ENC), .INIT(0), .NEEDS_SRESET(1)) ex3_itag_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex3_itag_offset:ex3_itag_offset + `ITAG_SIZE_ENC - 1]),
         .scout(sov[ex3_itag_offset:ex3_itag_offset + `ITAG_SIZE_ENC - 1]),
         .din(ex3_itag_d),
         .dout(ex3_itag_q)
      );
      //-----------------------------------------------------------------------------

      tri_rlmreg_p #(.WIDTH(`MM_THREADS), .INIT(0), .NEEDS_SRESET(1)) ex4_valid_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex4_valid_offset:ex4_valid_offset + `MM_THREADS - 1]),
         .scout(sov[ex4_valid_offset:ex4_valid_offset + `MM_THREADS - 1]),
         .din(ex4_valid_d),
         .dout(ex4_valid_q)
      );

      tri_rlmreg_p #(.WIDTH(`MMQ_INVAL_TTYPE_WIDTH), .INIT(0), .NEEDS_SRESET(1)) ex4_ttype_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex4_ttype_offset:ex4_ttype_offset + `MMQ_INVAL_TTYPE_WIDTH - 1]),
         .scout(sov[ex4_ttype_offset:ex4_ttype_offset + `MMQ_INVAL_TTYPE_WIDTH - 1]),
         .din(ex4_ttype_d[0:`MMQ_INVAL_TTYPE_WIDTH - 1]),
         .dout(ex4_ttype_q[0:`MMQ_INVAL_TTYPE_WIDTH - 1])
      );

      tri_rlmreg_p #(.WIDTH(`RS_IS_WIDTH), .INIT(0), .NEEDS_SRESET(1)) ex4_rs_is_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex4_rs_is_offset:ex4_rs_is_offset + `RS_IS_WIDTH - 1]),
         .scout(sov[ex4_rs_is_offset:ex4_rs_is_offset + `RS_IS_WIDTH - 1]),
         .din(ex4_rs_is_d[0:`RS_IS_WIDTH - 1]),
         .dout(ex4_rs_is_q[0:`RS_IS_WIDTH - 1])
      );

      tri_rlmreg_p #(.WIDTH(`MMQ_INVAL_STATE_WIDTH), .INIT(0), .NEEDS_SRESET(1)) ex4_state_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex4_state_offset:ex4_state_offset + `MMQ_INVAL_STATE_WIDTH - 1]),
         .scout(sov[ex4_state_offset:ex4_state_offset + `MMQ_INVAL_STATE_WIDTH - 1]),
         .din(ex4_state_d[0:`MMQ_INVAL_STATE_WIDTH - 1]),
         .dout(ex4_state_q[0:`MMQ_INVAL_STATE_WIDTH - 1])
      );

      tri_rlmreg_p #(.WIDTH(`T_WIDTH), .INIT(0), .NEEDS_SRESET(1)) ex4_t_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex4_t_offset:ex4_t_offset + `T_WIDTH - 1]),
         .scout(sov[ex4_t_offset:ex4_t_offset + `T_WIDTH - 1]),
         .din(ex4_t_d[0:`T_WIDTH - 1]),
         .dout(ex4_t_q[0:`T_WIDTH - 1])
      );

      tri_rlmreg_p #(.WIDTH(`ITAG_SIZE_ENC), .INIT(0), .NEEDS_SRESET(1)) ex4_itag_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex4_itag_offset:ex4_itag_offset + `ITAG_SIZE_ENC - 1]),
         .scout(sov[ex4_itag_offset:ex4_itag_offset + `ITAG_SIZE_ENC - 1]),
         .din(ex4_itag_d),
         .dout(ex4_itag_q)
      );
      //------------------------------------------------

      tri_rlmreg_p #(.WIDTH(`MM_THREADS), .INIT(0), .NEEDS_SRESET(1)) ex5_valid_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex5_valid_offset:ex5_valid_offset + `MM_THREADS - 1]),
         .scout(sov[ex5_valid_offset:ex5_valid_offset + `MM_THREADS - 1]),
         .din(ex5_valid_d),
         .dout(ex5_valid_q)
      );

      tri_rlmreg_p #(.WIDTH(`MMQ_INVAL_TTYPE_WIDTH), .INIT(0), .NEEDS_SRESET(1)) ex5_ttype_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex5_ttype_offset:ex5_ttype_offset + `MMQ_INVAL_TTYPE_WIDTH - 1]),
         .scout(sov[ex5_ttype_offset:ex5_ttype_offset + `MMQ_INVAL_TTYPE_WIDTH - 1]),
         .din(ex5_ttype_d[0:`MMQ_INVAL_TTYPE_WIDTH - 1]),
         .dout(ex5_ttype_q[0:`MMQ_INVAL_TTYPE_WIDTH - 1])
      );

      tri_rlmreg_p #(.WIDTH(`RS_IS_WIDTH), .INIT(0), .NEEDS_SRESET(1)) ex5_rs_is_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex5_rs_is_offset:ex5_rs_is_offset + `RS_IS_WIDTH - 1]),
         .scout(sov[ex5_rs_is_offset:ex5_rs_is_offset + `RS_IS_WIDTH - 1]),
         .din(ex5_rs_is_d[0:`RS_IS_WIDTH - 1]),
         .dout(ex5_rs_is_q[0:`RS_IS_WIDTH - 1])
      );

      tri_rlmreg_p #(.WIDTH(`MMQ_INVAL_STATE_WIDTH), .INIT(0), .NEEDS_SRESET(1)) ex5_state_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex5_state_offset:ex5_state_offset + `MMQ_INVAL_STATE_WIDTH - 1]),
         .scout(sov[ex5_state_offset:ex5_state_offset + `MMQ_INVAL_STATE_WIDTH - 1]),
         .din(ex5_state_d[0:`MMQ_INVAL_STATE_WIDTH - 1]),
         .dout(ex5_state_q[0:`MMQ_INVAL_STATE_WIDTH - 1])
      );

      tri_rlmreg_p #(.WIDTH(`T_WIDTH), .INIT(0), .NEEDS_SRESET(1)) ex5_t_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex5_t_offset:ex5_t_offset + `T_WIDTH - 1]),
         .scout(sov[ex5_t_offset:ex5_t_offset + `T_WIDTH - 1]),
         .din(ex5_t_d[0:`T_WIDTH - 1]),
         .dout(ex5_t_q[0:`T_WIDTH - 1])
      );

      tri_rlmreg_p #(.WIDTH(`ITAG_SIZE_ENC), .INIT(0), .NEEDS_SRESET(1)) ex5_itag_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex5_itag_offset:ex5_itag_offset + `ITAG_SIZE_ENC - 1]),
         .scout(sov[ex5_itag_offset:ex5_itag_offset + `ITAG_SIZE_ENC - 1]),
         .din(ex5_itag_d),
         .dout(ex5_itag_q)
      );
      //------------------------------------------------

      tri_rlmreg_p #(.WIDTH(`MM_THREADS), .INIT(0), .NEEDS_SRESET(1)) ex6_valid_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex6_valid_offset:ex6_valid_offset + `MM_THREADS - 1]),
         .scout(sov[ex6_valid_offset:ex6_valid_offset + `MM_THREADS - 1]),
         .din(ex6_valid_d),
         .dout(ex6_valid_q)
      );

      tri_rlmreg_p #(.WIDTH(`MMQ_INVAL_TTYPE_WIDTH), .INIT(0), .NEEDS_SRESET(1)) ex6_ttype_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex6_ttype_offset:ex6_ttype_offset + `MMQ_INVAL_TTYPE_WIDTH - 1]),
         .scout(sov[ex6_ttype_offset:ex6_ttype_offset + `MMQ_INVAL_TTYPE_WIDTH - 1]),
         .din(ex6_ttype_d[0:`MMQ_INVAL_TTYPE_WIDTH - 1]),
         .dout(ex6_ttype_q[0:`MMQ_INVAL_TTYPE_WIDTH - 1])
      );

      tri_rlmreg_p #(.WIDTH(3), .INIT(0), .NEEDS_SRESET(1)) ex6_isel_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex6_isel_offset:ex6_isel_offset + 3 - 1]),
         .scout(sov[ex6_isel_offset:ex6_isel_offset + 3 - 1]),
         .din(ex6_isel_d[0:3 - 1]),
         .dout(ex6_isel_q[0:3 - 1])
      );

      tri_rlmreg_p #(.WIDTH(4), .INIT(0), .NEEDS_SRESET(1)) ex6_size_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex6_size_offset:ex6_size_offset + 4 - 1]),
         .scout(sov[ex6_size_offset:ex6_size_offset + 4 - 1]),
         .din(ex6_size_d[0:4 - 1]),
         .dout(ex6_size_q[0:4 - 1])
      );

      tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex6_gs_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex6_gs_offset]),
         .scout(sov[ex6_gs_offset]),
         .din(ex6_gs_d),
         .dout(ex6_gs_q)
      );

      tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex6_ts_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex6_ts_offset]),
         .scout(sov[ex6_ts_offset]),
         .din(ex6_ts_d),
         .dout(ex6_ts_q)
      );

      tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex6_ind_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex6_ind_offset]),
         .scout(sov[ex6_ind_offset]),
         .din(ex6_ind_d),
         .dout(ex6_ind_q)
      );

      tri_rlmreg_p #(.WIDTH(`PID_WIDTH), .INIT(0), .NEEDS_SRESET(1)) ex6_pid_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex6_pid_offset:ex6_pid_offset + `PID_WIDTH - 1]),
         .scout(sov[ex6_pid_offset:ex6_pid_offset + `PID_WIDTH - 1]),
         .din(ex6_pid_d[0:`PID_WIDTH - 1]),
         .dout(ex6_pid_q[0:`PID_WIDTH - 1])
      );

      tri_rlmreg_p #(.WIDTH(`LPID_WIDTH), .INIT(0), .NEEDS_SRESET(1)) ex6_lpid_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex6_lpid_offset:ex6_lpid_offset + `LPID_WIDTH - 1]),
         .scout(sov[ex6_lpid_offset:ex6_lpid_offset + `LPID_WIDTH - 1]),
         .din(ex6_lpid_d[0:`LPID_WIDTH - 1]),
         .dout(ex6_lpid_q[0:`LPID_WIDTH - 1])
      );

      tri_rlmreg_p #(.WIDTH(`ITAG_SIZE_ENC), .INIT(0), .NEEDS_SRESET(1)) ex6_itag_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex6_itag_offset:ex6_itag_offset + `ITAG_SIZE_ENC - 1]),
         .scout(sov[ex6_itag_offset:ex6_itag_offset + `ITAG_SIZE_ENC - 1]),
         .din(ex6_itag_d),
         .dout(ex6_itag_q)
      );

      tri_rlmreg_p #(.WIDTH(`ITAG_SIZE_ENC), .INIT(0), .NEEDS_SRESET(1)) mm_xu_itag_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[mm_xu_itag_offset:mm_xu_itag_offset + `ITAG_SIZE_ENC - 1]),
         .scout(sov[mm_xu_itag_offset:mm_xu_itag_offset + `ITAG_SIZE_ENC - 1]),
         .din(mm_xu_itag_d),
         .dout(mm_xu_itag_q)
      );

      tri_rlmreg_p #(.WIDTH(`MM_THREADS), .INIT(0), .NEEDS_SRESET(1)) ord_np1_flush_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ord_np1_flush_offset:ord_np1_flush_offset + `MM_THREADS - 1]),
         .scout(sov[ord_np1_flush_offset:ord_np1_flush_offset + `MM_THREADS - 1]),
         .din(ord_np1_flush_d),
         .dout(ord_np1_flush_q)
      );

      tri_rlmreg_p #(.WIDTH(`MM_THREADS), .INIT(0), .NEEDS_SRESET(1)) ord_read_done_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ord_read_done_offset:ord_read_done_offset + `MM_THREADS - 1]),
         .scout(sov[ord_read_done_offset:ord_read_done_offset + `MM_THREADS - 1]),
         .din(ord_read_done_d),
         .dout(ord_read_done_q)
      );

      tri_rlmreg_p #(.WIDTH(`MM_THREADS), .INIT(0), .NEEDS_SRESET(1)) ord_write_done_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ord_write_done_offset:ord_write_done_offset + `MM_THREADS - 1]),
         .scout(sov[ord_write_done_offset:ord_write_done_offset + `MM_THREADS - 1]),
         .din(ord_write_done_d),
         .dout(ord_write_done_q)
      );
      //------------------------------------------------

      tri_rlmreg_p #(.WIDTH(6), .INIT(0), .NEEDS_SRESET(1)) inv_seq_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[inv_seq_offset:inv_seq_offset + 6 - 1]),
         .scout(sov[inv_seq_offset:inv_seq_offset + 6 - 1]),
         .din(inv_seq_d[0:`INV_SEQ_WIDTH - 1]),
         .dout(inv_seq_q[0:`INV_SEQ_WIDTH - 1])
      );

      tri_rlmreg_p #(.WIDTH(`MM_THREADS), .INIT(0), .NEEDS_SRESET(1)) hold_req_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[hold_req_offset:hold_req_offset + `MM_THREADS - 1]),
         .scout(sov[hold_req_offset:hold_req_offset + `MM_THREADS - 1]),
         .din(hold_req_d),
         .dout(hold_req_q)
      );

      tri_rlmreg_p #(.WIDTH(`MM_THREADS), .INIT(0), .NEEDS_SRESET(1)) hold_ack_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[hold_ack_offset:hold_ack_offset + `MM_THREADS - 1]),
         .scout(sov[hold_ack_offset:hold_ack_offset + `MM_THREADS - 1]),
         .din(hold_ack_d),
         .dout(hold_ack_q)
      );

      tri_rlmreg_p #(.WIDTH(`MM_THREADS), .INIT(0), .NEEDS_SRESET(1)) hold_done_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[hold_done_offset:hold_done_offset + `MM_THREADS - 1]),
         .scout(sov[hold_done_offset:hold_done_offset + `MM_THREADS - 1]),
         .din(hold_done_d),
         .dout(hold_done_q)
      );

      tri_rlmreg_p #(.WIDTH(`MM_THREADS), .INIT(0), .NEEDS_SRESET(1)) iu_flush_req_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[iu_flush_req_offset:iu_flush_req_offset + `MM_THREADS - 1]),
         .scout(sov[iu_flush_req_offset:iu_flush_req_offset + `MM_THREADS - 1]),
         .din(iu_flush_req_d),
         .dout(iu_flush_req_q)
      );

      tri_rlmreg_p #(.WIDTH(`BUS_SNOOP_SEQ_WIDTH), .INIT(0), .NEEDS_SRESET(1)) bus_snoop_seq_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[bus_snoop_seq_offset:bus_snoop_seq_offset + `BUS_SNOOP_SEQ_WIDTH - 1]),
         .scout(sov[bus_snoop_seq_offset:bus_snoop_seq_offset + `BUS_SNOOP_SEQ_WIDTH - 1]),
         .din(bus_snoop_seq_d),
         .dout(bus_snoop_seq_q)
      );

      tri_rlmreg_p #(.WIDTH(`MM_THREADS), .INIT(0), .NEEDS_SRESET(1)) bus_snoop_hold_req_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[bus_snoop_hold_req_offset:bus_snoop_hold_req_offset + `MM_THREADS - 1]),
         .scout(sov[bus_snoop_hold_req_offset:bus_snoop_hold_req_offset + `MM_THREADS - 1]),
         .din(bus_snoop_hold_req_d),
         .dout(bus_snoop_hold_req_q)
      );

      tri_rlmreg_p #(.WIDTH(`MM_THREADS), .INIT(0), .NEEDS_SRESET(1)) bus_snoop_hold_ack_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[bus_snoop_hold_ack_offset:bus_snoop_hold_ack_offset + `MM_THREADS - 1]),
         .scout(sov[bus_snoop_hold_ack_offset:bus_snoop_hold_ack_offset + `MM_THREADS - 1]),
         .din(bus_snoop_hold_ack_d),
         .dout(bus_snoop_hold_ack_q)
      );

      tri_rlmreg_p #(.WIDTH(`MM_THREADS), .INIT(0), .NEEDS_SRESET(1)) bus_snoop_hold_done_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[bus_snoop_hold_done_offset:bus_snoop_hold_done_offset + `MM_THREADS - 1]),
         .scout(sov[bus_snoop_hold_done_offset:bus_snoop_hold_done_offset + `MM_THREADS - 1]),
         .din(bus_snoop_hold_done_d),
         .dout(bus_snoop_hold_done_q)
      );

      tri_rlmreg_p #(.WIDTH(`MM_THREADS), .INIT(0), .NEEDS_SRESET(1)) tlbi_complete_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[tlbi_complete_offset:tlbi_complete_offset + `MM_THREADS - 1]),
         .scout(sov[tlbi_complete_offset:tlbi_complete_offset + `MM_THREADS - 1]),
         .din(tlbi_complete_d),
         .dout(tlbi_complete_q)
      );

      tri_rlmreg_p #(.WIDTH(`MM_THREADS), .INIT(0), .NEEDS_SRESET(1)) local_barrier_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[local_barrier_offset:local_barrier_offset + `MM_THREADS - 1]),
         .scout(sov[local_barrier_offset:local_barrier_offset + `MM_THREADS - 1]),
         .din(local_barrier_d),
         .dout(local_barrier_q)
      );

      tri_rlmreg_p #(.WIDTH(`MM_THREADS), .INIT(0), .NEEDS_SRESET(1)) global_barrier_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[global_barrier_offset:global_barrier_offset + `MM_THREADS - 1]),
         .scout(sov[global_barrier_offset:global_barrier_offset + `MM_THREADS - 1]),
         .din(global_barrier_d),
         .dout(global_barrier_q)
      );

      tri_rlmreg_p #(.WIDTH(`MM_THREADS), .INIT(0), .NEEDS_SRESET(1)) ex3_illeg_instr_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex3_illeg_instr_offset:ex3_illeg_instr_offset + `MM_THREADS - 1]),
         .scout(sov[ex3_illeg_instr_offset:ex3_illeg_instr_offset + `MM_THREADS - 1]),
         .din(ex3_illeg_instr_d),
         .dout(ex3_illeg_instr_q)
      );

      tri_rlmreg_p #(.WIDTH(`MM_THREADS), .INIT(0), .NEEDS_SRESET(1)) ex4_illeg_instr_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex4_illeg_instr_offset:ex4_illeg_instr_offset + `MM_THREADS - 1]),
         .scout(sov[ex4_illeg_instr_offset:ex4_illeg_instr_offset + `MM_THREADS - 1]),
         .din(ex4_illeg_instr_d),
         .dout(ex4_illeg_instr_q)
      );

      tri_rlmreg_p #(.WIDTH(`MM_THREADS), .INIT(0), .NEEDS_SRESET(1)) ex5_illeg_instr_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex5_illeg_instr_offset:ex5_illeg_instr_offset + `MM_THREADS - 1]),
         .scout(sov[ex5_illeg_instr_offset:ex5_illeg_instr_offset + `MM_THREADS - 1]),
         .din(ex5_illeg_instr_d),
         .dout(ex5_illeg_instr_q)
      );

      tri_rlmreg_p #(.WIDTH(`MM_THREADS), .INIT(0), .NEEDS_SRESET(1)) ex6_illeg_instr_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex6_illeg_instr_offset:ex6_illeg_instr_offset + `MM_THREADS - 1]),
         .scout(sov[ex6_illeg_instr_offset:ex6_illeg_instr_offset + `MM_THREADS - 1]),
         .din(ex6_illeg_instr_d),
         .dout(ex6_illeg_instr_q)
      );

      tri_rlmreg_p #(.WIDTH(`MM_THREADS), .INIT(0), .NEEDS_SRESET(1)) ex7_illeg_instr_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex7_illeg_instr_offset:ex7_illeg_instr_offset + `MM_THREADS - 1]),
         .scout(sov[ex7_illeg_instr_offset:ex7_illeg_instr_offset + `MM_THREADS - 1]),
         .din(ex7_illeg_instr_d),
         .dout(ex7_illeg_instr_q)
      );

      tri_rlmreg_p #(.WIDTH(`MM_THREADS), .INIT(0), .NEEDS_SRESET(1)) ex3_ivax_lpid_reject_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex3_ivax_lpid_reject_offset:ex3_ivax_lpid_reject_offset + `MM_THREADS - 1]),
         .scout(sov[ex3_ivax_lpid_reject_offset:ex3_ivax_lpid_reject_offset + `MM_THREADS - 1]),
         .din(ex3_ivax_lpid_reject_d),
         .dout(ex3_ivax_lpid_reject_q)
      );

      tri_rlmreg_p #(.WIDTH(`MM_THREADS), .INIT(0), .NEEDS_SRESET(1)) ex4_ivax_lpid_reject_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[ex4_ivax_lpid_reject_offset:ex4_ivax_lpid_reject_offset + `MM_THREADS - 1]),
         .scout(sov[ex4_ivax_lpid_reject_offset:ex4_ivax_lpid_reject_offset + `MM_THREADS - 1]),
         .din(ex4_ivax_lpid_reject_d),
         .dout(ex4_ivax_lpid_reject_q)
      );

      tri_rlmreg_p #(.WIDTH(`MM_THREADS), .INIT(0), .NEEDS_SRESET(1)) local_snoop_reject_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[local_snoop_reject_offset:local_snoop_reject_offset + `MM_THREADS - 1]),
         .scout(sov[local_snoop_reject_offset:local_snoop_reject_offset + `MM_THREADS - 1]),
         .din(local_snoop_reject_d),
         .dout(local_snoop_reject_q)
      );
      // snoop output and ack latches 0:ierat, 1:derat, 2:tlb

      tri_rlmreg_p #(.WIDTH(5), .INIT(0), .NEEDS_SRESET(1)) snoop_coming_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[snoop_coming_offset:snoop_coming_offset + 5 - 1]),
         .scout(sov[snoop_coming_offset:snoop_coming_offset + 5 - 1]),
         .din(snoop_coming_d),
         .dout(snoop_coming_q)
      );

      tri_rlmreg_p #(.WIDTH(3), .INIT(0), .NEEDS_SRESET(1)) snoop_valid_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[snoop_valid_offset:snoop_valid_offset + 3 - 1]),
         .scout(sov[snoop_valid_offset:snoop_valid_offset + 3 - 1]),
         .din(snoop_valid_d),
         .dout(snoop_valid_q)
      );

      tri_rlmreg_p #(.WIDTH(35), .INIT(0), .NEEDS_SRESET(1)) snoop_attr_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(snoop_coming_q[3]),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[snoop_attr_offset:snoop_attr_offset + 35 - 1]),
         .scout(sov[snoop_attr_offset:snoop_attr_offset + 35 - 1]),
         .din(snoop_attr_d),
         .dout(snoop_attr_q)
      );

      tri_rlmreg_p #(.WIDTH(`EPN_WIDTH), .INIT(0), .NEEDS_SRESET(1)) snoop_vpn_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(snoop_coming_q[3]),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[snoop_vpn_offset:snoop_vpn_offset + `EPN_WIDTH - 1]),
         .scout(sov[snoop_vpn_offset:snoop_vpn_offset + `EPN_WIDTH - 1]),
         .din(snoop_vpn_d[52 - `EPN_WIDTH:51]),
         .dout(snoop_vpn_q[52 - `EPN_WIDTH:51])
      );

      tri_rlmreg_p #(.WIDTH(26), .INIT(0), .NEEDS_SRESET(1)) snoop_attr_clone_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(snoop_coming_q[4]),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[snoop_attr_clone_offset:snoop_attr_clone_offset + 26 - 1]),
         .scout(sov[snoop_attr_clone_offset:snoop_attr_clone_offset + 26 - 1]),
         .din(snoop_attr_clone_d),
         .dout(snoop_attr_clone_q)
      );

      tri_rlmreg_p #(.WIDTH(2), .INIT(0), .NEEDS_SRESET(1)) snoop_attr_tlb_spec_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(snoop_coming_q[3]),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[snoop_attr_tlb_spec_offset:snoop_attr_tlb_spec_offset + 2 - 1]),
         .scout(sov[snoop_attr_tlb_spec_offset:snoop_attr_tlb_spec_offset + 2 - 1]),
         .din(snoop_attr_tlb_spec_d),
         .dout(snoop_attr_tlb_spec_q)
      );

      tri_rlmreg_p #(.WIDTH(`EPN_WIDTH), .INIT(0), .NEEDS_SRESET(1)) snoop_vpn_clone_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(snoop_coming_q[4]),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[snoop_vpn_clone_offset:snoop_vpn_clone_offset + `EPN_WIDTH - 1]),
         .scout(sov[snoop_vpn_clone_offset:snoop_vpn_clone_offset + `EPN_WIDTH - 1]),
         .din(snoop_vpn_clone_d[52 - `EPN_WIDTH:51]),
         .dout(snoop_vpn_clone_q[52 - `EPN_WIDTH:51])
      );

      tri_rlmreg_p #(.WIDTH(3), .INIT(0), .NEEDS_SRESET(1)) snoop_ack_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[snoop_ack_offset:snoop_ack_offset + 3 - 1]),
         .scout(sov[snoop_ack_offset:snoop_ack_offset + 3 - 1]),
         .din(snoop_ack_d),
         .dout(snoop_ack_q)
      );

      tri_rlmreg_p #(.WIDTH(`MM_THREADS), .INIT(0), .NEEDS_SRESET(1)) mm_xu_quiesce_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[mm_xu_quiesce_offset:mm_xu_quiesce_offset + `MM_THREADS - 1]),
         .scout(sov[mm_xu_quiesce_offset:mm_xu_quiesce_offset + `MM_THREADS - 1]),
         .din(mm_xu_quiesce_d),
         .dout(mm_xu_quiesce_q)
      );

      tri_rlmreg_p #(.WIDTH(4*`MM_THREADS), .INIT(0), .NEEDS_SRESET(1)) mm_pc_quiesce_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[mm_pc_quiesce_offset:mm_pc_quiesce_offset + 4*`MM_THREADS - 1]),
         .scout(sov[mm_pc_quiesce_offset:mm_pc_quiesce_offset + 4*`MM_THREADS - 1]),
         .din(mm_pc_quiesce_d),
         .dout(mm_pc_quiesce_q)
      );

      // snoop invalidate input latches

      tri_rlmreg_p #(.WIDTH(9), .INIT(0), .NEEDS_SRESET(1)) an_ac_back_inv_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[an_ac_back_inv_offset:an_ac_back_inv_offset + 9 - 1]),
         .scout(sov[an_ac_back_inv_offset:an_ac_back_inv_offset + 9 - 1]),
         .din(an_ac_back_inv_d),
         .dout(an_ac_back_inv_q)
      );

      tri_rlmreg_p #(.WIDTH(`REAL_ADDR_WIDTH), .INIT(0), .NEEDS_SRESET(1)) an_ac_back_inv_addr_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[an_ac_back_inv_addr_offset:an_ac_back_inv_addr_offset + `REAL_ADDR_WIDTH - 1]),
         .scout(sov[an_ac_back_inv_addr_offset:an_ac_back_inv_addr_offset + `REAL_ADDR_WIDTH - 1]),
         .din(an_ac_back_inv_addr_d[64 - `REAL_ADDR_WIDTH:63]),
         .dout(an_ac_back_inv_addr_q[64 - `REAL_ADDR_WIDTH:63])
      );

      tri_rlmreg_p #(.WIDTH(`LPID_WIDTH), .INIT(0), .NEEDS_SRESET(1)) an_ac_back_inv_lpar_id_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[an_ac_back_inv_lpar_id_offset:an_ac_back_inv_lpar_id_offset + `LPID_WIDTH - 1]),
         .scout(sov[an_ac_back_inv_lpar_id_offset:an_ac_back_inv_lpar_id_offset + `LPID_WIDTH - 1]),
         .din(an_ac_back_inv_lpar_id_d[0:`LPID_WIDTH - 1]),
         .dout(an_ac_back_inv_lpar_id_q[0:`LPID_WIDTH - 1])
      );
      // Load/Store unit request interface latches

      tri_rlmreg_p #(.WIDTH(2), .INIT(1), .NEEDS_SRESET(1)) lsu_tokens_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[lsu_tokens_offset:lsu_tokens_offset + 2 - 1]),
         .scout(sov[lsu_tokens_offset:lsu_tokens_offset + 2 - 1]),
         .din(lsu_tokens_d[0:1]),
         .dout(lsu_tokens_q[0:1])
      );

      tri_rlmreg_p #(.WIDTH(`MM_THREADS), .INIT(0), .NEEDS_SRESET(1)) lsu_req_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[lsu_req_offset:lsu_req_offset + `MM_THREADS - 1]),
         .scout(sov[lsu_req_offset:lsu_req_offset + `MM_THREADS - 1]),
         .din(lsu_req_d),
         .dout(lsu_req_q)
      );

      tri_rlmreg_p #(.WIDTH(2), .INIT(0), .NEEDS_SRESET(1)) lsu_ttype_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[lsu_ttype_offset:lsu_ttype_offset + 2 - 1]),
         .scout(sov[lsu_ttype_offset:lsu_ttype_offset + 2 - 1]),
         .din(lsu_ttype_d[0:1]),
         .dout(lsu_ttype_q[0:1])
      );

      tri_rlmreg_p #(.WIDTH(4), .INIT(0), .NEEDS_SRESET(1)) lsu_ubits_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[lsu_ubits_offset:lsu_ubits_offset + 4 - 1]),
         .scout(sov[lsu_ubits_offset:lsu_ubits_offset + 4 - 1]),
         .din(lsu_ubits_d[0:3]),
         .dout(lsu_ubits_q[0:3])
      );

      tri_rlmreg_p #(.WIDTH(5), .INIT(0), .NEEDS_SRESET(1)) lsu_wimge_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[lsu_wimge_offset:lsu_wimge_offset + 5 - 1]),
         .scout(sov[lsu_wimge_offset:lsu_wimge_offset + 5 - 1]),
         .din(lsu_wimge_d[0:4]),
         .dout(lsu_wimge_q[0:4])
      );

      tri_rlmreg_p #(.WIDTH(`REAL_ADDR_WIDTH), .INIT(0), .NEEDS_SRESET(1)) lsu_addr_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[lsu_addr_offset:lsu_addr_offset + `REAL_ADDR_WIDTH - 1]),
         .scout(sov[lsu_addr_offset:lsu_addr_offset + `REAL_ADDR_WIDTH - 1]),
         .din(lsu_addr_d[64 - `REAL_ADDR_WIDTH:63]),
         .dout(lsu_addr_q[64 - `REAL_ADDR_WIDTH:63])
      );

      tri_rlmreg_p #(.WIDTH(`LPID_WIDTH), .INIT(0), .NEEDS_SRESET(1)) lsu_lpid_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[lsu_lpid_offset:lsu_lpid_offset + `LPID_WIDTH - 1]),
         .scout(sov[lsu_lpid_offset:lsu_lpid_offset + `LPID_WIDTH - 1]),
         .din(lsu_lpid_d[0:`LPID_WIDTH - 1]),
         .dout(lsu_lpid_q[0:`LPID_WIDTH - 1])
      );

      tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) lsu_ind_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[lsu_ind_offset]),
         .scout(sov[lsu_ind_offset]),
         .din(lsu_ind_d),
         .dout(lsu_ind_q)
      );

      tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) lsu_gs_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[lsu_gs_offset]),
         .scout(sov[lsu_gs_offset]),
         .din(lsu_gs_d),
         .dout(lsu_gs_q)
      );

      tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) lsu_lbit_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[lsu_lbit_offset]),
         .scout(sov[lsu_lbit_offset]),
         .din(lsu_lbit_d),
         .dout(lsu_lbit_q)
      );
      // core night-night sleep mode

      tri_rlmreg_p #(.WIDTH(4), .INIT(0), .NEEDS_SRESET(1)) power_managed_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[power_managed_offset:power_managed_offset + 4 - 1]),
         .scout(sov[power_managed_offset:power_managed_offset + 4 - 1]),
         .din(power_managed_d),
         .dout(power_managed_q)
      );

      // chicken switches
      //  0 - override lsu empty requirement for sending tlbivax
      //  1 - override lsu empty requirement for processing incoming tlbivax snoop
      //  2 - override wait for tlbwe back_inv erat snoop complete before issuing barrier_done, ord_read_done
      //  3 - override i-fetch miss queue empty requirement for processing incoming tlbivax snoop
      tri_rlmreg_p #(.WIDTH(4), .INIT(MMQ_INVAL_CSWITCH_0TO3), .NEEDS_SRESET(1)) cswitch_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[cswitch_offset:cswitch_offset + 4 - 1]),
         .scout(sov[cswitch_offset:cswitch_offset + 4 - 1]),
         .din(cswitch_q),
         .dout(cswitch_q)
      );

      tri_rlmreg_p #(.WIDTH(`MM_THREADS+2), .INIT(0), .NEEDS_SRESET(1)) tlbwe_back_inv_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[tlbwe_back_inv_offset:tlbwe_back_inv_offset + `MM_THREADS + 2 - 1]),
         .scout(sov[tlbwe_back_inv_offset:tlbwe_back_inv_offset + `MM_THREADS + 2 - 1]),
         .din(tlbwe_back_inv_d[0:`MM_THREADS+1]),
         .dout(tlbwe_back_inv_q[0:`MM_THREADS+1])
      );

      tri_rlmreg_p #(.WIDTH(`EPN_WIDTH), .INIT(0), .NEEDS_SRESET(1)) tlbwe_back_inv_addr_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[tlbwe_back_inv_addr_offset:tlbwe_back_inv_addr_offset + `EPN_WIDTH - 1]),
         .scout(sov[tlbwe_back_inv_addr_offset:tlbwe_back_inv_addr_offset + `EPN_WIDTH - 1]),
         .din(tlbwe_back_inv_addr_d[0:`EPN_WIDTH - 1]),
         .dout(tlbwe_back_inv_addr_q[0:`EPN_WIDTH - 1])
      );

      tri_rlmreg_p #(.WIDTH(35), .INIT(0), .NEEDS_SRESET(1)) tlbwe_back_inv_attr_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[tlbwe_back_inv_attr_offset:tlbwe_back_inv_attr_offset + 35 - 1]),
         .scout(sov[tlbwe_back_inv_attr_offset:tlbwe_back_inv_attr_offset + 35 - 1]),
         .din(tlbwe_back_inv_attr_d),
         .dout(tlbwe_back_inv_attr_q)
      );

      tri_rlmreg_p #(.WIDTH(6), .INIT(0), .NEEDS_SRESET(1)) inv_seq_inprogress_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[inv_seq_inprogress_offset:inv_seq_inprogress_offset + 6 - 1]),
         .scout(sov[inv_seq_inprogress_offset:inv_seq_inprogress_offset + 6 - 1]),
         .din(inv_seq_inprogress_d),
         .dout(inv_seq_inprogress_q)
      );

      tri_rlmreg_p #(.WIDTH(13), .INIT(0), .NEEDS_SRESET(1)) xu_mm_ccr2_notlb_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[xu_mm_ccr2_notlb_offset:xu_mm_ccr2_notlb_offset + 13 - 1]),
         .scout(sov[xu_mm_ccr2_notlb_offset:xu_mm_ccr2_notlb_offset + 13 - 1]),
         .din(xu_mm_ccr2_notlb_d),
         .dout(xu_mm_ccr2_notlb_q)
      );

      tri_rlmreg_p #(.WIDTH(16), .INIT(0), .NEEDS_SRESET(1)) spare_latch(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .act(tiup),
         .thold_b(pc_func_slp_sl_thold_0_b),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_sl_force),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .d_mode(lcb_d_mode_dc),
         .scin(siv[spare_offset:spare_offset + 16 - 1]),
         .scout(sov[spare_offset:spare_offset + 16 - 1]),
         .din(spare_q),
         .dout(spare_q)
      );
      // non-scannable config latches, includes bogus sg, scin, scout ports

      tri_regk #(.WIDTH(`MM_THREADS), .INIT(0), .NEEDS_SRESET(0)) epcr_dgtmi_latch(
         .nclk(nclk),
         .vd(vdd),
         .gd(gnd),
         .act(tiup),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_nsl_force),
         .d_mode(lcb_d_mode_dc),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .thold_b(pc_func_slp_nsl_thold_0_b),
         .scin({`MM_THREADS{tidn}}),
         //.scout(unused_dc[13]),
         .din(xu_mm_spr_epcr_dgtmi),
         .dout(xu_mm_epcr_dgtmi_q)
      );

      tri_regk #(.WIDTH(`LPID_WIDTH), .INIT(0), .NEEDS_SRESET(0)) lpidr_latch(
         .nclk(nclk),
         .vd(vdd),
         .gd(gnd),
         .act(tiup),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_nsl_force),
         .d_mode(lcb_d_mode_dc),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .thold_b(pc_func_slp_nsl_thold_0_b),
         .scin({`LPID_WIDTH{tidn}}),
         //.scout(unused_dc[14]),
         .din(lpidr),
         .dout(lpidr_q)
      );

      tri_regk #(.WIDTH(8), .INIT(0), .NEEDS_SRESET(0)) mmucr1_latch(
         .nclk(nclk),
         .vd(vdd),
         .gd(gnd),
         .act(tiup),
         .sg(pc_sg_0),
         .force_t(pc_func_slp_nsl_force),
         .d_mode(lcb_d_mode_dc),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .thold_b(pc_func_slp_nsl_thold_0_b),
         .scin({8{tidn}}),
         //.scout(unused_dc[15]),
         .din(mmucr1),
         .dout(mmucr1_q)
      );

      tri_regk #(.WIDTH(2), .INIT(0), .NEEDS_SRESET(0)) mmucr1_csinv_latch(
         .nclk(nclk),
         .vd(vdd),
         .gd(gnd),
         .act(tiup),
         .force_t(pc_func_slp_nsl_force),
         .sg(pc_sg_0),
         .d_mode(lcb_d_mode_dc),
         .delay_lclkr(lcb_delay_lclkr_dc[0]),
         .mpw1_b(lcb_mpw1_dc_b[0]),
         .mpw2_b(lcb_mpw2_dc_b),
         .thold_b(pc_func_slp_nsl_thold_0_b),
         .scin({2{tidn}}),
         //.scout(unused_dc[16]),
         .din(mmucr1_csinv),
         .dout(mmucr1_csinv_q)
      );

      //------------------------------------------------
      // thold/sg latches
      //------------------------------------------------

      tri_plat #(.WIDTH(5)) perv_2to1_reg(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .flush(tc_ccflush_dc),
         .din( {pc_func_sl_thold_2, pc_func_slp_sl_thold_2, pc_func_slp_nsl_thold_2, pc_sg_2, pc_fce_2} ),
         .q( {pc_func_sl_thold_1, pc_func_slp_sl_thold_1, pc_func_slp_nsl_thold_1, pc_sg_1, pc_fce_1} )
      );

      tri_plat #(.WIDTH(5)) perv_1to0_reg(
         .vd(vdd),
         .gd(gnd),
         .nclk(nclk),
         .flush(tc_ccflush_dc),
         .din( {pc_func_sl_thold_1, pc_func_slp_sl_thold_1, pc_func_slp_nsl_thold_1, pc_sg_1, pc_fce_1} ),
         .q( {pc_func_sl_thold_0, pc_func_slp_sl_thold_0, pc_func_slp_nsl_thold_0, pc_sg_0, pc_fce_0} )
      );

      tri_lcbor perv_lcbor_func_sl(
         .clkoff_b(lcb_clkoff_dc_b),
         .thold(pc_func_sl_thold_0),
         .sg(pc_sg_0),
         .act_dis(lcb_act_dis_dc),
         .force_t(pc_func_sl_force),
         .thold_b(pc_func_sl_thold_0_b)
      );

      tri_lcbor perv_lcbor_func_slp_sl(
         .clkoff_b(lcb_clkoff_dc_b),
         .thold(pc_func_slp_sl_thold_0),
         .sg(pc_sg_0),
         .act_dis(lcb_act_dis_dc),
         .force_t(pc_func_slp_sl_force),
         .thold_b(pc_func_slp_sl_thold_0_b)
      );

      tri_lcbor perv_nsl_lcbor(
         .clkoff_b(lcb_clkoff_dc_b),
         .thold(pc_func_slp_nsl_thold_0),
         .sg(pc_fce_0),
         .act_dis(tidn),
         .force_t(pc_func_slp_nsl_force),
         .thold_b(pc_func_slp_nsl_thold_0_b)
      );

      //---------------------------------------------------------------------
      // Scan
      //---------------------------------------------------------------------
      assign siv[0:scan_right] = {sov[1:scan_right], ac_func_scan_in};
      assign ac_func_scan_out = sov[0];

endmodule
