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.

867 lines
44 KiB
VHDL

-- © 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.
library ieee;
use ieee.std_logic_1164.all;
library ibm,clib;
use ibm.std_ulogic_support.all;
use ibm.std_ulogic_function_support.all;
use ibm.std_ulogic_unsigned.all;
library support;
use support.power_logic_pkg.all;
library tri;
use tri.tri_latches_pkg.all;
entity pcq_regs_fir is
generic(expand_type : integer := 2);
port(
vdd : inout power_logic;
gnd : inout power_logic;
nclk : in clk_logic;
lcb_clkoff_dc_b : in std_ulogic;
lcb_mpw1_dc_b : in std_ulogic;
lcb_mpw2_dc_b : in std_ulogic;
lcb_delay_lclkr_dc : in std_ulogic;
lcb_act_dis_dc : in std_ulogic;
lcb_sg_0 : in std_ulogic;
lcb_func_slp_sl_thold_0 : in std_ulogic;
lcb_cfg_slp_sl_thold_0 : in std_ulogic;
cfgslp_d1clk : in std_ulogic;
cfgslp_d2clk : in std_ulogic;
cfgslp_lclk : in clk_logic;
cfg_slat_d2clk : in std_ulogic;
cfg_slat_lclk : in clk_logic;
bcfg_scan_in : in std_ulogic;
bcfg_scan_out : out std_ulogic;
func_scan_in : in std_ulogic;
func_scan_out : out std_ulogic;
sc_active : in std_ulogic;
sc_wr_q : in std_ulogic;
sc_addr_v : in std_ulogic_vector(0 to 63);
sc_wdata : in std_ulogic_vector(0 to 63);
sc_wparity : in std_ulogic;
sc_rdata : out std_ulogic_vector(0 to 63);
ac_an_special_attn : out std_ulogic_vector(0 to 3);
ac_an_checkstop : out std_ulogic_vector(0 to 2);
ac_an_local_checkstop : out std_ulogic_vector(0 to 2);
ac_an_recov_err : out std_ulogic_vector(0 to 2);
ac_an_trace_error : out std_ulogic;
rg_rg_any_fir_xstop : out std_ulogic;
an_ac_checkstop : in std_ulogic;
an_ac_malf_alert : in std_ulogic;
iu_pc_err_icache_parity : in std_ulogic;
iu_pc_err_icachedir_parity : in std_ulogic;
iu_pc_err_icachedir_multihit : in std_ulogic;
iu_pc_err_ucode_illegal : in std_ulogic_vector(0 to 3);
xu_pc_err_dcache_parity : in std_ulogic;
xu_pc_err_dcachedir_parity : in std_ulogic;
xu_pc_err_dcachedir_multihit : in std_ulogic;
xu_pc_err_mcsr_summary : in std_ulogic_vector(0 to 3);
xu_pc_err_ierat_parity : in std_ulogic;
xu_pc_err_derat_parity : in std_ulogic;
xu_pc_err_tlb_parity : in std_ulogic;
xu_pc_err_tlb_lru_parity : in std_ulogic;
xu_pc_err_ierat_multihit : in std_ulogic;
xu_pc_err_derat_multihit : in std_ulogic;
xu_pc_err_tlb_multihit : in std_ulogic;
xu_pc_err_ext_mchk : in std_ulogic;
xu_pc_err_ditc_overrun : in std_ulogic;
xu_pc_err_local_snoop_reject : in std_ulogic;
xu_pc_err_sprg_ecc : in std_ulogic_vector(0 to 3);
xu_pc_err_sprg_ue : in std_ulogic_vector(0 to 3);
xu_pc_err_regfile_parity : in std_ulogic_vector(0 to 3);
xu_pc_err_regfile_ue : in std_ulogic_vector(0 to 3);
xu_pc_err_llbust_attempt : in std_ulogic_vector(0 to 3);
xu_pc_err_llbust_failed : in std_ulogic_vector(0 to 3);
xu_pc_err_l2intrf_ecc : in std_ulogic;
xu_pc_err_l2intrf_ue : in std_ulogic;
xu_pc_err_l2credit_overrun : in std_ulogic;
xu_pc_err_wdt_reset : in std_ulogic_vector(0 to 3);
xu_pc_err_attention_instr : in std_ulogic_vector(0 to 3);
xu_pc_err_debug_event : in std_ulogic_vector(0 to 3);
xu_pc_err_nia_miscmpr : in std_ulogic_vector(0 to 3);
xu_pc_err_invld_reld : in std_ulogic;
xu_pc_err_mchk_disabled : in std_ulogic;
bx_pc_err_inbox_ecc : in std_ulogic;
bx_pc_err_inbox_ue : in std_ulogic;
bx_pc_err_outbox_ecc : in std_ulogic;
bx_pc_err_outbox_ue : in std_ulogic;
fu_pc_err_regfile_parity : in std_ulogic_vector(0 to 3);
fu_pc_err_regfile_ue : in std_ulogic_vector(0 to 3);
scom_reg_par_checks : in std_ulogic_vector(0 to 6);
scom_sat_fsm_error : in std_ulogic;
scom_ack_error : in std_ulogic;
sc_parity_error_inject : in std_ulogic;
rg_rg_xstop_report_ovride : in std_ulogic;
rg_rg_ram_mode : in std_ulogic;
rg_rg_ram_mode_xstop : out std_ulogic;
rg_rg_xstop_err : out std_ulogic_vector(0 to 3);
rg_rg_errinj_shutoff : out std_ulogic_vector(0 to 14);
rg_rg_maxRecErrCntrValue : in std_ulogic;
rg_rg_gateRecErrCntr : out std_ulogic;
pc_xu_cache_par_err_event : out std_ulogic;
dbg_fir0_err : out std_ulogic_vector(0 to 31);
dbg_fir1_err : out std_ulogic_vector(0 to 30);
dbg_fir2_err : out std_ulogic_vector(0 to 21);
dbg_fir_misc : out std_ulogic_vector(0 to 35)
);
-- synopsys translate_off
-- synopsys translate_on
end pcq_regs_fir;
architecture pcq_regs_fir of pcq_regs_fir is
constant fir0_width : positive := 32;
constant fir0_init : std_ulogic_vector := x"00000000";
constant fir0mask_init : std_ulogic_vector := x"FFFFFFFF";
constant fir0mask_par_init : std_ulogic_vector := "0";
constant fir0act0_init : std_ulogic_vector := x"00000F00";
constant fir0act0_par_init : std_ulogic_vector := "0";
constant fir0act1_init : std_ulogic_vector := x"FFFFF0FF";
constant fir0act1_par_init : std_ulogic_vector := "0";
constant fir1_width : positive := 32;
constant fir1_init : std_ulogic_vector := x"00000000";
constant fir1mask_init : std_ulogic_vector := x"FFFFFFFF";
constant fir1mask_par_init : std_ulogic_vector := "0";
constant fir1act0_init : std_ulogic_vector := x"3FFFFFFF";
constant fir1act0_par_init : std_ulogic_vector := "0";
constant fir1act1_init : std_ulogic_vector := x"C0000000";
constant fir1act1_par_init : std_ulogic_vector := "0";
constant fir2_width : positive := 22;
constant fir2_init : std_ulogic_vector := x"00000" & "00";
constant fir2mask_init : std_ulogic_vector := x"FFFE0" & "11";
constant fir2mask_par_init : std_ulogic_vector := "1";
constant fir2act0_init : std_ulogic_vector := x"00020" & "00";
constant fir2act0_par_init : std_ulogic_vector := "1";
constant fir2act1_init : std_ulogic_vector := x"0FFC0" & "11";
constant fir2act1_par_init : std_ulogic_vector := "0";
constant scpar_err_rpt_width : positive := 16;
constant scpar_rpt_reset_value : std_ulogic_vector := x"0000";
constant scack_err_rpt_width : positive := 2;
constant scack_rpt_reset_value : std_ulogic_vector := "00";
constant FIR0_bcfg_size : positive := 3*(fir0_width+1)+fir0_width;
constant FIR1_bcfg_size : positive := 3*(fir1_width+1)+fir1_width;
constant FIR2_bcfg_size : positive := 3*(fir2_width+1)+fir2_width;
constant FIR0_func_size : positive := 5;
constant FIR1_func_size : positive := 5;
constant FIR2_func_size : positive := 5;
constant attent_func_size : positive := 4;
constant errout_func_size : positive := 34;
constant bcfg_fir0_offset : natural := 0;
constant bcfg_fir1_offset : natural := bcfg_fir0_offset + FIR0_bcfg_size;
constant bcfg_fir2_offset : natural := bcfg_fir1_offset + FIR1_bcfg_size;
constant bcfg_erpt1_hld_offset : natural := bcfg_fir2_offset + FIR2_bcfg_size;
constant bcfg_erpt1_msk_offset : natural := bcfg_erpt1_hld_offset + scpar_err_rpt_width;
constant bcfg_erpt2_hld_offset : natural := bcfg_erpt1_msk_offset + scpar_err_rpt_width;
constant bcfg_erpt2_msk_offset : natural := bcfg_erpt2_hld_offset + scack_err_rpt_width;
constant bcfg_right : natural := bcfg_erpt2_msk_offset + scack_err_rpt_width - 1;
constant func_fir0_offset : natural := 0;
constant func_fir1_offset : natural := func_fir0_offset + FIR0_func_size;
constant func_fir2_offset : natural := func_fir1_offset + FIR1_func_size;
constant func_attent_offset : natural := func_fir2_offset + FIR2_func_size;
constant func_errout_offset : natural := func_attent_offset + attent_func_size;
constant func_f0err_offset : natural := func_errout_offset + errout_func_size;
constant func_f1err_offset : natural := func_f0err_offset + fir0_width;
constant func_f2err_offset : natural := func_f1err_offset + fir1_width;
constant func_right : natural := func_f2err_offset + fir2_width - 1;
signal tidn, tiup : std_ulogic;
signal tidn_32 : std_ulogic_vector(0 to 31);
signal func_d1clk : std_ulogic;
signal func_d2clk : std_ulogic;
signal func_lclk : clk_logic;
signal func_thold_b : std_ulogic;
signal func_force : std_ulogic;
signal scom_err_rpt_held : std_ulogic_vector(0 to 63);
signal sc_reg_par_err_in : std_ulogic_vector(0 to scpar_err_rpt_width-1);
signal sc_reg_par_err_out : std_ulogic_vector(0 to scpar_err_rpt_width-1);
signal sc_reg_par_err_out_q : std_ulogic_vector(0 to scpar_err_rpt_width-1);
signal sc_reg_par_err_hold : std_ulogic_vector(0 to scpar_err_rpt_width-1);
signal scom_reg_parity_err : std_ulogic;
signal fir_regs_parity_err : std_ulogic;
signal sc_reg_ack_err_in : std_ulogic_vector(0 to scack_err_rpt_width-1);
signal sc_reg_ack_err_out : std_ulogic_vector(0 to scack_err_rpt_width-1);
signal sc_reg_ack_err_out_q : std_ulogic_vector(0 to scack_err_rpt_width-1);
signal sc_reg_ack_err_hold : std_ulogic_vector(0 to scack_err_rpt_width-1);
signal scom_reg_ack_err : std_ulogic;
signal fir0_errors : std_ulogic_vector(0 to fir0_width-1);
signal fir0_errors_q : std_ulogic_vector(0 to fir0_width-1);
signal fir0_fir_out : std_ulogic_vector(0 to fir0_width-1);
signal fir0_act0_out : std_ulogic_vector(0 to fir0_width-1);
signal fir0_act1_out : std_ulogic_vector(0 to fir0_width-1);
signal fir0_mask_out : std_ulogic_vector(0 to fir0_width-1);
signal fir0_scrdata : std_ulogic_vector(0 to fir0_width-1);
signal fir0_xstop_err : std_ulogic;
signal fir0_recov_err : std_ulogic;
signal fir0_lxstop_mchk : std_ulogic;
signal fir0_trace_error : std_ulogic;
signal fir0_block_on_checkstop : std_ulogic;
signal fir0_fir_parity_check : std_ulogic_vector(0 to 2);
signal fir0_recoverable_errors : std_ulogic_vector(0 to fir0_width-1);
signal fir0_recov_err_in : std_ulogic_vector(0 to 1);
signal fir0_recov_err_q : std_ulogic_vector(0 to 1);
signal fir0_recov_err_pulse : std_ulogic;
signal fir0_enabled_checkstops : std_ulogic_vector(32 to 32 + fir0_width-1);
signal fir1_errors : std_ulogic_vector(0 to fir1_width-1);
signal fir1_errors_q : std_ulogic_vector(0 to fir1_width-1);
signal fir1_fir_out : std_ulogic_vector(0 to fir1_width-1);
signal fir1_act0_out : std_ulogic_vector(0 to fir1_width-1);
signal fir1_act1_out : std_ulogic_vector(0 to fir1_width-1);
signal fir1_mask_out : std_ulogic_vector(0 to fir1_width-1);
signal fir1_scrdata : std_ulogic_vector(0 to fir1_width-1);
signal fir1_xstop_err : std_ulogic;
signal fir1_recov_err : std_ulogic;
signal fir1_lxstop_mchk : std_ulogic;
signal fir1_trace_error : std_ulogic;
signal fir1_block_on_checkstop : std_ulogic;
signal fir1_fir_parity_check : std_ulogic_vector(0 to 2);
signal fir1_recoverable_errors : std_ulogic_vector(0 to fir1_width-1);
signal fir1_recov_err_in : std_ulogic_vector(0 to 1);
signal fir1_recov_err_q : std_ulogic_vector(0 to 1);
signal fir1_recov_err_pulse : std_ulogic;
signal fir1_enabled_checkstops : std_ulogic_vector(32 to 32 + fir1_width-1);
signal fir2_errors : std_ulogic_vector(0 to fir2_width-1);
signal fir2_errors_q : std_ulogic_vector(0 to fir2_width-1);
signal fir2_fir_out : std_ulogic_vector(0 to fir2_width-1);
signal fir2_act0_out : std_ulogic_vector(0 to fir2_width-1);
signal fir2_act1_out : std_ulogic_vector(0 to fir2_width-1);
signal fir2_mask_out : std_ulogic_vector(0 to fir2_width-1);
signal fir2_scrdata : std_ulogic_vector(0 to fir2_width-1);
signal fir2_xstop_err : std_ulogic;
signal fir2_recov_err : std_ulogic;
signal fir2_lxstop_mchk : std_ulogic;
signal fir2_trace_error : std_ulogic;
signal fir2_block_on_checkstop : std_ulogic;
signal fir2_fir_parity_check : std_ulogic_vector(0 to 2);
signal fir2_recoverable_errors : std_ulogic_vector(0 to fir2_width-1);
signal fir2_recov_err_in : std_ulogic_vector(0 to 1);
signal fir2_recov_err_q : std_ulogic_vector(0 to 1);
signal fir2_recov_err_pulse : std_ulogic;
signal fir2_enabled_checkstops : std_ulogic_vector(36 to 32 + fir2_width-1);
signal injoff_icache_parity : std_ulogic;
signal injoff_icachedir_parity : std_ulogic;
signal injoff_dcache_parity : std_ulogic;
signal injoff_dcachedir_parity : std_ulogic;
signal injoff_xuregfile_parity : std_ulogic;
signal injoff_furegfile_parity : std_ulogic;
signal injoff_sprg_ecc : std_ulogic;
signal injoff_inbox_ecc : std_ulogic;
signal injoff_outbox_ecc : std_ulogic;
signal injoff_llbust_attempt : std_ulogic;
signal injoff_llbust_failed : std_ulogic;
signal injoff_wdt_reset : std_ulogic;
signal injoff_scomreg_parity : std_ulogic;
signal injoff_icachedir_multihit : std_ulogic;
signal injoff_dcachedir_multihit : std_ulogic;
signal error_inject_shutoff : std_ulogic_vector(0 to 14);
signal xstop_err_int, xstop_err_q : std_ulogic_vector(0 to 2);
signal xstop_out_d, xstop_out_q : std_ulogic_vector(0 to 2);
signal lxstop_err_int, lxstop_err_q : std_ulogic_vector(0 to 2);
signal xstop_err_per_thread : std_ulogic_vector(0 to 3);
signal xstop_err_common : std_ulogic;
signal an_ac_checkstop_q : std_ulogic;
signal maxRecErrCntrValue_errrpt : std_ulogic;
signal block_xstop_in_ram_mode : std_ulogic;
signal atten_instr_q : std_ulogic_vector(0 to 3);
signal bcfg_siv, bcfg_sov : std_ulogic_vector(0 to bcfg_right);
signal func_siv, func_sov : std_ulogic_vector(0 to func_right);
signal unused_signals : std_ulogic;
begin
tiup <= '1';
tidn <= '0';
tidn_32 <= (others => '0');
unused_signals <= or_reduce( fir0_scrdata & fir1_scrdata & fir2_scrdata &
fir1_recoverable_errors(0) & sc_addr_v(9) &
sc_addr_v(29 to 63) & sc_wdata & an_ac_malf_alert );
FIR0: entity work.pcq_local_fir2
generic map( width => fir0_width,
expand_type => expand_type,
impl_lxstop_mchk => false,
use_recov_reset => false,
fir_init => fir0_init,
fir_mask_init => fir0mask_init,
fir_mask_par_init => fir0mask_par_init,
fir_action0_init => fir0act0_init,
fir_action0_par_init => fir0act0_par_init,
fir_action1_init => fir0act1_init,
fir_action1_par_init => fir0act1_par_init
)
port map
( nclk => nclk
, vd => vdd
, gd => gnd
, lcb_clkoff_dc_b => lcb_clkoff_dc_b
, lcb_mpw1_dc_b => lcb_mpw1_dc_b
, lcb_mpw2_dc_b => lcb_mpw2_dc_b
, lcb_delay_lclkr_dc => lcb_delay_lclkr_dc
, lcb_act_dis_dc => lcb_act_dis_dc
, lcb_sg_0 => lcb_sg_0
, lcb_func_slp_sl_thold_0 => lcb_func_slp_sl_thold_0
, lcb_cfg_slp_sl_thold_0 => lcb_cfg_slp_sl_thold_0
, mode_scan_siv => bcfg_siv(bcfg_fir0_offset to bcfg_fir0_offset + FIR0_bcfg_size-1)
, mode_scan_sov => bcfg_sov(bcfg_fir0_offset to bcfg_fir0_offset + FIR0_bcfg_size-1)
, func_scan_siv => func_siv(func_fir0_offset to func_fir0_offset + FIR0_func_size-1)
, func_scan_sov => func_sov(func_fir0_offset to func_fir0_offset + FIR0_func_size-1)
, error_in => fir0_errors_q
, xstop_err => fir0_xstop_err
, recov_err => fir0_recov_err
, lxstop_mchk => fir0_lxstop_mchk
, trace_error => fir0_trace_error
, sys_xstop_in => fir0_block_on_checkstop
, recov_reset => tidn
, fir_out => fir0_fir_out
, act0_out => fir0_act0_out
, act1_out => fir0_act1_out
, mask_out => fir0_mask_out
, sc_parity_error_inject => sc_parity_error_inject
, sc_active => sc_active
, sc_wr_q => sc_wr_q
, sc_addr_v => sc_addr_v(0 to 8)
, sc_wdata => sc_wdata(32 to 32+fir0_width-1)
, sc_wparity => sc_wparity
, sc_rdata => fir0_scrdata
, fir_parity_check => fir0_fir_parity_check
);
fir0_errors <=
iu_pc_err_icache_parity & iu_pc_err_icachedir_parity &
xu_pc_err_dcache_parity & xu_pc_err_dcachedir_parity &
xu_pc_err_sprg_ecc(0 to 3) & xu_pc_err_regfile_parity(0 to 3) &
fu_pc_err_regfile_parity(0 to 3) & bx_pc_err_inbox_ecc &
bx_pc_err_outbox_ecc & scom_reg_parity_err &
scom_reg_ack_err & xu_pc_err_wdt_reset(0 to 3) &
xu_pc_err_llbust_attempt(0 to 3) & xu_pc_err_llbust_failed(0 to 3) ;
fir0_block_on_checkstop <= an_ac_checkstop_q or xstop_err_q(1) or xstop_err_q(2);
FIR1: entity work.pcq_local_fir2
generic map( width => fir1_width,
expand_type => expand_type,
impl_lxstop_mchk => false,
use_recov_reset => false,
fir_init => fir1_init,
fir_mask_init => fir1mask_init,
fir_mask_par_init => fir1mask_par_init,
fir_action0_init => fir1act0_init,
fir_action0_par_init => fir1act0_par_init,
fir_action1_init => fir1act1_init,
fir_action1_par_init => fir1act1_par_init
)
port map
( nclk => nclk
, vd => vdd
, gd => gnd
, lcb_clkoff_dc_b => lcb_clkoff_dc_b
, lcb_mpw1_dc_b => lcb_mpw1_dc_b
, lcb_mpw2_dc_b => lcb_mpw2_dc_b
, lcb_delay_lclkr_dc => lcb_delay_lclkr_dc
, lcb_act_dis_dc => lcb_act_dis_dc
, lcb_sg_0 => lcb_sg_0
, lcb_func_slp_sl_thold_0 => lcb_func_slp_sl_thold_0
, lcb_cfg_slp_sl_thold_0 => lcb_cfg_slp_sl_thold_0
, mode_scan_siv => bcfg_siv(bcfg_fir1_offset to bcfg_fir1_offset + FIR1_bcfg_size-1)
, mode_scan_sov => bcfg_sov(bcfg_fir1_offset to bcfg_fir1_offset + FIR1_bcfg_size-1)
, func_scan_siv => func_siv(func_fir1_offset to func_fir1_offset + FIR1_func_size-1)
, func_scan_sov => func_sov(func_fir1_offset to func_fir1_offset + FIR1_func_size-1)
, error_in => fir1_errors_q
, xstop_err => fir1_xstop_err
, recov_err => fir1_recov_err
, lxstop_mchk => fir1_lxstop_mchk
, trace_error => fir1_trace_error
, sys_xstop_in => fir1_block_on_checkstop
, recov_reset => tidn
, fir_out => fir1_fir_out
, act0_out => fir1_act0_out
, act1_out => fir1_act1_out
, mask_out => fir1_mask_out
, sc_parity_error_inject => sc_parity_error_inject
, sc_active => sc_active
, sc_wr_q => sc_wr_q
, sc_addr_v => sc_addr_v(10 to 18)
, sc_wdata => sc_wdata(32 to 32+fir1_width-1)
, sc_wparity => sc_wparity
, sc_rdata => fir1_scrdata
, fir_parity_check => fir1_fir_parity_check
);
fir1_errors <=
maxRecErrCntrValue_errrpt & xu_pc_err_l2intrf_ecc &
xu_pc_err_l2intrf_ue & xu_pc_err_l2credit_overrun &
xu_pc_err_sprg_ue(0 to 3) & xu_pc_err_regfile_ue(0 to 3) &
fu_pc_err_regfile_ue(0 to 3) & xu_pc_err_nia_miscmpr(0 to 3) &
xu_pc_err_debug_event(0 to 3) & iu_pc_err_ucode_illegal(0 to 3) &
bx_pc_err_inbox_ue & bx_pc_err_outbox_ue &
xu_pc_err_invld_reld & fir_regs_parity_err ;
fir1_block_on_checkstop <= an_ac_checkstop_q or xstop_err_q(0) or xstop_err_q(2);
FIR2: entity work.pcq_local_fir2
generic map( width => fir2_width,
expand_type => expand_type,
impl_lxstop_mchk => false,
use_recov_reset => false,
fir_init => fir2_init,
fir_mask_init => fir2mask_init,
fir_mask_par_init => fir2mask_par_init,
fir_action0_init => fir2act0_init,
fir_action0_par_init => fir2act0_par_init,
fir_action1_init => fir2act1_init,
fir_action1_par_init => fir2act1_par_init
)
port map
( nclk => nclk
, vd => vdd
, gd => gnd
, lcb_clkoff_dc_b => lcb_clkoff_dc_b
, lcb_mpw1_dc_b => lcb_mpw1_dc_b
, lcb_mpw2_dc_b => lcb_mpw2_dc_b
, lcb_delay_lclkr_dc => lcb_delay_lclkr_dc
, lcb_act_dis_dc => lcb_act_dis_dc
, lcb_sg_0 => lcb_sg_0
, lcb_func_slp_sl_thold_0 => lcb_func_slp_sl_thold_0
, lcb_cfg_slp_sl_thold_0 => lcb_cfg_slp_sl_thold_0
, mode_scan_siv => bcfg_siv(bcfg_fir2_offset to bcfg_fir2_offset + FIR2_bcfg_size-1)
, mode_scan_sov => bcfg_sov(bcfg_fir2_offset to bcfg_fir2_offset + FIR2_bcfg_size-1)
, func_scan_siv => func_siv(func_fir2_offset to func_fir2_offset + FIR2_func_size-1)
, func_scan_sov => func_sov(func_fir2_offset to func_fir2_offset + FIR2_func_size-1)
, error_in => fir2_errors_q
, xstop_err => fir2_xstop_err
, recov_err => fir2_recov_err
, lxstop_mchk => fir2_lxstop_mchk
, trace_error => fir2_trace_error
, sys_xstop_in => fir2_block_on_checkstop
, recov_reset => tidn
, fir_out => fir2_fir_out
, act0_out => fir2_act0_out
, act1_out => fir2_act1_out
, mask_out => fir2_mask_out
, sc_parity_error_inject => sc_parity_error_inject
, sc_active => sc_active
, sc_wr_q => sc_wr_q
, sc_addr_v => sc_addr_v(20 to 28)
, sc_wdata => sc_wdata(32 to 32+fir2_width-1)
, sc_wparity => sc_wparity
, sc_rdata => fir2_scrdata
, fir_parity_check => fir2_fir_parity_check
);
fir2_errors <=
xu_pc_err_mcsr_summary(0 to 3) &
xu_pc_err_ierat_parity & xu_pc_err_derat_parity &
xu_pc_err_tlb_parity & xu_pc_err_tlb_lru_parity &
xu_pc_err_ierat_multihit & xu_pc_err_derat_multihit &
xu_pc_err_tlb_multihit & xu_pc_err_ext_mchk &
xu_pc_err_local_snoop_reject & xu_pc_err_ditc_overrun &
xu_pc_err_mchk_disabled & fir2_errors_q(15 to 19) &
iu_pc_err_icachedir_multihit & xu_pc_err_dcachedir_multihit ;
fir2_block_on_checkstop <= an_ac_checkstop_q or xstop_err_q(0) or xstop_err_q(1);
scom_err_rpt_held <= sc_reg_par_err_hold(0 to scpar_err_rpt_width-1) &
sc_reg_ack_err_hold(0 to scack_err_rpt_width-1) &
(scpar_err_rpt_width+scack_err_rpt_width to 63 => '0');
sc_rdata <= gate_and(sc_addr_v(0), tidn_32 & fir0_fir_out) or
gate_and(sc_addr_v(3), tidn_32 & fir0_act0_out) or
gate_and(sc_addr_v(4), tidn_32 & fir0_act1_out) or
gate_and(sc_addr_v(6), tidn_32 & fir0_mask_out) or
gate_and(sc_addr_v(10), tidn_32 & fir1_fir_out) or
gate_and(sc_addr_v(13), tidn_32 & fir1_act0_out) or
gate_and(sc_addr_v(14), tidn_32 & fir1_act1_out) or
gate_and(sc_addr_v(16), tidn_32 & fir1_mask_out) or
gate_and(sc_addr_v(20), tidn_32 & fir2_fir_out & "0000000000") or
gate_and(sc_addr_v(23), tidn_32 & fir2_act0_out & "0000000000") or
gate_and(sc_addr_v(24), tidn_32 & fir2_act1_out & "0000000000") or
gate_and(sc_addr_v(26), tidn_32 & fir2_mask_out & "0000000000") or
gate_and(sc_addr_v(5), scom_err_rpt_held) or
gate_and(sc_addr_v(19), fir0_fir_out & fir1_fir_out) ;
sc_reg_par_err_in <= scom_reg_par_checks & fir0_fir_parity_check &
fir1_fir_parity_check & fir2_fir_parity_check ;
scom_reg_parity_err <= or_reduce(sc_reg_par_err_out(0 to 6));
fir_regs_parity_err <= or_reduce(sc_reg_par_err_out(7 to 15));
scom_err : entity tri.tri_err_rpt
generic map
( width => scpar_err_rpt_width
, mask_reset_value => scpar_rpt_reset_value
, inline => false
, expand_type => expand_type
)
port map
( vd => vdd
, gd => gnd
, err_d1clk => cfgslp_d1clk
, err_d2clk => cfgslp_d2clk
, err_lclk => cfgslp_lclk
, err_scan_in => bcfg_siv(bcfg_erpt1_hld_offset to bcfg_erpt1_hld_offset + scpar_err_rpt_width-1)
, err_scan_out => bcfg_sov(bcfg_erpt1_hld_offset to bcfg_erpt1_hld_offset + scpar_err_rpt_width-1)
, mode_dclk => cfg_slat_d2clk
, mode_lclk => cfg_slat_lclk
, mode_scan_in => bcfg_siv(bcfg_erpt1_msk_offset to bcfg_erpt1_msk_offset + scpar_err_rpt_width-1)
, mode_scan_out => bcfg_sov(bcfg_erpt1_msk_offset to bcfg_erpt1_msk_offset + scpar_err_rpt_width-1)
, err_in => sc_reg_par_err_in
, err_out => sc_reg_par_err_out
, hold_out => sc_reg_par_err_hold
);
sc_reg_ack_err_in <= scom_ack_error & scom_sat_fsm_error;
scom_reg_ack_err <= or_reduce(sc_reg_ack_err_out);
sc_ack_err : entity tri.tri_err_rpt
generic map
( width => scack_err_rpt_width
, mask_reset_value => scack_rpt_reset_value
, inline => false
, expand_type => expand_type
)
port map
( vd => vdd
, gd => gnd
, err_d1clk => cfgslp_d1clk
, err_d2clk => cfgslp_d2clk
, err_lclk => cfgslp_lclk
, err_scan_in => bcfg_siv(bcfg_erpt2_hld_offset to bcfg_erpt2_hld_offset + scack_err_rpt_width-1)
, err_scan_out => bcfg_sov(bcfg_erpt2_hld_offset to bcfg_erpt2_hld_offset + scack_err_rpt_width-1)
, mode_dclk => cfg_slat_d2clk
, mode_lclk => cfg_slat_lclk
, mode_scan_in => bcfg_siv(bcfg_erpt2_msk_offset to bcfg_erpt2_msk_offset + scack_err_rpt_width-1)
, mode_scan_out => bcfg_sov(bcfg_erpt2_msk_offset to bcfg_erpt2_msk_offset + scack_err_rpt_width-1)
, err_in => sc_reg_ack_err_in
, err_out => sc_reg_ack_err_out
, hold_out => sc_reg_ack_err_hold
);
misc_dir_err : entity tri.tri_direct_err_rpt
generic map
( width => 1
, expand_type => expand_type
)
port map
( vd => vdd
, gd => gnd
, err_in(0) => rg_rg_maxRecErrCntrValue
, err_out(0) => maxRecErrCntrValue_errrpt
);
fir0_recoverable_errors <= fir0_errors_q and fir0_act1_out and not fir0_mask_out;
fir0_recov_err_in(0) <= or_reduce(fir0_recoverable_errors);
fir0_recov_err_in(1) <= fir0_recov_err_q(0);
fir0_recov_err_pulse <= fir0_recov_err_q(0) and not fir0_recov_err_q(1);
fir1_recoverable_errors <= fir1_errors_q and fir1_act1_out and not fir1_mask_out;
fir1_recov_err_in(0) <= or_reduce(fir1_recoverable_errors(1 to fir1_width-1));
fir1_recov_err_in(1) <= fir1_recov_err_q(0);
fir1_recov_err_pulse <= fir1_recov_err_q(0) and not fir1_recov_err_q(1);
fir2_recoverable_errors <= fir2_errors_q and fir2_act1_out and not fir2_mask_out;
fir2_recov_err_in(0) <= or_reduce(fir2_recoverable_errors);
fir2_recov_err_in(1) <= fir2_recov_err_q(0);
fir2_recov_err_pulse <= fir2_recov_err_q(0) and not fir2_recov_err_q(1);
fir0_enabled_checkstops <= fir0_fir_out and fir0_act0_out and not fir0_act1_out and not fir0_mask_out;
fir1_enabled_checkstops <= fir1_fir_out and fir1_act0_out and not fir1_act1_out and not fir1_mask_out;
fir2_enabled_checkstops <= fir2_fir_out(4 to fir2_width-1) and
fir2_act0_out(4 to fir2_width-1) and not
fir2_act1_out(4 to fir2_width-1) and not
fir2_mask_out(4 to fir2_width-1) ;
xstop_err_common <= or_reduce(fir0_enabled_checkstops(32 to 35) & fir0_enabled_checkstops(48 to 51)) or
or_reduce(fir1_enabled_checkstops(32 to 35) & fir1_enabled_checkstops(60 to 63)) or
or_reduce(fir2_enabled_checkstops(52 to 53));
xstop_err_per_thread(0) <= fir0_enabled_checkstops(36) or fir0_enabled_checkstops(40) or
fir0_enabled_checkstops(44) or fir0_enabled_checkstops(52) or
fir0_enabled_checkstops(56) or fir0_enabled_checkstops(60) or
fir1_enabled_checkstops(36) or fir1_enabled_checkstops(40) or
fir1_enabled_checkstops(44) or fir1_enabled_checkstops(48) or
fir1_enabled_checkstops(52) or fir1_enabled_checkstops(56) or
(fir2_fir_out(0) and or_reduce(fir2_enabled_checkstops(36 to 51))) or
xstop_err_common;
xstop_err_per_thread(1) <= fir0_enabled_checkstops(37) or fir0_enabled_checkstops(41) or
fir0_enabled_checkstops(45) or fir0_enabled_checkstops(53) or
fir0_enabled_checkstops(57) or fir0_enabled_checkstops(61) or
fir1_enabled_checkstops(37) or fir1_enabled_checkstops(41) or
fir1_enabled_checkstops(45) or fir1_enabled_checkstops(49) or
fir1_enabled_checkstops(53) or fir1_enabled_checkstops(57) or
(fir2_fir_out(1) and or_reduce(fir2_enabled_checkstops(36 to 51))) or
xstop_err_common;
xstop_err_per_thread(2) <= fir0_enabled_checkstops(38) or fir0_enabled_checkstops(42) or
fir0_enabled_checkstops(46) or fir0_enabled_checkstops(54) or
fir0_enabled_checkstops(58) or fir0_enabled_checkstops(62) or
fir1_enabled_checkstops(38) or fir1_enabled_checkstops(42) or
fir1_enabled_checkstops(46) or fir1_enabled_checkstops(50) or
fir1_enabled_checkstops(54) or fir1_enabled_checkstops(58) or
(fir2_fir_out(2) and or_reduce(fir2_enabled_checkstops(36 to 51))) or
xstop_err_common;
xstop_err_per_thread(3) <= fir0_enabled_checkstops(39) or fir0_enabled_checkstops(43) or
fir0_enabled_checkstops(47) or fir0_enabled_checkstops(55) or
fir0_enabled_checkstops(59) or fir0_enabled_checkstops(63) or
fir1_enabled_checkstops(39) or fir1_enabled_checkstops(43) or
fir1_enabled_checkstops(47) or fir1_enabled_checkstops(51) or
fir1_enabled_checkstops(55) or fir1_enabled_checkstops(59) or
(fir2_fir_out(3) and or_reduce(fir2_enabled_checkstops(36 to 51))) or
xstop_err_common;
xstop_err_int(0) <= fir0_xstop_err;
xstop_err_int(1) <= fir1_xstop_err;
xstop_err_int(2) <= fir2_xstop_err;
rg_rg_any_fir_xstop <= or_reduce(xstop_err_int(0 to 2));
lxstop_err_int(0) <= fir0_lxstop_mchk;
lxstop_err_int(1) <= fir1_lxstop_mchk;
lxstop_err_int(2) <= fir2_lxstop_mchk;
block_xstop_in_ram_mode <= rg_rg_xstop_report_ovride and rg_rg_ram_mode;
xstop_out_d(0 to 2) <= gate_and(not block_xstop_in_ram_mode, xstop_err_int(0 to 2));
injoff_icache_parity <= fir0_errors_q(0);
injoff_icachedir_parity <= fir0_errors_q(1);
injoff_dcache_parity <= fir0_errors_q(2);
injoff_dcachedir_parity <= fir0_errors_q(3);
injoff_sprg_ecc <= or_reduce(fir0_errors_q(4 to 7));
injoff_xuregfile_parity <= or_reduce(fir0_errors_q(8 to 11));
injoff_furegfile_parity <= or_reduce(fir0_errors_q(12 to 15));
injoff_inbox_ecc <= fir0_errors_q(16);
injoff_outbox_ecc <= fir0_errors_q(17);
injoff_scomreg_parity <= fir0_errors_q(18);
injoff_wdt_reset <= or_reduce(fir0_errors_q(20 to 23));
injoff_llbust_attempt <= or_reduce(fir0_errors_q(24 to 27));
injoff_llbust_failed <= or_reduce(fir0_errors_q(28 to 31));
injoff_icachedir_multihit <= fir2_errors_q(20);
injoff_dcachedir_multihit <= fir2_errors_q(21);
error_inject_shutoff <= injoff_icache_parity & injoff_icachedir_parity &
injoff_dcache_parity & injoff_dcachedir_parity &
injoff_xuregfile_parity & injoff_furegfile_parity &
injoff_sprg_ecc & injoff_inbox_ecc &
injoff_outbox_ecc & injoff_llbust_attempt &
injoff_llbust_failed & injoff_wdt_reset &
injoff_scomreg_parity & injoff_icachedir_multihit &
injoff_dcachedir_multihit ;
ac_an_special_attn <= atten_instr_q(0 to 3);
ac_an_checkstop <= xstop_out_q(0 to 2);
ac_an_local_checkstop <= lxstop_err_q(0 to 2);
ac_an_recov_err <= fir0_recov_err & fir1_recov_err & fir2_recov_err;
ac_an_trace_error <= fir0_trace_error or fir1_trace_error or fir2_trace_error;
rg_rg_xstop_err <= xstop_err_per_thread(0 to 3);
rg_rg_ram_mode_xstop <= rg_rg_ram_mode and (fir0_xstop_err or fir1_xstop_err or fir2_xstop_err);
rg_rg_errinj_shutoff <= error_inject_shutoff;
rg_rg_gateRecErrCntr <= fir0_recov_err_pulse or fir1_recov_err_pulse or fir2_recov_err_pulse;
pc_xu_cache_par_err_event <= or_reduce(fir0_errors_q(0 to 3));
dbg_fir0_err <= fir0_errors_q;
dbg_fir1_err <= fir1_errors_q(0 to 30);
dbg_fir2_err <= fir2_errors_q;
dbg_fir_misc <= atten_instr_q(0 to 3) &
fir0_xstop_err &
fir1_xstop_err &
fir2_xstop_err &
fir0_recov_err &
fir1_recov_err &
fir2_recov_err &
sc_reg_par_err_out_q(0 to 15) &
sc_reg_ack_err_out_q(0 to 1) &
xstop_err_per_thread(0 to 3) &
block_xstop_in_ram_mode &
fir0_recov_err_pulse &
fir1_recov_err_pulse &
fir2_recov_err_pulse ;
atten_instr : entity tri.tri_nlat_scan
generic map( width => attent_func_size, init => "0000", expand_type => expand_type )
port map
( d1clk => func_d1clk
, vd => vdd
, gd => gnd
, lclk => func_lclk
, d2clk => func_d2clk
, scan_in => func_siv(func_attent_offset to func_attent_offset + attent_func_size-1)
, scan_out => func_sov(func_attent_offset to func_attent_offset + attent_func_size-1)
, din => xu_pc_err_attention_instr
, q => atten_instr_q
);
error_out : entity tri.tri_nlat_scan
generic map( width => errout_func_size, init => x"00000000" & "00", expand_type => expand_type )
port map
( d1clk => func_d1clk
, vd => vdd
, gd => gnd
, lclk => func_lclk
, d2clk => func_d2clk
, scan_in => func_siv(func_errout_offset to func_errout_offset + errout_func_size-1)
, scan_out => func_sov(func_errout_offset to func_errout_offset + errout_func_size-1)
, din(0 to 2) => xstop_err_int
, din(3 to 5) => xstop_out_d
, din(6 to 8) => lxstop_err_int
, din(9 to 10) => fir0_recov_err_in
, din(11 to 12) => fir1_recov_err_in
, din(13 to 14) => fir2_recov_err_in
, din(15) => an_ac_checkstop
, din(16 to 31) => sc_reg_par_err_out
, din(32 to 33) => sc_reg_ack_err_out
, q(0 to 2) => xstop_err_q
, q(3 to 5) => xstop_out_q
, q(6 to 8) => lxstop_err_q
, q(9 to 10) => fir0_recov_err_q
, q(11 to 12) => fir1_recov_err_q
, q(13 to 14) => fir2_recov_err_q
, q(15) => an_ac_checkstop_q
, q(16 to 31) => sc_reg_par_err_out_q
, q(32 to 33) => sc_reg_ack_err_out_q
);
f0err_out : entity tri.tri_nlat_scan
generic map( width => fir0_width, init => fir0_init, expand_type => expand_type )
port map
( d1clk => func_d1clk
, vd => vdd
, gd => gnd
, lclk => func_lclk
, d2clk => func_d2clk
, scan_in => func_siv(func_f0err_offset to func_f0err_offset + fir0_width-1)
, scan_out => func_sov(func_f0err_offset to func_f0err_offset + fir0_width-1)
, din => fir0_errors
, q => fir0_errors_q
);
f1err_out : entity tri.tri_nlat_scan
generic map( width => fir1_width, init => fir1_init, expand_type => expand_type )
port map
( d1clk => func_d1clk
, vd => vdd
, gd => gnd
, lclk => func_lclk
, d2clk => func_d2clk
, scan_in => func_siv(func_f1err_offset to func_f1err_offset + fir1_width-1)
, scan_out => func_sov(func_f1err_offset to func_f1err_offset + fir1_width-1)
, din => fir1_errors
, q => fir1_errors_q
);
f2err_out : entity tri.tri_nlat_scan
generic map( width => fir2_width, init => fir2_init, expand_type => expand_type )
port map
( d1clk => func_d1clk
, vd => vdd
, gd => gnd
, lclk => func_lclk
, d2clk => func_d2clk
, scan_in => func_siv(func_f2err_offset to func_f2err_offset + fir2_width-1)
, scan_out => func_sov(func_f2err_offset to func_f2err_offset + fir2_width-1)
, din => fir2_errors
, q => fir2_errors_q
);
func_lcbor: entity tri.tri_lcbor
generic map (expand_type => expand_type )
port map( clkoff_b => lcb_clkoff_dc_b,
thold => lcb_func_slp_sl_thold_0,
sg => lcb_sg_0,
act_dis => lcb_act_dis_dc,
forcee => func_force,
thold_b => func_thold_b
);
func_lcb: entity tri.tri_lcbnd
generic map (expand_type => expand_type )
port map( act => tiup,
vd => vdd,
gd => gnd,
delay_lclkr => lcb_delay_lclkr_dc,
mpw1_b => lcb_mpw1_dc_b,
mpw2_b => lcb_mpw2_dc_b,
nclk => nclk,
forcee => func_force,
sg => lcb_sg_0,
thold_b => func_thold_b,
d1clk => func_d1clk,
d2clk => func_d2clk,
lclk => func_lclk
);
bcfg_siv(0 to bcfg_right) <= bcfg_scan_in & bcfg_sov(0 to bcfg_right-1);
bcfg_scan_out <= bcfg_sov(bcfg_right);
func_siv(0 to func_right) <= func_scan_in & func_sov(0 to func_right-1);
func_scan_out <= func_sov(func_right);
end pcq_regs_fir;