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.
981 lines
52 KiB
VHDL
981 lines
52 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.
|
|
|
|
--
|
|
-- Description: Pervasive Core FIR + Error Reporting Function
|
|
--
|
|
--*****************************************************************************
|
|
|
|
library ieee;
|
|
use ieee.std_logic_1164.all;
|
|
library ibm;
|
|
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); -- 0=ibm (Umbra), 1=non-ibm, 2=ibm (MPG)
|
|
|
|
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;
|
|
-- SCOM Satellite Interface
|
|
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);
|
|
-- FIR and Error Signals
|
|
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;
|
|
-- Performance Event Signals
|
|
pc_xu_cache_par_err_event : out std_ulogic;
|
|
-- Trace/Trigger Signals
|
|
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
|
|
--=====================================================================
|
|
-- Signal Declarations
|
|
--=====================================================================
|
|
-- FIR0 Init Values
|
|
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";
|
|
-- FIR1 Init Values
|
|
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";
|
|
-- FIR2 Init Values
|
|
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";
|
|
-- Common Init Values
|
|
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";
|
|
|
|
-- Scan Ring Ordering:
|
|
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;
|
|
-- start of bcfg scan chain ordering
|
|
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;
|
|
-- end of bcfg scan chain ordering
|
|
-- start of func scan chain ordering
|
|
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;
|
|
-- end of func scan chain ordering
|
|
|
|
-----------------------------------------------------------------------
|
|
-- Basic/Misc signals
|
|
signal tidn, tiup : std_ulogic;
|
|
signal tidn_32 : std_ulogic_vector(0 to 31);
|
|
-- Clocks
|
|
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;
|
|
-- SCOM
|
|
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;
|
|
-- FIR0
|
|
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);
|
|
-- FIR1
|
|
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);
|
|
-- FIR2
|
|
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);
|
|
-- Error Inject Shutoff
|
|
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);
|
|
-- MISC
|
|
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 Instantiation
|
|
--=====================================================================
|
|
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
|
|
-- Global lines for clocking and scan control
|
|
( 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 -- not power-managed
|
|
, lcb_cfg_slp_sl_thold_0 => lcb_cfg_slp_sl_thold_0 -- not power-managed
|
|
, 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)
|
|
-- external interface
|
|
, error_in => fir0_errors_q -- needs to be directly off a latch for timing
|
|
, xstop_err => fir0_xstop_err -- checkstop output to Global FIR
|
|
, recov_err => fir0_recov_err -- recoverable output to Global FIR
|
|
, lxstop_mchk => fir0_lxstop_mchk -- use ONLY if impl_lxstop_mchk = true
|
|
, trace_error => fir0_trace_error -- connect to error_input of closest trdata macro
|
|
, sys_xstop_in => fir0_block_on_checkstop -- freeze FIR on other checkstop errors
|
|
, recov_reset => tidn -- only needed if use_recov_reset = true
|
|
, fir_out => fir0_fir_out -- output of current FIR state if needed
|
|
, act0_out => fir0_act0_out -- output of current FIR ACT0 if needed
|
|
, act1_out => fir0_act1_out -- output of current FIR ACT1 if needed
|
|
, mask_out => fir0_mask_out -- output of current FIR MASK if needed
|
|
, sc_parity_error_inject => sc_parity_error_inject -- Force parity error
|
|
-- scom register connections
|
|
, 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
|
|
);
|
|
|
|
-----------------------------------------------------------------------
|
|
-- Error Input Facility
|
|
fir0_errors <=
|
|
iu_pc_err_icache_parity & iu_pc_err_icachedir_parity & -- 0:1
|
|
xu_pc_err_dcache_parity & xu_pc_err_dcachedir_parity & -- 2:3
|
|
xu_pc_err_sprg_ecc(0 to 3) & xu_pc_err_regfile_parity(0 to 3) & -- 4:11
|
|
fu_pc_err_regfile_parity(0 to 3) & bx_pc_err_inbox_ecc & -- 12:16
|
|
bx_pc_err_outbox_ecc & scom_reg_parity_err & -- 17:18
|
|
scom_reg_ack_err & xu_pc_err_wdt_reset(0 to 3) & -- 19:23
|
|
xu_pc_err_llbust_attempt(0 to 3) & xu_pc_err_llbust_failed(0 to 3) ; -- 24:31
|
|
|
|
-- Block FIR on checkstop (external input or from other FIRs)
|
|
fir0_block_on_checkstop <= an_ac_checkstop_q or xstop_err_q(1) or xstop_err_q(2);
|
|
|
|
|
|
--=====================================================================
|
|
-- FIR1 Instantiation
|
|
--=====================================================================
|
|
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
|
|
-- Global lines for clocking and scan control
|
|
( 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 -- not power-managed
|
|
, lcb_cfg_slp_sl_thold_0 => lcb_cfg_slp_sl_thold_0 -- not power-managed
|
|
, 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)
|
|
-- external interface
|
|
, error_in => fir1_errors_q -- needs to be directly off a latch for timing
|
|
, xstop_err => fir1_xstop_err -- checkstop output to Global FIR
|
|
, recov_err => fir1_recov_err -- recoverable output to Global FIR
|
|
, lxstop_mchk => fir1_lxstop_mchk -- use ONLY if impl_lxstop_mchk = true
|
|
, trace_error => fir1_trace_error -- connect to error_input of closest trdata macro
|
|
, sys_xstop_in => fir1_block_on_checkstop -- freeze FIR on other checkstop errors
|
|
, recov_reset => tidn -- only needed if use_recov_reset = true
|
|
, fir_out => fir1_fir_out -- output of current FIR state if needed
|
|
, act0_out => fir1_act0_out -- output of current FIR ACT0 if needed
|
|
, act1_out => fir1_act1_out -- output of current FIR ACT1 if needed
|
|
, mask_out => fir1_mask_out -- output of current FIR MASK if needed
|
|
, sc_parity_error_inject => sc_parity_error_inject -- Force parity error
|
|
-- scom register connections
|
|
, 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
|
|
);
|
|
|
|
-----------------------------------------------------------------------
|
|
-- Error Input Facility
|
|
fir1_errors <=
|
|
maxRecErrCntrValue_errrpt & xu_pc_err_l2intrf_ecc & -- 0:1
|
|
xu_pc_err_l2intrf_ue & xu_pc_err_l2credit_overrun & -- 2:3
|
|
xu_pc_err_sprg_ue(0 to 3) & xu_pc_err_regfile_ue(0 to 3) & -- 4:11
|
|
fu_pc_err_regfile_ue(0 to 3) & xu_pc_err_nia_miscmpr(0 to 3) & -- 12:19
|
|
xu_pc_err_debug_event(0 to 3) & iu_pc_err_ucode_illegal(0 to 3) & -- 20:27
|
|
bx_pc_err_inbox_ue & bx_pc_err_outbox_ue & -- 28:29
|
|
xu_pc_err_invld_reld & fir_regs_parity_err ; -- 30:31
|
|
|
|
|
|
-----------------------------------------------------------------------
|
|
-- Block FIR on checkstop (external input or from other FIRs)
|
|
fir1_block_on_checkstop <= an_ac_checkstop_q or xstop_err_q(0) or xstop_err_q(2);
|
|
|
|
|
|
--=====================================================================
|
|
-- FIR2 Instantiation
|
|
--=====================================================================
|
|
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
|
|
-- Global lines for clocking and scan control
|
|
( 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 -- not power-managed
|
|
, lcb_cfg_slp_sl_thold_0 => lcb_cfg_slp_sl_thold_0 -- not power-managed
|
|
, 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)
|
|
-- external interface
|
|
, error_in => fir2_errors_q -- needs to be directly off a latch for timing
|
|
, xstop_err => fir2_xstop_err -- checkstop output to Global FIR
|
|
, recov_err => fir2_recov_err -- recoverable output to Global FIR
|
|
, lxstop_mchk => fir2_lxstop_mchk -- use ONLY if impl_lxstop_mchk = true
|
|
, trace_error => fir2_trace_error -- connect to error_input of closest trdata macro
|
|
, sys_xstop_in => fir2_block_on_checkstop -- freeze FIR on other checkstop errors
|
|
, recov_reset => tidn -- only needed if use_recov_reset = true
|
|
, fir_out => fir2_fir_out -- output of current FIR state if needed
|
|
, act0_out => fir2_act0_out -- output of current FIR ACT0 if needed
|
|
, act1_out => fir2_act1_out -- output of current FIR ACT1 if needed
|
|
, mask_out => fir2_mask_out -- output of current FIR MASK if needed
|
|
, sc_parity_error_inject => sc_parity_error_inject -- Force parity error
|
|
-- scom register connections
|
|
, 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
|
|
);
|
|
|
|
|
|
-----------------------------------------------------------------------
|
|
-- Error Input Facility
|
|
fir2_errors <=
|
|
xu_pc_err_mcsr_summary(0 to 3) & -- 0:3
|
|
xu_pc_err_ierat_parity & xu_pc_err_derat_parity & -- 4:5
|
|
xu_pc_err_tlb_parity & xu_pc_err_tlb_lru_parity & -- 6:7
|
|
xu_pc_err_ierat_multihit & xu_pc_err_derat_multihit & -- 8:9
|
|
xu_pc_err_tlb_multihit & xu_pc_err_ext_mchk & -- 10:11
|
|
xu_pc_err_local_snoop_reject & xu_pc_err_ditc_overrun & -- 12:13
|
|
xu_pc_err_mchk_disabled & fir2_errors_q(15 to 19) & -- 14:19 spares (wrapback dout=>din)
|
|
iu_pc_err_icachedir_multihit & xu_pc_err_dcachedir_multihit ; -- 20:21
|
|
|
|
|
|
-----------------------------------------------------------------------
|
|
-- Block FIR on checkstop (external input or from other FIRs)
|
|
fir2_block_on_checkstop <= an_ac_checkstop_q or xstop_err_q(0) or xstop_err_q(1);
|
|
|
|
|
|
--=====================================================================
|
|
-- SCOM Register Read
|
|
--=====================================================================
|
|
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) ;
|
|
|
|
|
|
--=====================================================================
|
|
-- Error Related Signals
|
|
--=====================================================================
|
|
-- SCOM parity error reporting macro
|
|
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
|
|
) -- use to bundle error reporting checkers of the same exact type
|
|
port map
|
|
( vd => vdd
|
|
, gd => gnd
|
|
, err_d1clk => cfgslp_d1clk -- CAUTION: if LCB uses powersavings,
|
|
, err_d2clk => cfgslp_d2clk -- errors must always get reported
|
|
, 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
|
|
);
|
|
|
|
-----------------------------------------------------------------------
|
|
-- SCOM control error reporting macro
|
|
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
|
|
) -- use to bundle error reporting checkers of the same exact type
|
|
port map
|
|
( vd => vdd
|
|
, gd => gnd
|
|
, err_d1clk => cfgslp_d1clk -- CAUTION: if LCB uses powersavings,
|
|
, err_d2clk => cfgslp_d2clk -- errors must always get reported
|
|
, 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
|
|
);
|
|
|
|
-----------------------------------------------------------------------
|
|
-- Other error reporting macros
|
|
|
|
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
|
|
);
|
|
|
|
|
|
-----------------------------------------------------------------------
|
|
-- Error related facilities used in other functions
|
|
-- FIR0 Errors that increment the recoverable error counter
|
|
-- Only use fir0_act1_out so that a local_checkstop will count as a recoverable error.
|
|
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);
|
|
-- Only indicates 1 recoverable error pulse if error input active multiple cycles
|
|
fir0_recov_err_pulse <= fir0_recov_err_q(0) and not fir0_recov_err_q(1);
|
|
|
|
|
|
-- FIR1 Errors that increment the recoverable error counter
|
|
-- Only use fir1_act1_out so that a local_checkstop will count as a recoverable error.
|
|
fir1_recoverable_errors <= fir1_errors_q and fir1_act1_out and not fir1_mask_out;
|
|
-- Leaving maxRecErrCntrValue (FIR1(0)) out of input that gates recoverable error counter.
|
|
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);
|
|
-- Only indicates 1 recoverable error pulse if error input active multiple cycles
|
|
fir1_recov_err_pulse <= fir1_recov_err_q(0) and not fir1_recov_err_q(1);
|
|
|
|
|
|
-- FIR2 Errors that increment the recoverable error counter
|
|
-- Only use fir2_act1_out so that a local_checkstop will count as a recoverable error.
|
|
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);
|
|
-- Only indicates 1 recoverable error pulse if error input active multiple cycles
|
|
fir2_recov_err_pulse <= fir2_recov_err_q(0) and not fir2_recov_err_q(1);
|
|
|
|
|
|
-- Enabled checkstop errors used to stop failing thread.
|
|
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 -- F!R2(36 to 53)
|
|
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) ;
|
|
|
|
-----------------------------------------------------------------------
|
|
-- Determines how errors will force failing thread(s) to stop if configured as checkstop:
|
|
-- This is based on the error bit definition in each FIR (thread specific or per core).
|
|
--
|
|
-- T0 FIR0(36,40,44,52,56,60) FIR1(36,40,44,48,52,56) FIR2(32 and 36:51)
|
|
-- T1 FIR0(37,41,45,53,57,61) FIR1(37,41,45,49,53,57) FIR2(33 and 36:51)
|
|
-- T2 FIR0(38,42,46,54,58,62) FIR1(38,42,46,50,54,58) FIR2(34 and 36:51)
|
|
-- T3 FIR0(39,43,47,55,59,63) FIR1(39,43,47,51,55,59) FIR2(35 and 36:51)
|
|
-- Per core FIR0(32:35,48:51) FIR1(32:35,60:63) FIR2(52:53)
|
|
--
|
|
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;
|
|
|
|
-----------------------------------------------------------------------
|
|
-- Report xstop + lxstop errors to Chiplet FIR. Can bypass in Ram mode if override signal active.
|
|
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));
|
|
|
|
-----------------------------------------------------------------------
|
|
-- Error injection shutoff control signals
|
|
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 ;
|
|
|
|
|
|
--=====================================================================
|
|
-- Output Assignments
|
|
--=====================================================================
|
|
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;
|
|
|
|
-- Combined performance event for I-Cache and D-Cache parity errors
|
|
pc_xu_cache_par_err_event <= or_reduce(fir0_errors_q(0 to 3));
|
|
|
|
|
|
--=====================================================================
|
|
-- Trace/Trigger Signals
|
|
--=====================================================================
|
|
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) & -- 0:3
|
|
fir0_xstop_err & -- 4
|
|
fir1_xstop_err & -- 5
|
|
fir2_xstop_err & -- 6
|
|
fir0_recov_err & -- 7
|
|
fir1_recov_err & -- 8
|
|
fir2_recov_err & -- 9
|
|
sc_reg_par_err_out_q(0 to 15) & -- 10:25
|
|
sc_reg_ack_err_out_q(0 to 1) & -- 26:27
|
|
xstop_err_per_thread(0 to 3) & -- 28:31
|
|
block_xstop_in_ram_mode & -- 32
|
|
fir0_recov_err_pulse & -- 33
|
|
fir1_recov_err_pulse & -- 34
|
|
fir2_recov_err_pulse ; -- 35
|
|
|
|
|
|
|
|
--=====================================================================
|
|
-- Latches
|
|
--=====================================================================
|
|
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
|
|
);
|
|
|
|
|
|
--=====================================================================
|
|
-- LCBs
|
|
--=====================================================================
|
|
-- functional ring regs; NOT power managed
|
|
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, -- not power saved
|
|
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
|
|
);
|
|
|
|
|
|
--=====================================================================
|
|
-- Scan Connections
|
|
--=====================================================================
|
|
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;
|