You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2059 lines
88 KiB
Verilog

2 years ago
// © 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 Flush Generation
//
//*****************************************************************************
// ##########################################################################################
// VHDL Contents
// 1) Reload Flush generation
// 2) Back-Invalidate Flush generation
// 4) Instruction Flush Handling
// ##########################################################################################
`include "tri_a2o.vh"
module lq_fgen(
ex0_i0_vld,
ex0_i0_ucode_preissue,
ex0_i0_2ucode,
ex0_i0_ucode_cnt,
ex0_i1_vld,
ex0_i1_ucode_preissue,
ex0_i1_2ucode,
ex0_i1_ucode_cnt,
dec_dcc_ex1_expt_det,
dec_dcc_ex1_priv_prog,
dec_dcc_ex1_hypv_prog,
dec_dcc_ex1_illeg_prog,
dec_dcc_ex1_dlock_excp,
dec_dcc_ex1_ilock_excp,
dec_dcc_ex1_ehpriv_excp,
byp_dcc_ex2_req_aborted,
ex3_stg_act,
ex4_stg_act,
ex1_thrd_id,
ex2_thrd_id,
ex3_thrd_id,
ex4_thrd_id,
ex5_thrd_id,
ex3_cache_acc,
ex3_ucode_val,
ex3_ucode_cnt,
ex4_ucode_op,
ex4_mem_attr,
ex4_blkable_touch,
ex3_ldst_fexcpt,
ex3_axu_op_val,
ex3_axu_instr_type,
ex3_optype16,
ex3_optype8,
ex3_optype4,
ex3_optype2,
ex3_eff_addr,
ex3_icswx_type,
ex3_dcbz_instr,
ex3_resv_instr,
ex3_mword_instr,
ex3_ldawx_instr,
ex3_illeg_lswx,
ex4_icswx_dsi,
ex4_wclr_all_val,
ex4_wNComp_rcvd,
ex4_dac_int_det,
ex4_strg_gate,
ex4_restart_val,
ex5_restart_val,
spr_ccr2_ucode_dis,
spr_ccr2_notlb,
spr_xucr0_mddp,
spr_xucr0_mdcp,
spr_xucr4_mmu_mchk,
spr_xucr4_mddmh,
derat_dcc_ex4_restart,
derat_dcc_ex4_wimge_w,
derat_dcc_ex4_wimge_i,
derat_dcc_ex4_miss,
derat_dcc_ex4_tlb_err,
derat_dcc_ex4_dsi,
derat_dcc_ex4_vf,
derat_dcc_ex4_multihit_err_det,
derat_dcc_ex4_multihit_err_flush,
derat_dcc_ex4_tlb_inelig,
derat_dcc_ex4_pt_fault,
derat_dcc_ex4_lrat_miss,
derat_dcc_ex4_tlb_multihit,
derat_dcc_ex4_tlb_par_err,
derat_dcc_ex4_lru_par_err,
derat_dcc_ex4_par_err_det,
derat_dcc_ex4_par_err_flush,
derat_fir_par_err,
derat_fir_multihit,
dir_dcc_ex5_dir_perr_det,
dir_dcc_ex5_dc_perr_det,
dir_dcc_ex5_dir_perr_flush,
dir_dcc_ex5_dc_perr_flush,
dir_dcc_ex5_multihit_det,
dir_dcc_ex5_multihit_flush,
dir_dcc_stq4_dir_perr_det,
dir_dcc_stq4_multihit_det,
dir_dcc_ex5_stp_flush,
spr_xucr0_aflsta,
spr_xucr0_flsta,
spr_ccr2_ap,
spr_msr_fp,
spr_msr_spv,
iu_lq_cp_flush,
ex4_ucode_restart,
ex4_sfx_excpt_det,
ex4_excp_det,
ex4_wNComp_excp,
ex4_wNComp_excp_restart,
ex5_flush_req,
ex5_blk_tlb_req,
ex5_flush_pfetch,
fgen_ex4_cp_flush,
fgen_ex5_cp_flush,
fgen_ex1_stg_flush,
fgen_ex2_stg_flush,
fgen_ex3_stg_flush,
fgen_ex4_stg_flush,
fgen_ex5_stg_flush,
ex5_flush2ucode,
ex5_n_flush,
ex5_np1_flush,
ex5_exception_val,
ex5_exception,
ex5_dear_val,
ex5_misalign_flush,
lq_pc_err_derat_parity,
lq_pc_err_dir_ldp_parity,
lq_pc_err_dir_stp_parity,
lq_pc_err_dcache_parity,
lq_pc_err_derat_multihit,
lq_pc_err_dir_ldp_multihit,
lq_pc_err_dir_stp_multihit,
vdd,
gnd,
nclk,
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
);
//-------------------------------------------------------------------
// Generics
//-------------------------------------------------------------------
//parameter EXPAND_TYPE = 2;
//parameter THREADS = 2;
//parameter UCODE_ENTRIES_ENC = 3;
//parameter THREADS_POOL_ENC = 1;
//parameter ITAG_SIZE_ENC = 7;
// IU Dispatch to RV0
input [0:`THREADS-1] ex0_i0_vld;
input ex0_i0_ucode_preissue;
input ex0_i0_2ucode;
input [0:`UCODE_ENTRIES_ENC-1] ex0_i0_ucode_cnt;
input [0:`THREADS-1] ex0_i1_vld;
input ex0_i1_ucode_preissue;
input ex0_i1_2ucode;
input [0:`UCODE_ENTRIES_ENC-1] ex0_i1_ucode_cnt;
// Execution Pipe
input dec_dcc_ex1_expt_det;
input dec_dcc_ex1_priv_prog;
input dec_dcc_ex1_hypv_prog;
input dec_dcc_ex1_illeg_prog;
input dec_dcc_ex1_dlock_excp;
input dec_dcc_ex1_ilock_excp;
input dec_dcc_ex1_ehpriv_excp;
input byp_dcc_ex2_req_aborted;
// Control
input ex3_stg_act;
input ex4_stg_act;
input [0:`THREADS-1] ex1_thrd_id;
input [0:`THREADS-1] ex2_thrd_id;
input [0:`THREADS-1] ex3_thrd_id;
input [0:`THREADS-1] ex4_thrd_id;
input [0:`THREADS-1] ex5_thrd_id;
input ex3_cache_acc; // Cache Access is Valid in ex3
input ex3_ucode_val; // Ucode Preissue is Valid in ex3
input [0:`UCODE_ENTRIES_ENC-1] ex3_ucode_cnt; // Ucode Count in ex3
input ex4_ucode_op; // Op is from Ucode in ex4
input [0:8] ex4_mem_attr;
input ex4_blkable_touch;
input ex3_ldst_fexcpt; // Force Exception on misaligned AXU access
input ex3_axu_op_val; // ex3 AXU operation is valid
input [0:2] ex3_axu_instr_type;
input ex3_optype16; // Operation is 16 Byte Access
input ex3_optype8; // Operation is 8 Byte Access
input ex3_optype4; // Operation is 4 Byte Access
input ex3_optype2; // Operation is 2 Byte Access
input [57:63] ex3_eff_addr;
input ex3_icswx_type;
input ex3_dcbz_instr; // DCBZ instruction is valid in ex3
input ex3_resv_instr; // lwarx, ldarx, stwcx, and stdcx operations
input ex3_mword_instr; // Load/Store Multiple Word preissue
input ex3_ldawx_instr; // ldawx operation
input ex3_illeg_lswx; // STQ detected illegal form of LSWX
input ex4_icswx_dsi; // Unavailable Coprocessor DSI Interrupt
input ex4_wclr_all_val; // wclr All instruction is valid
input ex4_wNComp_rcvd; // Request is CP_NEXT with recirc valid
input ex4_dac_int_det; // Debug Address Compare Interrupt Detected
input ex4_strg_gate; // LSWX/STSWX NOOP indicator, gate mem attribute update
input ex4_restart_val; // Instruction is getting restarted in EX4
input ex5_restart_val; // Instruction is getting restarted in EX5
// SPR Bits
input spr_ccr2_ucode_dis; // CCR2[UCODE_DIS]
input spr_ccr2_notlb; // CCR2[NOTLB]
input spr_xucr0_mddp; // XUCR0[MDDP]
input spr_xucr0_mdcp; // XUCR0[MDCP]
input spr_xucr4_mmu_mchk; // XUCR4[MMU_MCHK]
input spr_xucr4_mddmh; // XUCR4[MDDMH]
// ERAT Interface
input derat_dcc_ex4_restart;
input derat_dcc_ex4_wimge_w;
input derat_dcc_ex4_wimge_i;
input derat_dcc_ex4_miss;
input derat_dcc_ex4_tlb_err;
input derat_dcc_ex4_dsi;
input derat_dcc_ex4_vf;
input derat_dcc_ex4_multihit_err_det;
input derat_dcc_ex4_multihit_err_flush;
input derat_dcc_ex4_tlb_inelig;
input derat_dcc_ex4_pt_fault;
input derat_dcc_ex4_lrat_miss;
input derat_dcc_ex4_tlb_multihit;
input derat_dcc_ex4_tlb_par_err;
input derat_dcc_ex4_lru_par_err;
input derat_dcc_ex4_par_err_det;
input derat_dcc_ex4_par_err_flush;
input derat_fir_par_err;
input derat_fir_multihit;
// D$ Parity Error Detected
input dir_dcc_ex5_dir_perr_det; // Data Directory Parity Error Detected
input dir_dcc_ex5_dc_perr_det; // Data Cache Parity Error Detected
input dir_dcc_ex5_dir_perr_flush; // Data Directory Parity Error Flush
input dir_dcc_ex5_dc_perr_flush; // Data Cache Parity Error Flush
input dir_dcc_ex5_multihit_det; // Directory Multihit Detected
input dir_dcc_ex5_multihit_flush; // Directory Multihit Flush
input dir_dcc_stq4_dir_perr_det; // Data Cache Parity Error Detected on the STQ Commit Pipeline
input dir_dcc_stq4_multihit_det; // Directory Multihit Detected on the STQ Commit Pipeline
input dir_dcc_ex5_stp_flush; // Directory Error detected on the STQ Commit Pipeline with EX5 LDP valid
// SPR's
input spr_xucr0_aflsta;
input spr_xucr0_flsta;
input spr_ccr2_ap;
input spr_msr_fp;
input spr_msr_spv;
// Instruction Flush
input [0:`THREADS-1] iu_lq_cp_flush;
// Flush Pipe Outputs
output ex4_ucode_restart; // Memory Attributes are not known, need to restart
output ex4_sfx_excpt_det; // Priveleged and illegal instructions
output ex4_excp_det; // Any Exception was detected
output ex4_wNComp_excp; // Exception with RECIRC_VAL detected
output ex4_wNComp_excp_restart; // CP_NEXT instruction got an exception, restart the 2 younger instructions
output ex5_flush_req; // Non-CP_NEXT Flush Request Detected
output ex5_blk_tlb_req; // Block ERAT Miss from going to the MMU
output ex5_flush_pfetch; // Flush Prefetch in ex5
output fgen_ex4_cp_flush; // Completion Flush Request in ex4
output fgen_ex5_cp_flush; // Completion Flush Request in ex5
output fgen_ex1_stg_flush; // Flush Instructions in ex1
output fgen_ex2_stg_flush; // Flush Instructions in ex2
output fgen_ex3_stg_flush; // Flush Instructions in ex3
output fgen_ex4_stg_flush; // Flush Instructions in ex4
output fgen_ex5_stg_flush; // Flush Instructions in ex5
// Completion Indicators
output ex5_flush2ucode; // EX5 Flush to Ucode indicator
output ex5_n_flush; // EX5 N Flush Indicator
output ex5_np1_flush; // EX5 NP1 Flush Indicator
output ex5_exception_val; // EX5 Exception Valid Indicator
output [0:5] ex5_exception; // EX5 Exception Encode
output [0:`THREADS-1] ex5_dear_val; // EX5 Dear Valid Indicator
// Performance Events
output ex5_misalign_flush;
// Error Reporting
output lq_pc_err_derat_parity;
output lq_pc_err_dir_ldp_parity;
output lq_pc_err_dir_stp_parity;
output lq_pc_err_dcache_parity;
output lq_pc_err_derat_multihit;
output lq_pc_err_dir_ldp_multihit;
output lq_pc_err_dir_stp_multihit;
//pervasive
inout vdd;
inout gnd;
(* pin_data="PIN_FUNCTION=/G_CLK/CAP_LIMIT=/99999/" *)
input [0:`NCLK_WIDTH-1] nclk;
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;
//--------------------------
// components
//--------------------------
//--------------------------
// constants
//--------------------------
parameter UCODEDEPTH = (2**`UCODE_ENTRIES_ENC)*`THREADS;
//--------------------------
// signals
//--------------------------
wire ex3_16Bop16_unal;
wire ex3_16Bop8_unal;
wire ex3_16Bop4_unal;
wire ex3_16Bop2_unal;
wire ex3_16Bunal_op;
wire ex4_wt_ci_trans;
wire ex3_valid_resv;
wire ex1_cp_flush_val;
wire ex2_cp_flush_val;
wire ex3_cp_flush_val;
wire ex4_cp_flush_val;
wire ex5_cp_flush_val;
wire ex4_local_flush;
wire ex4_valid_resv_d;
wire ex4_valid_resv_q;
wire ex4_prealign_int_d;
wire ex4_prealign_int_q;
wire force_align_int_a;
wire force_align_int_x;
wire force_align_int;
wire ex3_flush_2ucode_chk;
wire ex3_flush_2ucode;
wire ex4_flush_2ucode_d;
wire ex4_flush_2ucode_q;
wire ex5_flush_2ucode_d;
wire ex5_flush_2ucode_q;
wire ex4_ucode_dis_prog_d;
wire ex4_ucode_dis_prog_q;
wire ex3_op16_unal;
wire ex3_op8_unal;
wire ex3_op4_unal;
wire ex3_op2_unal;
wire ex3_unal_op;
wire ex5_misalign_flush_d;
wire ex5_misalign_flush_q;
wire ex4_n_flush_req;
wire ex4_tlb_flush_req;
wire ex5_tlb_flush_req_d;
wire ex5_tlb_flush_req_q;
wire ex5_tlb_mchk_req_d;
wire ex5_tlb_mchk_req_q;
wire ex5_flush_req_mchk;
wire ex5_flush_req_int;
wire ex3_icswx_unal;
wire ex4_is_dcbz_d;
wire ex4_is_dcbz_q;
wire ex4_dsi_int;
wire ex4_align_int;
wire ex4_dcbz_err;
wire ex4_axu_ap_unavail_d;
wire ex4_axu_ap_unavail_q;
wire ex4_axu_fp_unavail_d;
wire ex4_axu_fp_unavail_q;
wire ex4_axu_spv_unavail_d;
wire ex4_axu_spv_unavail_q;
wire ex5_local_flush;
wire ex5_local_flush_d;
wire ex5_local_flush_q;
wire [0:25] ex4_excp_pri;
wire [7:11] ex5_excp_pri;
wire ex4_tlb_perr_mchk;
wire ex4_tlb_lru_perr_mchk;
wire ex4_tlb_multihit_mchk;
wire ex5_derat_perr_mchk;
wire ex5_dir_perr_mchk;
wire ex5_dc_perr_mchk;
wire ex5_derat_multihit_mchk;
wire ex5_dir_multihit_mchk;
wire ex4_tlb_perr_flush;
wire ex4_tlb_lru_perr_flush;
wire ex4_tlb_multihit_flush;
wire ex5_derat_perr_flush;
wire ex5_dir_perr_flush;
wire ex5_dc_perr_flush;
wire ex5_derat_multihit_flush;
wire ex5_dir_multihit_flush;
wire ex4_non_cp_next_excp;
wire ex5_high_pri_excp_d;
wire ex5_high_pri_excp_q;
wire ex4_cp_next_excp;
wire ex4_cp_next_excp_det;
wire ex4_cp_next_excp_rpt;
wire ex5_low_pri_excp_d;
wire ex5_low_pri_excp_q;
wire [0:5] ex4_exception;
wire ex5_sel_mid_pri_excp;
wire [0:5] ex5_mid_pri_excp;
wire [0:5] ex5_exception_d;
wire [0:5] ex5_exception_q;
wire [0:5] ex5_exception_int;
wire [0:`THREADS-1] ex5_dear_val_d;
wire [0:`THREADS-1] ex5_dear_val_q;
wire ex5_derat_multihit_flush_d;
wire ex5_derat_multihit_flush_q;
wire ex5_derat_multihit_det_d;
wire ex5_derat_multihit_det_q;
wire ex5_derat_perr_flush_d;
wire ex5_derat_perr_flush_q;
wire ex5_derat_perr_det_d;
wire ex5_derat_perr_det_q;
wire ex2_sfx_excpt_det_d;
wire ex2_sfx_excpt_det_q;
wire ex3_sfx_excpt_det_d;
wire ex3_sfx_excpt_det_q;
wire ex4_sfx_excpt_det_d;
wire ex4_sfx_excpt_det_q;
wire ex2_priv_prog_d;
wire ex2_priv_prog_q;
wire ex3_priv_prog_d;
wire ex3_priv_prog_q;
wire ex4_priv_prog_d;
wire ex4_priv_prog_q;
wire ex2_hypv_prog_d;
wire ex2_hypv_prog_q;
wire ex3_hypv_prog_d;
wire ex3_hypv_prog_q;
wire ex4_hypv_prog_d;
wire ex4_hypv_prog_q;
wire ex2_illeg_prog_d;
wire ex2_illeg_prog_q;
wire ex3_illeg_prog_d;
wire ex3_illeg_prog_q;
wire ex4_illeg_prog_d;
wire ex4_illeg_prog_q;
wire ex2_dlock_excp_d;
wire ex2_dlock_excp_q;
wire ex3_dlock_excp_d;
wire ex3_dlock_excp_q;
wire ex4_dlock_excp_d;
wire ex4_dlock_excp_q;
wire ex2_ilock_excp_d;
wire ex2_ilock_excp_q;
wire ex3_ilock_excp_d;
wire ex3_ilock_excp_q;
wire ex4_ilock_excp_d;
wire ex4_ilock_excp_q;
wire ex2_ehpriv_excp_d;
wire ex2_ehpriv_excp_q;
wire ex3_ehpriv_excp_d;
wire ex3_ehpriv_excp_q;
wire ex4_ucode_val_d;
wire ex4_ucode_val_q;
wire [0:`UCODE_ENTRIES_ENC-1] ex4_ucode_cnt_d;
wire [0:`UCODE_ENTRIES_ENC-1] ex4_ucode_cnt_q;
wire [0:`UCODE_ENTRIES_ENC+`THREADS_POOL_ENC-1] ex0_i0_tid_ucode_cnt;
wire [0:`UCODE_ENTRIES_ENC+`THREADS_POOL_ENC-1] ex0_i1_tid_ucode_cnt;
wire [0:`UCODE_ENTRIES_ENC+`THREADS_POOL_ENC-1] ex3_tid_ucode_cnt;
wire [0:`UCODE_ENTRIES_ENC+`THREADS_POOL_ENC-1] ex4_tid_ucode_cnt;
wire [0:UCODEDEPTH-1] ex0_i0_ucode_cnt_entry;
wire [0:UCODEDEPTH-1] ex0_i0_ucode_cnt_start;
wire [0:UCODEDEPTH-1] ex0_i1_ucode_cnt_entry;
wire [0:UCODEDEPTH-1] ex0_i1_ucode_cnt_start;
wire [0:UCODEDEPTH-1] ex0_ucode_cnt_rst;
wire [0:UCODEDEPTH-1] ex3_ucode_cnt_entry;
wire [0:UCODEDEPTH-1] ex4_ucode_cnt_entry;
wire [0:UCODEDEPTH-1] ex4_ucode_cnt_set;
wire [0:1] ucode_cnt_ctrl[0:UCODEDEPTH-1];
wire [0:1] ucode_cnt_2ucode_ctrl[0:UCODEDEPTH-1];
wire [0:UCODEDEPTH-1] ucode_cnt_val_d;
wire [0:UCODEDEPTH-1] ucode_cnt_val_q;
wire [0:UCODEDEPTH-1] ucode_cnt_2ucode_d;
wire [0:UCODEDEPTH-1] ucode_cnt_2ucode_q;
wire [0:8] ucode_cnt_memAttr_d[0:UCODEDEPTH-1];
wire [0:8] ucode_cnt_memAttr_q[0:UCODEDEPTH-1];
wire ex4_cache_acc_d;
wire ex4_cache_acc_q;
wire [0:UCODEDEPTH-1] ex3_2ucode_cnt_set;
wire ex3_2ucode_set;
wire [0:UCODEDEPTH-1] ex4_ucode_align_int;
wire ex4_ucode_align_val;
wire [0:UCODEDEPTH-1] ex4_ucode_cnt_restart;
wire ex4_derat_vf_int;
wire ex5_wNComp_rcvd_d;
wire ex5_wNComp_rcvd_q;
wire ex5_wNComp_excp;
wire ex6_wNComp_excp_d;
wire ex6_wNComp_excp_q;
wire ex5_dac_int_det_d;
wire ex5_dac_int_det_q;
wire [0:6] perv_fir_rpt;
wire [0:6] perv_fir_rpt_d;
wire [0:6] perv_fir_rpt_q;
parameter ex4_valid_resv_offset = 0;
parameter ex4_prealign_int_offset = ex4_valid_resv_offset + 1;
parameter ex4_flush_2ucode_offset = ex4_prealign_int_offset + 1;
parameter ex5_flush_2ucode_offset = ex4_flush_2ucode_offset + 1;
parameter ex4_ucode_dis_prog_offset = ex5_flush_2ucode_offset + 1;
parameter ex4_is_dcbz_offset = ex4_ucode_dis_prog_offset + 1;
parameter ex5_misalign_flush_offset = ex4_is_dcbz_offset + 1;
parameter ex4_axu_ap_unavail_offset = ex5_misalign_flush_offset + 1;
parameter ex4_axu_fp_unavail_offset = ex4_axu_ap_unavail_offset + 1;
parameter ex4_axu_spv_unavail_offset = ex4_axu_fp_unavail_offset + 1;
parameter ex5_local_flush_offset = ex4_axu_spv_unavail_offset + 1;
parameter ex5_tlb_flush_req_offset = ex5_local_flush_offset + 1;
parameter ex5_tlb_mchk_req_offset = ex5_tlb_flush_req_offset + 1;
parameter ex5_low_pri_excp_offset = ex5_tlb_mchk_req_offset + 1;
parameter ex5_high_pri_excp_offset = ex5_low_pri_excp_offset + 1;
parameter ex5_exception_offset = ex5_high_pri_excp_offset + 1;
parameter ex5_dear_val_offset = ex5_exception_offset + 6;
parameter ex5_derat_multihit_flush_offset = ex5_dear_val_offset + `THREADS;
parameter ex5_derat_multihit_det_offset = ex5_derat_multihit_flush_offset + 1;
parameter ex5_derat_perr_flush_offset = ex5_derat_multihit_det_offset + 1;
parameter ex5_derat_perr_det_offset = ex5_derat_perr_flush_offset + 1;
parameter ex2_sfx_excpt_det_offset = ex5_derat_perr_det_offset + 1;
parameter ex3_sfx_excpt_det_offset = ex2_sfx_excpt_det_offset + 1;
parameter ex4_sfx_excpt_det_offset = ex3_sfx_excpt_det_offset + 1;
parameter ex2_priv_prog_offset = ex4_sfx_excpt_det_offset + 1;
parameter ex3_priv_prog_offset = ex2_priv_prog_offset + 1;
parameter ex4_priv_prog_offset = ex3_priv_prog_offset + 1;
parameter ex2_hypv_prog_offset = ex4_priv_prog_offset + 1;
parameter ex3_hypv_prog_offset = ex2_hypv_prog_offset + 1;
parameter ex4_hypv_prog_offset = ex3_hypv_prog_offset + 1;
parameter ex2_illeg_prog_offset = ex4_hypv_prog_offset + 1;
parameter ex3_illeg_prog_offset = ex2_illeg_prog_offset + 1;
parameter ex4_illeg_prog_offset = ex3_illeg_prog_offset + 1;
parameter ex2_dlock_excp_offset = ex4_illeg_prog_offset + 1;
parameter ex3_dlock_excp_offset = ex2_dlock_excp_offset + 1;
parameter ex4_dlock_excp_offset = ex3_dlock_excp_offset + 1;
parameter ex2_ilock_excp_offset = ex4_dlock_excp_offset + 1;
parameter ex3_ilock_excp_offset = ex2_ilock_excp_offset + 1;
parameter ex4_ilock_excp_offset = ex3_ilock_excp_offset + 1;
parameter ex2_ehpriv_excp_offset = ex4_ilock_excp_offset + 1;
parameter ex3_ehpriv_excp_offset = ex2_ehpriv_excp_offset + 1;
parameter ex4_cache_acc_offset = ex3_ehpriv_excp_offset + 1;
parameter ex4_ucode_val_offset = ex4_cache_acc_offset + 1;
parameter ex4_ucode_cnt_offset = ex4_ucode_val_offset + 1;
parameter ex5_wNComp_rcvd_offset = ex4_ucode_cnt_offset + `UCODE_ENTRIES_ENC;
parameter ex6_wNComp_excp_offset = ex5_wNComp_rcvd_offset + 1;
parameter ex5_dac_int_det_offset = ex6_wNComp_excp_offset + 1;
parameter perv_fir_rpt_offset = ex5_dac_int_det_offset + 1;
parameter ucode_cnt_val_offset = perv_fir_rpt_offset + 7;
parameter ucode_cnt_2ucode_offset = ucode_cnt_val_offset + UCODEDEPTH;
parameter ucode_cnt_memAttr_offset = ucode_cnt_2ucode_offset + UCODEDEPTH;
parameter scan_right = ucode_cnt_memAttr_offset + 9*UCODEDEPTH - 1;
wire tiup;
wire tidn;
wire [0:scan_right] siv;
wire [0:scan_right] sov;
(* analysis_not_referenced="true" *)
wire unused;
//--!! Bugspray Include: lq_fgen
// #############################################
// Inputs
// #############################################
assign tiup = 1'b1;
assign tidn = 1'b0;
assign ex4_derat_vf_int = ((ex4_cache_acc_q | ex4_ucode_val_q) & derat_dcc_ex4_vf) & ~(ex4_blkable_touch | ex4_strg_gate | ex4_wclr_all_val);
assign ex5_derat_multihit_flush_d = derat_dcc_ex4_multihit_err_flush & ~ex4_cp_flush_val;
assign ex5_derat_multihit_det_d = derat_dcc_ex4_multihit_err_det;
assign ex5_derat_perr_flush_d = derat_dcc_ex4_par_err_flush & ~ex4_cp_flush_val;
assign ex5_derat_perr_det_d = derat_dcc_ex4_par_err_det;
assign ex2_sfx_excpt_det_d = dec_dcc_ex1_expt_det & ~ex1_cp_flush_val;
assign ex3_sfx_excpt_det_d = ex2_sfx_excpt_det_q & ~ex2_cp_flush_val;
assign ex4_sfx_excpt_det_d = ex3_sfx_excpt_det_q & ~ex3_cp_flush_val;
assign ex2_priv_prog_d = dec_dcc_ex1_priv_prog;
assign ex3_priv_prog_d = ex2_priv_prog_q;
assign ex4_priv_prog_d = ex3_priv_prog_q & ex3_sfx_excpt_det_q & ~ex3_cp_flush_val;
assign ex2_hypv_prog_d = dec_dcc_ex1_hypv_prog;
assign ex3_hypv_prog_d = ex2_hypv_prog_q;
assign ex4_hypv_prog_d = (ex3_hypv_prog_q | ex3_ehpriv_excp_q) & ex3_sfx_excpt_det_q & ~ex3_cp_flush_val;
assign ex2_illeg_prog_d = dec_dcc_ex1_illeg_prog;
assign ex3_illeg_prog_d = ex2_illeg_prog_q;
assign ex4_illeg_prog_d = ((ex3_illeg_prog_q & ex3_sfx_excpt_det_q) | ex3_illeg_lswx) & ~ex3_cp_flush_val;
assign ex2_dlock_excp_d = dec_dcc_ex1_dlock_excp;
assign ex3_dlock_excp_d = ex2_dlock_excp_q;
assign ex4_dlock_excp_d = ex3_dlock_excp_q & ex3_sfx_excpt_det_q & ~ex3_cp_flush_val;
assign ex2_ilock_excp_d = dec_dcc_ex1_ilock_excp;
assign ex3_ilock_excp_d = ex2_ilock_excp_q;
assign ex4_ilock_excp_d = ex3_ilock_excp_q & ex3_sfx_excpt_det_q & ~ex3_cp_flush_val;
assign ex2_ehpriv_excp_d = dec_dcc_ex1_ehpriv_excp;
assign ex3_ehpriv_excp_d = ex2_ehpriv_excp_q;
assign ex4_ucode_val_d = ex3_ucode_val & ~ex3_cp_flush_val;
assign ex4_ucode_cnt_d = ex3_ucode_cnt;
assign ex4_is_dcbz_d = ex3_dcbz_instr & ex3_cache_acc & ~ex3_cp_flush_val;
assign ex4_cache_acc_d = ex3_cache_acc & ~ex3_cp_flush_val;
// XUCR[FLSTA] = '0' => Flush to ucode
// XUCR[FLSTA] = '1' => Flush to Alignment Interrupt
// XUCR[AFLSTA] = '0' => Flush to ucode (AXUop)
// XUCR[AFLSTA] = '1' => Flush to Alignment Interrupt (AXUop)
assign force_align_int_a = ex3_axu_op_val & (spr_xucr0_aflsta | ex3_ldst_fexcpt);
assign force_align_int_x = ~ex3_axu_op_val & spr_xucr0_flsta;
assign force_align_int = force_align_int_x | force_align_int_a | ex3_resv_instr | ex3_ldawx_instr | ex3_mword_instr;
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// UCODE Memory Attributes Array
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
generate
if (`THREADS_POOL_ENC == 0) begin : tid1
wire [0:`THREADS_POOL_ENC] ex0_i0_enc_tid;
wire [0:`THREADS_POOL_ENC] ex0_i1_enc_tid;
wire [0:`THREADS_POOL_ENC] ex3_enc_tid;
wire [0:`THREADS_POOL_ENC] ex4_enc_tid;
assign ex0_i0_tid_ucode_cnt = ex0_i0_ucode_cnt;
assign ex0_i1_tid_ucode_cnt = ex0_i1_ucode_cnt;
assign ex3_tid_ucode_cnt = ex3_ucode_cnt;
assign ex4_tid_ucode_cnt = ex4_ucode_cnt_q;
assign ex0_i0_enc_tid[`THREADS_POOL_ENC:`THREADS_POOL_ENC] = tidn;
assign ex0_i1_enc_tid[`THREADS_POOL_ENC:`THREADS_POOL_ENC] = tidn;
assign ex3_enc_tid[`THREADS_POOL_ENC:`THREADS_POOL_ENC] = tidn;
assign ex4_enc_tid[`THREADS_POOL_ENC:`THREADS_POOL_ENC] = tidn;
assign unused = ex0_i0_enc_tid[`THREADS_POOL_ENC] | ex0_i1_enc_tid[`THREADS_POOL_ENC] | ex3_enc_tid[`THREADS_POOL_ENC] | ex4_enc_tid[`THREADS_POOL_ENC];
end
endgenerate
generate
if (`THREADS_POOL_ENC > 0) begin : tidMulti
reg [0:`THREADS_POOL_ENC] ex0_i0_enc_tid;
reg [0:`THREADS_POOL_ENC] ex0_i1_enc_tid;
reg [0:`THREADS_POOL_ENC] ex3_enc_tid;
reg [0:`THREADS_POOL_ENC] ex4_enc_tid;
always @(*) begin: tidEnc
reg [0:`THREADS_POOL_ENC-1] i0Tid;
reg [0:`THREADS_POOL_ENC-1] i1Tid;
reg [0:`THREADS_POOL_ENC-1] ex3Tid;
reg [0:`THREADS_POOL_ENC-1] ex4Tid;
//(* analysis_not_referenced="true" *)
reg [0:31] tid;
i0Tid = {`THREADS_POOL_ENC{1'b0}};
i1Tid = {`THREADS_POOL_ENC{1'b0}};
ex3Tid = {`THREADS_POOL_ENC{1'b0}};
ex4Tid = {`THREADS_POOL_ENC{1'b0}};
ex0_i0_enc_tid[`THREADS_POOL_ENC:`THREADS_POOL_ENC] <= tidn;
ex0_i1_enc_tid[`THREADS_POOL_ENC:`THREADS_POOL_ENC] <= tidn;
ex3_enc_tid[`THREADS_POOL_ENC:`THREADS_POOL_ENC] <= tidn;
ex4_enc_tid[`THREADS_POOL_ENC:`THREADS_POOL_ENC] <= tidn;
for (tid=0; tid<`THREADS; tid=tid+1) begin
i0Tid = (tid[32-`THREADS_POOL_ENC:31] & {`THREADS_POOL_ENC{ex0_i0_vld[tid]}}) | i0Tid;
i1Tid = (tid[32-`THREADS_POOL_ENC:31] & {`THREADS_POOL_ENC{ex0_i1_vld[tid]}}) | i1Tid;
ex3Tid = (tid[32-`THREADS_POOL_ENC:31] & {`THREADS_POOL_ENC{ex3_thrd_id[tid]}}) | ex3Tid;
ex4Tid = (tid[32-`THREADS_POOL_ENC:31] & {`THREADS_POOL_ENC{ex4_thrd_id[tid]}}) | ex4Tid;
end
ex0_i0_enc_tid[0:`THREADS_POOL_ENC-1] <= i0Tid;
ex0_i1_enc_tid[0:`THREADS_POOL_ENC-1] <= i1Tid;
ex3_enc_tid[0:`THREADS_POOL_ENC-1] <= ex3Tid;
ex4_enc_tid[0:`THREADS_POOL_ENC-1] <= ex4Tid;
end
assign ex0_i0_tid_ucode_cnt = {ex0_i0_enc_tid[0:`THREADS_POOL_ENC-1], ex0_i0_ucode_cnt};
assign ex0_i1_tid_ucode_cnt = {ex0_i1_enc_tid[0:`THREADS_POOL_ENC-1], ex0_i1_ucode_cnt};
assign ex3_tid_ucode_cnt = {ex3_enc_tid[0:`THREADS_POOL_ENC-1], ex3_ucode_cnt};
assign ex4_tid_ucode_cnt = {ex4_enc_tid[0:`THREADS_POOL_ENC-1], ex4_ucode_cnt_q};
assign unused = ex0_i0_enc_tid[`THREADS_POOL_ENC] | ex0_i1_enc_tid[`THREADS_POOL_ENC] | ex3_enc_tid[`THREADS_POOL_ENC] | ex4_enc_tid[`THREADS_POOL_ENC];
end
endgenerate
generate begin : memAttrQ
genvar ucodeEntry;
for (ucodeEntry=0; ucodeEntry<UCODEDEPTH; ucodeEntry=ucodeEntry+1) begin : memAttrQ
wire [0:`UCODE_ENTRIES_ENC+`THREADS_POOL_ENC-1] ucodeEntryDummy = ucodeEntry;
// Detect PreIssue of ucode for a given ucode engine entry
assign ex0_i0_ucode_cnt_entry[ucodeEntry] = (ucodeEntryDummy == ex0_i0_tid_ucode_cnt);
assign ex0_i0_ucode_cnt_start[ucodeEntry] = ex0_i0_ucode_cnt_entry[ucodeEntry] & |(ex0_i0_vld) & ex0_i0_ucode_preissue;
assign ex0_i1_ucode_cnt_entry[ucodeEntry] = (ucodeEntryDummy == ex0_i1_tid_ucode_cnt);
assign ex0_i1_ucode_cnt_start[ucodeEntry] = ex0_i1_ucode_cnt_entry[ucodeEntry] & |(ex0_i1_vld) & ex0_i1_ucode_preissue;
// Want to reset the ucode engine entry Valid on a PreIssue from Dispatch
assign ex0_ucode_cnt_rst[ucodeEntry] = ex0_i0_ucode_cnt_start[ucodeEntry] | ex0_i1_ucode_cnt_start[ucodeEntry];
// Want to Set the ucode engine entry Valid on either the PreIssue or the first ucode instruction from Issue
// Dont want to set valid if we got an ERAT Miss or a Restart from the ERAT
assign ex3_ucode_cnt_entry[ucodeEntry] = (ucodeEntryDummy == ex3_tid_ucode_cnt);
assign ex4_ucode_cnt_entry[ucodeEntry] = (ucodeEntryDummy == ex4_tid_ucode_cnt);
assign ex4_ucode_cnt_set[ucodeEntry] = ex4_ucode_cnt_entry[ucodeEntry] & ex4_ucode_val_q & ~(ucode_cnt_val_q[ucodeEntry] | derat_dcc_ex4_restart | derat_dcc_ex4_miss | ex4_strg_gate);
// Control for ucode engine entry Valid
// We should never see cnt_rst and cnt_set at the same time
assign ucode_cnt_ctrl[ucodeEntry] = {ex0_ucode_cnt_rst[ucodeEntry], ex4_ucode_cnt_set[ucodeEntry]};
assign ucode_cnt_val_d[ucodeEntry] = (ucode_cnt_ctrl[ucodeEntry] == 2'b00) ? ucode_cnt_val_q[ucodeEntry] :
(ucode_cnt_ctrl[ucodeEntry] == 2'b01) ? 1'b1 :
1'b0;
// Control for 2ucode, should only be set on the PreIssue of the ucode instruction
// We should never set i0_cnt_start and i1_cnt_start for the same ucodeEntry
assign ucode_cnt_2ucode_ctrl[ucodeEntry] = {ex0_i0_ucode_cnt_start[ucodeEntry], ex0_i1_ucode_cnt_start[ucodeEntry]};
assign ucode_cnt_2ucode_d[ucodeEntry] = (ucode_cnt_2ucode_ctrl[ucodeEntry] == 2'b10) ? ex0_i0_2ucode :
(ucode_cnt_2ucode_ctrl[ucodeEntry] == 2'b01) ? ex0_i1_2ucode :
ucode_cnt_2ucode_q[ucodeEntry];
// 2ucode Mux Select, want to gate misalignment flush2ucode check on a ucode preIssue
// that was already flushed2ucode due to misalignment
assign ex3_2ucode_cnt_set[ucodeEntry] = ucode_cnt_2ucode_q[ucodeEntry] & ex3_ucode_cnt_entry[ucodeEntry];
// Want to update the memory attribute bits when the Valid is set
assign ucode_cnt_memAttr_d[ucodeEntry] = ex4_mem_attr;
// ucode Alignment Interrupt detect
assign ex4_ucode_align_int[ucodeEntry] = (ucode_cnt_memAttr_q[ucodeEntry] != ex4_mem_attr) & ucode_cnt_val_q[ucodeEntry] & ex4_ucode_cnt_entry[ucodeEntry] & ex4_ucode_op & ex4_cache_acc_q;
// ucode Restart detected
// need to wait for preIssue to update the memory attribute bits
// was hitting a case where
// 1) second page loads updated memory attribute bits
// 2) first page and second page memory attributes bits differ
// 3) second page should be causing a DSI and test expects a DSI
// 4) first page access was causing an alignment interrupt because memory attributes differed,
// should have caused a DSI instead
assign ex4_ucode_cnt_restart[ucodeEntry] = ex4_ucode_cnt_entry[ucodeEntry] & ex4_ucode_op & ex4_cache_acc_q & ~ucode_cnt_val_q[ucodeEntry];
end
end
endgenerate
assign ex4_ucode_align_val = |(ex4_ucode_align_int);
assign ex4_ucode_restart = |(ex4_ucode_cnt_restart);
assign ex3_2ucode_set = |(ex3_2ucode_cnt_set);
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// Exception Calculations
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// FP, VEC, AP not available
assign ex4_axu_ap_unavail_d = (ex3_cache_acc | ex3_ucode_val) & ex3_axu_op_val & ex3_axu_instr_type[0] & ~(spr_ccr2_ap | ex3_cp_flush_val);
assign ex4_axu_spv_unavail_d = (ex3_cache_acc | ex3_ucode_val) & ex3_axu_op_val & ex3_axu_instr_type[1] & ~(spr_msr_spv | ex3_cp_flush_val);
assign ex4_axu_fp_unavail_d = (ex3_cache_acc | ex3_ucode_val) & ex3_axu_op_val & ex3_axu_instr_type[2] & ~(spr_msr_fp | ex3_cp_flush_val);
// Operation translated to either Write-Through or Cache-Inhibited
assign ex4_wt_ci_trans = derat_dcc_ex4_wimge_w | derat_dcc_ex4_wimge_i;
// ################################################################################################################
// Alignment Interrupt
// 1) Load/Store is not aligned and FLSTA/AFLSTA bit is set
// 2) Unaligned lwarx,ldarx,stwcx, or stdcx
// 3) Unaligned ldawx
// 4) Unaligned AXU operation and fexcpt is set
// 5) dcbz translates to write through required or cache-inhibit
// ################################################################################################################
// ########################
// Unaligned Operation crossing the operand's size
// ########################
// Crossing the Operand Size boundary, only used to determine alignment interrupt if FLSTA = 1 or is_lock_instruction
assign ex3_op16_unal = ex3_optype16 & (ex3_eff_addr[60] | ex3_eff_addr[61] | ex3_eff_addr[62] | ex3_eff_addr[63]);
assign ex3_op8_unal = ex3_optype8 & (ex3_eff_addr[61] | ex3_eff_addr[62] | ex3_eff_addr[63]);
assign ex3_op4_unal = ex3_optype4 & (ex3_eff_addr[62] | ex3_eff_addr[63]);
assign ex3_op2_unal = ex3_optype2 & ex3_eff_addr[63];
assign ex3_unal_op = ex3_op16_unal | ex3_op8_unal | ex3_op4_unal | ex3_op2_unal;
// ########################
// ########################
// Unaligned ICSWX crossing the 64Byte boundary
// ########################
// icswx crossing the 128 byte boundary
assign ex3_icswx_unal = ex3_icswx_type & |(ex3_eff_addr);
// ########################
// Unaligned Operation crossing a 16 Byte boundary
// ########################
assign ex3_16Bop16_unal = ex3_optype16 & (ex3_eff_addr[60] | ex3_eff_addr[61] | ex3_eff_addr[62] | ex3_eff_addr[63]);
assign ex3_16Bop8_unal = ex3_optype8 & ex3_eff_addr[60] & (ex3_eff_addr[61] | ex3_eff_addr[62] | ex3_eff_addr[63]);
assign ex3_16Bop4_unal = ex3_optype4 & ex3_eff_addr[60] & ex3_eff_addr[61] & (ex3_eff_addr[62] | ex3_eff_addr[63]);
assign ex3_16Bop2_unal = ex3_optype2 & ex3_eff_addr[60] & ex3_eff_addr[61] & ex3_eff_addr[62] & ex3_eff_addr[63];
assign ex3_16Bunal_op = ex3_16Bop16_unal | ex3_16Bop8_unal | ex3_16Bop4_unal | ex3_16Bop2_unal;
// Flush to uCode if ucode supports unalignment
assign ex3_flush_2ucode_chk = ex3_cache_acc | (ex3_ucode_val & ~ex3_2ucode_set);
assign ex3_flush_2ucode = (~(ex3_resv_instr | ex3_ldawx_instr | ex3_mword_instr | ex3_icswx_type)) & ex3_16Bunal_op & ex3_flush_2ucode_chk & ~ex3_cp_flush_val;
assign ex4_flush_2ucode_d = ex3_flush_2ucode & ~spr_ccr2_ucode_dis;
assign ex4_ucode_dis_prog_d = ex3_flush_2ucode & spr_ccr2_ucode_dis & ~ex3_cp_flush_val;
assign ex5_flush_2ucode_d = ex4_flush_2ucode_q & ~(ex4_cp_flush_val | ex4_cp_next_excp_rpt | ex4_non_cp_next_excp | ex4_restart_val);
// Alignment Interrupt Collected
assign ex4_prealign_int_d = (ex3_icswx_unal | (force_align_int & (ex3_unal_op | ex3_16Bunal_op))) & (ex3_cache_acc | ex3_ucode_val) & ~ex3_cp_flush_val;
// DCBZ translated to Write-Through or Cache-Inhibited.
assign ex4_dcbz_err = ex4_is_dcbz_q & ex4_wt_ci_trans;
assign ex4_align_int = ex4_prealign_int_q | ((ex4_dcbz_err | ex4_ucode_align_val) & ~derat_dcc_ex4_miss);
// ########################
assign ex5_misalign_flush_d = (ex4_flush_2ucode_q & ~ex4_restart_val) | ex4_prealign_int_q;
// ################################################################################################################
// ################################################################################################################
// Data Storage Interrupt
// 1) lwarx,ldarx,stwcx, or stdcx translate to write through required or cache-inhibit
// ################################################################################################################
// lwarx,ldarx,stwcx,stdcx translate to write-through or cache-inhibit
assign ex3_valid_resv = ex3_resv_instr & ex3_cache_acc & ~ex3_cp_flush_val;
assign ex4_valid_resv_d = ex3_valid_resv;
assign ex4_dsi_int = ex4_valid_resv_q & ex4_wt_ci_trans & ~derat_dcc_ex4_miss;
// ################################################################################################################
// #############################################
// FLUSH CONDITIONS
// #############################################
// ex1 Instruction Flush
assign ex1_cp_flush_val = |(ex1_thrd_id & iu_lq_cp_flush);
// ex2 Instruction Flush and ex2 Speculative Flush
assign ex2_cp_flush_val = |(ex2_thrd_id & iu_lq_cp_flush) | byp_dcc_ex2_req_aborted;
// ex3 Instruction Flush
assign ex3_cp_flush_val = |(ex3_thrd_id & iu_lq_cp_flush);
// ex4 Instruction Flush
// CP_FLUSH should be the only thing coming into this
// this is getting used by the slowspr partition
// If something else needs to go in here, need to create
// a special one for the slowspr partition
assign ex4_cp_flush_val = |(ex4_thrd_id & iu_lq_cp_flush);
// ex5 Instruction Flush
assign ex5_cp_flush_val = |(ex5_thrd_id & iu_lq_cp_flush);
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// ex1 Flush Stage
// 1) Instruction Flush from Completion
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
assign fgen_ex1_stg_flush = ex1_cp_flush_val;
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// ex2 Flush Stage
// 1) Instruction Flush from Completion
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
assign fgen_ex2_stg_flush = ex2_cp_flush_val;
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// ex3 Flush Stage
// 1) Instruction Flush from Completion
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
assign fgen_ex3_stg_flush = ex3_cp_flush_val;
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// ex4 Flush Stage takes into account the following
// 1) Directory Parity Error
// 2) Cache Parity Error
// 3) Directory Multiple ways hit
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
assign ex4_tlb_flush_req = ex4_tlb_perr_flush | ex4_tlb_lru_perr_flush | ex4_tlb_multihit_flush;
assign ex5_tlb_flush_req_d = ex4_tlb_flush_req;
assign ex5_tlb_mchk_req_d = |(ex4_excp_pri[12:14]);
assign ex4_n_flush_req = (ex4_flush_2ucode_q | ex4_dac_int_det | ex4_tlb_flush_req) & ~ex4_restart_val;
assign ex5_flush_req_mchk = |(ex5_excp_pri);
assign ex5_flush_req_int = ex5_derat_perr_flush | ex5_dir_perr_flush | ex5_dc_perr_flush | ex5_derat_multihit_flush | ex5_dir_multihit_flush | dir_dcc_ex5_stp_flush;
assign ex4_local_flush = (ex4_n_flush_req & ~ex4_cp_next_excp_det) | ex4_cp_next_excp_rpt | ex4_non_cp_next_excp;
// Currently a placeholder in case the STQ ever needs to report an exception
assign ex4_excp_det = ex4_local_flush;
assign ex5_local_flush_d = ex4_local_flush;
assign ex5_local_flush = ex5_local_flush_q | ex5_flush_req_int;
assign ex5_dac_int_det_d = ex4_dac_int_det;
// Exception Priority
// POWERPC ARCHITECTURE EXCEPTION PRIORITY
//ex4_excp_pri <=
//ex4_illeg_prog_q & -- 0 illegal instr type Non CP_NEXT
//ex4_priv_prog_q & -- 1 Privilege Non CP_NEXT
//ex4_axu_fp_unavail_q & -- 2 FP Unavailable Non CP_NEXT
//ex4_axu_ap_unavail_q & -- 3 AP Unavailable Non CP_NEXT
//ex4_axu_spv_unavail_q & -- 4 Vector Unavailable Non CP_NEXT
//ex4_ucode_dis_prog_q & -- 5 Ucode Disabled Program Interrupt Non CP_NEXT
//ex4_hypv_prog_q & -- 6 Hypervisor Privilege Non CP_NEXT
//'0' & -- 7 DERAT Parity Non CP_NEXT
//'0' & -- 8 Data Dir Parity Error Non CP_NEXT
//'0' & -- 9 Data Cache Parity Error Non CP_NEXT
//'0' & -- 10 DERAT Multihit Non CP_NEXT
//'0' & -- 11 Data Dir Multihit Non CP_NEXT
//derat_dcc_ex4_tlb_par_err & -- 12 TLB Parity Error CP_NEXT
//derat_dcc_ex4_lru_par_err & -- 13 TLB LRU Parity Error CP_NEXT
//derat_dcc_ex4_tlb_multihit & -- 14 TLB Multihit Error CP_NEXT
//derat_dcc_ex4_tlb_err & -- 15 TLB/DERAT Miss CP_NEXT
//ex4_dlock_excp_q & -- 16 DSI DLOCK Instruction CP_NEXT
//ex4_ilock_excp_q & -- 17 DSI ILOCK Instruction CP_NEXT
//derat_dcc_ex4_pt_fault & -- 18 DSI Page Table Fault CP_NEXT
//ex4_derat_vf_int & -- 19 DSI Virtualization Fault CP_NEXT
//derat_dcc_ex4_tlb_inelig & -- 20 TLB Ineligible CP_NEXT
//derat_dcc_ex4_dsi & -- 21 DSI R/W Access Violation CP_NEXT
//ex4_dsi_int & -- 22 LARX/STCX DSI CP_NEXT
//ex4_icswx_dsi & -- 23 Unavailable Coprocessor CP_NEXT
//ex4_align_int & -- 24 load/store Alignment CP_NEXT
//derat_dcc_ex4_lrat_miss; -- 25 Data Side LRAT Miss CP_NEXT
// A2I/A2O ARCHITECTURE EXCEPTION PRIORITY
assign ex4_excp_pri = {ex4_illeg_prog_q, // 0 illegal instr type Non CP_NEXT
ex4_priv_prog_q, // 1 Privilege Non CP_NEXT
ex4_axu_fp_unavail_q, // 2 FP Unavailable Non CP_NEXT
ex4_axu_ap_unavail_q, // 3 AP Unavailable Non CP_NEXT
ex4_axu_spv_unavail_q, // 4 Vector Unavailable Non CP_NEXT
ex4_ucode_dis_prog_q, // 5 Ucode Disabled Program Interrupt Non CP_NEXT
ex4_hypv_prog_q, // 6 Hypervisor Privilege Non CP_NEXT
1'b0, // 7 DERAT Parity Non CP_NEXT
1'b0, // 8 Data Dir Parity Error Non CP_NEXT
1'b0, // 9 Data Cache Parity Error Non CP_NEXT
1'b0, // 10 DERAT Multihit Non CP_NEXT
1'b0, // 11 Data Dir Multihit Non CP_NEXT
ex4_tlb_perr_mchk, // 12 TLB Parity Error CP_NEXT
ex4_tlb_lru_perr_mchk, // 13 TLB LRU Parity Error CP_NEXT
ex4_tlb_multihit_mchk, // 14 TLB Multihit Error CP_NEXT
derat_dcc_ex4_tlb_err, // 15 TLB/DERAT Miss CP_NEXT
derat_dcc_ex4_pt_fault, // 16 DSI Page Table Fault CP_NEXT
derat_dcc_ex4_tlb_inelig, // 17 TLB Ineligible CP_NEXT
ex4_dlock_excp_q, // 18 DSI DLOCK Instruction CP_NEXT
ex4_ilock_excp_q, // 19 DSI ILOCK Instruction CP_NEXT
ex4_derat_vf_int, // 20 DSI Virtualization Fault CP_NEXT
derat_dcc_ex4_dsi, // 21 DSI R/W Access Violation CP_NEXT
ex4_dsi_int, // 22 LARX/STCX DSI CP_NEXT
ex4_icswx_dsi, // 23 Unavailable Coprocessor CP_NEXT
ex4_align_int, // 24 load/store Alignment CP_NEXT
derat_dcc_ex4_lrat_miss}; // 25 Data Side LRAT Miss CP_NEXT
// 26 L2 Reload ECC_UE Machine Check Non CP_NEXT Detected by Loadmiss Queue on reload
// Machine Check Enabled Interrupts
assign ex4_tlb_perr_mchk = derat_dcc_ex4_tlb_par_err & spr_xucr4_mmu_mchk;
assign ex4_tlb_lru_perr_mchk = derat_dcc_ex4_lru_par_err & spr_xucr4_mmu_mchk;
assign ex4_tlb_multihit_mchk = derat_dcc_ex4_tlb_multihit & spr_xucr4_mmu_mchk;
assign ex5_derat_perr_mchk = ex5_derat_perr_flush_q & (spr_xucr4_mmu_mchk | spr_ccr2_notlb);
assign ex5_dir_perr_mchk = dir_dcc_ex5_dir_perr_flush & spr_xucr0_mddp;
assign ex5_dc_perr_mchk = dir_dcc_ex5_dc_perr_flush & spr_xucr0_mdcp;
assign ex5_derat_multihit_mchk = ex5_derat_multihit_flush_q & (spr_xucr4_mmu_mchk | spr_ccr2_notlb);
assign ex5_dir_multihit_mchk = dir_dcc_ex5_multihit_flush & spr_xucr4_mddmh;
// N-Flush Generated Scenarios
assign ex4_tlb_perr_flush = derat_dcc_ex4_tlb_par_err;
assign ex4_tlb_lru_perr_flush = derat_dcc_ex4_lru_par_err;
assign ex4_tlb_multihit_flush = derat_dcc_ex4_tlb_multihit;
assign ex5_derat_perr_flush = ex5_derat_perr_flush_q;
assign ex5_dir_perr_flush = dir_dcc_ex5_dir_perr_flush;
assign ex5_dc_perr_flush = dir_dcc_ex5_dc_perr_flush;
assign ex5_derat_multihit_flush = ex5_derat_multihit_flush_q;
assign ex5_dir_multihit_flush = dir_dcc_ex5_multihit_flush;
assign ex4_exception = (ex4_excp_pri[0] == 1'b1) ? 6'b000000 :
(ex4_excp_pri[1] == 1'b1) ? 6'b000001 :
(ex4_excp_pri[2] == 1'b1) ? 6'b000010 :
(ex4_excp_pri[3] == 1'b1) ? 6'b000011 :
(ex4_excp_pri[4] == 1'b1) ? 6'b000100 :
(ex4_excp_pri[5] == 1'b1) ? 6'b000101 :
(ex4_excp_pri[6] == 1'b1) ? 6'b000110 :
(ex4_excp_pri[7] == 1'b1) ? 6'b000111 :
(ex4_excp_pri[8] == 1'b1) ? 6'b001000 :
(ex4_excp_pri[9] == 1'b1) ? 6'b001001 :
(ex4_excp_pri[10] == 1'b1) ? 6'b001010 :
(ex4_excp_pri[11] == 1'b1) ? 6'b001011 :
(ex4_excp_pri[12] == 1'b1) ? 6'b001100 :
(ex4_excp_pri[13] == 1'b1) ? 6'b001101 :
(ex4_excp_pri[14] == 1'b1) ? 6'b001110 :
(ex4_excp_pri[15] == 1'b1) ? 6'b001111 :
(ex4_excp_pri[16] == 1'b1) ? 6'b010000 :
(ex4_excp_pri[17] == 1'b1) ? 6'b010001 :
(ex4_excp_pri[18] == 1'b1) ? 6'b010010 :
(ex4_excp_pri[19] == 1'b1) ? 6'b010011 :
(ex4_excp_pri[20] == 1'b1) ? 6'b010100 :
(ex4_excp_pri[21] == 1'b1) ? 6'b010101 :
(ex4_excp_pri[22] == 1'b1) ? 6'b010110 :
(ex4_excp_pri[23] == 1'b1) ? 6'b010111 :
(ex4_excp_pri[24] == 1'b1) ? 6'b011000 :
6'b011001;
assign ex5_excp_pri = {ex5_derat_perr_mchk, // 7 DERAT Parity
ex5_dir_perr_mchk, // 8 Data Dir Parity Error
ex5_dc_perr_mchk, // 9 Data Cache Parity Error
ex5_derat_multihit_mchk, // 10 DERAT Multihit
ex5_dir_multihit_mchk}; // 11 Data Dir Multihit
assign ex5_mid_pri_excp = (ex5_excp_pri[7] == 1'b1) ? 6'b000111 :
(ex5_excp_pri[8] == 1'b1) ? 6'b001000 :
(ex5_excp_pri[9] == 1'b1) ? 6'b001001 :
(ex5_excp_pri[10] == 1'b1) ? 6'b001010 :
6'b001011;
assign ex5_sel_mid_pri_excp = ex5_flush_req_int & ~ex5_high_pri_excp_q;
assign ex4_non_cp_next_excp = |(ex4_excp_pri[0:11]);
assign ex5_high_pri_excp_d = ex4_non_cp_next_excp & ~ex4_cp_flush_val;
assign ex5_low_pri_excp_d = ex4_cp_next_excp & ~ex4_cp_flush_val;
assign ex4_cp_next_excp = |(ex4_excp_pri[12:25]) & ex4_wNComp_rcvd & ~ex4_restart_val;
assign ex4_cp_next_excp_det = |(ex4_excp_pri[12:25]) & ~ex4_restart_val;
assign ex4_cp_next_excp_rpt = ex4_cp_next_excp;
assign ex4_wNComp_excp = ex4_cp_next_excp_det & ~(ex4_cp_flush_val | ex4_non_cp_next_excp);
assign ex4_sfx_excpt_det = ex4_sfx_excpt_det_q;
// Want to blow away everything when there is a Non-CP_NEXT exception detected
assign ex5_flush_req = ex5_flush_req_int | ex5_high_pri_excp_q;
assign ex5_exception_d = ex4_exception;
// CP_NEXT instruction got a Flush
// need to restart instructions behind it so that the directory
// does not get corrupted, this handles the case where a dcbtls
// got an exception and a lq pipeline instruction behind it bypassed
// the wrong directory results, also needed in case there is a parity
// error in either directory, dataCache, or erats
assign ex5_wNComp_rcvd_d = ex4_wNComp_rcvd;
assign ex5_wNComp_excp = (ex5_wNComp_rcvd_q & ex5_local_flush) | dir_dcc_ex5_dir_perr_det | dir_dcc_ex5_dc_perr_det |
dir_dcc_ex5_multihit_det | ex5_derat_multihit_det_q | ex5_derat_perr_det_q |
dir_dcc_stq4_dir_perr_det | dir_dcc_stq4_multihit_det;
assign ex6_wNComp_excp_d = ex5_wNComp_excp;
assign ex4_wNComp_excp_restart = ex5_wNComp_excp | ex6_wNComp_excp_q;
// Select between EX4 and EX5 Exceptions
assign ex5_exception_int = ~ex5_sel_mid_pri_excp ? ex5_exception_q : ex5_mid_pri_excp;
assign ex5_dear_val_d = ex4_thrd_id & {`THREADS{ex4_cp_next_excp_rpt}};
assign ex5_flush2ucode = ex5_flush_2ucode_q & ~(ex5_flush_req_int | ex5_high_pri_excp_q);
assign ex5_n_flush = ex5_local_flush_q | ex5_flush_req_int;
assign ex5_np1_flush = 1'b0; //'
// Want to take an interrupt if
// 1) high priority interrupt ex4_excp_pri(0:6) => program interrupts, these interrupts ignore any bad machine path errors detected by
// data cache, directory, and erat
// 2) mid priority interrupt ex4_excp_pri(7:11) => machine check enabled and bad machine path error detected by
// data cache, directory, or erat
// 3) mid priority interrupt ex4_excp_pri(12:14) => machine check enabled and bad machine path error detected by the MMU, these exceptions
// are gated if error detected by data cache, directory, or erat and machine check disabled for error
// 4) low priority interrupt ex4_excp_pri(15:25) => translation type interrupts, these exceptions are gated if error detected by
// data cache, directory, mmu, or erat and machine check disabled for error
assign ex5_exception_val = ex5_high_pri_excp_q | ex5_flush_req_mchk | (ex5_tlb_mchk_req_q & ~ex5_flush_req_int) | (ex5_low_pri_excp_q & ~(ex5_flush_req_int | ex5_tlb_flush_req_q));
assign ex5_exception = ex5_exception_int;
assign ex5_dear_val = ex5_dear_val_q;
assign ex5_blk_tlb_req = ex5_high_pri_excp_q | ex5_flush_req_int;
assign fgen_ex4_stg_flush = ex4_cp_flush_val | ex4_n_flush_req | ex4_non_cp_next_excp | ex4_cp_next_excp_det;
assign fgen_ex5_stg_flush = ex5_cp_flush_val | ex5_local_flush | ex5_restart_val | ex5_dac_int_det_q;
assign ex5_flush_pfetch = dir_dcc_ex5_dir_perr_det | dir_dcc_ex5_dc_perr_det | dir_dcc_ex5_multihit_det |
ex5_derat_multihit_det_q | ex5_derat_perr_det_q | dir_dcc_stq4_dir_perr_det |
dir_dcc_stq4_multihit_det;
assign fgen_ex4_cp_flush = ex4_cp_flush_val;
assign fgen_ex5_cp_flush = ex5_cp_flush_val;
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// FIR Error Reporting
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
assign perv_fir_rpt_d = {derat_fir_par_err, dir_dcc_ex5_dir_perr_det, dir_dcc_ex5_dc_perr_det, derat_fir_multihit, dir_dcc_ex5_multihit_det, dir_dcc_stq4_dir_perr_det, dir_dcc_stq4_multihit_det};
tri_direct_err_rpt #(.WIDTH(7)) pervFir(
.vd(vdd),
.gd(gnd),
.err_in(perv_fir_rpt_q),
.err_out(perv_fir_rpt)
);
assign lq_pc_err_derat_parity = perv_fir_rpt[0];
assign lq_pc_err_dir_ldp_parity = perv_fir_rpt[1];
assign lq_pc_err_dcache_parity = perv_fir_rpt[2];
assign lq_pc_err_derat_multihit = perv_fir_rpt[3];
assign lq_pc_err_dir_ldp_multihit = perv_fir_rpt[4];
assign lq_pc_err_dir_stp_parity = perv_fir_rpt[5];
assign lq_pc_err_dir_stp_multihit = perv_fir_rpt[6];
// xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// Performance Events
// xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
assign ex5_misalign_flush = ex5_misalign_flush_q;
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// Registers
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex4_valid_resv_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_valid_resv_offset]),
.scout(sov[ex4_valid_resv_offset]),
.din(ex4_valid_resv_d),
.dout(ex4_valid_resv_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex4_prealign_int_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_prealign_int_offset]),
.scout(sov[ex4_prealign_int_offset]),
.din(ex4_prealign_int_d),
.dout(ex4_prealign_int_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex4_flush_2ucode_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_flush_2ucode_offset]),
.scout(sov[ex4_flush_2ucode_offset]),
.din(ex4_flush_2ucode_d),
.dout(ex4_flush_2ucode_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex5_flush_2ucode_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_flush_2ucode_offset]),
.scout(sov[ex5_flush_2ucode_offset]),
.din(ex5_flush_2ucode_d),
.dout(ex5_flush_2ucode_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex4_ucode_dis_prog_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_ucode_dis_prog_offset]),
.scout(sov[ex4_ucode_dis_prog_offset]),
.din(ex4_ucode_dis_prog_d),
.dout(ex4_ucode_dis_prog_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex4_is_dcbz_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_is_dcbz_offset]),
.scout(sov[ex4_is_dcbz_offset]),
.din(ex4_is_dcbz_d),
.dout(ex4_is_dcbz_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex5_misalign_flush_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_misalign_flush_offset]),
.scout(sov[ex5_misalign_flush_offset]),
.din(ex5_misalign_flush_d),
.dout(ex5_misalign_flush_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex4_axu_ap_unavail_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_axu_ap_unavail_offset]),
.scout(sov[ex4_axu_ap_unavail_offset]),
.din(ex4_axu_ap_unavail_d),
.dout(ex4_axu_ap_unavail_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex4_axu_fp_unavail_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_axu_fp_unavail_offset]),
.scout(sov[ex4_axu_fp_unavail_offset]),
.din(ex4_axu_fp_unavail_d),
.dout(ex4_axu_fp_unavail_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex4_axu_spv_unavail_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_axu_spv_unavail_offset]),
.scout(sov[ex4_axu_spv_unavail_offset]),
.din(ex4_axu_spv_unavail_d),
.dout(ex4_axu_spv_unavail_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex5_local_flush_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_local_flush_offset]),
.scout(sov[ex5_local_flush_offset]),
.din(ex5_local_flush_d),
.dout(ex5_local_flush_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex5_tlb_flush_req_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_tlb_flush_req_offset]),
.scout(sov[ex5_tlb_flush_req_offset]),
.din(ex5_tlb_flush_req_d),
.dout(ex5_tlb_flush_req_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex5_tlb_mchk_req_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_tlb_mchk_req_offset]),
.scout(sov[ex5_tlb_mchk_req_offset]),
.din(ex5_tlb_mchk_req_d),
.dout(ex5_tlb_mchk_req_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex5_low_pri_excp_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_low_pri_excp_offset]),
.scout(sov[ex5_low_pri_excp_offset]),
.din(ex5_low_pri_excp_d),
.dout(ex5_low_pri_excp_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex5_high_pri_excp_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_high_pri_excp_offset]),
.scout(sov[ex5_high_pri_excp_offset]),
.din(ex5_high_pri_excp_d),
.dout(ex5_high_pri_excp_q)
);
tri_rlmreg_p #(.WIDTH(6), .INIT(0), .NEEDS_SRESET(1)) ex5_exception_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.act(ex4_stg_act),
.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_exception_offset:ex5_exception_offset + 6 - 1]),
.scout(sov[ex5_exception_offset:ex5_exception_offset + 6 - 1]),
.din(ex5_exception_d),
.dout(ex5_exception_q)
);
tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0), .NEEDS_SRESET(1)) ex5_dear_val_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_dear_val_offset:ex5_dear_val_offset + `THREADS - 1]),
.scout(sov[ex5_dear_val_offset:ex5_dear_val_offset + `THREADS - 1]),
.din(ex5_dear_val_d),
.dout(ex5_dear_val_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex5_derat_multihit_flush_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_derat_multihit_flush_offset]),
.scout(sov[ex5_derat_multihit_flush_offset]),
.din(ex5_derat_multihit_flush_d),
.dout(ex5_derat_multihit_flush_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex5_derat_multihit_det_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_derat_multihit_det_offset]),
.scout(sov[ex5_derat_multihit_det_offset]),
.din(ex5_derat_multihit_det_d),
.dout(ex5_derat_multihit_det_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex5_derat_perr_flush_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_derat_perr_flush_offset]),
.scout(sov[ex5_derat_perr_flush_offset]),
.din(ex5_derat_perr_flush_d),
.dout(ex5_derat_perr_flush_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex5_derat_perr_det_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_derat_perr_det_offset]),
.scout(sov[ex5_derat_perr_det_offset]),
.din(ex5_derat_perr_det_d),
.dout(ex5_derat_perr_det_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex2_sfx_excpt_det_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_sfx_excpt_det_offset]),
.scout(sov[ex2_sfx_excpt_det_offset]),
.din(ex2_sfx_excpt_det_d),
.dout(ex2_sfx_excpt_det_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex3_sfx_excpt_det_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_sfx_excpt_det_offset]),
.scout(sov[ex3_sfx_excpt_det_offset]),
.din(ex3_sfx_excpt_det_d),
.dout(ex3_sfx_excpt_det_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex4_sfx_excpt_det_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_sfx_excpt_det_offset]),
.scout(sov[ex4_sfx_excpt_det_offset]),
.din(ex4_sfx_excpt_det_d),
.dout(ex4_sfx_excpt_det_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex2_priv_prog_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_priv_prog_offset]),
.scout(sov[ex2_priv_prog_offset]),
.din(ex2_priv_prog_d),
.dout(ex2_priv_prog_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex3_priv_prog_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_priv_prog_offset]),
.scout(sov[ex3_priv_prog_offset]),
.din(ex3_priv_prog_d),
.dout(ex3_priv_prog_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex4_priv_prog_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_priv_prog_offset]),
.scout(sov[ex4_priv_prog_offset]),
.din(ex4_priv_prog_d),
.dout(ex4_priv_prog_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex2_hypv_prog_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_hypv_prog_offset]),
.scout(sov[ex2_hypv_prog_offset]),
.din(ex2_hypv_prog_d),
.dout(ex2_hypv_prog_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex3_hypv_prog_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_hypv_prog_offset]),
.scout(sov[ex3_hypv_prog_offset]),
.din(ex3_hypv_prog_d),
.dout(ex3_hypv_prog_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex4_hypv_prog_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_hypv_prog_offset]),
.scout(sov[ex4_hypv_prog_offset]),
.din(ex4_hypv_prog_d),
.dout(ex4_hypv_prog_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex2_illeg_prog_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_illeg_prog_offset]),
.scout(sov[ex2_illeg_prog_offset]),
.din(ex2_illeg_prog_d),
.dout(ex2_illeg_prog_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex3_illeg_prog_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_illeg_prog_offset]),
.scout(sov[ex3_illeg_prog_offset]),
.din(ex3_illeg_prog_d),
.dout(ex3_illeg_prog_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex4_illeg_prog_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_illeg_prog_offset]),
.scout(sov[ex4_illeg_prog_offset]),
.din(ex4_illeg_prog_d),
.dout(ex4_illeg_prog_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex2_dlock_excp_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_dlock_excp_offset]),
.scout(sov[ex2_dlock_excp_offset]),
.din(ex2_dlock_excp_d),
.dout(ex2_dlock_excp_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex3_dlock_excp_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_dlock_excp_offset]),
.scout(sov[ex3_dlock_excp_offset]),
.din(ex3_dlock_excp_d),
.dout(ex3_dlock_excp_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex4_dlock_excp_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_dlock_excp_offset]),
.scout(sov[ex4_dlock_excp_offset]),
.din(ex4_dlock_excp_d),
.dout(ex4_dlock_excp_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex2_ilock_excp_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_ilock_excp_offset]),
.scout(sov[ex2_ilock_excp_offset]),
.din(ex2_ilock_excp_d),
.dout(ex2_ilock_excp_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex3_ilock_excp_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_ilock_excp_offset]),
.scout(sov[ex3_ilock_excp_offset]),
.din(ex3_ilock_excp_d),
.dout(ex3_ilock_excp_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex4_ilock_excp_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_ilock_excp_offset]),
.scout(sov[ex4_ilock_excp_offset]),
.din(ex4_ilock_excp_d),
.dout(ex4_ilock_excp_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex2_ehpriv_excp_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_ehpriv_excp_offset]),
.scout(sov[ex2_ehpriv_excp_offset]),
.din(ex2_ehpriv_excp_d),
.dout(ex2_ehpriv_excp_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex3_ehpriv_excp_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_ehpriv_excp_offset]),
.scout(sov[ex3_ehpriv_excp_offset]),
.din(ex3_ehpriv_excp_d),
.dout(ex3_ehpriv_excp_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex4_cache_acc_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_cache_acc_offset]),
.scout(sov[ex4_cache_acc_offset]),
.din(ex4_cache_acc_d),
.dout(ex4_cache_acc_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex4_ucode_val_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_ucode_val_offset]),
.scout(sov[ex4_ucode_val_offset]),
.din(ex4_ucode_val_d),
.dout(ex4_ucode_val_q)
);
tri_rlmreg_p #(.WIDTH(`UCODE_ENTRIES_ENC), .INIT(0), .NEEDS_SRESET(1)) ex4_ucode_cnt_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.act(ex3_stg_act),
.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_ucode_cnt_offset:ex4_ucode_cnt_offset + `UCODE_ENTRIES_ENC - 1]),
.scout(sov[ex4_ucode_cnt_offset:ex4_ucode_cnt_offset + `UCODE_ENTRIES_ENC - 1]),
.din(ex4_ucode_cnt_d),
.dout(ex4_ucode_cnt_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex5_wNComp_rcvd_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_wNComp_rcvd_offset]),
.scout(sov[ex5_wNComp_rcvd_offset]),
.din(ex5_wNComp_rcvd_d),
.dout(ex5_wNComp_rcvd_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex6_wNComp_excp_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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[ex6_wNComp_excp_offset]),
.scout(sov[ex6_wNComp_excp_offset]),
.din(ex6_wNComp_excp_d),
.dout(ex6_wNComp_excp_q)
);
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ex5_dac_int_det_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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_dac_int_det_offset]),
.scout(sov[ex5_dac_int_det_offset]),
.din(ex5_dac_int_det_d),
.dout(ex5_dac_int_det_q)
);
tri_rlmreg_p #(.WIDTH(7), .INIT(0), .NEEDS_SRESET(1)) perv_fir_rpt_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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[perv_fir_rpt_offset:perv_fir_rpt_offset + 7 - 1]),
.scout(sov[perv_fir_rpt_offset:perv_fir_rpt_offset + 7 - 1]),
.din(perv_fir_rpt_d),
.dout(perv_fir_rpt_q)
);
tri_rlmreg_p #(.WIDTH(UCODEDEPTH), .INIT(0), .NEEDS_SRESET(1)) ucode_cnt_val_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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[ucode_cnt_val_offset:ucode_cnt_val_offset + UCODEDEPTH - 1]),
.scout(sov[ucode_cnt_val_offset:ucode_cnt_val_offset + UCODEDEPTH - 1]),
.din(ucode_cnt_val_d),
.dout(ucode_cnt_val_q)
);
tri_rlmreg_p #(.WIDTH(UCODEDEPTH), .INIT(0), .NEEDS_SRESET(1)) ucode_cnt_2ucode_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.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[ucode_cnt_2ucode_offset:ucode_cnt_2ucode_offset + UCODEDEPTH - 1]),
.scout(sov[ucode_cnt_2ucode_offset:ucode_cnt_2ucode_offset + UCODEDEPTH - 1]),
.din(ucode_cnt_2ucode_d),
.dout(ucode_cnt_2ucode_q)
);
generate begin : ucode_cnt_memAttr
genvar ucodeEntry;
for (ucodeEntry=0; ucodeEntry<UCODEDEPTH; ucodeEntry=ucodeEntry+1) begin : ucode_cnt_memAttr
tri_rlmreg_p #(.WIDTH(9), .INIT(1), .NEEDS_SRESET(1)) ucode_cnt_memAttr_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.act(ex4_ucode_cnt_set[ucodeEntry]),
.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[ucode_cnt_memAttr_offset + 9*ucodeEntry:ucode_cnt_memAttr_offset + 9*(ucodeEntry+1)-1]),
.scout(sov[ucode_cnt_memAttr_offset + 9*ucodeEntry:ucode_cnt_memAttr_offset + 9*(ucodeEntry+1)-1]),
.din(ucode_cnt_memAttr_d[ucodeEntry]),
.dout(ucode_cnt_memAttr_q[ucodeEntry])
);
end
end
endgenerate
assign siv[0:scan_right] = {sov[1:scan_right], scan_in};
assign scan_out = sov[0];
endmodule