// © 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.

`timescale 1 ns / 1 ns

//
//  Description:  XU LSU Order Queue
//
//*****************************************************************************

`include "tri_a2o.vh"

module lq_odq(		// 0 = ibm (Umbra), 1 = non-ibm, 2 = ibm (MPG)
   rv_lq_rv1_i0_vld,
   rv_lq_rv1_i0_ucode_preissue,
   rv_lq_rv1_i0_s3_t,
   rv_lq_rv1_i0_rte_lq,
   rv_lq_rv1_i0_rte_sq,
   rv_lq_rv1_i0_isLoad,
   rv_lq_rv1_i0_isStore,
   rv_lq_rv1_i0_itag,
   rv_lq_rv1_i1_vld,
   rv_lq_rv1_i1_ucode_preissue,
   rv_lq_rv1_i1_s3_t,
   rv_lq_rv1_i1_rte_lq,
   rv_lq_rv1_i1_rte_sq,
   rv_lq_rv1_i1_isLoad,
   rv_lq_rv1_i1_isStore,
   rv_lq_rv1_i1_itag,
   ldq_odq_vld,
   ldq_odq_tid,
   ldq_odq_wimge_i,
   ldq_odq_inv,
   ldq_odq_hit,
   ldq_odq_fwd,
   ldq_odq_addr,
   ldq_odq_bytemask,
   ldq_odq_itag,
   ldq_odq_cline_chk,
   ldq_odq_ex6_pEvents,
   ctl_lsq_ex6_ldh_dacrw,
   ldq_odq_upd_val,
   ldq_odq_upd_itag,
   ldq_odq_upd_nFlush,
   ldq_odq_upd_np1Flush,
   ldq_odq_upd_tid,
   ldq_odq_upd_dacrw,
   ldq_odq_upd_eccue,
   ldq_odq_upd_pEvents,
   ldq_odq_pfetch_vld,
   odq_ldq_resolved,
   odq_ldq_report_needed,
   odq_ldq_report_itag,
   odq_ldq_n_flush,
   odq_ldq_np1_flush,
   odq_ldq_report_tid,
   odq_ldq_report_dacrw,
   odq_ldq_report_eccue,
   odq_ldq_report_pEvents,
   odq_stq_resolved,
   odq_stq_stTag,
   odq_ldq_oldest_ld_tid,
   odq_ldq_oldest_ld_itag,
   odq_ldq_ex7_pfetch_blk,
   lsq_ctl_oldest_tid,
   lsq_ctl_oldest_itag,
   ctl_lsq_ex2_thrd_id,
   ctl_lsq_ex2_itag,
   stq_odq_i0_stTag,
   stq_odq_i1_stTag,
   stq_odq_stq4_stTag_inval,
   stq_odq_stq4_stTag,
   odq_stq_ex2_nxt_oldest_val,
   odq_stq_ex2_nxt_oldest_stTag,
   odq_stq_ex2_nxt_youngest_val,
   odq_stq_ex2_nxt_youngest_stTag,
   iu_lq_cp_next_itag,
   iu_lq_i0_completed,
   iu_lq_i0_completed_itag,
   iu_lq_i1_completed,
   iu_lq_i1_completed_itag,
   l2_back_inv_val,
   l2_back_inv_addr,
   iu_lq_cp_flush,
   lq_iu_credit_free,
   xu_lq_spr_xucr0_cls,
   lsq_perv_odq_events,
   vdd,
   gnd,
   clk,
   rst,
   sg_0,
   func_sl_thold_0_b,
   func_sl_force,
   d_mode_dc,
   delay_lclkr_dc,
   mpw1_dc_b,
   mpw2_dc_b,
   scan_in,
   scan_out
);

   // Parameters used from tri_a2o.vh
   //   parameter                         THREADS           = 2;	// number of threads
   //   parameter                         LDSTQ_ENTRIES     = 16;	// Load Queue Size
   //   parameter                         LDSTQ_ENTRIES_ENC = 4;	// Load Queue array address width
   //   parameter                         STQ_ENTRIES_ENC   = 4;	// Store Queue Entries Encoded
   //   parameter                         STQ_ENTRIES       = 12;	// Number of Store Queue Entries
   //   parameter                         ITAG_SIZE_ENC     = 7;        // ITag Size
   //   parameter                         DC_SIZE           = 15 	// 14 => 16K L1D$, 15 => 32K L1D$
   //   parameter                         CL_SIZE           = 6;	// 6 => 64B CLINE, 7 => 128B CLINE
   //   parameter                         REAL_IFAR_WIDTH   = 42;
   parameter DACR_WIDTH = 4;


   //   IU interface to RV for instruction insertion
   // port 0
   input [0:`THREADS-1]              rv_lq_rv1_i0_vld;
   input                             rv_lq_rv1_i0_ucode_preissue;
   input [0:2]                       rv_lq_rv1_i0_s3_t;
   input                             rv_lq_rv1_i0_rte_lq;
   input                             rv_lq_rv1_i0_rte_sq;
   input                             rv_lq_rv1_i0_isLoad;
   input                             rv_lq_rv1_i0_isStore;
   input [0:`ITAG_SIZE_ENC-1] 	     rv_lq_rv1_i0_itag;

   // port 1
   input [0:`THREADS-1]              rv_lq_rv1_i1_vld;
   input                             rv_lq_rv1_i1_ucode_preissue;
   input [0:2]                       rv_lq_rv1_i1_s3_t;
   input                             rv_lq_rv1_i1_rte_lq;
   input                             rv_lq_rv1_i1_rte_sq;
   input                             rv_lq_rv1_i1_isLoad;
   input                             rv_lq_rv1_i1_isStore;
   input [0:`ITAG_SIZE_ENC-1] 	     rv_lq_rv1_i1_itag;

   //
   // These interfaces from ldq are mutually exlcusive
   // You can either update and entry or remove an entry
   // Interface between ldstq and orderq
   input                             ldq_odq_vld;
   input [0:`THREADS-1]              ldq_odq_tid;
   input                             ldq_odq_wimge_i;
   input                             ldq_odq_inv;
   input                             ldq_odq_hit;
   input                             ldq_odq_fwd;
   input [64-`REAL_IFAR_WIDTH:59]    ldq_odq_addr;
   input [0:15]                      ldq_odq_bytemask;
   input [0:`ITAG_SIZE_ENC-1]        ldq_odq_itag;
   input                             ldq_odq_cline_chk;
   input [0:3]                       ldq_odq_ex6_pEvents;

   // DACRW results for Load hits, 1 cycle after ldq_odq_vld
   input [0:DACR_WIDTH-1]            ctl_lsq_ex6_ldh_dacrw;

   // second update bus from lq
   input                             ldq_odq_upd_val;
   input [0:`ITAG_SIZE_ENC-1]        ldq_odq_upd_itag;
   input                             ldq_odq_upd_nFlush;
   input                             ldq_odq_upd_np1Flush;
   input [0:`THREADS-1]              ldq_odq_upd_tid;
   input [0:DACR_WIDTH-1]            ldq_odq_upd_dacrw;
   input                             ldq_odq_upd_eccue;
   input [0:3]                       ldq_odq_upd_pEvents;
   input                             ldq_odq_pfetch_vld;

   // send indicator, valid with itag to ldq
   output                            odq_ldq_resolved;
   output                            odq_ldq_report_needed;
   output [0:`ITAG_SIZE_ENC-1]       odq_ldq_report_itag;
   output                            odq_ldq_n_flush;
   output                            odq_ldq_np1_flush;
   output [0:`THREADS-1]             odq_ldq_report_tid;
   output [0:DACR_WIDTH-1]           odq_ldq_report_dacrw;
   output                            odq_ldq_report_eccue;
   output [0:3]                      odq_ldq_report_pEvents;
   output                            odq_stq_resolved;
   output [0:`STQ_ENTRIES-1]         odq_stq_stTag;

   output [0:`THREADS-1]             odq_ldq_oldest_ld_tid;
   output [0:`ITAG_SIZE_ENC-1]       odq_ldq_oldest_ld_itag;
   output                            odq_ldq_ex7_pfetch_blk;

   output [0:`THREADS-1]             lsq_ctl_oldest_tid;
   output [0:`ITAG_SIZE_ENC-1]       lsq_ctl_oldest_itag;

   // Age Detection
   // need to determine age for this load in ex2
   input [0:`THREADS-1]              ctl_lsq_ex2_thrd_id;
   input [0:`ITAG_SIZE_ENC-1]        ctl_lsq_ex2_itag;

   // store tag used when instruction was inserted to store queue
   input [0:`STQ_ENTRIES_ENC-1]      stq_odq_i0_stTag;
   input [0:`STQ_ENTRIES_ENC-1]      stq_odq_i1_stTag;

   // store tag is committed, remove from order queue and dont compare against it
   input                             stq_odq_stq4_stTag_inval;
   input [0:`STQ_ENTRIES_ENC-1]      stq_odq_stq4_stTag;

   // order queue closest oldest store to the ex2 load request
   output                            odq_stq_ex2_nxt_oldest_val;
   output [0:`STQ_ENTRIES-1]         odq_stq_ex2_nxt_oldest_stTag;

   // order queue closest youngest store to the ex2 load request
   output                            odq_stq_ex2_nxt_youngest_val;
   output [0:`STQ_ENTRIES-1]         odq_stq_ex2_nxt_youngest_stTag;

   // CP_NEXT Itag
   input [0:(`THREADS * `ITAG_SIZE_ENC)-1]  iu_lq_cp_next_itag;

   // Commit Report
   input [0:`THREADS-1]                     iu_lq_i0_completed;
   input [0:(`THREADS * `ITAG_SIZE_ENC)-1]  iu_lq_i0_completed_itag;
   input [0:`THREADS-1]                     iu_lq_i1_completed;
   input [0:(`THREADS * `ITAG_SIZE_ENC)-1]  iu_lq_i1_completed_itag;

   // Back-Invalidate Valid
   input                             l2_back_inv_val;
   input [67-`DC_SIZE:63-`CL_SIZE]   l2_back_inv_addr;

   // flush interface
   input [0:`THREADS-1]              iu_lq_cp_flush;

   // return credit to iu
   output [0:`THREADS-1]             lq_iu_credit_free;

   // mode bit
   input                             xu_lq_spr_xucr0_cls;

   // Performance Events
   output [0:4+`THREADS-1]           lsq_perv_odq_events;

   // Pervasive
   inout                             vdd;
   inout                             gnd;
   input                             clk;
   input                             rst;
   input                             sg_0;
   input                             func_sl_thold_0_b;
   input                             func_sl_force;
   input                             d_mode_dc;
   input                             delay_lclkr_dc;
   input                             mpw1_dc_b;
   input                             mpw2_dc_b;

   (* pin_data="PIN_FUNCTION=/SCAN_IN/" *)

   input                             scan_in;

   (* pin_data="PIN_FUNCTION=/SCAN_OUT/" *)

   output                            scan_out;

   //--------------------------
   // signals
   //--------------------------
   wire [0:`LDSTQ_ENTRIES-1] 	     remove_entry_base;
   wire [0:`LDSTQ_ENTRIES-1] 	     compress_vector;
   wire                              compress_val;
   wire [0:`LDSTQ_ENTRIES_ENC-1]     compress_entry;
   wire [0:`LDSTQ_ENTRIES-1] 	     remove_entry_vec;
   reg  [0:`LDSTQ_ENTRIES_ENC-1]     remove_entry;
   reg  [0:`THREADS-1]               remove_tid;

   wire [67-`DC_SIZE:63-`CL_SIZE]    oldest_entry_p0_cclass;
   wire [67-`DC_SIZE:63-`CL_SIZE]    oldest_entry_p1_cclass;
   wire                              oldest_entry_p0_m_rv0;
   wire                              oldest_entry_p1_m_rv0;
   wire                              oldest_entry_p1_m_rv1;
   wire                              oldest_entry_p1_m_ex0;
   wire                              oldest_entry_p1_m_ex1;
   wire                              oldest_entry_p1_m_ex2;
   wire                              oldest_entry_p1_m_ex3;
   wire                              oldest_entry_p1_m_ex4;
   wire                              oldest_entry_p1_m_ex5;
   wire                              entry_rv1_blk_d;
   wire                              entry_rv1_blk_q;
   wire                              entry_ex0_blk_d;
   wire                              entry_ex0_blk_q;
   wire                              entry_ex1_blk_d;
   wire                              entry_ex1_blk_q;
   wire                              entry_ex2_blk_d;
   wire                              entry_ex2_blk_q;
   wire                              entry_ex3_blk_d;
   wire                              entry_ex3_blk_q;
   wire                              entry_ex4_blk_d;
   wire                              entry_ex4_blk_q;
   wire                              entry_ex5_blk_d;
   wire                              entry_ex5_blk_q;
   wire                              entry_ex6_blk_d;
   wire                              entry_ex6_blk_q;
   wire                              oldest_entry_blk;

   // Order Queue field values
   reg                               orderq_entry_inuse_d[0:`LDSTQ_ENTRIES-1];      // order queue entry in use
   wire                              orderq_entry_inuse_q[0:`LDSTQ_ENTRIES-1];
   reg  [0:`THREADS-1] 	             orderq_entry_tid_d[0:`LDSTQ_ENTRIES-1];        // order queue entry thread ID
   wire [0:`THREADS-1]               orderq_entry_tid_q[0:`LDSTQ_ENTRIES-1];
   reg                               orderq_entry_val_d[0:`LDSTQ_ENTRIES-1];        // order queue entry valid
   wire                              orderq_entry_val_q[0:`LDSTQ_ENTRIES-1];
   reg                               orderq_entry_ld_d[0:`LDSTQ_ENTRIES-1];         // order queue entry is load
   wire                              orderq_entry_ld_q[0:`LDSTQ_ENTRIES-1];
   reg                               orderq_entry_efs_d[0:`LDSTQ_ENTRIES-1];        // order queue entry needs to stay in order
   wire                              orderq_entry_efs_q[0:`LDSTQ_ENTRIES-1];
   reg                               orderq_entry_i_d[0:`LDSTQ_ENTRIES-1];          // order queue entry is caching-inhibited
   wire                              orderq_entry_i_q[0:`LDSTQ_ENTRIES-1];
   reg                               orderq_entry_hit_d[0:`LDSTQ_ENTRIES-1];        // order queue entry is hit
   wire                              orderq_entry_hit_q[0:`LDSTQ_ENTRIES-1];
   reg                               orderq_entry_fwd_d[0:`LDSTQ_ENTRIES-1];        // order queue entry forwarded from store queue
   wire                              orderq_entry_fwd_q[0:`LDSTQ_ENTRIES-1];
   reg                               orderq_entry_cls_op_d[0:`LDSTQ_ENTRIES-1];     // order queue op requires full cacheline compare
   wire                              orderq_entry_cls_op_q[0:`LDSTQ_ENTRIES-1];
   reg  [0:DACR_WIDTH-1]             orderq_entry_dacrw_d[0:`LDSTQ_ENTRIES-1];      // order queue entry DACRW results for load hits only
   wire [0:DACR_WIDTH-1]             orderq_entry_dacrw_q[0:`LDSTQ_ENTRIES-1];
   reg                               orderq_entry_eccue_d[0:`LDSTQ_ENTRIES-1];      // order queue entry had an ECC_UE on the L2 interface
   wire                              orderq_entry_eccue_q[0:`LDSTQ_ENTRIES-1];
   reg  [0:3]                        orderq_entry_pEvents_d[0:`LDSTQ_ENTRIES-1];    // order queue entry Performance Events result
   wire [0:3]                        orderq_entry_pEvents_q[0:`LDSTQ_ENTRIES-1];
   reg                               orderq_entry_pre_d[0:`LDSTQ_ENTRIES-1];        // order queue entry resolved idication has been sent to ldq
   wire                              orderq_entry_pre_q[0:`LDSTQ_ENTRIES-1];
   reg                               orderq_entry_instq_d[0:`LDSTQ_ENTRIES-1];      // order queue entry is a store queue request
   wire                              orderq_entry_instq_q[0:`LDSTQ_ENTRIES-1];
   reg                               orderq_entry_flushed_d[0:`LDSTQ_ENTRIES-1];    // order queue entry has been flushed
   wire                              orderq_entry_flushed_q[0:`LDSTQ_ENTRIES-1];
   reg                               orderq_entry_myflush_d[0:`LDSTQ_ENTRIES-1];    // order queue entry has been flushed
   wire                              orderq_entry_myflush_q[0:`LDSTQ_ENTRIES-1];
   reg                               orderq_entry_ld_chk_d[0:`LDSTQ_ENTRIES-1];     // order queue entry load needs collision check
   wire                              orderq_entry_ld_chk_q[0:`LDSTQ_ENTRIES-1];
   reg  [0:`STQ_ENTRIES_ENC-1] 	     orderq_entry_stTag_d[0:`LDSTQ_ENTRIES-1];      // order queue entry Store Tag
   wire [0:`STQ_ENTRIES_ENC-1] 	     orderq_entry_stTag_q[0:`LDSTQ_ENTRIES-1];
   reg                               orderq_entry_cmmt_d[0:`LDSTQ_ENTRIES-1];       // order queue entry has been committed
   wire                              orderq_entry_cmmt_q[0:`LDSTQ_ENTRIES-1];

   reg                               orderq_entry_bi_flag_d[0:`LDSTQ_ENTRIES-1];    // order queue entry had a back invalidate come in after it
   wire                              orderq_entry_bi_flag_q[0:`LDSTQ_ENTRIES-1];
   reg                               orderq_entry_bi_flush_d[0:`LDSTQ_ENTRIES-1];   // order queue entry needs to be flushed due to back invalidate
   wire                              orderq_entry_bi_flush_q[0:`LDSTQ_ENTRIES-1];

   reg                               orderq_entry_val2_d[0:`LDSTQ_ENTRIES-1];       // order queue entry valid for second update bus
   wire                              orderq_entry_val2_q[0:`LDSTQ_ENTRIES-1];
   reg                               orderq_entry_n_flush_d[0:`LDSTQ_ENTRIES-1];    // order queue entry needs to be np flushed due to back invalidate
   wire                              orderq_entry_n_flush_q[0:`LDSTQ_ENTRIES-1];
   reg                               orderq_entry_np1_flush_d[0:`LDSTQ_ENTRIES-1];  // order queue entry needs to be np1 flushed due to back invalidate
   wire                              orderq_entry_np1_flush_q[0:`LDSTQ_ENTRIES-1];
   reg                               orderq_entry_update_pulse_d[0:`LDSTQ_ENTRIES-1];// order queue entry update pulse.  Indicates that the entry just became valid.
   wire                              orderq_entry_update_pulse_q[0:`LDSTQ_ENTRIES-1];// it should only be on for a single cycle.

   reg  [0:`ITAG_SIZE_ENC-1] 	     orderq_entry_itag_d[0:`LDSTQ_ENTRIES-1];       // order queue entry itag
   wire [0:`ITAG_SIZE_ENC-1] 	     orderq_entry_itag_q[0:`LDSTQ_ENTRIES-1];

   // Address Queue field values
   reg                               addrq_entry_inuse_d[0:`LDSTQ_ENTRIES-1];       // addr queue entry in use
   wire                              addrq_entry_inuse_q[0:`LDSTQ_ENTRIES-1];
   reg                               addrq_entry_val_d[0:`LDSTQ_ENTRIES-1];         // addr queue entry valid
   wire                              addrq_entry_val_q[0:`LDSTQ_ENTRIES-1];
   reg  [0:`THREADS-1]               addrq_entry_tid_d[0:`LDSTQ_ENTRIES-1];         // addr queue entry thread ID
   wire [0:`THREADS-1]               addrq_entry_tid_q[0:`LDSTQ_ENTRIES-1];
   reg  [0:`ITAG_SIZE_ENC-1] 	     addrq_entry_itag_d[0:`LDSTQ_ENTRIES-1];        // addr queue entry itag
   wire [0:`ITAG_SIZE_ENC-1] 	     addrq_entry_itag_q[0:`LDSTQ_ENTRIES-1];
   reg  [64-`REAL_IFAR_WIDTH:59]     addrq_entry_address_d[0:`LDSTQ_ENTRIES-1];     // addr queue address
   wire [64-`REAL_IFAR_WIDTH:59]     addrq_entry_address_q[0:`LDSTQ_ENTRIES-1];
   reg  [0:15]                       addrq_entry_bytemask_d[0:`LDSTQ_ENTRIES-1];    // addr queue byte mask
   wire [0:15]                       addrq_entry_bytemask_q[0:`LDSTQ_ENTRIES-1];

   wire                              compress_val_d;
   wire                              compress_val_q;


   // port 0
   wire [0:`THREADS-1]               ex0_i0_vld_q;
   wire                              ex0_i0_rte_lq_q;
   wire                              ex0_i0_rte_sq_q;
   wire                              ex0_i0_ucode_preissue_q;
   wire [0:2]                        ex0_i0_s3_t_q;
   wire                              ex0_i0_isLoad_q;
   wire                              ex0_i0_isStore_q;
   wire [0:`ITAG_SIZE_ENC-1]         ex0_i0_itag_q;

   wire [0:`THREADS-1]               ex1_i0_vld_d;
   wire [0:`THREADS-1]               ex1_i0_vld_q;
   wire                              ex1_i0_pre_d;
   wire                              ex1_i0_pre_q;
   wire                              ex1_i0_isLoad_d;
   wire                              ex1_i0_isLoad_q;
   wire [0:`ITAG_SIZE_ENC-1] 	     ex1_i0_itag_d;
   wire [0:`ITAG_SIZE_ENC-1] 	     ex1_i0_itag_q;

   // port 1
   wire [0:`THREADS-1]               ex0_i1_vld_q;
   wire                              ex0_i1_rte_lq_q;
   wire                              ex0_i1_rte_sq_q;
   wire                              ex0_i1_ucode_preissue_q;
   wire [0:2]                        ex0_i1_s3_t_q;
   wire                              ex0_i1_isLoad_q;
   wire                              ex0_i1_isStore_q;
   wire [0:`ITAG_SIZE_ENC-1]         ex0_i1_itag_q;

   wire [0:`THREADS-1]               ex1_i1_vld_d;
   wire [0:`THREADS-1]               ex1_i1_vld_q;
   wire                              ex1_i1_pre_d;
   wire                              ex1_i1_pre_q;
   wire                              ex1_i1_isLoad_d;
   wire                              ex1_i1_isLoad_q;
   wire [0:`ITAG_SIZE_ENC-1]         ex1_i1_itag_d;
   wire [0:`ITAG_SIZE_ENC-1]         ex1_i1_itag_q;


   wire [0:`LDSTQ_ENTRIES]           next_fill_ptr_d;
   wire [0:`LDSTQ_ENTRIES]           next_fill_ptr_q;

   wire [0:`LDSTQ_ENTRIES_ENC-1]     flushed_credit_count_d[0:`THREADS-1];
   wire [0:`LDSTQ_ENTRIES_ENC-1]     flushed_credit_count_q[0:`THREADS-1];

   wire [0:`THREADS-1]               cp_flush_d;
   wire [0:`THREADS-1]               cp_flush_q;
   wire [0:`THREADS-1]               cp_flush2_d;
   wire [0:`THREADS-1]               cp_flush2_q;
   wire [0:`THREADS-1]               cp_flush3_d;
   wire [0:`THREADS-1] 	             cp_flush3_q;
   wire [0:`THREADS-1] 	             cp_flush4_d;
   wire [0:`THREADS-1] 	             cp_flush4_q;
   wire [0:`THREADS-1] 	             cp_flush5_d;
   wire [0:`THREADS-1] 	             cp_flush5_q;

   wire                              xu_lq_spr_xucr0_cls_q;
   wire [0:`THREADS-1]               lq_iu_credit_free_d;
   wire [0:`THREADS-1]               lq_iu_credit_free_q;

   // pipeline latches for ldq_odq interface
   wire                              ldq_odq_vld_q;
   wire [0:`THREADS-1] 	             ldq_odq_tid_q;
   wire                              ldq_odq_inv_q;
   wire                              ldq_odq_wimge_i_q;
   wire                              ldq_odq_hit_q;
   wire                              ldq_odq_fwd_q;
   wire [0:`ITAG_SIZE_ENC-1] 	     ldq_odq_itag_q;
   wire                              ldq_odq_cline_chk_q;
   wire [0:`ITAG_SIZE_ENC-1] 	     iu_lq_cp_next_itag_q[0:`THREADS-1];
   wire [0:`THREADS-1]               cp_i0_completed_q;
   wire [0:`ITAG_SIZE_ENC-1] 	     cp_i0_completed_itag_q[0:`THREADS-1];
   wire [0:`THREADS-1]               cp_i1_completed_q;
   wire [0:`ITAG_SIZE_ENC-1] 	     cp_i1_completed_itag_q[0:`THREADS-1];

   // extra entry is source for compressing the 15th entry
   reg                               orderq_entry_inuse_next[0:`LDSTQ_ENTRIES];     // order queue entry in use
   reg [0:`THREADS-1]                orderq_entry_tid_next[0:`LDSTQ_ENTRIES];       // order queue entry thread id
   reg                               orderq_entry_val_next[0:`LDSTQ_ENTRIES];       // order queue entry valid
   reg                               orderq_entry_ld_next[0:`LDSTQ_ENTRIES];        // order queue entry is load
   reg                               orderq_entry_efs_next[0:`LDSTQ_ENTRIES];       // order queue entry is load
   reg                               orderq_entry_i_next[0:`LDSTQ_ENTRIES];         // order queue entry is caching-inhibited
   reg                               orderq_entry_hit_next[0:`LDSTQ_ENTRIES];       // order queue entry is cache hit
   reg                               orderq_entry_fwd_next[0:`LDSTQ_ENTRIES];       // order queue entry forwarded from store queue
   reg                               orderq_entry_cls_op_next[0:`LDSTQ_ENTRIES];    // order queue entry is cachline sized operation
   reg  [0:DACR_WIDTH-1] 	         orderq_entry_dacrw_next[0:`LDSTQ_ENTRIES];     // order queue entry DACRW results for load hits
   reg                               orderq_entry_eccue_next[0:`LDSTQ_ENTRIES];     // order queue entry ECC_UE results
   reg  [0:3] 	                     orderq_entry_pEvents_next[0:`LDSTQ_ENTRIES];   // order queue entry Performance Events results
   reg                               orderq_entry_pre_next[0:`LDSTQ_ENTRIES];		// order queue entry resolved idication has been sent to ldq
   reg                               orderq_entry_instq_next[0:`LDSTQ_ENTRIES];		// order queue entry is a store queue request
   reg                               orderq_entry_flushed_next[0:`LDSTQ_ENTRIES];	// order queue entry has been flushed
   reg                               orderq_entry_myflush_next[0:`LDSTQ_ENTRIES];	// order queue entry has been flushed
   reg                               orderq_entry_ld_chk_next[0:`LDSTQ_ENTRIES];	// order queue entries reload data is ready
   reg  [0:`STQ_ENTRIES_ENC-1] 	     orderq_entry_stTag_next[0:`LDSTQ_ENTRIES];		// order queue entry Store Tag
   reg                               orderq_entry_cmmt_next[0:`LDSTQ_ENTRIES];		// order queue entry has been committed
   reg                               orderq_entry_bi_flag_next[0:`LDSTQ_ENTRIES];	// order queue entry is a back invalidate
   reg                               orderq_entry_bi_flush_next[0:`LDSTQ_ENTRIES];	// order queue entry is flushed due to back invalidate
   reg                               orderq_entry_val2_next[0:`LDSTQ_ENTRIES];		// order queue entry valid for second update bus
   reg                               orderq_entry_n_flush_next[0:`LDSTQ_ENTRIES];	// order queue entry is np flushed due to back invalidate
   reg                               orderq_entry_np1_flush_next[0:`LDSTQ_ENTRIES];	// order queue entry is np1 flushed due to back invalidate
   reg                               orderq_entry_update_pulse_next[0:`LDSTQ_ENTRIES];	// order queue entry update pulse, on for 1 cycle with val
   reg  [0:`ITAG_SIZE_ENC-1] 	     orderq_entry_itag_next[0:`LDSTQ_ENTRIES];		// order queue entry itag
   wire [0:`STQ_ENTRIES-1]           orderq_entry_stTag_1hot[0:`LDSTQ_ENTRIES-1];   // order queue entry 1-hot Store Tag
   wire                              orderq_entry_instq_inval[0:`LDSTQ_ENTRIES-1];	// order queue entry needs to invalidate instq state bit
   reg  [0:`ITAG_SIZE_ENC-1]         oderq_entry_i0_comp_itag[0:`LDSTQ_ENTRIES-1];  // order queue entry committed itag on I0 bus
   reg  [0:`ITAG_SIZE_ENC-1] 	     oderq_entry_i1_comp_itag[0:`LDSTQ_ENTRIES-1];  // order queue entry committed itag on I1 bus
   wire                              orderq_entry_i0_cmmt[0:`LDSTQ_ENTRIES-1];		// order queue entry committed on I0 bus
   wire                              orderq_entry_i1_cmmt[0:`LDSTQ_ENTRIES-1];      // order queue entry committed on I1 bus
   wire                              orderq_entry_cmmt[0:`LDSTQ_ENTRIES-1];	        // order queue entry committed

   reg                               addrq_entry_inuse_next[0:`LDSTQ_ENTRIES];		// addr queue entry in use
   reg                               addrq_entry_val_next[0:`LDSTQ_ENTRIES];		// addr queue entry valid
   reg  [0:`THREADS-1]               addrq_entry_tid_next[0:`LDSTQ_ENTRIES];		// addr queue entry thread ID
   reg  [0:`ITAG_SIZE_ENC-1] 	     addrq_entry_itag_next[0:`LDSTQ_ENTRIES];		// order queue entry itag
   reg  [64-`REAL_IFAR_WIDTH:59]     addrq_entry_address_next[0:`LDSTQ_ENTRIES];	// addr queue address
   reg  [0:15]                       addrq_entry_bytemask_next[0:`LDSTQ_ENTRIES];	// addr queue byte mask

   wire [0:`LDSTQ_ENTRIES-1] 	     collision_vector_pre;
   wire [0:`LDSTQ_ENTRIES-1] 	     collision_vector;
   wire [0:`LDSTQ_ENTRIES-1] 	     collision_vector_d;
   wire [0:`LDSTQ_ENTRIES-1] 	     collision_vector_q;

   reg  [0:`LDSTQ_ENTRIES-1] 	     flush_vector_pre;
   wire [0:`LDSTQ_ENTRIES-1] 	     flush_vector;

   wire [0:`LDSTQ_ENTRIES-1] 	     collision_vector_new;

   wire [0:`LDSTQ_ENTRIES-1] 	     ci_flush_detected;
   wire [0:`LDSTQ_ENTRIES-1] 	     forw_flush_detected;
   wire [0:`LDSTQ_ENTRIES-1] 	     store_flush_detected;
   wire [0:`LDSTQ_ENTRIES-1] 	     set_flush_condition;

   wire [0:2]                        next_fill_sel;

   wire                              instr0_vld;
   wire                              instr1_vld;

   wire [0:`LDSTQ_ENTRIES-1] 	     next_instr0_ptr;
   wire [0:`LDSTQ_ENTRIES-1] 	     next_instr1_ptr;
   wire [0:`LDSTQ_ENTRIES-1] 	     write_instr0;
   wire [0:`LDSTQ_ENTRIES-1] 	     write_instr1;
   wire [0:`LDSTQ_ENTRIES-1] 	     update_vld;
   wire [0:`LDSTQ_ENTRIES-1] 	     update2_vld;
   wire [0:`LDSTQ_ENTRIES-1] 	     cp_flush_entry;

   wire [0:`LDSTQ_ENTRIES-1] 	     update_addrq_vld;

   reg  [0:`LDSTQ_ENTRIES-1] 	     store_collisions_ahead;
   reg  [0:`LDSTQ_ENTRIES-1] 	     load_collisions_ahead;
   reg  [0:`LDSTQ_ENTRIES-1] 	     forw_collisions_ahead;

   wire [0:`LDSTQ_ENTRIES-1] 	     queue_entry_is_store;
   wire [0:`LDSTQ_ENTRIES-1] 	     queue_entry_is_load;
   wire [0:`LDSTQ_ENTRIES-1] 	     oo_collision_detected;
   reg  [0:`LDSTQ_ENTRIES-1] 	     collision_check_mask;

   wire [0:`LDSTQ_ENTRIES-1] 	     sent_early_flush;

   wire [0:`THREADS-1]               inc0_flush_count;
   wire [0:`THREADS-1]               inc1_flush_count;
   wire [0:2]                        flushed_credit_sel[0:`THREADS-1];
   wire [0:`THREADS-1]               flush_credit_avail;
   wire [0:`THREADS-1]               flush_credit_free;
   wire [0:`THREADS-1]               flush_credit_token;

   wire                              compressed_store_collision;
   wire [0:`LDSTQ_ENTRIES-1] 	     temp_collision_flush;

   wire                              cl64;

   reg  [0:`THREADS-1]               oldest_unrsv_ld_tid;
   reg  [0:`ITAG_SIZE_ENC-1] 	     oldest_unrsv_ld_itag;
   wire [0:`LDSTQ_ENTRIES-1] 	     unresolved_load;

   wire                              cacheline_size_check[0:`LDSTQ_ENTRIES-1];

   wire [0:`ITAG_SIZE_ENC-1] 	     oldest_rem_itag;
   wire                              oldest_rem_n_flush_value;
   wire                              oldest_rem_np1_flush_value;
   wire                              oldest_rem_report_needed;

   wire                              oldest_rem_hit;
   wire                              oldest_rem_is_nonflush_ld;
   wire                              oldest_rem_instq;
   wire [0:`STQ_ENTRIES-1]           oldest_rem_stTag;
   wire [0:DACR_WIDTH-1]             oldest_rem_dacrw;
   wire                              oldest_rem_eccue;
   wire [0:3]                        oldest_rem_pEvents;
   wire [0:`THREADS-1]               oldest_rem_tid;

   wire [0:`LDSTQ_ENTRIES-1] 	     binv_flush_detected;

   wire                              rv1_binv_val_d;
   wire                              rv1_binv_val_q;
   wire                              ex0_binv_val_d;
   wire                              ex0_binv_val_q;
   wire                              ex1_binv_val_d;
   wire                              ex1_binv_val_q;
   wire                              ex2_binv_val_d;
   wire                              ex2_binv_val_q;
   wire                              ex3_binv_val_d;
   wire                              ex3_binv_val_q;
   wire                              ex4_binv_val_d;
   wire                              ex4_binv_val_q;
   wire                              ex5_binv_val_d;
   wire                              ex5_binv_val_q;

   // 64-(`DC_SIZE-3):63-`CL_SIZE = 67-`DC_SIZE:63-`CL_SIZE
   wire [67-`DC_SIZE:63-`CL_SIZE]    rv1_binv_addr_d;
   wire [67-`DC_SIZE:63-`CL_SIZE]    rv1_binv_addr_q;
   wire [67-`DC_SIZE:63-`CL_SIZE]    ex0_binv_addr_d;
   wire [67-`DC_SIZE:63-`CL_SIZE]    ex0_binv_addr_q;
   wire [67-`DC_SIZE:63-`CL_SIZE]    ex1_binv_addr_d;
   wire [67-`DC_SIZE:63-`CL_SIZE]    ex1_binv_addr_q;
   wire [67-`DC_SIZE:63-`CL_SIZE]    ex2_binv_addr_d;
   wire [67-`DC_SIZE:63-`CL_SIZE]    ex2_binv_addr_q;
   wire [67-`DC_SIZE:63-`CL_SIZE]    ex3_binv_addr_d;
   wire [67-`DC_SIZE:63-`CL_SIZE]    ex3_binv_addr_q;
   wire [67-`DC_SIZE:63-`CL_SIZE]    ex4_binv_addr_d;
   wire [67-`DC_SIZE:63-`CL_SIZE]    ex4_binv_addr_q;
   wire [67-`DC_SIZE:63-`CL_SIZE]    ex5_binv_addr_d;
   wire [67-`DC_SIZE:63-`CL_SIZE]    ex5_binv_addr_q;

   wire [0:`LDSTQ_ENTRIES-1] 	     ex2_age_upper_ptr;
   wire [0:`LDSTQ_ENTRIES-1] 	     ex2_age_entry_younger;
   wire [0:`LDSTQ_ENTRIES-1] 	     ex2_age_entry_older;
   wire [0:`LDSTQ_ENTRIES-1] 	     ex2_age_younger_ptr;
   wire [0:`LDSTQ_ENTRIES-1] 	     ex2_age_older_ptr;
   wire [0:`LDSTQ_ENTRIES-1] 	     ex2_age_younger_st;
   wire [0:`LDSTQ_ENTRIES-1] 	     ex2_age_older_st;
   wire [0:`LDSTQ_ENTRIES-1] 	     ex2_nxt_youngest_ptr;
   wire [0:`LDSTQ_ENTRIES-1] 	     ex2_nxt_oldest_ptr;
   reg  [0:`STQ_ENTRIES-1]           ex2_nxt_youngest_stTag;
   reg  [0:`STQ_ENTRIES-1]           ex2_nxt_oldest_stTag;

   wire                              ex0_i0_src_xer;
   wire                              ex0_i1_src_xer;
   wire                              ex1_i0_instq_d;
   wire                              ex1_i0_instq_q;
   wire                              ex1_i1_instq_d;
   wire                              ex1_i1_instq_q;

   wire                              ldq_odq_pfetch_vld_ex6_d;
   wire                              ldq_odq_pfetch_vld_ex6_q;
   wire                              odq_ldq_ex7_pfetch_blk_d;
   wire                              odq_ldq_ex7_pfetch_blk_q;



   // these wires are to convert the ports at the top to an array of itags
   wire [0:`ITAG_SIZE_ENC-1]         iu_lq_cp_next_itag_int[0:`THREADS-1];
   wire [0:`ITAG_SIZE_ENC-1]         iu_lq_i0_completed_itag_int[0:`THREADS-1];
   wire [0:`ITAG_SIZE_ENC-1]         iu_lq_i1_completed_itag_int[0:`THREADS-1];

   //----------------------------
   //-- constants
   //----------------------------
   parameter                         orderq_entry_inuse_offset          = 0;
   parameter                         orderq_entry_tid_offset            = orderq_entry_inuse_offset          + `LDSTQ_ENTRIES;
   parameter                         orderq_entry_val_offset            = orderq_entry_tid_offset            + (`LDSTQ_ENTRIES * `THREADS);
   parameter                         orderq_entry_ld_offset             = orderq_entry_val_offset            + `LDSTQ_ENTRIES;
   parameter                         orderq_entry_i_offset              = orderq_entry_ld_offset             + `LDSTQ_ENTRIES;
   parameter                         orderq_entry_hit_offset            = orderq_entry_i_offset              + `LDSTQ_ENTRIES;
   parameter                         orderq_entry_fwd_offset            = orderq_entry_hit_offset            + `LDSTQ_ENTRIES;
   parameter                         orderq_entry_cls_op_offset         = orderq_entry_fwd_offset            + `LDSTQ_ENTRIES;
   parameter                         orderq_entry_dacrw_offset          = orderq_entry_cls_op_offset         + `LDSTQ_ENTRIES;
   parameter                         orderq_entry_eccue_offset          = orderq_entry_dacrw_offset          + (`LDSTQ_ENTRIES * DACR_WIDTH);
   parameter                         orderq_entry_pEvents_offset        = orderq_entry_eccue_offset          + `LDSTQ_ENTRIES;
   parameter                         orderq_entry_pre_offset            = orderq_entry_pEvents_offset        + (`LDSTQ_ENTRIES * 4);
   parameter                         orderq_entry_instq_offset          = orderq_entry_pre_offset            + `LDSTQ_ENTRIES;
   parameter                         orderq_entry_flushed_offset        = orderq_entry_instq_offset          + `LDSTQ_ENTRIES;
   parameter                         orderq_entry_myflush_offset        = orderq_entry_flushed_offset        + `LDSTQ_ENTRIES;
   parameter                         orderq_entry_itag_offset           = orderq_entry_myflush_offset        + `LDSTQ_ENTRIES;
   parameter                         orderq_entry_ld_chk_offset         = orderq_entry_itag_offset           + (`LDSTQ_ENTRIES * `ITAG_SIZE_ENC);
   parameter                         orderq_entry_stTag_offset          = orderq_entry_ld_chk_offset         + `LDSTQ_ENTRIES;
   parameter                         orderq_entry_cmmt_offset           = orderq_entry_stTag_offset          + (`LDSTQ_ENTRIES * `STQ_ENTRIES_ENC);
   parameter                         orderq_entry_bi_flag_offset        = orderq_entry_cmmt_offset           + `LDSTQ_ENTRIES;
   parameter                         orderq_entry_bi_flush_offset       = orderq_entry_bi_flag_offset        + `LDSTQ_ENTRIES;
   parameter                         orderq_entry_val2_offset           = orderq_entry_bi_flush_offset       + `LDSTQ_ENTRIES;
   parameter                         orderq_entry_n_flush_offset        = orderq_entry_val2_offset           + `LDSTQ_ENTRIES;
   parameter                         orderq_entry_np1_flush_offset      = orderq_entry_n_flush_offset        + `LDSTQ_ENTRIES;
   parameter                         orderq_entry_update_pulse_offset   = orderq_entry_np1_flush_offset      + `LDSTQ_ENTRIES;
   parameter                         orderq_entry_efs_offset            = orderq_entry_update_pulse_offset   + `LDSTQ_ENTRIES;
   parameter                         addrq_entry_inuse_offset           = orderq_entry_efs_offset            + `LDSTQ_ENTRIES;
   parameter                         addrq_entry_val_offset             = addrq_entry_inuse_offset           + `LDSTQ_ENTRIES;
   parameter                         addrq_entry_tid_offset             = addrq_entry_val_offset             + `LDSTQ_ENTRIES;
   parameter                         addrq_entry_itag_offset            = addrq_entry_tid_offset             + (`LDSTQ_ENTRIES * `THREADS);
   parameter                         addrq_entry_address_offset         = addrq_entry_itag_offset            + (`LDSTQ_ENTRIES * `ITAG_SIZE_ENC);
   parameter                         addrq_entry_bytemask_offset        = addrq_entry_address_offset         + (`LDSTQ_ENTRIES * (`REAL_IFAR_WIDTH - 4));
   parameter                         ex0_i0_vld_offset                  = addrq_entry_bytemask_offset        + `LDSTQ_ENTRIES * 16;
   parameter                         ex0_i0_rte_lq_offset               = ex0_i0_vld_offset                  + `THREADS;
   parameter                         ex0_i0_rte_sq_offset               = ex0_i0_rte_lq_offset               + 1;
   parameter                         ex0_i0_isLoad_offset               = ex0_i0_rte_sq_offset               + 1;
   parameter                         ex0_i0_ucode_preissue_offset       = ex0_i0_isLoad_offset               + 1;
   parameter                         ex0_i0_s3_t_offset                 = ex0_i0_ucode_preissue_offset       + 1;
   parameter                         ex0_i0_isStore_offset              = ex0_i0_s3_t_offset                 + 3;
   parameter                         ex0_i0_itag_offset                 = ex0_i0_isStore_offset              + 1;
   parameter                         ex1_i0_vld_offset                  = ex0_i0_itag_offset                 + `ITAG_SIZE_ENC;
   parameter                         ex1_i0_isLoad_offset               = ex1_i0_vld_offset                  + `THREADS;
   parameter                         ex1_i0_pre_offset                  = ex1_i0_isLoad_offset               + 1;
   parameter                         ex1_i0_instq_offset                = ex1_i0_pre_offset                  + 1;
   parameter                         ex1_i0_itag_offset                 = ex1_i0_instq_offset                + 1;
   parameter                         ex0_i1_vld_offset                  = ex1_i0_itag_offset                 + `ITAG_SIZE_ENC;
   parameter                         ex0_i1_rte_lq_offset               = ex0_i1_vld_offset                  + `THREADS;
   parameter                         ex0_i1_rte_sq_offset               = ex0_i1_rte_lq_offset               + 1;
   parameter                         ex0_i1_isLoad_offset               = ex0_i1_rte_sq_offset               + 1;
   parameter                         ex0_i1_ucode_preissue_offset       = ex0_i1_isLoad_offset               + 1;
   parameter                         ex0_i1_s3_t_offset                 = ex0_i1_ucode_preissue_offset       + 1;
   parameter                         ex0_i1_isStore_offset              = ex0_i1_s3_t_offset                 + 3;
   parameter                         ex0_i1_itag_offset                 = ex0_i1_isStore_offset              + 1;
   parameter                         ex1_i1_vld_offset                  = ex0_i1_itag_offset                 + `ITAG_SIZE_ENC;
   parameter                         ex1_i1_isLoad_offset               = ex1_i1_vld_offset                  + `THREADS;
   parameter                         ex1_i1_pre_offset                  = ex1_i1_isLoad_offset               + 1;
   parameter                         ex1_i1_instq_offset                = ex1_i1_pre_offset                  + 1;
   parameter                         ex1_i1_itag_offset                 = ex1_i1_instq_offset                + 1;
   parameter                         ldq_odq_vld_offset                 = ex1_i1_itag_offset                 + `ITAG_SIZE_ENC;
   parameter                         ldq_odq_tid_offset                 = ldq_odq_vld_offset                 + 1;
   parameter                         ldq_odq_inv_offset                 = ldq_odq_tid_offset                 + `THREADS;
   parameter                         ldq_odq_wimge_i_offset             = ldq_odq_inv_offset                 + 1;
   parameter                         ldq_odq_hit_offset                 = ldq_odq_wimge_i_offset             + 1;
   parameter                         ldq_odq_fwd_offset                 = ldq_odq_hit_offset                 + 1;
   parameter                         ldq_odq_itag_offset                = ldq_odq_fwd_offset                 + 1;
   parameter                         iu_lq_cp_next_itag_offset          = ldq_odq_itag_offset                + `ITAG_SIZE_ENC;
   parameter                         cp_i0_completed_offset             = iu_lq_cp_next_itag_offset          + (`ITAG_SIZE_ENC * `THREADS);
   parameter                         cp_i0_completed_itag_offset        = cp_i0_completed_offset             + `THREADS;
   parameter                         cp_i1_completed_offset             = cp_i0_completed_itag_offset        + (`THREADS * `ITAG_SIZE_ENC);
   parameter                         cp_i1_completed_itag_offset        = cp_i1_completed_offset             + `THREADS;
   parameter                         ldq_odq_cline_chk_offset           = cp_i1_completed_itag_offset        + (`THREADS * `ITAG_SIZE_ENC);
   parameter                         next_fill_ptr_offset               = ldq_odq_cline_chk_offset           + 1;
   parameter                         collision_vector_offset            = next_fill_ptr_offset               + (`LDSTQ_ENTRIES + 1);
   parameter                         flushed_credit_count_offset        = collision_vector_offset            + `LDSTQ_ENTRIES;
   parameter                         cp_flush_offset                    = flushed_credit_count_offset        + (`LDSTQ_ENTRIES_ENC * `THREADS);
   parameter                         cp_flush2_offset                   = cp_flush_offset                    + `THREADS;
   parameter                         cp_flush3_offset                   = cp_flush2_offset                   + `THREADS;
   parameter                         cp_flush4_offset                   = cp_flush3_offset                   + `THREADS;
   parameter                         cp_flush5_offset                   = cp_flush4_offset                   + `THREADS;
   parameter                         xu_lq_spr_xucr0_cls_offset         = cp_flush5_offset                   + `THREADS;
   parameter                         lq_iu_credit_free_offset           = xu_lq_spr_xucr0_cls_offset         + 1;
   parameter                         compress_val_offset                = lq_iu_credit_free_offset           + `THREADS;
   parameter                         rv1_binv_val_offset                = compress_val_offset                + 1;
   parameter                         ex0_binv_val_offset                = rv1_binv_val_offset                + 1;
   parameter                         ex1_binv_val_offset                = ex0_binv_val_offset                + 1;
   parameter                         ex2_binv_val_offset                = ex1_binv_val_offset                + 1;
   parameter                         ex3_binv_val_offset                = ex2_binv_val_offset                + 1;
   parameter                         ex4_binv_val_offset                = ex3_binv_val_offset                + 1;
   parameter                         ex5_binv_val_offset                = ex4_binv_val_offset                + 1;
   parameter                         rv1_binv_addr_offset               = ex5_binv_val_offset                + 1;
   parameter                         ex0_binv_addr_offset               = rv1_binv_addr_offset               + (`DC_SIZE - `CL_SIZE - 3);
   parameter                         ex1_binv_addr_offset               = ex0_binv_addr_offset               + (`DC_SIZE - `CL_SIZE - 3);
   parameter                         ex2_binv_addr_offset               = ex1_binv_addr_offset               + (`DC_SIZE - `CL_SIZE - 3);
   parameter                         ex3_binv_addr_offset               = ex2_binv_addr_offset               + (`DC_SIZE - `CL_SIZE - 3);
   parameter                         ex4_binv_addr_offset               = ex3_binv_addr_offset               + (`DC_SIZE - `CL_SIZE - 3);
   parameter                         ex5_binv_addr_offset               = ex4_binv_addr_offset               + (`DC_SIZE - `CL_SIZE - 3);
   parameter                         entry_rv1_blk_offset               = ex5_binv_addr_offset               + (`DC_SIZE - `CL_SIZE - 3);
   parameter                         entry_ex0_blk_offset               = entry_rv1_blk_offset               + 1;
   parameter                         entry_ex1_blk_offset               = entry_ex0_blk_offset               + 1;
   parameter                         entry_ex2_blk_offset               = entry_ex1_blk_offset               + 1;
   parameter                         entry_ex3_blk_offset               = entry_ex2_blk_offset               + 1;
   parameter                         entry_ex4_blk_offset               = entry_ex3_blk_offset               + 1;
   parameter                         entry_ex5_blk_offset               = entry_ex4_blk_offset               + 1;
   parameter                         entry_ex6_blk_offset               = entry_ex5_blk_offset               + 1;
   parameter                         ldq_odq_pfetch_vld_ex6_offset      = entry_ex6_blk_offset               + 1;
   parameter                         odq_ldq_ex7_pfetch_blk_offset      = ldq_odq_pfetch_vld_ex6_offset      + 1;
   parameter                         scan_right                         = odq_ldq_ex7_pfetch_blk_offset      + 1 - 1;

   wire                              tiup;
   wire                              tidn;
   wire [0:scan_right]               siv;
   wire [0:scan_right]               sov;

//
// Bugsray Include
//
//!! Bugspray Include: lq_odq
//
//

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

   // This is used to convert the wide vector port inputs into an internal 2 dimesional array format
   generate
      begin : ports
         genvar tid;
         for (tid = 0; tid <= `THREADS - 1; tid = tid + 1)
           begin : convert
             assign iu_lq_cp_next_itag_int[tid]      = iu_lq_cp_next_itag[`ITAG_SIZE_ENC*tid:(`ITAG_SIZE_ENC*(tid+1))-1];
             assign iu_lq_i0_completed_itag_int[tid] = iu_lq_i0_completed_itag[`ITAG_SIZE_ENC*tid:(`ITAG_SIZE_ENC*(tid+1))-1];
             assign iu_lq_i1_completed_itag_int[tid] = iu_lq_i1_completed_itag[`ITAG_SIZE_ENC*tid:(`ITAG_SIZE_ENC*(tid+1))-1];
           end
      end
   endgenerate

   assign compressed_store_collision = 1'b0;
   assign lsq_perv_odq_events = {4+`THREADS{1'b0}};

   // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
   // BACK-INVALIDATE IN PROGRESS
   // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

   // Back-Invalidate in the LQ pipeline
   assign rv1_binv_val_d = l2_back_inv_val;
   assign ex0_binv_val_d = rv1_binv_val_q;
   assign ex1_binv_val_d = ex0_binv_val_q;
   assign ex2_binv_val_d = ex1_binv_val_q;
   assign ex3_binv_val_d = ex2_binv_val_q;
   assign ex4_binv_val_d = ex3_binv_val_q;
   assign ex5_binv_val_d = ex4_binv_val_q;

   assign rv1_binv_addr_d = l2_back_inv_addr;
   assign ex0_binv_addr_d = rv1_binv_addr_q;
   assign ex1_binv_addr_d = ex0_binv_addr_q;
   assign ex2_binv_addr_d = ex1_binv_addr_q;
   assign ex3_binv_addr_d = ex2_binv_addr_q;
   assign ex4_binv_addr_d = ex3_binv_addr_q;
   assign ex5_binv_addr_d = ex4_binv_addr_q;

   // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
   // ORDER QUEUE
   // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
   //
   // Bit 0   1   2   3    4   5    6        7   8   9   5 bits  16 bits            4 bits   Total Bits = 35 bits per entry
   //   ------------------------------------------------------------------------------------------
   //   | E | V | L | B | OC | H | EF | ld_chk | S | F | itag  | collision vector | lsqEntry |
   //   ------------------------------------------------------------------------------------------
   //     |   |   |   |    |   |    |       |    |   |      |                   |          |
   //     |   |   |   |    |   |    |       |    |   |      |                   |          Pointer to lsq array entry
   //     |   |   |   |    |   |    |       |    |   |      |                   Collision vector each bit indicates an address
   //     |   |   |   |    |   |    |       |    |   |      |                    collision with another entry
   //     |   |   |   |    |   |    |       |    |   |      Itag of the instruction corresponding to this entry
   //     |   |   |   |    |   |    |       |    |   Command was flushed by someone else
   //     |   |   |   |    |   |    |       |    Sent Load/Store to L2
   //     |   |   |   |    |   |    |       Sent Load Hit w/ unresolved Stores ahead, need to check for collisions and flush if found
   //     |   |   |   |    |   |    Early flush detect
   //     |   |   |   |    |   Entry Hit the cache
   //     |   |   |   |    OrderQ is responsible for completing this instruction
   //     |   |   |   Entry needs to stay ordered
   //     |   |   1 = Load, 0  = Store
   //     |   Valid entry.  This entry has been issued by RV
   //     Entry exists.  This entry has been dispatched to RV.
   //
   //
   //
   // Queue is compressing.  When an entry is selected for removal.  The slot will be compressed
   // along with the corresponding collision vector for all entries ordered after.
   //
   //
   // Compress will indicate an entry 0-n which will be translated into a bit vector for each
   // latch to either grab the older entries next value or it's own next value
   // built into the compress is compression of the collision vector.
   //
   //
   // Bus interfaces
   //
   // 1) RV interface to fill in an entry
   // 2) LQ interface to fill in array pointer and collision vector
   // 3) LQ interface to indicate which entry to send
   // 4)
   //
   //

   assign cp_flush_d  = iu_lq_cp_flush;
   assign cp_flush2_d = cp_flush_q;
   assign cp_flush3_d = cp_flush2_q;
   assign cp_flush4_d = cp_flush3_q;
   assign cp_flush5_d = cp_flush4_q;

   assign ex0_i0_src_xer  = (ex0_i0_s3_t_q == 3'b100);
   assign ex1_i0_vld_d    = (ex0_i0_vld_q & {`THREADS{ex0_i0_rte_lq_q}});
   assign ex1_i0_pre_d    = ex0_i0_ucode_preissue_q | ((~ex0_i0_isLoad_q) & (~ex0_i0_isStore_q));
   assign ex1_i0_isLoad_d = ex0_i0_isLoad_q;
   assign ex1_i0_itag_d   = ex0_i0_itag_q;
   assign ex1_i0_instq_d  = ex0_i0_rte_sq_q & ((ex0_i0_ucode_preissue_q & ex0_i0_src_xer) | ((~ex0_i0_ucode_preissue_q)));

   assign ex0_i1_src_xer  = (ex0_i1_s3_t_q == 3'b100);
   assign ex1_i1_vld_d    = (ex0_i1_vld_q & {`THREADS{ex0_i1_rte_lq_q}});
   assign ex1_i1_pre_d    = ex0_i1_ucode_preissue_q | ((~ex0_i1_isLoad_q) & (~ex0_i1_isStore_q));
   assign ex1_i1_isLoad_d = ex0_i1_isLoad_q;
   assign ex1_i1_itag_d   = ex0_i1_itag_q;
   assign ex1_i1_instq_d  = ex0_i1_rte_sq_q & ((ex0_i1_ucode_preissue_q & ex0_i1_src_xer) | ((~ex0_i1_ucode_preissue_q)));

   assign instr0_vld = |(ex1_i0_vld_q & (~(cp_flush_q | cp_flush2_q | cp_flush3_q | cp_flush4_q | cp_flush5_q)));
   assign instr1_vld = |(ex1_i1_vld_q & (~(cp_flush_q | cp_flush2_q | cp_flush3_q | cp_flush4_q | cp_flush5_q)));


   generate
      begin : fcf
         genvar tid;
         for (tid = 0; tid <= `THREADS - 1; tid = tid + 1)
           begin : flushCredFree
              assign inc0_flush_count[tid] = ex1_i0_vld_q[tid] & (cp_flush_q[tid] | cp_flush2_q[tid] | cp_flush3_q[tid] | cp_flush4_q[tid] | cp_flush5_q[tid]);
              assign inc1_flush_count[tid] = ex1_i1_vld_q[tid] & (cp_flush_q[tid] | cp_flush2_q[tid] | cp_flush3_q[tid] | cp_flush4_q[tid] | cp_flush5_q[tid]);

              assign flushed_credit_sel[tid] = {inc0_flush_count[tid], inc1_flush_count[tid], flush_credit_free[tid]};
              assign flushed_credit_count_d[tid] = (flushed_credit_sel[tid] == 3'b110) ? flushed_credit_count_q[tid] + 4'd2 :
                                                   (flushed_credit_sel[tid] == 3'b100) ? flushed_credit_count_q[tid] + 4'd1 :
                                                   (flushed_credit_sel[tid] == 3'b010) ? flushed_credit_count_q[tid] + 4'd1 :
                                                   (flushed_credit_sel[tid] == 3'b111) ? flushed_credit_count_q[tid] + 4'd1 :
                                                   (flushed_credit_sel[tid] == 3'b001) ? flushed_credit_count_q[tid] - 4'd1 :
                                                   flushed_credit_count_q[tid];
              assign flush_credit_avail[tid] = |(flushed_credit_count_q[tid]);
              assign flush_credit_free[tid] = ((~compress_val)) & flush_credit_avail[tid] & flush_credit_token[tid];
           end
      end
   endgenerate

   // need to do a better scheme here, right now just give thread 0 higher priority.
   generate
      if (`THREADS == 1)
        begin : t1
           assign flush_credit_token[0] = (flushed_credit_count_q[0] != 4'b0000);
        end
   endgenerate
   generate
      if (`THREADS == 2)
        begin : t2
           assign flush_credit_token[0] = (flushed_credit_count_q[0] != 4'b0000);
           assign flush_credit_token[1] = (flushed_credit_count_q[1] != 4'b0000) & (~flush_credit_token[0]);
        end
   endgenerate

   assign next_fill_sel = {compress_val, instr0_vld, instr1_vld};

   // not removing and cmd on i0, shift right 1
   // not removing and cmd on both i0 and i1, shift right 2
   // removing command and no new cmds, shift left 1
   // removing command and cmd on both i0 and i1, shift right 1
   // other combinations are either invalid or result in no change
   assign next_fill_ptr_d = ((next_fill_sel) == 3'b010) ? ({1'b0, next_fill_ptr_q[0:`LDSTQ_ENTRIES - 1]}) : 		// not removing and cmd on i1, shift right 1
                            ((next_fill_sel) == 3'b001) ? ({1'b0, next_fill_ptr_q[0:`LDSTQ_ENTRIES - 1]}) :
                            ((next_fill_sel) == 3'b011) ? ({2'b00, next_fill_ptr_q[0:`LDSTQ_ENTRIES - 2]}) :
                            ((next_fill_sel) == 3'b100) ? ({next_fill_ptr_q[1:`LDSTQ_ENTRIES], 1'b0}) :
                            ((next_fill_sel) == 3'b111) ? ({1'b0, next_fill_ptr_q[0:`LDSTQ_ENTRIES - 1]}) :
                            next_fill_ptr_q;
   assign next_instr0_ptr = next_fill_ptr_q[0:`LDSTQ_ENTRIES - 1];

   assign next_instr1_ptr = ((instr0_vld == 1'b1)) ? ({1'b0, next_fill_ptr_q[0:`LDSTQ_ENTRIES - 2]}) :
                            next_fill_ptr_q[0:`LDSTQ_ENTRIES - 1];

   //
   // Set the shift in value for the last queue entry to all 0's
   //

   always @(*)
   begin : def
      orderq_entry_inuse_next[`LDSTQ_ENTRIES]        = tidn;
      orderq_entry_tid_next[`LDSTQ_ENTRIES]          = {`THREADS{tidn}};
      orderq_entry_val_next[`LDSTQ_ENTRIES]          = tidn;
      orderq_entry_ld_next[`LDSTQ_ENTRIES]           = tidn;
      orderq_entry_efs_next[`LDSTQ_ENTRIES]          = tidn;
      orderq_entry_i_next[`LDSTQ_ENTRIES]            = tidn;
      orderq_entry_hit_next[`LDSTQ_ENTRIES]          = tidn;
      orderq_entry_fwd_next[`LDSTQ_ENTRIES]          = tidn;
      orderq_entry_cls_op_next[`LDSTQ_ENTRIES]       = tidn;
      orderq_entry_dacrw_next[`LDSTQ_ENTRIES]        = {DACR_WIDTH{tidn}};
      orderq_entry_eccue_next[`LDSTQ_ENTRIES]        = tidn;
      orderq_entry_pEvents_next[`LDSTQ_ENTRIES]      = {4{tidn}};
      orderq_entry_pre_next[`LDSTQ_ENTRIES]          = tidn;
      orderq_entry_instq_next[`LDSTQ_ENTRIES]        = tidn;
      orderq_entry_flushed_next[`LDSTQ_ENTRIES]      = tidn;
      orderq_entry_myflush_next[`LDSTQ_ENTRIES]      = tidn;
      orderq_entry_ld_chk_next[`LDSTQ_ENTRIES]       = tidn;
      orderq_entry_stTag_next[`LDSTQ_ENTRIES]        = {`STQ_ENTRIES_ENC{tidn}};
      orderq_entry_cmmt_next[`LDSTQ_ENTRIES]         = tidn;
      orderq_entry_bi_flag_next[`LDSTQ_ENTRIES]      = tidn;
      orderq_entry_bi_flush_next[`LDSTQ_ENTRIES]     = tidn;
      orderq_entry_val2_next[`LDSTQ_ENTRIES]         = tidn;
      orderq_entry_n_flush_next[`LDSTQ_ENTRIES]      = tidn;
      orderq_entry_np1_flush_next[`LDSTQ_ENTRIES]    = tidn;
      orderq_entry_update_pulse_next[`LDSTQ_ENTRIES] = tidn;
      orderq_entry_itag_next[`LDSTQ_ENTRIES]         = {`ITAG_SIZE_ENC{tidn}};
   end




   generate
      begin : gen_a
         genvar                            entry;
         for (entry = 0; entry <= `LDSTQ_ENTRIES - 1; entry = entry + 1)
           begin : gen_a

              assign write_instr0[entry] = (next_instr0_ptr[entry] & instr0_vld);
              assign write_instr1[entry] = (next_instr1_ptr[entry] & instr1_vld);
              assign update_vld[entry] = ldq_odq_vld_q & |(ldq_odq_tid_q & orderq_entry_tid_q[entry]) & orderq_entry_inuse_q[entry] & ((~orderq_entry_val_q[entry])) & (orderq_entry_itag_q[entry] == ldq_odq_itag_q) & ((~orderq_entry_flushed_q[entry]));

              // don't worry about the extra qualifiers, this
              assign update2_vld[entry] = ldq_odq_upd_val & |(ldq_odq_upd_tid & orderq_entry_tid_q[entry]) & orderq_entry_inuse_q[entry] & ((~orderq_entry_val2_q[entry])) & (orderq_entry_itag_q[entry] == ldq_odq_upd_itag);

              // CP_Flush Entry
              assign cp_flush_entry[entry] = |(cp_flush_q & orderq_entry_tid_q[entry]);

              // temporary fix to flush a load hit that has a collision on a store that is being compressed this cycle
              assign temp_collision_flush[entry] = 1'b0;		// (compressed_store_collision and update_vld(entry) and orderq_entry_ld_q(entry) and ldq_odq_hit_q);

              // Store has been committed to L1/L2, need to invalidate instq state if still in order queue
              assign orderq_entry_instq_inval[entry] = orderq_entry_inuse_q[entry] & stq_odq_stq4_stTag_inval & (orderq_entry_stTag_q[entry] == stq_odq_stq4_stTag);

              // Instruction has received its Commit Report

             //SENS always @(orderq_entry_tid_q[entry] or cp_i0_completed_itag_q or cp_i1_completed_itag_q)
             always @(*)
                 begin: complete_itag_p
                   reg [0:`ITAG_SIZE_ENC-1]       i0_itag;
                   reg [0:`ITAG_SIZE_ENC-1] 	  i1_itag;
                   integer                        tid;
                   i0_itag = {`ITAG_SIZE_ENC{1'b0}};
                   i1_itag = {`ITAG_SIZE_ENC{1'b0}};
                   for (tid = 0; tid <= `THREADS - 1; tid = tid + 1)
                     begin
                        i0_itag = (cp_i0_completed_itag_q[tid] & {`ITAG_SIZE_ENC{orderq_entry_tid_q[entry][tid]}}) | i0_itag;
                        i1_itag = (cp_i1_completed_itag_q[tid] & {`ITAG_SIZE_ENC{orderq_entry_tid_q[entry][tid]}}) | i1_itag;
                     end
                   oderq_entry_i0_comp_itag[entry] = i0_itag;
                   oderq_entry_i1_comp_itag[entry] = i1_itag;
                end

              assign orderq_entry_i0_cmmt[entry] = |(cp_i0_completed_q & orderq_entry_tid_q[entry]) & (oderq_entry_i0_comp_itag[entry] == orderq_entry_itag_q[entry]);
              assign orderq_entry_i1_cmmt[entry] = |(cp_i1_completed_q & orderq_entry_tid_q[entry]) & (oderq_entry_i1_comp_itag[entry] == orderq_entry_itag_q[entry]);
              assign orderq_entry_cmmt[entry] = orderq_entry_inuse_q[entry] & (orderq_entry_i0_cmmt[entry] | orderq_entry_i1_cmmt[entry]);

              //always @(flush_vector[entry] or cp_flush_entry[entry] or write_instr0[entry] or write_instr1[entry] or update_vld[entry] or ex1_i0_instq_q or ex1_i1_instq_q or ex1_i0_vld_q or ex1_i1_vld_q or ex1_i0_itag_q or ex1_i1_itag_q or ex1_i0_isLoad_q or ex1_i1_isLoad_q or ex1_i0_pre_q or ex1_i1_pre_q or ldq_odq_wimge_i_q or ldq_odq_hit_q or ldq_odq_cline_chk_q or ctl_lsq_ex6_ldh_dacrw or collision_vector_new[entry] or orderq_entry_inuse_q[entry] or orderq_entry_tid_q[entry] or orderq_entry_val_q[entry] or orderq_entry_ld_q[entry] or orderq_entry_efs_q[entry] or orderq_entry_i_q[entry] or orderq_entry_hit_q[entry] or orderq_entry_fwd_q[entry] or orderq_entry_cls_op_q[entry] or orderq_entry_dacrw_q[entry] or orderq_entry_pre_q[entry] or orderq_entry_instq_q[entry] or orderq_entry_flushed_q[entry] or orderq_entry_myflush_q[entry] or orderq_entry_ld_chk_q[entry] or orderq_entry_stTag_q[entry] or orderq_entry_bi_flag_q[entry] or orderq_entry_bi_flush_q[entry] or orderq_entry_itag_q[entry] or ldq_odq_inv_q or ldq_odq_fwd_q or stq_odq_i0_stTag or stq_odq_i1_stTag or orderq_entry_instq_inval[entry] or orderq_entry_cmmt[entry] or orderq_entry_cmmt_q[entry] or set_flush_condition[entry] or sent_early_flush[entry] or temp_collision_flush[entry] or binv_flush_detected[entry] or orderq_entry_n_flush_q[entry] or orderq_entry_np1_flush_q[entry] or update2_vld[entry] or cp_next_match[entry] or ldq_odq_upd_nFlush or ldq_odq_upd_np1Flush or ldq_odq_upd_dacrw or orderq_entry_val2_q[entry])
              always @(*)
                begin: entry_update

                   // default
                   orderq_entry_inuse_next[entry]        = orderq_entry_inuse_q[entry];
                   orderq_entry_tid_next[entry]          = orderq_entry_tid_q[entry];
                   orderq_entry_val_next[entry]          = orderq_entry_val_q[entry];
                   orderq_entry_ld_next[entry]           = orderq_entry_ld_q[entry];
                   orderq_entry_efs_next[entry]          = (sent_early_flush[entry] | orderq_entry_efs_q[entry]);
                   orderq_entry_i_next[entry]            = orderq_entry_i_q[entry];
                   orderq_entry_hit_next[entry]          = orderq_entry_hit_q[entry];
                   orderq_entry_fwd_next[entry]          = orderq_entry_fwd_q[entry];
                   orderq_entry_cls_op_next[entry]       = orderq_entry_cls_op_q[entry];
                   orderq_entry_dacrw_next[entry]        = orderq_entry_dacrw_q[entry];
                   orderq_entry_eccue_next[entry]        = orderq_entry_eccue_q[entry];
                   orderq_entry_pEvents_next[entry]      = orderq_entry_pEvents_q[entry];
                   orderq_entry_pre_next[entry]          = orderq_entry_pre_q[entry];
                   orderq_entry_instq_next[entry]        = orderq_entry_instq_q[entry];
                   orderq_entry_flushed_next[entry]      = orderq_entry_flushed_q[entry];
                   orderq_entry_myflush_next[entry]      = orderq_entry_myflush_q[entry];
                   orderq_entry_ld_chk_next[entry]       = ((set_flush_condition[entry] & (~ldq_odq_pfetch_vld_ex6_q)) | orderq_entry_ld_chk_q[entry]);
                   orderq_entry_stTag_next[entry]        = orderq_entry_stTag_q[entry];
                   orderq_entry_cmmt_next[entry]         = orderq_entry_cmmt_q[entry];
                   orderq_entry_bi_flag_next[entry]      = orderq_entry_bi_flag_q[entry];
                   orderq_entry_bi_flush_next[entry]     = orderq_entry_bi_flush_q[entry];
                   orderq_entry_val2_next[entry]         = orderq_entry_val2_q[entry];
                   orderq_entry_n_flush_next[entry]      = orderq_entry_n_flush_q[entry];
                   orderq_entry_np1_flush_next[entry]    = orderq_entry_np1_flush_q[entry];
                   orderq_entry_update_pulse_next[entry] = 1'b0;
                   orderq_entry_itag_next[entry]         = orderq_entry_itag_q[entry];

                   // =======================================================================
                   // order queue info updated from rv
                   // =======================================================================
                   if (cp_flush_entry[entry] == 1'b1 & flush_vector[entry] == 1'b1 & orderq_entry_cmmt_q[entry] == 1'b0)
                     orderq_entry_flushed_next[entry] = orderq_entry_inuse_q[entry];
                   else if (write_instr0[entry] == 1'b1 | write_instr1[entry] == 1'b1)
                     orderq_entry_flushed_next[entry] = 1'b0;

                   // temporary fix to flush a load hit that has a collision on a store that is being compressed this cycle
                   if (temp_collision_flush[entry] == 1'b1)
                     orderq_entry_myflush_next[entry] = 1'b1;
                   else if (write_instr0[entry] == 1'b1 | write_instr1[entry] == 1'b1)
                     orderq_entry_myflush_next[entry] = 1'b0;

                   // =======================================================================
                   // order queue info updated from rv i0
                   // =======================================================================
                   if (write_instr0[entry] == 1'b1)
                     begin
                        orderq_entry_inuse_next[entry]  = 1'b1;
                        orderq_entry_tid_next[entry]    = ex1_i0_vld_q;
                        orderq_entry_val_next[entry]    = 1'b0;
                        orderq_entry_ld_next[entry]     = ex1_i0_isLoad_q;
                        orderq_entry_pre_next[entry]    = ex1_i0_pre_q;
                        orderq_entry_ld_chk_next[entry] = 1'b0;
                        orderq_entry_stTag_next[entry]  = stq_odq_i0_stTag;
                        orderq_entry_itag_next[entry]   = ex1_i0_itag_q;
                     end

                   if (write_instr0[entry] == 1'b1)
                     orderq_entry_instq_next[entry] = ex1_i0_instq_q;
                   else if (orderq_entry_instq_inval[entry] == 1'b1)
                     orderq_entry_instq_next[entry] = 1'b0;

                   // =======================================================================
                   // order queue info updated from rv i1
                   // =======================================================================
                   if (write_instr1[entry] == 1'b1)
                     begin
                        orderq_entry_inuse_next[entry]  = 1'b1;
                        orderq_entry_tid_next[entry]    = ex1_i1_vld_q;
                        orderq_entry_val_next[entry]    = 1'b0;
                        orderq_entry_ld_next[entry]     = ex1_i1_isLoad_q;
                       orderq_entry_pre_next[entry]     = ex1_i1_pre_q;
                        orderq_entry_ld_chk_next[entry] = 1'b0;
                        orderq_entry_stTag_next[entry]  = stq_odq_i1_stTag;
                        orderq_entry_itag_next[entry]   = ex1_i1_itag_q;
                     end

                   if (write_instr1[entry] == 1'b1)
                     orderq_entry_instq_next[entry] = ex1_i1_instq_q;
                   else if (orderq_entry_instq_inval[entry] == 1'b1)
                     orderq_entry_instq_next[entry] = 1'b0;

                   // =======================================================================
                   // order queue info updated from ldq
                   // lsq_entry
                   // =======================================================================
                   if (update_vld[entry] == 1'b1)
                     begin
                        orderq_entry_val_next[entry]    = 1'b1;
                        orderq_entry_update_pulse_next[entry] = 1'b1;
                        orderq_entry_i_next[entry]      = ldq_odq_wimge_i_q;
                        orderq_entry_hit_next[entry]    = ldq_odq_hit_q;
                        orderq_entry_fwd_next[entry]    = ldq_odq_fwd_q;
                        orderq_entry_cls_op_next[entry] = ldq_odq_cline_chk_q;

                        if (binv_flush_detected[entry] == 1'b1)
                          orderq_entry_bi_flush_next[entry] = 1'b1;
                     end

                   // update dacrw bits from both update interfaces
                   if (update_vld[entry] == 1'b1) begin
                     orderq_entry_dacrw_next[entry]   = ctl_lsq_ex6_ldh_dacrw;
                     orderq_entry_pEvents_next[entry] = ldq_odq_ex6_pEvents;
                     orderq_entry_eccue_next[entry]   = 1'b0;
                   end

                   if (update2_vld[entry] == 1'b1) begin
                     orderq_entry_dacrw_next[entry]   = ldq_odq_upd_dacrw | orderq_entry_dacrw_q[entry];
                     orderq_entry_pEvents_next[entry] = ldq_odq_upd_pEvents | orderq_entry_pEvents_q[entry];
                     orderq_entry_eccue_next[entry]   = ldq_odq_upd_eccue | orderq_entry_eccue_q[entry];
                   end

                   //
                   // Mark all resolved loads with a flag if they hit against a back invalidate
                   // if any older loads become resolved and hit against a newer
                   //
                   if (ldq_odq_inv_q == 1'b1 & collision_vector_new[entry] == 1'b1 & orderq_entry_val_q[entry] == 1'b1 & orderq_entry_ld_q[entry] == 1'b1)
                     orderq_entry_bi_flag_next[entry] = 1'b1;

                   if ((binv_flush_detected[entry] == 1'b1) | (update2_vld[entry] == 1'b1 & ldq_odq_upd_nFlush == 1'b1))
                     orderq_entry_n_flush_next[entry] = 1'b1;

                   if ((update2_vld[entry] == 1'b1 & ldq_odq_upd_np1Flush == 1'b1))
                     orderq_entry_np1_flush_next[entry] = 1'b1;

                   // keep track if this entry is the
                   if (update2_vld[entry] == 1'b1)
                     orderq_entry_val2_next[entry] = 1'b1;

                   // Keep track of committed instructions still in the Order Queue
                   if (orderq_entry_cmmt[entry] == 1'b1)
                     orderq_entry_cmmt_next[entry] = 1'b1;
                   else if (write_instr0[entry] == 1'b1 | write_instr1[entry] == 1'b1)
                     orderq_entry_cmmt_next[entry] = 1'b0;


                   // =======================================================================
                   // order queue info updated from internal
                   // =======================================================================
                end

           end
      end
   endgenerate

   // =======================================================================
   // Age Detection
   // =======================================================================
   // Trying to determine what the closet youngest store is from my position in the orderq,
   // need to also determine what the closet oldest store is from my position in the orderq,
   // with these 2 itags, we can determine the AGE of a load with respect to the store queue

   // Determine Closest Youngest Store
   generate
      begin : ady
         genvar entry;
         for (entry = 0; entry <= `LDSTQ_ENTRIES - 1; entry = entry + 1)
           begin : ageDetectYoung
              // Determine where request is located in orderq, anything below this pointer is older, anything above is younger
              assign ex2_age_upper_ptr[entry] = |(ctl_lsq_ex2_thrd_id & orderq_entry_tid_q[entry]) & (ctl_lsq_ex2_itag == orderq_entry_itag_q[entry]);

              // Generate a Mask of younger entries
              assign ex2_age_entry_younger[entry] = |(ex2_age_younger_ptr[0:entry]);

              // Generate a Mask of older entries
              assign ex2_age_entry_older[entry] = |(ex2_age_older_ptr[entry:`LDSTQ_ENTRIES - 1]);

              // Need to determine which entries are the closest youngest valid stores in store queue
              assign ex2_age_younger_st[entry] = ex2_age_entry_younger[entry] & orderq_entry_inuse_q[entry] & orderq_entry_instq_q[entry] & (~orderq_entry_flushed_q[entry]);

              // Need to determine which entries are the closest oldest valid stores in store queue
              assign ex2_age_older_st[entry] = ex2_age_entry_older[entry] & orderq_entry_inuse_q[entry] & orderq_entry_instq_q[entry] & (~orderq_entry_flushed_q[entry]);

              // Determine the Next youngest store
              if (entry == 0)
                begin : priYoungEntry0
                   assign ex2_nxt_youngest_ptr[entry] = ex2_age_younger_st[entry];
                end

              if (entry > 0)
                begin : priYoungerEntry
                   assign ex2_nxt_youngest_ptr[entry] = (~(|(ex2_age_younger_st[0:entry - 1]))) & ex2_age_younger_st[entry];
                end

              // Generate a 1-hot signal
              genvar b;
              for (b = 0; b <= `STQ_ENTRIES - 1; b = b + 1)
                begin : stTag1Hot
                   wire [0:`STQ_ENTRIES_ENC-1] bitVect = b;
                   assign orderq_entry_stTag_1hot[entry][b] = (bitVect == orderq_entry_stTag_q[entry]);
                end
           end
      end
   endgenerate

   // Determine Closest Oldest Store
   generate
      begin : ado
         genvar entry;
         for (entry = 0; entry <= `LDSTQ_ENTRIES - 1; entry = entry + 1)
           begin : ageDetectOld
              // Determine the Next Oldest store
              if (entry == `LDSTQ_ENTRIES - 1)
                begin : priOldEntryLast
                   assign ex2_nxt_oldest_ptr[entry] = ex2_age_older_st[entry];
                end

              if (entry < `LDSTQ_ENTRIES - 1)
		        begin : priOldEntry
                   assign ex2_nxt_oldest_ptr[entry] = (~(|(ex2_age_older_st[entry + 1:`LDSTQ_ENTRIES - 1]))) & ex2_age_older_st[entry];
		        end
           end
      end
   endgenerate

   // Closest Youngest instruction is my entry shifted to the right by 1
   assign ex2_age_younger_ptr = {1'b0, ex2_age_upper_ptr[0:`LDSTQ_ENTRIES - 2]};

   // Closest Oldest instruction is my entry shifted to the left by 1
   assign ex2_age_older_ptr = {ex2_age_upper_ptr[1:`LDSTQ_ENTRIES - 1], 1'b0};

   // Mux out ITAG and THREAD_ID for youngest and oldest entries

   //SENS always @(ex2_nxt_youngest_ptr or ex2_nxt_oldest_ptr or orderq_entry_stTag_1hot)
   always @(*)
     begin: ageMux
        reg [0:`STQ_ENTRIES-1] yStTag;
        reg [0:`STQ_ENTRIES-1] oStTag;
        integer entry;
        yStTag = {`STQ_ENTRIES{1'b0}};
        oStTag = {`STQ_ENTRIES{1'b0}};
        for (entry = 0; entry <= `LDSTQ_ENTRIES - 1; entry = entry + 1)
          begin
             yStTag = (orderq_entry_stTag_1hot[entry] & {`STQ_ENTRIES{ex2_nxt_youngest_ptr[entry]}}) | yStTag;
             oStTag = (orderq_entry_stTag_1hot[entry] & {`STQ_ENTRIES{ex2_nxt_oldest_ptr[entry]}}) | oStTag;
          end
        ex2_nxt_youngest_stTag = yStTag;
        ex2_nxt_oldest_stTag   = oStTag;
     end

   assign odq_stq_ex2_nxt_oldest_val     = |(ex2_nxt_oldest_ptr);
   assign odq_stq_ex2_nxt_oldest_stTag   = ex2_nxt_oldest_stTag;
   assign odq_stq_ex2_nxt_youngest_val   = |(ex2_nxt_youngest_ptr);
   assign odq_stq_ex2_nxt_youngest_stTag = ex2_nxt_youngest_stTag;

   // =======================================================================
   // Flush Scenario Detection
   // =======================================================================

   //
   // Determine if we have a load colliding with an incomming store that is older than it, these need to be flushed
   //
   generate
      begin : flush_a
         genvar entry;
         for (entry = 0; entry <= `LDSTQ_ENTRIES - 1; entry = entry + 1)
           begin : flush_a
              assign store_flush_detected[entry] = store_collisions_ahead[entry] & orderq_entry_val_q[entry] & orderq_entry_ld_q[entry];
              assign binv_flush_detected[entry]  = load_collisions_ahead[entry] & orderq_entry_bi_flag_q[entry] & orderq_entry_ld_q[entry];
              assign ci_flush_detected[entry]    = load_collisions_ahead[entry] & orderq_entry_val_q[entry] & orderq_entry_ld_q[entry] & orderq_entry_i_q[entry];
              assign forw_flush_detected[entry]  = forw_collisions_ahead[entry] & orderq_entry_val_q[entry] & orderq_entry_ld_q[entry] & (~orderq_entry_hit_q[entry]);
              assign set_flush_condition[entry]  = store_flush_detected[entry] | forw_flush_detected[entry] | ci_flush_detected[entry];
           end
      end
   endgenerate

   // TODO:
   //
   // Determine if we have an older load miss that hits a younger load hit that is already in the queue (reordered).
   // These need to be flushed
   //

   // TODO:
   //
   // Need to change the back invalidate flush to be all entries that hit except for the oldest one in the queue.
   //


  //SENS always @(orderq_entry_inuse_q)
  always @(*)
     begin: cmp
        integer i;

        for (i = 0; i <= `LDSTQ_ENTRIES - 1; i = i + 1)

          flush_vector_pre[i] = orderq_entry_inuse_q[i];

     end

   //
   //  Generate the compression string from the entry
   //
   // Need to compress when all commands are resolved ahead of
   assign compress_val   = |(remove_entry_vec);
   assign compress_entry = remove_entry;

   // return credit whenever we remove an entry or we have prevented a command from entering the queue due to cp_flush
   assign lq_iu_credit_free_d = (remove_tid & {`THREADS{compress_val}}) | flush_credit_free;
   assign lq_iu_credit_free   = lq_iu_credit_free_q;

   generate
      begin : compVect
         genvar entry;
         for (entry = 0; entry <= `LDSTQ_ENTRIES - 1; entry = entry + 1)
           begin : compVect
              if (entry == 0)
                begin : en0
                   assign remove_entry_base[entry] = remove_entry_vec[entry];
                   assign compress_vector[entry]   = remove_entry_base[entry];
                end
              if (entry > 0)
                begin : en
                   assign remove_entry_base[entry] = remove_entry_vec[entry] & (~(|(remove_entry_vec[0:entry - 1])));
                   assign compress_vector[entry]   = |(remove_entry_base[0:entry]);
                end
           end
      end
   endgenerate

   //
   //  if we are compressing this cycle, shift the flush vector so it is correct
   //
   //flush_vector <= flush_vector_pre(1 to `LDSTQ_ENTRIES-1) & '0' when (compress_val = '1') else
   assign flush_vector = flush_vector_pre;

   generate
      begin : cmp_loop
         genvar entry;
         for (entry = 0; entry <= `LDSTQ_ENTRIES - 1; entry = entry + 1)
           begin : cmp_loop

              // ##############################################
              // ##############################################
              // Order Queue Compression
              // ##############################################
              // ##############################################


              //always @(compress_vector[entry] or compress_val or orderq_entry_inuse_next[entry] or orderq_entry_tid_next[entry] or orderq_entry_val_next[entry] or orderq_entry_ld_next[entry] or orderq_entry_efs_next[entry] or orderq_entry_i_next[entry] or orderq_entry_hit_next[entry] or orderq_entry_fwd_next[entry] or orderq_entry_cls_op_next[entry] or orderq_entry_dacrw_next[entry] or orderq_entry_pre_next[entry] or orderq_entry_instq_next[entry] or orderq_entry_flushed_next[entry] or orderq_entry_myflush_next[entry] or orderq_entry_ld_chk_next[entry] or orderq_entry_stTag_next[entry] or orderq_entry_cmmt_next[entry] or orderq_entry_bi_flag_next[entry] or orderq_entry_bi_flush_next[entry] or orderq_entry_n_flush_next[entry] or orderq_entry_np1_flush_next[entry] or orderq_entry_update_pulse_next[entry] or orderq_entry_itag_next[entry] or orderq_entry_val2_next[entry] or orderq_entry_inuse_next[entry + 1] or orderq_entry_tid_next[entry + 1] or orderq_entry_val_next[entry + 1] or orderq_entry_ld_next[entry + 1] or orderq_entry_efs_next[entry + 1] or orderq_entry_i_next[entry + 1] or orderq_entry_hit_next[entry + 1] or orderq_entry_fwd_next[entry + 1] or orderq_entry_cls_op_next[entry + 1] or orderq_entry_dacrw_next[entry + 1] or orderq_entry_pre_next[entry + 1] or orderq_entry_instq_next[entry + 1] or orderq_entry_flushed_next[entry + 1] or orderq_entry_myflush_next[entry + 1] or orderq_entry_ld_chk_next[entry + 1] or orderq_entry_stTag_next[entry + 1] or orderq_entry_cmmt_next[entry + 1] or orderq_entry_bi_flag_next[entry + 1] or orderq_entry_bi_flush_next[entry + 1] or orderq_entry_n_flush_next[entry + 1] or orderq_entry_np1_flush_next[entry + 1] or orderq_entry_update_pulse_next[entry + 1] or orderq_entry_itag_next[entry + 1] or orderq_entry_val2_next[entry + 1])
              always @(*)
                begin: cmp

                   orderq_entry_inuse_d[entry]        = orderq_entry_inuse_next[entry];
                   orderq_entry_tid_d[entry]          = orderq_entry_tid_next[entry];
                   orderq_entry_val_d[entry]          = orderq_entry_val_next[entry];
                   orderq_entry_ld_d[entry]           = orderq_entry_ld_next[entry];
                   orderq_entry_efs_d[entry]          = orderq_entry_efs_next[entry];
                   orderq_entry_i_d[entry]            = orderq_entry_i_next[entry];
                   orderq_entry_hit_d[entry]          = orderq_entry_hit_next[entry];
                   orderq_entry_fwd_d[entry]          = orderq_entry_fwd_next[entry];
                   orderq_entry_cls_op_d[entry]       = orderq_entry_cls_op_next[entry];
                   orderq_entry_dacrw_d[entry]        = orderq_entry_dacrw_next[entry];
                   orderq_entry_eccue_d[entry]        = orderq_entry_eccue_next[entry];
                   orderq_entry_pEvents_d[entry]      = orderq_entry_pEvents_next[entry];
                   orderq_entry_pre_d[entry]          = orderq_entry_pre_next[entry];
                   orderq_entry_instq_d[entry]        = orderq_entry_instq_next[entry];
                   orderq_entry_flushed_d[entry]      = orderq_entry_flushed_next[entry];
                   orderq_entry_myflush_d[entry]      = orderq_entry_myflush_next[entry];
                   orderq_entry_ld_chk_d[entry]       = orderq_entry_ld_chk_next[entry];
                   orderq_entry_stTag_d[entry]        = orderq_entry_stTag_next[entry];
                   orderq_entry_cmmt_d[entry]         = orderq_entry_cmmt_next[entry];
                   orderq_entry_bi_flag_d[entry]      = orderq_entry_bi_flag_next[entry];
                   orderq_entry_bi_flush_d[entry]     = orderq_entry_bi_flush_next[entry];
                   orderq_entry_val2_d[entry]         = orderq_entry_val2_next[entry];
                   orderq_entry_n_flush_d[entry]      = orderq_entry_n_flush_next[entry];
                   orderq_entry_np1_flush_d[entry]    = orderq_entry_np1_flush_next[entry];
                   orderq_entry_update_pulse_d[entry] = orderq_entry_update_pulse_next[entry];
                   orderq_entry_itag_d[entry]         = orderq_entry_itag_next[entry];

                   if (compress_vector[entry] == 1'b1 & compress_val == 1'b1)
                     begin
                        orderq_entry_inuse_d[entry]        = orderq_entry_inuse_next[entry + 1];
                        orderq_entry_tid_d[entry]          = orderq_entry_tid_next[entry + 1];
                        orderq_entry_val_d[entry]          = orderq_entry_val_next[entry + 1];
                        orderq_entry_ld_d[entry]           = orderq_entry_ld_next[entry + 1];
                        orderq_entry_efs_d[entry]          = orderq_entry_efs_next[entry + 1];
                        orderq_entry_i_d[entry]            = orderq_entry_i_next[entry + 1];
                        orderq_entry_hit_d[entry]          = orderq_entry_hit_next[entry + 1];
                        orderq_entry_fwd_d[entry]          = orderq_entry_fwd_next[entry + 1];
                        orderq_entry_cls_op_d[entry]       = orderq_entry_cls_op_next[entry + 1];
                        orderq_entry_dacrw_d[entry]        = orderq_entry_dacrw_next[entry + 1];
                        orderq_entry_eccue_d[entry]        = orderq_entry_eccue_next[entry + 1];
                        orderq_entry_pEvents_d[entry]      = orderq_entry_pEvents_next[entry + 1];
                        orderq_entry_pre_d[entry]          = orderq_entry_pre_next[entry + 1];
                        orderq_entry_instq_d[entry]        = orderq_entry_instq_next[entry + 1];
                        orderq_entry_flushed_d[entry]      = orderq_entry_flushed_next[entry + 1];
                        orderq_entry_myflush_d[entry]      = orderq_entry_myflush_next[entry + 1];
                        orderq_entry_ld_chk_d[entry]       = orderq_entry_ld_chk_next[entry + 1];
                        orderq_entry_stTag_d[entry]        = orderq_entry_stTag_next[entry + 1];
                        orderq_entry_cmmt_d[entry]         = orderq_entry_cmmt_next[entry + 1];
                        orderq_entry_bi_flag_d[entry]      = orderq_entry_bi_flag_next[entry + 1];
                        orderq_entry_bi_flush_d[entry]     = orderq_entry_bi_flush_next[entry + 1];
                        orderq_entry_val2_d[entry]         = orderq_entry_val2_next[entry + 1];
                        orderq_entry_n_flush_d[entry]      = orderq_entry_n_flush_next[entry + 1];
                        orderq_entry_np1_flush_d[entry]    = orderq_entry_np1_flush_next[entry + 1];
                        orderq_entry_update_pulse_d[entry] = orderq_entry_update_pulse_next[entry + 1];
                        orderq_entry_itag_d[entry]         = orderq_entry_itag_next[entry + 1];
                     end
                end
           end
      end
   endgenerate


   //
   // Create a vector which we can or in with each entry as an update to its current state
   // this is needed to update entries that are sent out of order with the correct collision info
   // The process needs to take the collision_vector and change it from the perspective of each
   // entry in the queue, basically using the bit value that corresponds to its own entry as the value
   // for the collision bit entry that is being updated by lq.
   //
   //  Example:
   //  If we had the following queue
   //  Entry  InUse  Valid Collision vectors
   //  3      1      1     L 0000
   //  2      1      1     L 0000
   //  1      1      1     L 0000
   //  0      1      0     S 0000
   //
   // If incomming collison vector for entry 0 looks like this 0111, we would need to create the following or masks
   //
   //  Entry  InUse  Valid Collision or masks
   //  3      1      1     1110
   //  2      1      1     1101
   //  1      1      1     1011
   //  0      1      0     ----

   // After applying the masks the final collision vectors should look like the following
   //
   //  Entry  InUse  Valid Collision or masks
   //  3      1      1     1110
   //  2      1      1     1101
   //  1      1      1     1011
   //  0      1      0     0111
   //

   //
   // Temp fix...need to look at this...If we ever need
   // to remove from the middle this won't work.  We can
   // just shift the collison vector left.
   //
   assign compress_val_d = compress_val;


   //
   // New Collision detection logic
   //
   assign collision_vector_new = (compress_val_q == 1'b0) ? collision_vector_q :
                                 {collision_vector_q[1:`LDSTQ_ENTRIES - 1], 1'b0};
   generate
      begin : gen_ops
         genvar entry;
         for (entry = 0; entry <= `LDSTQ_ENTRIES - 1; entry = entry + 1)
           begin : gen_ops
              assign queue_entry_is_store[entry] = ((orderq_entry_ld_q[entry] == 1'b0) & orderq_entry_pre_q[entry] == 1'b0);
              assign queue_entry_is_load[entry]  = (orderq_entry_ld_q[entry] == 1'b1);
           end
      end
   endgenerate

   //collision_check_mask(0) <= '0';
   generate
      begin : col_det_g
         genvar entry;
         for (entry = 0; entry <= `LDSTQ_ENTRIES - 1; entry = entry + 1)
           begin : col_det_g
              assign oo_collision_detected[entry] = collision_vector_new[entry] & collision_check_mask[entry];
           end
      end
   endgenerate

   always @(*)
     begin : def2
        collision_check_mask[0]   = tidn;
        store_collisions_ahead[0] = tidn;
        load_collisions_ahead[0]  = tidn;
        forw_collisions_ahead[0]  = tidn;
      end

   generate
      begin : col_det_f
         genvar entry;
         for (entry = 1; entry <= `LDSTQ_ENTRIES - 1; entry = entry + 1)
           begin : col_det_f

              //SENS always @(update_vld[0:entry - 1] or oo_collision_detected[entry] or queue_entry_is_load[0:entry - 1] or queue_entry_is_store[0:entry - 1] or ldq_odq_vld_q or ldq_odq_fwd_q)
              always @(*)
                begin: col_chk
                   collision_check_mask[entry]   = ((|(update_vld[0:entry - 1])) | ldq_odq_pfetch_vld_ex6_q);
                   store_collisions_ahead[entry] = oo_collision_detected[entry] & |(update_vld[0:entry - 1] & queue_entry_is_store[0:entry - 1]);
                   load_collisions_ahead[entry]  = oo_collision_detected[entry] & |(update_vld[0:entry - 1] & queue_entry_is_load[0:entry - 1]);
                   forw_collisions_ahead[entry]  = oo_collision_detected[entry] & ldq_odq_vld_q & ldq_odq_fwd_q;
                end
           end
      end
   endgenerate


   assign ldq_odq_pfetch_vld_ex6_d = ldq_odq_pfetch_vld;

   assign odq_ldq_ex7_pfetch_blk_d = ((|(set_flush_condition[0:`LDSTQ_ENTRIES-1])) & ldq_odq_pfetch_vld_ex6_q);
   assign odq_ldq_ex7_pfetch_blk = odq_ldq_ex7_pfetch_blk_q;

   assign sent_early_flush = {`LDSTQ_ENTRIES{1'b0}};

   // =======================================================================
   //
   // Ordering rules
   // The following are the rules that need to be followed when deciding
   // if a load/store op is allowed to be sent.
   //
   // =======================================================================

   // TODO

   // What are the rules
   // A) ON LOAD MISS
   //     1) it can only be sent if there are no unresolved stores in front of it, and there are no store collisions ahead of it
   //     2)
   // B) ON LOAD HIT
   //     1) it can only be sent if there are no unresolved stores or loads in front of it and there are no collisions.
   //     2) if there are outstanding unresolved stores, the load must be marked to be checked when all stores are resolved
   //        if there ends up being a collision, a flush needs to be issued for the load.
   //     3)
   // C) ON STORE
   //     1) stores can be sent as long as all ops ahead are resolved and there are no collisions
   //     2)

   //
   //    NOTE:  The odq_ldq_send_cmd signal is generatated from the following logic.  The way flushes work currently
   //           I don't have an indicator that an entry has been completed.  If we have an old itag that matches a new
   //           itag that gets flushed, the old itag's flushed indicator will come on to ldq.  This could be fixed by
   //           getting completion results from ldq and storing them and gating cp_flush for the entry if it is considered
   //           completed by the ldq.
   //           Instead of adding this logic we decided to allow the flush to come on for the old itag and we do not gate off
   //           cmd_send for the entry.  The command send will get gated off for the myflush and early_flush indicators
   //           so ldq can qualify next itag to complete.
   //

   // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
   // Address Compare Push down queue
   // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
   //
   // Bits 0   1   60 bits   16 bits    5 bits
   //    ------------------------------------------------------------------------------------------
   //    | E | V | Address | Mask     | itag  |
   //    ------------------------------------------------------------------------------------------
   //      |   |   |         |          |
   //      |   |   |         |          |
   //      |   |   |         |          |
   //      |   |   |         |          Itag of the instruction corresponding to this entry
   //      |   |   |         Byte Mask
   //      |   |   Address(0:59)
   //      |   Valid entry.  This entry has been issued by RV
   //      Entry exists.  This entry has been dispatched to RV.
   //
   // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

   //
   // Set the shift in value for the last queue entry to all 0's
   //
   always @(*)
     begin : def3
       addrq_entry_inuse_next[`LDSTQ_ENTRIES]    = tidn;
       addrq_entry_val_next[`LDSTQ_ENTRIES]      = tidn;
       addrq_entry_tid_next[`LDSTQ_ENTRIES]      = {`THREADS{tidn}};
       addrq_entry_itag_next[`LDSTQ_ENTRIES]     = {`ITAG_SIZE_ENC{tidn}};
       addrq_entry_address_next[`LDSTQ_ENTRIES]  = {`REAL_IFAR_WIDTH-4{tidn}};
       addrq_entry_bytemask_next[`LDSTQ_ENTRIES] = {16{tidn}};
   end

   generate
      begin : gen_b
         genvar entry;
         for (entry = 0; entry <= `LDSTQ_ENTRIES - 1; entry = entry + 1)
           begin : gen_b

              assign update_addrq_vld[entry] = ldq_odq_vld & |(ldq_odq_tid & addrq_entry_tid_q[entry]) & addrq_entry_inuse_q[entry] & (~addrq_entry_val_q[entry]) & (addrq_entry_itag_q[entry] == ldq_odq_itag) & (~orderq_entry_flushed_q[entry]);

              //SENS always @(write_instr0[entry] or write_instr1[entry] or update_addrq_vld[entry] or ex1_i0_itag_q or ex1_i1_itag_q or ex1_i1_vld_q or ex0_i1_vld_q or ldq_odq_addr or ldq_odq_bytemask or addrq_entry_itag_q[entry] or addrq_entry_inuse_q[entry] or addrq_entry_val_q[entry] or addrq_entry_tid_q[entry] or orderq_entry_itag_q[entry] or addrq_entry_address_q[entry] or addrq_entry_bytemask_q[entry])
              always @(*)
                begin: entry_update

                   // default
                   addrq_entry_inuse_next[entry]    = addrq_entry_inuse_q[entry];
                   addrq_entry_val_next[entry]      = addrq_entry_val_q[entry];
                   addrq_entry_tid_next[entry]      = addrq_entry_tid_q[entry];
                   addrq_entry_itag_next[entry]     = addrq_entry_itag_q[entry];
                   addrq_entry_address_next[entry]  = addrq_entry_address_q[entry];
                   addrq_entry_bytemask_next[entry] = addrq_entry_bytemask_q[entry];

                   // =======================================================================
                   // order queue info updated from rv i0
                   // =======================================================================
                   if (write_instr0[entry] == 1'b1)
                     begin
                        addrq_entry_inuse_next[entry] = 1'b1;
                        addrq_entry_val_next[entry]   = 1'b0;
                        addrq_entry_tid_next[entry]   = ex1_i0_vld_q;
                        addrq_entry_itag_next[entry]  = ex1_i0_itag_q;
                     end

                   // =======================================================================
                   // order queue info updated from rv i1
                   // =======================================================================
                   if (write_instr1[entry] == 1'b1)
                     begin
                        addrq_entry_inuse_next[entry] = 1'b1;
                        addrq_entry_val_next[entry]   = 1'b0;
                        addrq_entry_tid_next[entry]   = ex1_i1_vld_q;
                        addrq_entry_itag_next[entry]  = ex1_i1_itag_q;
                     end

                   // =======================================================================
                   // order queue info updated from ldq
                   // lsq_entry
                   // =======================================================================
                   if (update_addrq_vld[entry] == 1'b1)
                     begin
                        addrq_entry_val_next[entry]      = 1'b1;
                        addrq_entry_address_next[entry]  = ldq_odq_addr;
                        addrq_entry_bytemask_next[entry] = ldq_odq_bytemask;
                     end


                   // =======================================================================
                   // addr queue info updated from internal
                   // =======================================================================

                end
           end
      end
   endgenerate

   generate
      begin : cmp2_loop
         genvar  entry;
         for (entry = 0; entry <= `LDSTQ_ENTRIES - 1; entry = entry + 1)
           begin : cmp2_loop

              // ##############################################
              // ##############################################
              // Addr Queue Compression
              // ##############################################
              // ##############################################


              //always @(compress_vector[entry] or compress_val or addrq_entry_inuse_next[entry] or addrq_entry_val_next[entry] or addrq_entry_tid_next[entry] or addrq_entry_itag_next[entry] or addrq_entry_address_next[entry] or addrq_entry_bytemask_next[entry] or addrq_entry_inuse_next[entry + 1] or addrq_entry_val_next[entry + 1] or addrq_entry_tid_next[entry + 1] or addrq_entry_itag_next[entry + 1] or addrq_entry_address_next[entry + 1] or addrq_entry_bytemask_next[entry + 1])
              always @(*)
                begin: cmp

                   addrq_entry_inuse_d[entry]    = addrq_entry_inuse_next[entry];
                   addrq_entry_val_d[entry]      = addrq_entry_val_next[entry];
                   addrq_entry_tid_d[entry]      = addrq_entry_tid_next[entry];
                   addrq_entry_itag_d[entry]     = addrq_entry_itag_next[entry];
                   addrq_entry_address_d[entry]  = addrq_entry_address_next[entry];
                   addrq_entry_bytemask_d[entry] = addrq_entry_bytemask_next[entry];

                   if (compress_vector[entry] == 1'b1 & compress_val == 1'b1)
                     begin
                        addrq_entry_inuse_d[entry]    = addrq_entry_inuse_next[entry + 1];
                        addrq_entry_val_d[entry]      = addrq_entry_val_next[entry + 1];
                        addrq_entry_tid_d[entry]      = addrq_entry_tid_next[entry + 1];
                        addrq_entry_itag_d[entry]     = addrq_entry_itag_next[entry + 1];
                        addrq_entry_address_d[entry]  = addrq_entry_address_next[entry + 1];
                        addrq_entry_bytemask_d[entry] = addrq_entry_bytemask_next[entry + 1];		// if we are compressing use the compressed collision vector
                     end

                end

              //
              //
              // Collision Detection
              //
              // Coll = A(0:57) = B(0:57) and
              //        ((cl64 = '0' and cls_op = '1') or ((cl64 = '1' or cls_op = '0') and A(58) = B(58))) and
              //        ((               cls_op = '1') or ((              cls_op = '0') and A(59) = B(59))) and
              //        ((               cls_op = '1') or ((              cls_op = '0') and ByteCompare)
              //
              // ByteCompare = or_reduce(BM_A and BM_B)
              //

              assign cacheline_size_check[entry] = orderq_entry_cls_op_q[entry] | ldq_odq_cline_chk;

              //                             [ Always compare on address(0 to 57)                             ]
              assign collision_vector_pre[entry] = ((addrq_entry_val_q[entry] == 1'b1) &
                                                    ((addrq_entry_address_q[entry][64 - `REAL_IFAR_WIDTH:57] == ldq_odq_addr[64 - `REAL_IFAR_WIDTH:57]) &
              //                                    [ Force match if CL=128 and we are not doing a byte compare or op is cl size], or [ CL=64  or we are doing a byte compare and bit 58 matches ]
                                                    ((cl64 == 1'b0 & cacheline_size_check[entry] == 1'b1) | ((cl64 == 1'b1 | cacheline_size_check[entry] == 1'b0) & (addrq_entry_address_q[entry][58] == ldq_odq_addr[58]))) &
              //                                    [ Force match if we are not doing a byte compare or op is cl size],          or [ we are doing a byte compare and bit 59 matches ]
                                                    ((cacheline_size_check[entry] == 1'b1) | ((cacheline_size_check[entry] == 1'b0) & (addrq_entry_address_q[entry][59] == ldq_odq_addr[59]))) &
              //                                    [ Force match if we are not doing a byte compare or op is cl size],          or [ we are doing a byte compare and bytemasks match ]
                                                    ((cacheline_size_check[entry] == 1'b1) | ((cacheline_size_check[entry] == 1'b0) & |(addrq_entry_bytemask_q[entry] & ldq_odq_bytemask)))));

              // for pre-issued ucode instrutions we need to make sure they do
              // not collide with any instruction
              assign collision_vector[entry] = (collision_vector_pre[entry] & ((~orderq_entry_pre_q[entry])));
           end
      end
   endgenerate

   assign collision_vector_d = collision_vector;

   assign cl64 = xu_lq_spr_xucr0_cls_q;

   // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
   //
   // Machine Kill Scenarios
   //
   // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
   //
   // 1. Back-invalidate hits a loadmiss/loadhit in the orderQ
   //      Load is marked with B-INV status, needs to check older unresolved addresses
   //        If older unresolved addresses hit, need to machine kill newer load that has the B-INV status set, else no machine kill
   //
   // 2. Newer Loadmiss-Hit-Older Unresolved Store
   //      Loadmiss is sent speculatively
   //        If reload comes back, without store resolved, update L1D$, cant complete until store is resolved
   //          Once store is resolved, if overlap with store bytes, then loadmiss machine kill
   //        If reload not back before store resolves, update the L1D$
   //          if overlap with store bytes, then loadmiss machine kill when reload gets back and updates L1D$
   //
   // 3. Newer Loadhit-Hit-Older Unresolved Store
   //      Loadhit waits for stores address resolution
   //        If address resolution of store results in byte overlap, then machine kill loadhit
   //
   // 4. Load hit Store with Mismatching EA and Matching RA coming down the pipeline to ORDQ
   //      MACHINE_KILL older instruction
   //
   // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

   // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
   //
   // Generate all resolved ahead indication for ldq
   //
   // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

   // resolved indicator (Indicates itag is ok to complete)

   //all_resolved_ahead(

   // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
   //
   // Generate Flush indication to ldq
   //
   // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

   //
   // Conditions where we flush
   //
   // 1. Load hit hit store
   //
   // 2. Back invalidate comes in and marks all sent loads it hits.  If any
   //    load becomes resolved and hits an older marked load it must be flushed.

   assign odq_ldq_resolved       = remove_entry_vec[0] & oldest_rem_is_nonflush_ld;
   assign odq_ldq_report_itag    = oldest_rem_itag;
   assign odq_ldq_n_flush        = oldest_rem_n_flush_value;
   assign odq_ldq_np1_flush      = oldest_rem_np1_flush_value;
   assign odq_ldq_report_needed  = oldest_rem_report_needed | oldest_rem_hit;
   assign odq_ldq_report_dacrw   = oldest_rem_dacrw;
   assign odq_ldq_report_eccue   = oldest_rem_eccue;
   assign odq_ldq_report_tid     = oldest_rem_tid;
   assign odq_ldq_report_pEvents = oldest_rem_pEvents;
   assign odq_stq_resolved       = remove_entry_vec[0] & oldest_rem_instq;
   assign odq_stq_stTag          = oldest_rem_stTag;

   // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
   //
   // Generate oldest unresolved itag for ldq
   //
   // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

   generate
      begin : urld_gen
         genvar entry;
         for (entry = 0; entry <= `LDSTQ_ENTRIES - 1; entry = entry + 1)
           begin : urld_gen
              assign unresolved_load[entry] = orderq_entry_inuse_q[entry] & ((~orderq_entry_val_q[entry])) & orderq_entry_ld_q[entry];
           end
      end
   endgenerate


   //SENS always @(unresolved_load[0:`LDSTQ_ENTRIES - 1] or orderq_entry_itag_q)
   always @(*)
     begin: old_itag
        integer                           i;
        oldest_unrsv_ld_tid  = {`THREADS{1'b0}};
        oldest_unrsv_ld_itag = {`ITAG_SIZE_ENC{1'b0}};
        for (i = `LDSTQ_ENTRIES - 1; i >= 0; i = i - 1)
          if (unresolved_load[i] == 1'b1)
            begin
               oldest_unrsv_ld_tid  = orderq_entry_tid_q[i];
               oldest_unrsv_ld_itag = orderq_entry_itag_q[i];
            end
     end

   assign odq_ldq_oldest_ld_tid  = oldest_unrsv_ld_tid;
   assign odq_ldq_oldest_ld_itag = oldest_unrsv_ld_itag;

   // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
   //
   // Generate oldest resolved or flushed itag for ldq
   //
   // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

   // Back-Invalidate in the pipe check against the oldest entry in the order queue
   assign oldest_entry_p0_cclass = {addrq_entry_address_q[0][64 - (`DC_SIZE - 3):56], (addrq_entry_address_q[0][57] | xu_lq_spr_xucr0_cls_q)};
   assign oldest_entry_p1_cclass = {addrq_entry_address_q[1][64 - (`DC_SIZE - 3):56], (addrq_entry_address_q[1][57] | xu_lq_spr_xucr0_cls_q)};
   assign oldest_entry_p0_m_rv0 = orderq_entry_inuse_q[0] & orderq_entry_val_q[0] & orderq_entry_ld_q[0] & l2_back_inv_val & (l2_back_inv_addr == oldest_entry_p0_cclass);
   assign oldest_entry_p1_m_rv0 = orderq_entry_inuse_q[1] & orderq_entry_val_q[1] & orderq_entry_ld_q[1] & l2_back_inv_val & (l2_back_inv_addr == oldest_entry_p1_cclass);
   assign oldest_entry_p1_m_rv1 = orderq_entry_inuse_q[1] & orderq_entry_val_q[1] & orderq_entry_ld_q[1] & rv1_binv_val_q & (rv1_binv_addr_q == oldest_entry_p1_cclass);
   assign oldest_entry_p1_m_ex0 = orderq_entry_inuse_q[1] & orderq_entry_val_q[1] & orderq_entry_ld_q[1] & ex0_binv_val_q & (ex0_binv_addr_q == oldest_entry_p1_cclass);
   assign oldest_entry_p1_m_ex1 = orderq_entry_inuse_q[1] & orderq_entry_val_q[1] & orderq_entry_ld_q[1] & ex1_binv_val_q & (ex1_binv_addr_q == oldest_entry_p1_cclass);
   assign oldest_entry_p1_m_ex2 = orderq_entry_inuse_q[1] & orderq_entry_val_q[1] & orderq_entry_ld_q[1] & ex2_binv_val_q & (ex2_binv_addr_q == oldest_entry_p1_cclass);
   assign oldest_entry_p1_m_ex3 = orderq_entry_inuse_q[1] & orderq_entry_val_q[1] & orderq_entry_ld_q[1] & ex3_binv_val_q & (ex3_binv_addr_q == oldest_entry_p1_cclass);
   assign oldest_entry_p1_m_ex4 = orderq_entry_inuse_q[1] & orderq_entry_val_q[1] & orderq_entry_ld_q[1] & ex4_binv_val_q & (ex4_binv_addr_q == oldest_entry_p1_cclass);
   assign oldest_entry_p1_m_ex5 = orderq_entry_inuse_q[1] & orderq_entry_val_q[1] & orderq_entry_ld_q[1] & ex5_binv_val_q & (ex5_binv_addr_q == oldest_entry_p1_cclass);
   assign entry_rv1_blk_d = oldest_entry_p0_m_rv0 | oldest_entry_p1_m_rv0;
   assign entry_ex0_blk_d = entry_rv1_blk_q | oldest_entry_p1_m_rv1;
   assign entry_ex1_blk_d = entry_ex0_blk_q | oldest_entry_p1_m_ex0;
   assign entry_ex2_blk_d = entry_ex1_blk_q | oldest_entry_p1_m_ex1;
   assign entry_ex3_blk_d = entry_ex2_blk_q | oldest_entry_p1_m_ex2;
   assign entry_ex4_blk_d = entry_ex3_blk_q | oldest_entry_p1_m_ex3;
   assign entry_ex5_blk_d = entry_ex4_blk_q | oldest_entry_p1_m_ex4;
   assign entry_ex6_blk_d = entry_ex5_blk_q | oldest_entry_p1_m_ex5;
   assign oldest_entry_blk = (orderq_entry_ld_q[0] & l2_back_inv_val) | entry_rv1_blk_q | entry_ex0_blk_q | entry_ex1_blk_q | entry_ex2_blk_q | entry_ex3_blk_q | entry_ex4_blk_q | entry_ex5_blk_q | entry_ex6_blk_q;

   // Want to gate the compression of the oldest entry if there is a back-invalidate in the pipeline
   // targetting the same congruence class as the oldest load entry
   assign remove_entry_vec[0] = orderq_entry_inuse_q[0] & ((orderq_entry_val_q[0] & (~oldest_entry_blk)) | orderq_entry_flushed_q[0]);

   //
   // This logic allows for removal of flushed entries from the middle of the queue.  There are issues with this as some of the shifting being
   // done is assuming that entries will only be allowed to remove from the oldest location.  We could fix this by:
   // 1. not allowing removal from middle.
   // 2. put in the extra logic in the collision detection logic to shift based on actual entry being compressed instead of assuming it
   //    is entry 0 and just doing a full shift of all entries.
   // 3. prevent removal of entries > 0 concurrent with the update of the entry from the ldq.
   //
   // For now I am choosing option 3 at it will be the best timing and still gets most of the benefit from removing the flushed entries
   // from the middle.  I will check ldq_odq_vld and only allow a flushed entry removal from the middle if this value is 0.
   //
   generate
      begin : rld_gen
         genvar entry;
         for (entry = 1; entry <= `LDSTQ_ENTRIES - 1; entry = entry + 1)
           begin : rld_gen
              assign remove_entry_vec[entry] = (orderq_entry_inuse_q[entry] & orderq_entry_flushed_q[entry] & ((~ldq_odq_vld)));
           end
      end
   endgenerate


   //SENS always @(remove_entry_vec or orderq_entry_tid_q)
   always @(*)
     begin: rm_entry
        integer i;
        remove_entry = {`LDSTQ_ENTRIES_ENC{1'b0}};
        remove_tid   = {`THREADS{1'b0}};
        for (i = `LDSTQ_ENTRIES - 1; i >= 0; i = i - 1)
          if (remove_entry_vec[i] == 1'b1)
            begin
               remove_entry = i;
               remove_tid   = orderq_entry_tid_q[i];
            end
     end


   assign oldest_rem_itag            = orderq_entry_itag_q[0];
   assign oldest_rem_n_flush_value   = (orderq_entry_ld_chk_q[0] | orderq_entry_myflush_q[0] | orderq_entry_efs_q[0] | orderq_entry_bi_flush_q[0] | orderq_entry_n_flush_q[0]);
   assign oldest_rem_np1_flush_value = orderq_entry_np1_flush_q[0];
   assign oldest_rem_report_needed   = orderq_entry_val2_q[0];
   assign oldest_rem_hit             = orderq_entry_hit_q[0];
   assign oldest_rem_is_nonflush_ld  = (orderq_entry_ld_q[0] & ((~orderq_entry_flushed_q[0])));
   assign oldest_rem_dacrw           = orderq_entry_dacrw_q[0];
   assign oldest_rem_eccue           = orderq_entry_eccue_q[0];
   assign oldest_rem_pEvents         = orderq_entry_pEvents_q[0];
   assign oldest_rem_tid             = orderq_entry_tid_q[0];
   assign oldest_rem_instq           = orderq_entry_instq_q[0] & (~orderq_entry_flushed_q[0]);

   generate
      genvar b;
      for (b = 0; b <= `STQ_ENTRIES - 1; b = b + 1)
        begin : stTag1Hot
           wire [0:`STQ_ENTRIES_ENC-1] bitVect = b;
           assign oldest_rem_stTag[b] = (bitVect == orderq_entry_stTag_q[0]);
        end
   endgenerate

   //
   assign lsq_ctl_oldest_tid  = orderq_entry_tid_q[0];
   assign lsq_ctl_oldest_itag = orderq_entry_itag_q[0];

   // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
   // REGISTERS
   // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

   generate
      /*begin : oqe*/
      genvar 			       entry;
      for (entry = 0; entry <= `LDSTQ_ENTRIES - 1; entry = entry + 1)
        begin : oqe

           //
           // Order Queue Entry Latches
           //

           tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) orderq_entry_inuse_reg
		   (
		    .vd(vdd),
		    .gd(gnd),
		    .clk(clk),
	.rst(rst),
		    .act(tiup),
		    .force_t(func_sl_force),
		    .d_mode(d_mode_dc),
		    .delay_lclkr(delay_lclkr_dc),
		    .mpw1_b(mpw1_dc_b),
		    .mpw2_b(mpw2_dc_b),
		    .thold_b(func_sl_thold_0_b),
		    .sg(sg_0),
		    .scin(siv[orderq_entry_inuse_offset + entry]),
		    .scout(sov[orderq_entry_inuse_offset + entry]),
		    .din(orderq_entry_inuse_d[entry]),
		    .dout(orderq_entry_inuse_q[entry])
		    );


           tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0), .NEEDS_SRESET(1)) orderq_entry_tid_reg
	     (
	      .vd(vdd),
	      .gd(gnd),
	      .clk(clk),
	.rst(rst),
	      .act(tiup),
	      .force_t(func_sl_force),
	      .d_mode(d_mode_dc),
	      .delay_lclkr(delay_lclkr_dc),
	      .mpw1_b(mpw1_dc_b),
	      .mpw2_b(mpw2_dc_b),
	      .thold_b(func_sl_thold_0_b),
	      .sg(sg_0),
	      .scin(siv[orderq_entry_tid_offset + (`THREADS * entry):orderq_entry_tid_offset + (`THREADS * (entry + 1)) - 1]),
	      .scout(sov[orderq_entry_tid_offset + (`THREADS * entry):orderq_entry_tid_offset + (`THREADS * (entry + 1)) - 1]),
	      .din(orderq_entry_tid_d[entry]),
	      .dout(orderq_entry_tid_q[entry])
	      );


           tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) orderq_entry_val_reg
	     (
	      .vd(vdd),
	      .gd(gnd),
	      .clk(clk),
	.rst(rst),
	      .act(tiup),
	      .force_t(func_sl_force),
	      .d_mode(d_mode_dc),
	      .delay_lclkr(delay_lclkr_dc),
	      .mpw1_b(mpw1_dc_b),
	      .mpw2_b(mpw2_dc_b),
	      .thold_b(func_sl_thold_0_b),
	      .sg(sg_0),
	      .scin(siv[orderq_entry_val_offset + entry]),
	      .scout(sov[orderq_entry_val_offset + entry]),
	      .din(orderq_entry_val_d[entry]),
	      .dout(orderq_entry_val_q[entry])
	      );


           tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) orderq_entry_ld_reg
	     (
	      .vd(vdd),
	      .gd(gnd),
	      .clk(clk),
	.rst(rst),
	      .act(tiup),
	      .force_t(func_sl_force),
	      .d_mode(d_mode_dc),
	      .delay_lclkr(delay_lclkr_dc),
	      .mpw1_b(mpw1_dc_b),
	      .mpw2_b(mpw2_dc_b),
	      .thold_b(func_sl_thold_0_b),
	      .sg(sg_0),
	      .scin(siv[orderq_entry_ld_offset + entry]),
	      .scout(sov[orderq_entry_ld_offset + entry]),
	      .din(orderq_entry_ld_d[entry]),
	      .dout(orderq_entry_ld_q[entry])
	      );


           tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) orderq_entry_i_reg
	     (
              .vd(vdd),
              .gd(gnd),
              .clk(clk),
	.rst(rst),
              .act(tiup),
              .force_t(func_sl_force),
              .d_mode(d_mode_dc),
              .delay_lclkr(delay_lclkr_dc),
              .mpw1_b(mpw1_dc_b),
              .mpw2_b(mpw2_dc_b),
              .thold_b(func_sl_thold_0_b),
              .sg(sg_0),
              .scin(siv[orderq_entry_i_offset + entry]),
              .scout(sov[orderq_entry_i_offset + entry]),
              .din(orderq_entry_i_d[entry]),
              .dout(orderq_entry_i_q[entry])
              );


           tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) orderq_entry_hit_reg
	     (
              .vd(vdd),
              .gd(gnd),
              .clk(clk),
	.rst(rst),
              .act(tiup),
              .force_t(func_sl_force),
              .d_mode(d_mode_dc),
              .delay_lclkr(delay_lclkr_dc),
              .mpw1_b(mpw1_dc_b),
              .mpw2_b(mpw2_dc_b),
              .thold_b(func_sl_thold_0_b),
              .sg(sg_0),
              .scin(siv[orderq_entry_hit_offset + entry]),
              .scout(sov[orderq_entry_hit_offset + entry]),
              .din(orderq_entry_hit_d[entry]),
              .dout(orderq_entry_hit_q[entry])
              );


           tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) orderq_entry_fwd_reg
	     (
              .vd(vdd),
              .gd(gnd),
              .clk(clk),
	.rst(rst),
              .act(tiup),
              .force_t(func_sl_force),
              .d_mode(d_mode_dc),
              .delay_lclkr(delay_lclkr_dc),
              .mpw1_b(mpw1_dc_b),
              .mpw2_b(mpw2_dc_b),
              .thold_b(func_sl_thold_0_b),
              .sg(sg_0),
              .scin(siv[orderq_entry_fwd_offset + entry]),
              .scout(sov[orderq_entry_fwd_offset + entry]),
              .din(orderq_entry_fwd_d[entry]),
              .dout(orderq_entry_fwd_q[entry])
              );


           tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) orderq_entry_cls_op_reg
	     (
              .vd(vdd),
              .gd(gnd),
              .clk(clk),
	.rst(rst),
              .act(tiup),
              .force_t(func_sl_force),
              .d_mode(d_mode_dc),
              .delay_lclkr(delay_lclkr_dc),
              .mpw1_b(mpw1_dc_b),
              .mpw2_b(mpw2_dc_b),
              .thold_b(func_sl_thold_0_b),
              .sg(sg_0),
              .scin(siv[orderq_entry_cls_op_offset + entry]),
              .scout(sov[orderq_entry_cls_op_offset + entry]),
              .din(orderq_entry_cls_op_d[entry]),
              .dout(orderq_entry_cls_op_q[entry])
              );


           tri_rlmreg_p #(.WIDTH(DACR_WIDTH), .INIT(0), .NEEDS_SRESET(1)) orderq_entry_dacrw_reg
	     (
              .vd(vdd),
              .gd(gnd),
              .clk(clk),
	.rst(rst),
              .act(tiup),
              .force_t(func_sl_force),
              .d_mode(d_mode_dc),
              .delay_lclkr(delay_lclkr_dc),
              .mpw1_b(mpw1_dc_b),
              .mpw2_b(mpw2_dc_b),
              .thold_b(func_sl_thold_0_b),
              .sg(sg_0),
              .scin(siv[orderq_entry_dacrw_offset + (DACR_WIDTH * entry):orderq_entry_dacrw_offset + (DACR_WIDTH * (entry + 1)) - 1]),
              .scout(sov[orderq_entry_dacrw_offset + (DACR_WIDTH  * entry):orderq_entry_dacrw_offset + (DACR_WIDTH * (entry + 1)) - 1]),
              .din(orderq_entry_dacrw_d[entry]),
              .dout(orderq_entry_dacrw_q[entry])
              );

           tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) orderq_entry_eccue_reg
	     (
              .vd(vdd),
              .gd(gnd),
              .clk(clk),
	.rst(rst),
              .act(tiup),
              .force_t(func_sl_force),
              .d_mode(d_mode_dc),
              .delay_lclkr(delay_lclkr_dc),
              .mpw1_b(mpw1_dc_b),
              .mpw2_b(mpw2_dc_b),
              .thold_b(func_sl_thold_0_b),
              .sg(sg_0),
              .scin(siv[orderq_entry_eccue_offset + entry]),
              .scout(sov[orderq_entry_eccue_offset + entry]),
              .din(orderq_entry_eccue_d[entry]),
              .dout(orderq_entry_eccue_q[entry])
              );

           tri_rlmreg_p #(.WIDTH(4), .INIT(0), .NEEDS_SRESET(1)) orderq_entry_pEvents_reg
	     (
              .vd(vdd),
              .gd(gnd),
              .clk(clk),
	.rst(rst),
              .act(tiup),
              .force_t(func_sl_force),
              .d_mode(d_mode_dc),
              .delay_lclkr(delay_lclkr_dc),
              .mpw1_b(mpw1_dc_b),
              .mpw2_b(mpw2_dc_b),
              .thold_b(func_sl_thold_0_b),
              .sg(sg_0),
              .scin(siv[orderq_entry_pEvents_offset + (4 * entry):orderq_entry_pEvents_offset + (4 * (entry + 1)) - 1]),
              .scout(sov[orderq_entry_pEvents_offset + (4  * entry):orderq_entry_pEvents_offset + (4 * (entry + 1)) - 1]),
              .din(orderq_entry_pEvents_d[entry]),
              .dout(orderq_entry_pEvents_q[entry])
              );

           tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) orderq_entry_pre_reg
	     (
              .vd(vdd),
              .gd(gnd),
              .clk(clk),
	.rst(rst),
              .act(tiup),
              .force_t(func_sl_force),
              .d_mode(d_mode_dc),
              .delay_lclkr(delay_lclkr_dc),
              .mpw1_b(mpw1_dc_b),
              .mpw2_b(mpw2_dc_b),
              .thold_b(func_sl_thold_0_b),
              .sg(sg_0),
              .scin(siv[orderq_entry_pre_offset + entry]),
              .scout(sov[orderq_entry_pre_offset + entry]),
              .din(orderq_entry_pre_d[entry]),
              .dout(orderq_entry_pre_q[entry])
              );


           tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) orderq_entry_instq_reg
	     (
              .vd(vdd),
              .gd(gnd),
              .clk(clk),
	.rst(rst),
              .act(tiup),
              .force_t(func_sl_force),
              .d_mode(d_mode_dc),
              .delay_lclkr(delay_lclkr_dc),
              .mpw1_b(mpw1_dc_b),
              .mpw2_b(mpw2_dc_b),
              .thold_b(func_sl_thold_0_b),
              .sg(sg_0),
              .scin(siv[orderq_entry_instq_offset + entry]),
              .scout(sov[orderq_entry_instq_offset + entry]),
              .din(orderq_entry_instq_d[entry]),
              .dout(orderq_entry_instq_q[entry])
              );


           tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) orderq_entry_flushed_reg
	     (
              .vd(vdd),
              .gd(gnd),
              .clk(clk),
	.rst(rst),
              .act(tiup),
              .force_t(func_sl_force),
              .d_mode(d_mode_dc),
              .delay_lclkr(delay_lclkr_dc),
              .mpw1_b(mpw1_dc_b),
              .mpw2_b(mpw2_dc_b),
              .thold_b(func_sl_thold_0_b),
              .sg(sg_0),
              .scin(siv[orderq_entry_flushed_offset + entry]),
              .scout(sov[orderq_entry_flushed_offset + entry]),
              .din(orderq_entry_flushed_d[entry]),
              .dout(orderq_entry_flushed_q[entry])
              );


           tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) orderq_entry_myflush_reg
	     (
              .vd(vdd),
              .gd(gnd),
              .clk(clk),
	.rst(rst),
              .act(tiup),
              .force_t(func_sl_force),
              .d_mode(d_mode_dc),
              .delay_lclkr(delay_lclkr_dc),
              .mpw1_b(mpw1_dc_b),
              .mpw2_b(mpw2_dc_b),
              .thold_b(func_sl_thold_0_b),
              .sg(sg_0),
              .scin(siv[orderq_entry_myflush_offset + entry]),
              .scout(sov[orderq_entry_myflush_offset + entry]),
              .din(orderq_entry_myflush_d[entry]),
              .dout(orderq_entry_myflush_q[entry])
              );


           tri_rlmreg_p #(.WIDTH(`ITAG_SIZE_ENC), .INIT(0), .NEEDS_SRESET(1)) orderq_entry_itag_reg
	     (
              .vd(vdd),
              .gd(gnd),
              .clk(clk),
	.rst(rst),
              .act(tiup),
              .force_t(func_sl_force),
              .d_mode(d_mode_dc),
              .delay_lclkr(delay_lclkr_dc),
              .mpw1_b(mpw1_dc_b),
              .mpw2_b(mpw2_dc_b),
              .thold_b(func_sl_thold_0_b),
              .sg(sg_0),
              .scin(siv[orderq_entry_itag_offset + (`ITAG_SIZE_ENC * entry):orderq_entry_itag_offset + (`ITAG_SIZE_ENC * (entry + 1)) - 1]),
              .scout(sov[orderq_entry_itag_offset + (`ITAG_SIZE_ENC * entry):orderq_entry_itag_offset + (`ITAG_SIZE_ENC * (entry + 1)) - 1]),
              .din(orderq_entry_itag_d[entry]),
              .dout(orderq_entry_itag_q[entry])
              );


           tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) orderq_entry_ld_chk_reg
	     (
              .vd(vdd),
              .gd(gnd),
              .clk(clk),
	.rst(rst),
              .act(tiup),
              .force_t(func_sl_force),
              .d_mode(d_mode_dc),
              .delay_lclkr(delay_lclkr_dc),
              .mpw1_b(mpw1_dc_b),
              .mpw2_b(mpw2_dc_b),
              .thold_b(func_sl_thold_0_b),
              .sg(sg_0),
              .scin(siv[orderq_entry_ld_chk_offset + entry]),
              .scout(sov[orderq_entry_ld_chk_offset + entry]),
              .din(orderq_entry_ld_chk_d[entry]),
              .dout(orderq_entry_ld_chk_q[entry])
              );


           tri_rlmreg_p #(.WIDTH(`STQ_ENTRIES_ENC), .INIT(0), .NEEDS_SRESET(1)) orderq_entry_stTag_reg
	     (
              .vd(vdd),
              .gd(gnd),
              .clk(clk),
	.rst(rst),
              .act(tiup),
              .force_t(func_sl_force),
              .d_mode(d_mode_dc),
              .delay_lclkr(delay_lclkr_dc),
              .mpw1_b(mpw1_dc_b),
              .mpw2_b(mpw2_dc_b),
              .thold_b(func_sl_thold_0_b),
              .sg(sg_0),
              .scin(siv[orderq_entry_stTag_offset + (`STQ_ENTRIES_ENC * entry):orderq_entry_stTag_offset + (`STQ_ENTRIES_ENC * (entry + 1)) - 1]),
              .scout(sov[orderq_entry_stTag_offset + (`STQ_ENTRIES_ENC * entry):orderq_entry_stTag_offset + (`STQ_ENTRIES_ENC * (entry + 1)) - 1]),
              .din(orderq_entry_stTag_d[entry]),
              .dout(orderq_entry_stTag_q[entry])
              );


           tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) orderq_entry_cmmt_reg
	     (
              .vd(vdd),
              .gd(gnd),
              .clk(clk),
	.rst(rst),
              .act(tiup),
              .force_t(func_sl_force),
              .d_mode(d_mode_dc),
              .delay_lclkr(delay_lclkr_dc),
              .mpw1_b(mpw1_dc_b),
              .mpw2_b(mpw2_dc_b),
              .thold_b(func_sl_thold_0_b),
              .sg(sg_0),
              .scin(siv[orderq_entry_cmmt_offset + entry]),
              .scout(sov[orderq_entry_cmmt_offset + entry]),
              .din(orderq_entry_cmmt_d[entry]),
              .dout(orderq_entry_cmmt_q[entry])
              );


           tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) orderq_entry_bi_flag_reg
	     (
              .vd(vdd),
              .gd(gnd),
              .clk(clk),
	.rst(rst),
              .act(tiup),
              .force_t(func_sl_force),
              .d_mode(d_mode_dc),
              .delay_lclkr(delay_lclkr_dc),
              .mpw1_b(mpw1_dc_b),
              .mpw2_b(mpw2_dc_b),
              .thold_b(func_sl_thold_0_b),
              .sg(sg_0),
              .scin(siv[orderq_entry_bi_flag_offset + entry]),
              .scout(sov[orderq_entry_bi_flag_offset + entry]),
              .din(orderq_entry_bi_flag_d[entry]),
              .dout(orderq_entry_bi_flag_q[entry])
              );


           tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) orderq_entry_bi_flush_reg
	     (
              .vd(vdd),
              .gd(gnd),
              .clk(clk),
	.rst(rst),
              .act(tiup),
              .force_t(func_sl_force),
              .d_mode(d_mode_dc),
              .delay_lclkr(delay_lclkr_dc),
              .mpw1_b(mpw1_dc_b),
              .mpw2_b(mpw2_dc_b),
              .thold_b(func_sl_thold_0_b),
              .sg(sg_0),
              .scin(siv[orderq_entry_bi_flush_offset + entry]),
              .scout(sov[orderq_entry_bi_flush_offset + entry]),
              .din(orderq_entry_bi_flush_d[entry]),
              .dout(orderq_entry_bi_flush_q[entry])
              );


           tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) orderq_entry_val2_reg
	     (
              .vd(vdd),
              .gd(gnd),
              .clk(clk),
	.rst(rst),
              .act(tiup),
              .force_t(func_sl_force),
              .d_mode(d_mode_dc),
              .delay_lclkr(delay_lclkr_dc),
              .mpw1_b(mpw1_dc_b),
              .mpw2_b(mpw2_dc_b),
              .thold_b(func_sl_thold_0_b),
              .sg(sg_0),
              .scin(siv[orderq_entry_val2_offset + entry]),
              .scout(sov[orderq_entry_val2_offset + entry]),
              .din(orderq_entry_val2_d[entry]),
              .dout(orderq_entry_val2_q[entry])
              );


           tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) orderq_entry_n_flush_reg
	     (
              .vd(vdd),
              .gd(gnd),
              .clk(clk),
	.rst(rst),
              .act(tiup),
              .force_t(func_sl_force),
              .d_mode(d_mode_dc),
              .delay_lclkr(delay_lclkr_dc),
              .mpw1_b(mpw1_dc_b),
              .mpw2_b(mpw2_dc_b),
              .thold_b(func_sl_thold_0_b),
              .sg(sg_0),
              .scin(siv[orderq_entry_n_flush_offset + entry]),
              .scout(sov[orderq_entry_n_flush_offset + entry]),
              .din(orderq_entry_n_flush_d[entry]),
              .dout(orderq_entry_n_flush_q[entry])
              );


           tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) orderq_entry_np1_flush_reg
	     (
              .vd(vdd),
              .gd(gnd),
              .clk(clk),
	.rst(rst),
              .act(tiup),
              .force_t(func_sl_force),
              .d_mode(d_mode_dc),
              .delay_lclkr(delay_lclkr_dc),
              .mpw1_b(mpw1_dc_b),
              .mpw2_b(mpw2_dc_b),
              .thold_b(func_sl_thold_0_b),
              .sg(sg_0),
              .scin(siv[orderq_entry_np1_flush_offset + entry]),
              .scout(sov[orderq_entry_np1_flush_offset + entry]),
              .din(orderq_entry_np1_flush_d[entry]),
              .dout(orderq_entry_np1_flush_q[entry])
              );


           tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) orderq_entry_update_pulse_reg
	     (
              .vd(vdd),
              .gd(gnd),
              .clk(clk),
	.rst(rst),
              .act(tiup),
              .force_t(func_sl_force),
              .d_mode(d_mode_dc),
              .delay_lclkr(delay_lclkr_dc),
              .mpw1_b(mpw1_dc_b),
              .mpw2_b(mpw2_dc_b),
              .thold_b(func_sl_thold_0_b),
              .sg(sg_0),
              .scin(siv[orderq_entry_update_pulse_offset + entry]),
              .scout(sov[orderq_entry_update_pulse_offset + entry]),
              .din(orderq_entry_update_pulse_d[entry]),
              .dout(orderq_entry_update_pulse_q[entry])
              );


           tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) orderq_entry_efs_reg
	     (
              .vd(vdd),
              .gd(gnd),
              .clk(clk),
	.rst(rst),
              .act(tiup),
              .force_t(func_sl_force),
              .d_mode(d_mode_dc),
              .delay_lclkr(delay_lclkr_dc),
              .mpw1_b(mpw1_dc_b),
              .mpw2_b(mpw2_dc_b),
              .thold_b(func_sl_thold_0_b),
              .sg(sg_0),
              .scin(siv[orderq_entry_efs_offset + entry]),
              .scout(sov[orderq_entry_efs_offset + entry]),
              .din(orderq_entry_efs_d[entry]),
              .dout(orderq_entry_efs_q[entry])
              );

           // addr queue latches

           tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) addrq_entry_inuse_reg
	     (
              .vd(vdd),
              .gd(gnd),
              .clk(clk),
	.rst(rst),
              .act(tiup),
              .force_t(func_sl_force),
              .d_mode(d_mode_dc),
              .delay_lclkr(delay_lclkr_dc),
              .mpw1_b(mpw1_dc_b),
              .mpw2_b(mpw2_dc_b),
              .thold_b(func_sl_thold_0_b),
              .sg(sg_0),
              .scin(siv[addrq_entry_inuse_offset + entry]),
              .scout(sov[addrq_entry_inuse_offset + entry]),
              .din(addrq_entry_inuse_d[entry]),
              .dout(addrq_entry_inuse_q[entry])
              );


           tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) addrq_entry_val_reg
	     (
              .vd(vdd),
              .gd(gnd),
              .clk(clk),
	.rst(rst),
              .act(tiup),
              .force_t(func_sl_force),
              .d_mode(d_mode_dc),
              .delay_lclkr(delay_lclkr_dc),
              .mpw1_b(mpw1_dc_b),
              .mpw2_b(mpw2_dc_b),
              .thold_b(func_sl_thold_0_b),
              .sg(sg_0),
              .scin(siv[addrq_entry_val_offset + entry]),
              .scout(sov[addrq_entry_val_offset + entry]),
              .din(addrq_entry_val_d[entry]),
              .dout(addrq_entry_val_q[entry])
              );


           tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0), .NEEDS_SRESET(1)) addrq_entry_tid_reg
	     (
              .vd(vdd),
              .gd(gnd),
              .clk(clk),
	.rst(rst),
              .act(tiup),
              .force_t(func_sl_force),
              .d_mode(d_mode_dc),
              .delay_lclkr(delay_lclkr_dc),
              .mpw1_b(mpw1_dc_b),
              .mpw2_b(mpw2_dc_b),
              .thold_b(func_sl_thold_0_b),
              .sg(sg_0),
              .scin(siv[addrq_entry_tid_offset + (`THREADS * entry):addrq_entry_tid_offset + (`THREADS * (entry + 1)) - 1]),
              .scout(sov[addrq_entry_tid_offset + (`THREADS * entry):addrq_entry_tid_offset + (`THREADS * (entry + 1)) - 1]),
              .din(addrq_entry_tid_d[entry]),
              .dout(addrq_entry_tid_q[entry])
              );


           tri_rlmreg_p #(.WIDTH(`ITAG_SIZE_ENC), .INIT(0), .NEEDS_SRESET(1)) addrq_entry_itag_reg
	     (
              .vd(vdd),
              .gd(gnd),
              .clk(clk),
	.rst(rst),
              .act(tiup),
              .force_t(func_sl_force),
              .d_mode(d_mode_dc),
              .delay_lclkr(delay_lclkr_dc),
              .mpw1_b(mpw1_dc_b),
              .mpw2_b(mpw2_dc_b),
              .thold_b(func_sl_thold_0_b),
              .sg(sg_0),
              .scin(siv[addrq_entry_itag_offset + (`ITAG_SIZE_ENC * entry):addrq_entry_itag_offset + (`ITAG_SIZE_ENC * (entry + 1)) - 1]),
              .scout(sov[addrq_entry_itag_offset + (`ITAG_SIZE_ENC * entry):addrq_entry_itag_offset + (`ITAG_SIZE_ENC * (entry + 1)) - 1]),
              .din(addrq_entry_itag_d[entry]),
              .dout(addrq_entry_itag_q[entry])
              );


           tri_rlmreg_p #(.WIDTH(`REAL_IFAR_WIDTH-4), .INIT(0), .NEEDS_SRESET(1)) addrq_entry_address_reg
	     (
              .vd(vdd),
              .gd(gnd),
              .clk(clk),
	.rst(rst),
              .act(tiup),
              .force_t(func_sl_force),
              .d_mode(d_mode_dc),
              .delay_lclkr(delay_lclkr_dc),
              .mpw1_b(mpw1_dc_b),
              .mpw2_b(mpw2_dc_b),
              .thold_b(func_sl_thold_0_b),
              .sg(sg_0),
              .scin(siv[addrq_entry_address_offset + ((`REAL_IFAR_WIDTH-4) * entry):addrq_entry_address_offset + ((`REAL_IFAR_WIDTH-4) * (entry + 1)) - 1]),
              .scout(sov[addrq_entry_address_offset + ((`REAL_IFAR_WIDTH-4) * entry):addrq_entry_address_offset + ((`REAL_IFAR_WIDTH-4) * (entry + 1)) - 1]),
              .din(addrq_entry_address_d[entry]),
              .dout(addrq_entry_address_q[entry])
              );


           tri_rlmreg_p #(.WIDTH(16), .INIT(0), .NEEDS_SRESET(1)) addrq_entry_bytemask_reg
	     (
              .vd(vdd),
              .gd(gnd),
              .clk(clk),
	.rst(rst),
              .act(tiup),
              .force_t(func_sl_force),
              .d_mode(d_mode_dc),
              .delay_lclkr(delay_lclkr_dc),
              .mpw1_b(mpw1_dc_b),
              .mpw2_b(mpw2_dc_b),
              .thold_b(func_sl_thold_0_b),
              .sg(sg_0),
              .scin(siv[addrq_entry_bytemask_offset + (16 * entry):addrq_entry_bytemask_offset + (16 * (entry + 1)) - 1]),
              .scout(sov[addrq_entry_bytemask_offset + (16 * entry):addrq_entry_bytemask_offset + (16 * (entry + 1)) - 1]),
              .din(addrq_entry_bytemask_d[entry]),
              .dout(addrq_entry_bytemask_q[entry])
              );
        end
      /* end */
   endgenerate

   //
   // Interface latches
   //


   tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0), .NEEDS_SRESET(1)) ex0_i0_vld_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex0_i0_vld_offset:ex0_i0_vld_offset + `THREADS - 1]),
      .scout(sov[ex0_i0_vld_offset:ex0_i0_vld_offset + `THREADS - 1]),
      .din(rv_lq_rv1_i0_vld),
      .dout(ex0_i0_vld_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex0_i0_rte_lq_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex0_i0_rte_lq_offset]),
      .scout(sov[ex0_i0_rte_lq_offset]),
      .din(rv_lq_rv1_i0_rte_lq),
      .dout(ex0_i0_rte_lq_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex0_i0_rte_sq_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex0_i0_rte_sq_offset]),
      .scout(sov[ex0_i0_rte_sq_offset]),
      .din(rv_lq_rv1_i0_rte_sq),
      .dout(ex0_i0_rte_sq_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex0_i0_isLoad_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex0_i0_isLoad_offset]),
      .scout(sov[ex0_i0_isLoad_offset]),
      .din(rv_lq_rv1_i0_isLoad),
      .dout(ex0_i0_isLoad_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex0_i0_ucode_preissue_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex0_i0_ucode_preissue_offset]),
      .scout(sov[ex0_i0_ucode_preissue_offset]),
      .din(rv_lq_rv1_i0_ucode_preissue),
      .dout(ex0_i0_ucode_preissue_q)
      );


   tri_rlmreg_p #(.WIDTH(3), .INIT(0), .NEEDS_SRESET(1)) ex0_i0_s3_t_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex0_i0_s3_t_offset:ex0_i0_s3_t_offset + 3 - 1]),
      .scout(sov[ex0_i0_s3_t_offset:ex0_i0_s3_t_offset + 3 - 1]),
      .din(rv_lq_rv1_i0_s3_t),
      .dout(ex0_i0_s3_t_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex0_i0_isStore_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex0_i0_isStore_offset]),
      .scout(sov[ex0_i0_isStore_offset]),
      .din(rv_lq_rv1_i0_isStore),
      .dout(ex0_i0_isStore_q)
      );


   tri_rlmreg_p #(.WIDTH(`ITAG_SIZE_ENC), .INIT(0), .NEEDS_SRESET(1)) ex0_i0_itag_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex0_i0_itag_offset:ex0_i0_itag_offset + `ITAG_SIZE_ENC - 1]),
      .scout(sov[ex0_i0_itag_offset:ex0_i0_itag_offset + `ITAG_SIZE_ENC - 1]),
      .din(rv_lq_rv1_i0_itag),
      .dout(ex0_i0_itag_q)
      );


   tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0), .NEEDS_SRESET(1)) ex1_i0_vld_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex1_i0_vld_offset:ex1_i0_vld_offset + `THREADS - 1]),
      .scout(sov[ex1_i0_vld_offset:ex1_i0_vld_offset + `THREADS - 1]),
      .din(ex1_i0_vld_d),
      .dout(ex1_i0_vld_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex1_i0_isLoad_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex1_i0_isLoad_offset]),
      .scout(sov[ex1_i0_isLoad_offset]),
      .din(ex1_i0_isLoad_d),
      .dout(ex1_i0_isLoad_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex1_i0_pre_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex1_i0_pre_offset]),
      .scout(sov[ex1_i0_pre_offset]),
      .din(ex1_i0_pre_d),
      .dout(ex1_i0_pre_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex1_i0_instq_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex1_i0_instq_offset]),
      .scout(sov[ex1_i0_instq_offset]),
      .din(ex1_i0_instq_d),
      .dout(ex1_i0_instq_q)
      );


   tri_rlmreg_p #(.WIDTH(`ITAG_SIZE_ENC), .INIT(0), .NEEDS_SRESET(1)) ex1_i0_itag_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex1_i0_itag_offset:ex1_i0_itag_offset + `ITAG_SIZE_ENC - 1]),
      .scout(sov[ex1_i0_itag_offset:ex1_i0_itag_offset + `ITAG_SIZE_ENC - 1]),
      .din(ex1_i0_itag_d),
      .dout(ex1_i0_itag_q)
      );


   tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0), .NEEDS_SRESET(1)) ex0_i1_vld_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex0_i1_vld_offset:ex0_i1_vld_offset + `THREADS - 1]),
      .scout(sov[ex0_i1_vld_offset:ex0_i1_vld_offset + `THREADS - 1]),
      .din(rv_lq_rv1_i1_vld),
      .dout(ex0_i1_vld_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex0_i1_rte_lq_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex0_i1_rte_lq_offset]),
      .scout(sov[ex0_i1_rte_lq_offset]),
      .din(rv_lq_rv1_i1_rte_lq),
      .dout(ex0_i1_rte_lq_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex0_i1_rte_sq_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex0_i1_rte_sq_offset]),
      .scout(sov[ex0_i1_rte_sq_offset]),
      .din(rv_lq_rv1_i1_rte_sq),
      .dout(ex0_i1_rte_sq_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex0_i1_isLoad_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex0_i1_isLoad_offset]),
      .scout(sov[ex0_i1_isLoad_offset]),
      .din(rv_lq_rv1_i1_isLoad),
      .dout(ex0_i1_isLoad_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex0_i1_ucode_preissue_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex0_i1_ucode_preissue_offset]),
      .scout(sov[ex0_i1_ucode_preissue_offset]),
      .din(rv_lq_rv1_i1_ucode_preissue),
      .dout(ex0_i1_ucode_preissue_q)
      );


   tri_rlmreg_p #(.WIDTH(3), .INIT(0), .NEEDS_SRESET(1)) ex0_i1_s3_t_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex0_i1_s3_t_offset:ex0_i1_s3_t_offset + 3 - 1]),
      .scout(sov[ex0_i1_s3_t_offset:ex0_i1_s3_t_offset + 3 - 1]),
      .din(rv_lq_rv1_i1_s3_t),
      .dout(ex0_i1_s3_t_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex0_i1_isStore_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex0_i1_isStore_offset]),
      .scout(sov[ex0_i1_isStore_offset]),
      .din(rv_lq_rv1_i1_isStore),
      .dout(ex0_i1_isStore_q)
      );


   tri_rlmreg_p #(.WIDTH(`ITAG_SIZE_ENC), .INIT(0), .NEEDS_SRESET(1)) ex0_i1_itag_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex0_i1_itag_offset:ex0_i1_itag_offset + `ITAG_SIZE_ENC - 1]),
      .scout(sov[ex0_i1_itag_offset:ex0_i1_itag_offset + `ITAG_SIZE_ENC - 1]),
      .din(rv_lq_rv1_i1_itag),
      .dout(ex0_i1_itag_q)
      );


   tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0), .NEEDS_SRESET(1)) ex1_i1_vld_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex1_i1_vld_offset:ex1_i1_vld_offset + `THREADS - 1]),
      .scout(sov[ex1_i1_vld_offset:ex1_i1_vld_offset + `THREADS - 1]),
      .din(ex1_i1_vld_d),
      .dout(ex1_i1_vld_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex1_i1_isLoad_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex1_i1_isLoad_offset]),
      .scout(sov[ex1_i1_isLoad_offset]),
      .din(ex1_i1_isLoad_d),
      .dout(ex1_i1_isLoad_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex1_i1_pre_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex1_i1_pre_offset]),
      .scout(sov[ex1_i1_pre_offset]),
      .din(ex1_i1_pre_d),
      .dout(ex1_i1_pre_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex1_i1_instq_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex1_i1_instq_offset]),
      .scout(sov[ex1_i1_instq_offset]),
      .din(ex1_i1_instq_d),
      .dout(ex1_i1_instq_q)
      );

      tri_rlmreg_p #(.WIDTH(`ITAG_SIZE_ENC), .INIT(0), .NEEDS_SRESET(1)) ex1_i1_itag_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex1_i1_itag_offset:ex1_i1_itag_offset + `ITAG_SIZE_ENC - 1]),
      .scout(sov[ex1_i1_itag_offset:ex1_i1_itag_offset + `ITAG_SIZE_ENC - 1]),
      .din(ex1_i1_itag_d),
      .dout(ex1_i1_itag_q)
      );

   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ldq_odq_vld_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ldq_odq_vld_offset]),
      .scout(sov[ldq_odq_vld_offset]),
      .din(ldq_odq_vld),
      .dout(ldq_odq_vld_q)
      );


   tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0), .NEEDS_SRESET(1)) ldq_odq_tid_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ldq_odq_tid_offset:ldq_odq_tid_offset + `THREADS - 1]),
      .scout(sov[ldq_odq_tid_offset:ldq_odq_tid_offset + `THREADS - 1]),
      .din(ldq_odq_tid),
      .dout(ldq_odq_tid_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ldq_odq_inv_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ldq_odq_inv_offset]),
      .scout(sov[ldq_odq_inv_offset]),
      .din(ldq_odq_inv),
      .dout(ldq_odq_inv_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ldq_odq_wimge_i_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ldq_odq_wimge_i_offset]),
      .scout(sov[ldq_odq_wimge_i_offset]),
      .din(ldq_odq_wimge_i),
      .dout(ldq_odq_wimge_i_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ldq_odq_hit_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ldq_odq_hit_offset]),
      .scout(sov[ldq_odq_hit_offset]),
      .din(ldq_odq_hit),
      .dout(ldq_odq_hit_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ldq_odq_fwd_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ldq_odq_fwd_offset]),
      .scout(sov[ldq_odq_fwd_offset]),
      .din(ldq_odq_fwd),
      .dout(ldq_odq_fwd_q)
      );


   tri_rlmreg_p #(.WIDTH(`ITAG_SIZE_ENC), .INIT(0), .NEEDS_SRESET(1)) ldq_odq_itag_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ldq_odq_itag_offset:ldq_odq_itag_offset + `ITAG_SIZE_ENC - 1]),
      .scout(sov[ldq_odq_itag_offset:ldq_odq_itag_offset + `ITAG_SIZE_ENC - 1]),
      .din(ldq_odq_itag),
      .dout(ldq_odq_itag_q)
      );

   generate
      /*begin : gen_rega*/
      genvar  tid;
      for (tid = 0; tid <= `THREADS - 1; tid = tid + 1)
        begin : iu_lq_cp_next_itag_tid

           tri_rlmreg_p #(.WIDTH(`ITAG_SIZE_ENC), .INIT(0), .NEEDS_SRESET(1)) iu_lq_cp_next_itag_reg
		 (
		  .vd(vdd),
		  .gd(gnd),
		  .clk(clk),
	.rst(rst),
		  .act(tiup),
		  .force_t(func_sl_force),
		  .d_mode(d_mode_dc),
		  .delay_lclkr(delay_lclkr_dc),
		  .mpw1_b(mpw1_dc_b),
		  .mpw2_b(mpw2_dc_b),
		  .thold_b(func_sl_thold_0_b),
		  .sg(sg_0),
		  .scin(siv[iu_lq_cp_next_itag_offset + (`ITAG_SIZE_ENC * tid):iu_lq_cp_next_itag_offset + (`ITAG_SIZE_ENC * (tid + 1)) - 1]),
		  .scout(sov[iu_lq_cp_next_itag_offset + (`ITAG_SIZE_ENC * tid):iu_lq_cp_next_itag_offset + (`ITAG_SIZE_ENC * (tid + 1)) - 1]),
		  .din(iu_lq_cp_next_itag_int[tid]),
		  .dout(iu_lq_cp_next_itag_q[tid])
		  );

        end

      for (tid = 0; tid <= `THREADS-1; tid = tid + 1)
        begin : cp_i0_completed_itag_latch_gen

           tri_rlmreg_p #(.WIDTH(`ITAG_SIZE_ENC), .INIT(0), .NEEDS_SRESET(1)) cp_i0_completed_itag_latch
		 (
                  .clk(clk),
	.rst(rst),
                  .vd(vdd),
                  .gd(gnd),
                  .act(iu_lq_i0_completed[tid]),
                  .force_t(func_sl_force),
                  .d_mode(d_mode_dc),
                  .delay_lclkr(delay_lclkr_dc),
                  .mpw1_b(mpw1_dc_b),
                  .mpw2_b(mpw2_dc_b),
                  .thold_b(func_sl_thold_0_b),
                  .sg(sg_0),
                  .scin(siv[cp_i0_completed_itag_offset + (`ITAG_SIZE_ENC * tid):cp_i0_completed_itag_offset + (`ITAG_SIZE_ENC * (tid + 1)) - 1]),
                  .scout(sov[cp_i0_completed_itag_offset + (`ITAG_SIZE_ENC * tid):cp_i0_completed_itag_offset + (`ITAG_SIZE_ENC * (tid + 1)) - 1]),
                  .din(iu_lq_i0_completed_itag_int[tid]),
                  .dout(cp_i0_completed_itag_q[tid])
                  );
        end

      for (tid = 0; tid <= `THREADS-1; tid = tid + 1)
        begin : cp_i1_completed_itag_latch_gen

           tri_rlmreg_p #(.WIDTH(`ITAG_SIZE_ENC), .INIT(0), .NEEDS_SRESET(1)) cp_i1_completed_itag_latch
		 (
                  .clk(clk),
	.rst(rst),
                  .vd(vdd),
                  .gd(gnd),
                  .act(iu_lq_i1_completed[tid]),
                  .force_t(func_sl_force),
                  .d_mode(d_mode_dc),
                  .delay_lclkr(delay_lclkr_dc),
                  .mpw1_b(mpw1_dc_b),
                  .mpw2_b(mpw2_dc_b),
                  .thold_b(func_sl_thold_0_b),
                  .sg(sg_0),
                  .scin(siv[cp_i1_completed_itag_offset + (`ITAG_SIZE_ENC * tid):cp_i1_completed_itag_offset + (`ITAG_SIZE_ENC * (tid + 1)) - 1]),
                  .scout(sov[cp_i1_completed_itag_offset + (`ITAG_SIZE_ENC * tid):cp_i1_completed_itag_offset + (`ITAG_SIZE_ENC * (tid + 1)) - 1]),
                  .din(iu_lq_i1_completed_itag_int[tid]),
                  .dout(cp_i1_completed_itag_q[tid])
                  );
        end

      for (tid = 0; tid <= `THREADS - 1; tid = tid + 1)
        begin : flushed_credit_count

           tri_rlmreg_p #(.WIDTH(`LDSTQ_ENTRIES_ENC), .INIT(0), .NEEDS_SRESET(1)) flushed_credit_count_reg
		 (
                  .vd(vdd),
                  .gd(gnd),
                  .clk(clk),
	.rst(rst),
                  .act(tiup),
                  .force_t(func_sl_force),
                  .d_mode(d_mode_dc),
                  .delay_lclkr(delay_lclkr_dc),
                  .mpw1_b(mpw1_dc_b),
                  .mpw2_b(mpw2_dc_b),
                  .thold_b(func_sl_thold_0_b),
                  .sg(sg_0),
                  .scin(siv[flushed_credit_count_offset + (`LDSTQ_ENTRIES_ENC * tid):flushed_credit_count_offset + (`LDSTQ_ENTRIES_ENC * (tid + 1)) - 1]),
                  .scout(sov[flushed_credit_count_offset + (`LDSTQ_ENTRIES_ENC * tid):flushed_credit_count_offset + (`LDSTQ_ENTRIES_ENC * (tid + 1)) - 1]),
                  .din(flushed_credit_count_d[tid]),
                  .dout(flushed_credit_count_q[tid])
                  );


        end
      /*end */
   endgenerate


   tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0), .NEEDS_SRESET(1)) cp_i0_completed_latch
     (
      .clk(clk),
	.rst(rst),
      .vd(vdd),
      .gd(gnd),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[cp_i0_completed_offset:cp_i0_completed_offset + `THREADS - 1]),
      .scout(sov[cp_i0_completed_offset:cp_i0_completed_offset + `THREADS - 1]),
      .din(iu_lq_i0_completed),
      .dout(cp_i0_completed_q)
      );

   tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0), .NEEDS_SRESET(1)) cp_i1_completed_latch
     (
      .clk(clk),
	.rst(rst),
      .vd(vdd),
      .gd(gnd),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[cp_i1_completed_offset:cp_i1_completed_offset + `THREADS - 1]),
      .scout(sov[cp_i1_completed_offset:cp_i1_completed_offset + `THREADS - 1]),
      .din(iu_lq_i1_completed),
      .dout(cp_i1_completed_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ldq_odq_cline_chk_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ldq_odq_cline_chk_offset]),
      .scout(sov[ldq_odq_cline_chk_offset]),
      .din(ldq_odq_cline_chk),
      .dout(ldq_odq_cline_chk_q)
      );


   tri_rlmreg_p #(.WIDTH(`LDSTQ_ENTRIES + 1), .INIT((2 ** `LDSTQ_ENTRIES)), .NEEDS_SRESET(1)) next_fill_ptr_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[next_fill_ptr_offset:next_fill_ptr_offset + (`LDSTQ_ENTRIES+1) - 1]),
      .scout(sov[next_fill_ptr_offset:next_fill_ptr_offset + (`LDSTQ_ENTRIES+1) - 1]),
      .din(next_fill_ptr_d),
      .dout(next_fill_ptr_q)
      );


   tri_rlmreg_p #(.WIDTH(`LDSTQ_ENTRIES), .INIT(0), .NEEDS_SRESET(1)) collision_vector_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[collision_vector_offset:collision_vector_offset + `LDSTQ_ENTRIES - 1]),
      .scout(sov[collision_vector_offset:collision_vector_offset + `LDSTQ_ENTRIES - 1]),
      .din(collision_vector_d),
      .dout(collision_vector_q)
      );


   tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0), .NEEDS_SRESET(1)) cp_flush_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[cp_flush_offset:cp_flush_offset + `THREADS - 1]),
      .scout(sov[cp_flush_offset:cp_flush_offset + `THREADS - 1]),
      .din(cp_flush_d),
      .dout(cp_flush_q)
      );


   tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0), .NEEDS_SRESET(1)) cp_flush2_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[cp_flush2_offset:cp_flush2_offset + `THREADS - 1]),
      .scout(sov[cp_flush2_offset:cp_flush2_offset + `THREADS - 1]),
      .din(cp_flush2_d),
      .dout(cp_flush2_q)
      );


   tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0), .NEEDS_SRESET(1)) cp_flush3_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[cp_flush3_offset:cp_flush3_offset + `THREADS - 1]),
      .scout(sov[cp_flush3_offset:cp_flush3_offset + `THREADS - 1]),
      .din(cp_flush3_d),
      .dout(cp_flush3_q)
      );


   tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0), .NEEDS_SRESET(1)) cp_flush4_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[cp_flush4_offset:cp_flush4_offset + `THREADS - 1]),
      .scout(sov[cp_flush4_offset:cp_flush4_offset + `THREADS - 1]),
      .din(cp_flush4_d),
      .dout(cp_flush4_q)
      );


   tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0), .NEEDS_SRESET(1)) cp_flush5_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[cp_flush5_offset:cp_flush5_offset + `THREADS - 1]),
      .scout(sov[cp_flush5_offset:cp_flush5_offset + `THREADS - 1]),
      .din(cp_flush5_d),
      .dout(cp_flush5_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) xu_lq_spr_xucr0_cls_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[xu_lq_spr_xucr0_cls_offset]),
      .scout(sov[xu_lq_spr_xucr0_cls_offset]),
      .din(xu_lq_spr_xucr0_cls),
      .dout(xu_lq_spr_xucr0_cls_q)
      );


   tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0), .NEEDS_SRESET(1)) lq_iu_credit_free_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[lq_iu_credit_free_offset:lq_iu_credit_free_offset + `THREADS - 1]),
      .scout(sov[lq_iu_credit_free_offset:lq_iu_credit_free_offset + `THREADS - 1]),
      .din(lq_iu_credit_free_d),
      .dout(lq_iu_credit_free_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) compress_val_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[compress_val_offset]),
      .scout(sov[compress_val_offset]),
      .din(compress_val_d),
      .dout(compress_val_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) rv1_binv_val_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[rv1_binv_val_offset]),
      .scout(sov[rv1_binv_val_offset]),
      .din(rv1_binv_val_d),
      .dout(rv1_binv_val_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex0_binv_val_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex0_binv_val_offset]),
      .scout(sov[ex0_binv_val_offset]),
      .din(ex0_binv_val_d),
      .dout(ex0_binv_val_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex1_binv_val_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex1_binv_val_offset]),
      .scout(sov[ex1_binv_val_offset]),
      .din(ex1_binv_val_d),
      .dout(ex1_binv_val_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex2_binv_val_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex2_binv_val_offset]),
      .scout(sov[ex2_binv_val_offset]),
      .din(ex2_binv_val_d),
      .dout(ex2_binv_val_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex3_binv_val_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex3_binv_val_offset]),
      .scout(sov[ex3_binv_val_offset]),
      .din(ex3_binv_val_d),
      .dout(ex3_binv_val_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex4_binv_val_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex4_binv_val_offset]),
      .scout(sov[ex4_binv_val_offset]),
      .din(ex4_binv_val_d),
      .dout(ex4_binv_val_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex5_binv_val_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex5_binv_val_offset]),
      .scout(sov[ex5_binv_val_offset]),
      .din(ex5_binv_val_d),
      .dout(ex5_binv_val_q)
      );


   tri_rlmreg_p #(.WIDTH((`DC_SIZE-`CL_SIZE-3)), .INIT(0), .NEEDS_SRESET(1)) rv1_binv_addr_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[rv1_binv_addr_offset:rv1_binv_addr_offset + (`DC_SIZE-`CL_SIZE-3) - 1]),
      .scout(sov[rv1_binv_addr_offset:rv1_binv_addr_offset + (`DC_SIZE-`CL_SIZE-3) - 1]),
      .din(rv1_binv_addr_d),
      .dout(rv1_binv_addr_q)
      );


   tri_rlmreg_p #(.WIDTH((`DC_SIZE-`CL_SIZE-3)), .INIT(0), .NEEDS_SRESET(1)) ex0_binv_addr_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex0_binv_addr_offset:ex0_binv_addr_offset + (`DC_SIZE-`CL_SIZE-3) - 1]),
      .scout(sov[ex0_binv_addr_offset:ex0_binv_addr_offset + (`DC_SIZE-`CL_SIZE-3) - 1]),
      .din(ex0_binv_addr_d),
      .dout(ex0_binv_addr_q)
      );


   tri_rlmreg_p #(.WIDTH((`DC_SIZE-`CL_SIZE-3)), .INIT(0), .NEEDS_SRESET(1)) ex1_binv_addr_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex1_binv_addr_offset:ex1_binv_addr_offset + (`DC_SIZE-`CL_SIZE-3) - 1]),
      .scout(sov[ex1_binv_addr_offset:ex1_binv_addr_offset + (`DC_SIZE-`CL_SIZE-3) - 1]),
      .din(ex1_binv_addr_d),
      .dout(ex1_binv_addr_q)
      );


   tri_rlmreg_p #(.WIDTH((`DC_SIZE-`CL_SIZE-3)), .INIT(0), .NEEDS_SRESET(1)) ex2_binv_addr_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex2_binv_addr_offset:ex2_binv_addr_offset + (`DC_SIZE-`CL_SIZE-3) - 1]),
      .scout(sov[ex2_binv_addr_offset:ex2_binv_addr_offset + (`DC_SIZE-`CL_SIZE-3) - 1]),
      .din(ex2_binv_addr_d),
      .dout(ex2_binv_addr_q)
      );


   tri_rlmreg_p #(.WIDTH((`DC_SIZE-`CL_SIZE-3)), .INIT(0), .NEEDS_SRESET(1)) ex3_binv_addr_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex3_binv_addr_offset:ex3_binv_addr_offset + (`DC_SIZE-`CL_SIZE-3) - 1]),
      .scout(sov[ex3_binv_addr_offset:ex3_binv_addr_offset + (`DC_SIZE-`CL_SIZE-3) - 1]),
      .din(ex3_binv_addr_d),
      .dout(ex3_binv_addr_q)
      );


   tri_rlmreg_p #(.WIDTH((`DC_SIZE-`CL_SIZE-3)), .INIT(0), .NEEDS_SRESET(1)) ex4_binv_addr_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex4_binv_addr_offset:ex4_binv_addr_offset + (`DC_SIZE-`CL_SIZE-3) - 1]),
      .scout(sov[ex4_binv_addr_offset:ex4_binv_addr_offset + (`DC_SIZE-`CL_SIZE-3) - 1]),
      .din(ex4_binv_addr_d),
      .dout(ex4_binv_addr_q)
      );


   tri_rlmreg_p #(.WIDTH((`DC_SIZE-`CL_SIZE-3)), .INIT(0), .NEEDS_SRESET(1)) ex5_binv_addr_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ex5_binv_addr_offset:ex5_binv_addr_offset + (`DC_SIZE-`CL_SIZE-3) - 1]),
      .scout(sov[ex5_binv_addr_offset:ex5_binv_addr_offset + (`DC_SIZE-`CL_SIZE-3) - 1]),
      .din(ex5_binv_addr_d),
      .dout(ex5_binv_addr_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) entry_rv1_blk_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[entry_rv1_blk_offset]),
      .scout(sov[entry_rv1_blk_offset]),
      .din(entry_rv1_blk_d),
      .dout(entry_rv1_blk_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) entry_ex0_blk_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[entry_ex0_blk_offset]),
      .scout(sov[entry_ex0_blk_offset]),
      .din(entry_ex0_blk_d),
      .dout(entry_ex0_blk_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) entry_ex1_blk_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[entry_ex1_blk_offset]),
      .scout(sov[entry_ex1_blk_offset]),
      .din(entry_ex1_blk_d),
      .dout(entry_ex1_blk_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) entry_ex2_blk_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[entry_ex2_blk_offset]),
      .scout(sov[entry_ex2_blk_offset]),
      .din(entry_ex2_blk_d),
      .dout(entry_ex2_blk_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) entry_ex3_blk_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[entry_ex3_blk_offset]),
      .scout(sov[entry_ex3_blk_offset]),
      .din(entry_ex3_blk_d),
      .dout(entry_ex3_blk_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) entry_ex4_blk_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[entry_ex4_blk_offset]),
      .scout(sov[entry_ex4_blk_offset]),
      .din(entry_ex4_blk_d),
      .dout(entry_ex4_blk_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) entry_ex5_blk_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[entry_ex5_blk_offset]),
      .scout(sov[entry_ex5_blk_offset]),
      .din(entry_ex5_blk_d),
      .dout(entry_ex5_blk_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) entry_ex6_blk_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[entry_ex6_blk_offset]),
      .scout(sov[entry_ex6_blk_offset]),
      .din(entry_ex6_blk_d),
      .dout(entry_ex6_blk_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ldq_odq_pfetch_vld_ex6_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[ldq_odq_pfetch_vld_ex6_offset]),
      .scout(sov[ldq_odq_pfetch_vld_ex6_offset]),
      .din(ldq_odq_pfetch_vld_ex6_d),
      .dout(ldq_odq_pfetch_vld_ex6_q)
      );


   tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) odq_ldq_ex7_pfetch_blk_reg
     (
      .vd(vdd),
      .gd(gnd),
      .clk(clk),
	.rst(rst),
      .act(tiup),
      .force_t(func_sl_force),
      .d_mode(d_mode_dc),
      .delay_lclkr(delay_lclkr_dc),
      .mpw1_b(mpw1_dc_b),
      .mpw2_b(mpw2_dc_b),
      .thold_b(func_sl_thold_0_b),
      .sg(sg_0),
      .scin(siv[odq_ldq_ex7_pfetch_blk_offset]),
      .scout(sov[odq_ldq_ex7_pfetch_blk_offset]),
      .din(odq_ldq_ex7_pfetch_blk_d),
      .dout(odq_ldq_ex7_pfetch_blk_q)
      );


   assign siv[0:scan_right] = {sov[1:scan_right], scan_in};
   assign scan_out = sov[0];

endmodule