// ========== Copyright Header Begin ==========================================
// OpenSPARC T2 Processor File: tlu_asi_ctl.v
// Copyright (C) 1995-2007 Sun Microsystems, Inc. All Rights Reserved
// 4150 Network Circle, Santa Clara, California 95054, U.S.A.
// * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; version 2 of the License.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
// For the avoidance of doubt, and except that if any non-GPL license
// choice is available it will apply instead, Sun elects to use only
// the General Public License version 2 (GPLv2) at this time for any
// software where a choice of GPL license versions is made
// available with the language indicating that GPLv2 or any later version
// may be used, or where a choice of which version of the GPL is applied is
// otherwise unspecified.
// Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
// CA 95054 USA or visit www.sun.com if you need additional information or
// ========== Copyright Header End ============================================
asi_tsa_wr_data_npc_oor_va,
asi_tsa_wr_data_npc_nonseq,
wire stg1_en_lat_scanout;
wire stg2_en_lat_scanout;
wire stg3_en_lat_scanout;
wire stg4_en_lat_scanout;
wire mbist_run_lat_scanin;
wire mbist_run_lat_scanout;
wire mbist_tsa0_write_lat_scanin;
wire mbist_tsa0_write_lat_scanout;
wire mbist_tsa1_write_lat_scanin;
wire mbist_tsa1_write_lat_scanout;
wire mbist_tca_write_lat_scanin;
wire mbist_tca_write_lat_scanout;
wire mbist_addr_lat_scanin;
wire mbist_addr_lat_scanout;
wire mbist_tsa0_read_lat_scanin;
wire mbist_tsa0_read_lat_scanout;
wire mbist_tsa1_read_lat_scanin;
wire mbist_tsa1_read_lat_scanout;
wire mbist_tca_read_lat_scanin;
wire mbist_tca_read_lat_scanout;
wire mbist_cmpsel_lat_scanin;
wire mbist_cmpsel_lat_scanout;
wire [7:0] mbist_wdata_2;
wire mbist_addr_2_lat_scanin;
wire mbist_addr_2_lat_scanout;
wire mbist_tsa0_read_2_lat_scanin;
wire mbist_tsa0_read_2_lat_scanout;
wire mbist_tsa1_read_2_lat_scanin;
wire mbist_tsa1_read_2_lat_scanout;
wire mbist_tca_read_2_lat_scanin;
wire mbist_tca_read_2_lat_scanout;
wire mbist_cmpsel_2_lat_scanin;
wire mbist_cmpsel_2_lat_scanout;
wire [3:0] mbist_cmpsel_2;
wire mbist_wdata_2_lat_scanin;
wire mbist_wdata_2_lat_scanout;
wire mbist_tsa0_read_3_lat_scanin;
wire mbist_tsa0_read_3_lat_scanout;
wire mbist_tsa1_read_3_lat_scanin;
wire mbist_tsa1_read_3_lat_scanout;
wire mbist_tca_read_3_lat_scanin;
wire mbist_tca_read_3_lat_scanout;
wire mbist_wdata_3_lat_scanin;
wire mbist_wdata_3_lat_scanout;
wire [7:0] mbist_wdata_3;
wire mbist_tsa0_read_4_lat_scanin;
wire mbist_tsa0_read_4_lat_scanout;
wire mbist_tsa1_read_4_lat_scanin;
wire mbist_tsa1_read_4_lat_scanout;
wire [7:0] compare_data_in;
wire compare_data_lat_scanin;
wire compare_data_lat_scanout;
wire tsa0_fail_lat_scanin;
wire tsa0_fail_lat_scanout;
wire tsa1_fail_lat_scanin;
wire tsa1_fail_lat_scanout;
wire tca_fail_lat_scanin;
wire tca_fail_lat_scanout;
wire compare_lat_scanout;
wire [1:0] preempt_done_retry_in;
wire [1:0] preempt_trap_in;
wire preempt_trap_lat_scanin;
wire preempt_trap_lat_scanout;
wire [1:0] preempt_done_retry;
wire [63:48] clfesr_data;
wire clfesr_lat_wmr_scanin;
wire clfesr_lat_wmr_scanout;
wire rng_stg1_data_scanin;
wire rng_stg1_data_scanout;
wire hpstatehpriv_lat_scanin;
wire hpstatehpriv_lat_scanout;
wire pstatepriv_lat_scanin;
wire pstatepriv_lat_scanout;
wire fast_tsa_rd_iqr_res_nonres;
wire wr_nonres_err_head_2;
wire wr_nonres_err_tail_2;
wire wr_nonres_err_head_3;
wire wr_nonres_err_tail_3;
wire rd_nonres_err_head_2;
wire rd_nonres_err_tail_2;
wire stg2_data_lat_scanin;
wire stg2_data_lat_scanout;
wire stg2_ctl_lat_scanin;
wire stg2_ctl_lat_scanout;
wire wr_tid_dec_lat_scanin;
wire wr_tid_dec_lat_scanout;
wire [47:0] mbist_tsa_wdata;
wire irl_any_cleared_lat_scanin;
wire irl_any_cleared_lat_scanout;
wire tick_npt_inv_lat_scanin;
wire tick_npt_inv_lat_scanout;
wire tick_npt_3_inv_lat_scanin;
wire tick_npt_3_inv_lat_scanout;
wire [63:46] decr_reg_in;
wire [64:0] tba_htba_data;
wire [64:0] tsa_nopc_data;
wire [64:0] tsa_ecc_data;
wire [64:0] tic_data_for_3;
wire [64:0] rngf_cdbus_2;
wire kill_write_if_error_in;
wire kill_write_if_error;
wire tca_rd_addr_2_lat_scanin;
wire tca_rd_addr_2_lat_scanout;
wire [4:3] tca_rd_addr_2;
wire tca_rd_addr_3_lat_scanin;
wire tca_rd_addr_3_lat_scanout;
wire [4:3] tca_rd_addr_3;
wire tca_rd_addr_4_lat_scanin;
wire tca_rd_addr_4_lat_scanout;
wire [4:3] tca_rd_addr_4;
wire [64:0] rngf_cdbus_3;
wire error_4_lat_scanout;
wire [3:0] check_qr_exc_in;
wire check_qr_exc_lat_scanin;
wire check_qr_exc_lat_scanout;
wire error_inject_lat_scanin;
wire error_inject_lat_scanout;
wire [7:0] write_lsu_ctl;
wire [7:0] spec_enable_in;
wire spec_enable_lat_scanin;
wire spec_enable_lat_scanout;
wire [7:0] immu_enable_in;
wire immu_enable_lat_scanin;
wire immu_enable_lat_scanout;
input spc_aclk_wmr; // Warm reset (non)scan
input lsu_asi_clken; // Power management
input lsu_tlu_pmen; // Power management
input mbi_tsa0_write_en; // MBIST write control
input mbi_tsa1_write_en; // MBIST write control
input mbi_tca_write_en; // MBIST write control
input [4:0] mbi_addr; // 32 entry addressability for MBIST
input mbi_run; // Select MBIST controls
input [7:0] mbi_wdata; // MBIST write data
input mbi_tsa0_read_en; // MBIST read control
input mbi_tsa1_read_en; // MBIST read control
input mbi_tca_read_en; // MBIST read control
input [3:0] mbi_tlu_cmpsel; // Mux (NPE) between 32 bit chunks
input error_inject_enable;
input [7:0] error_inject_mask;
input [64:0] lsu_rngf_cdbus; // control/data bus from lsu
input [48:2] pct0_asi_data;
input [48:2] pct1_asi_data;
input [16:0] trl0_asi_data;
input [16:0] trl1_asi_data;
input [7:0] tlu_ceter_pscce;
input [7:0] tsd_hpstate_hpriv;
input [7:0] tsd_pstate_priv;
input [1:0] tsd0_asi_data;
input [1:0] tsd1_asi_data;
input [63:0] tic_asi_data;
input [63:0] cer_asi_data;
input [64:0] mmu_asi_data; // ASI read data for fast bus
input mmu_asi_read; // Valid for MMU ASI read
input mmu_asi_cecc; // Correctable ECC error (stg 4)
input mmu_asi_uecc; // Uncorrectable ECC error (stg 4)
input [7:0] tlu_lsu_clear_ctl_reg_;
input [3:0] hver_mask_major_rev; // An input to asi
input [3:0] hver_mask_minor_rev; // An input to spc
output [7:0] asi_error_mask;
output [4:0] asi_tsa_rd_addr;
output asi_tsa_rd_iqr_ecc;
output [1:0] asi_tsa_tid;
output [7:0] asi_rd_asireg;
output [7:0] asi_wr_asireg;
output [7:0] asi_wr_set_softint;
output [7:0] asi_wr_clear_softint;
output [7:0] asi_rd_softint;
output [7:0] asi_wr_softint;
output [4:0] asi_tca_addr; // Used for [H][S]TICK_CMPR
output asi_tca_addr_valid;
output [1:0] asi_wr_mondo_head;
output [1:0] asi_wr_mondo_tail;
output [1:0] asi_wr_device_head;
output [1:0] asi_wr_device_tail;
output [1:0] asi_wr_res_err_head;
output [1:0] asi_wr_res_err_tail;
output [1:0] asi_wr_nonres_err_head;
output [1:0] asi_wr_nonres_err_tail;
output [1:0] asi_rd_iqr_reg;
output [2:0] asi_rd_iqr; // Read any interrupt queue reg
output [1:0] asi_rd_tpc; // encoded TID for IQR read
output [1:0] asi_rd_tnpc;
output [1:0] asi_wr_tnpc;
output [1:0] asi_rd_tstate;
output [1:0] asi_wr_tstate;
output [7:0] asi_wr_pstate;
output [7:0] asi_wr_hpstate;
output [1:0] asi_rd_htstate;
output [1:0] asi_wr_htstate;
output [7:0] asi_rd_hintp;
output [7:0] asi_wr_hintp;
output [7:0] asi_wr_htba;
output [2:0] asi_rd_h_pstate_tba;
output [1:0] asi_rd_tba_htba;
output [1:0] asi_rd_pstate_hpstate;
output [1:0] asi_preempt_trap;
output [1:0] asi_preempt_done_retry;
output [1:0] asi_rmw_tsa;
output [7:0] asi_wr_int_rec; // Write Interrupt Receive Register
output asi_wr_any_int_rec; // Write any Interrupt Receive Register
output [7:0] asi_rd_inc_vec_2; // Update Interrupt Vector Register
output [2:0] asi_int_rec_mux_sel_in;
output asi_rd_int_rec; // Read for any thread
output asi_rd_inc_vec; // Read for any thread
output [7:0] asi_check_qr_exc; // Check for Interrupt Queue Register
// head vs. tail mismatch
output asi_tca_wr_data_63; // stored negative active
output [63:0] asi_wr_data_0; // data to write
output [62:0] asi_wr_data_1; // data to write
output asi_tsd0_wr_data_12;
output [10:8] asi_tsd0_wr_data_10_08;
output [5:0] asi_tsd0_wr_data_05_00;
output asi_tsd1_wr_data_12;
output [10:8] asi_tsd1_wr_data_10_08;
output [5:0] asi_tsd1_wr_data_05_00;
output [47:0] asi_tsa_wr_data;
output asi_tsa_wr_data_npc_oor_va;
output asi_tsa_wr_data_npc_nonseq;
output [2:0] asi_ceter_tid;
output [7:0] asi_wr_isfsr;
output [7:0] asi_wr_dsfsr;
output [7:0] asi_wr_dsfar;
output asi_ece_exc; // Correctable ECC error on ASI rd/wr
output asi_eue_exc; // Uncorrectable ECC error on ASI rd/wr
output [2:0] asi_ecc_tid; // TID for ECC error
output asi_tsac; // For DSFSR
output [1:0] asi_tsacu; // For killing TSA writes
output [2:0] asi_tsacu_tid;
output [7:0] asi_irl_cleared; // Int_Received Reg had bits cleared
output asi_rd_stage_1; // Power management: read in stage 1
output [1:0] asi_trl_pstate_en; // Power management: h/pstate flop
output asi_stg1_en; // Power management: TCA wr data flop
output [7:0] asi_mbist_ecc_in; // MBIST
output [7:0] asi_mbist_tsa_ecc_in; // MBIST
output asi_mbist_run; // MBIST
output [3:0] asi_mbist_cmpsel; // MBIST
output [7:0] asi_mbd_compare_data; // MBIST
output asi_mbd_sel_tsd0; // MBIST
output asi_mbd_sel_tsd1; // MBIST
output asi_mbd_sel_tic; // MBIST
output [4:0] asi_mbist_addr; // MBIST
output [1:0] asi_mbist_tsa_rd_en; // MBIST
output [1:0] asi_mbist_tsa_wr_en; // MBIST
output [1:0] asi_mbist_tel_en; // MBIST
output [7:0] asi_immu_enable;
output [7:0] asi_spec_enable;
output [7:0] asi_clear_spu_trap_req;
output [7:0] tlu_spec_enable;
output [2:0] tlu_tca_tid;
output [1:0] tlu_tca_index; // Index for precise TCA errors
output tlu_mbi_tsa0_fail; // MBIST
output tlu_mbi_tsa1_fail; // MBIST
output tlu_mbi_tca_fail; // MBIST
output [64:0] tlu_rngf_cdbus; // 65 bit control/data bus
// 61:60 - 00-ASI, 01-ASR, 10-PR,11-HPR
// 47:0 - Virtual Address
output tlu_rngf_cdbus_error;
//////////////////////////////////////////////////////////////////////
assign pce_ov = tcu_pce_ov;
tlu_asi_ctl_l1clkhdr_ctl_macro free_clken (
//////////////////////////////////////////////////////////////////////////////
tlu_asi_ctl_msff_ctl_macro__width_1 pmen_lat (
.scan_in(pmen_lat_scanin),
.scan_out(pmen_lat_scanout),
tlu_asi_ctl_msff_ctl_macro__width_1 stg1_en_lat (
.scan_in(stg1_en_lat_scanin),
.scan_out(stg1_en_lat_scanout),
(lsu_rngf_cdbus[64] & lsu_rngf_cdbus[63]) |
(~lsu_rngf_cdbus[64] & stg2_en) |
tlu_asi_ctl_msff_ctl_macro__width_1 stg2_en_lat (
.scan_in(stg2_en_lat_scanin),
.scan_out(stg2_en_lat_scanout),
tlu_asi_ctl_msff_ctl_macro__width_1 stg3_en_lat (
.scan_in(stg3_en_lat_scanin),
.scan_out(stg3_en_lat_scanout),
tlu_asi_ctl_msff_ctl_macro__width_1 stg4_en_lat (
.scan_in(stg4_en_lat_scanin),
.scan_out(stg4_en_lat_scanout),
// data_4[64] added to prevent stopping on control packet on MMU ITLB reload
pstg4_en | mmu_asi_read | data_4[64];
// Have to enable during mbist because the write data goes through
stg1_en | stg2_en | stg3_en | stg4_en | mbist_run;
tlu_asi_ctl_l1clkhdr_ctl_macro stg4_clken (
tlu_asi_ctl_l1clkhdr_ctl_macro mbist_clken (
//////////////////////////////////////////////////////////////////////////////
tlu_asi_ctl_msff_ctl_macro__width_1 mbist_run_lat (
.scan_in(mbist_run_lat_scanin),
.scan_out(mbist_run_lat_scanout),
tlu_asi_ctl_msff_ctl_macro__width_1 mbist_tsa0_write_lat (
.scan_in(mbist_tsa0_write_lat_scanin),
.scan_out(mbist_tsa0_write_lat_scanout),
.din (mbi_tsa0_write_en ),
.dout (mbist_tsa0_wr_en ),
tlu_asi_ctl_msff_ctl_macro__width_1 mbist_tsa1_write_lat (
.scan_in(mbist_tsa1_write_lat_scanin),
.scan_out(mbist_tsa1_write_lat_scanout),
.din (mbi_tsa1_write_en ),
.dout (mbist_tsa1_wr_en ),
tlu_asi_ctl_msff_ctl_macro__width_1 mbist_tca_write_lat (
.scan_in(mbist_tca_write_lat_scanin),
.scan_out(mbist_tca_write_lat_scanout),
.din (mbi_tca_write_en ),
.dout (mbist_tca_wr_en ),
tlu_asi_ctl_msff_ctl_macro__width_5 mbist_addr_lat (
.scan_in(mbist_addr_lat_scanin),
.scan_out(mbist_addr_lat_scanout),
.dout (mbist_addr [4:0] ),
assign mbist_wdata[7:0] =
tlu_asi_ctl_msff_ctl_macro__width_1 mbist_tsa0_read_lat (
.scan_in(mbist_tsa0_read_lat_scanin),
.scan_out(mbist_tsa0_read_lat_scanout),
.din (mbi_tsa0_read_en ),
.dout (mbist_tsa0_rd_en ),
tlu_asi_ctl_msff_ctl_macro__width_1 mbist_tsa1_read_lat (
.scan_in(mbist_tsa1_read_lat_scanin),
.scan_out(mbist_tsa1_read_lat_scanout),
.din (mbi_tsa1_read_en ),
.dout (mbist_tsa1_rd_en ),
tlu_asi_ctl_msff_ctl_macro__width_1 mbist_tca_read_lat (
.scan_in(mbist_tca_read_lat_scanin),
.scan_out(mbist_tca_read_lat_scanout),
.dout (mbist_tca_rd_en ),
tlu_asi_ctl_msff_ctl_macro__width_4 mbist_cmpsel_lat (
.scan_in(mbist_cmpsel_lat_scanin),
.scan_out(mbist_cmpsel_lat_scanout),
.din (mbi_tlu_cmpsel [3:0] ),
.dout (mbist_cmpsel [3:0] ),
assign asi_mbist_ecc_in[7:0] =
mbist_wdata[7:0] & {8 {mbist_run}};
assign asi_mbist_tsa_ecc_in[7:0] =
mbist_wdata_2[7:0] & {8 {mbist_run}};
assign asi_mbist_addr[4:0] =
assign asi_mbist_tsa_rd_en[1:0] =
{2 {mbist_run}} & {mbist_tsa1_rd_en_2, mbist_tsa0_rd_en_2};
assign asi_mbist_tsa_wr_en[1:0] =
{2 {mbist_run}} & {mbist_tsa1_wr_en, mbist_tsa0_wr_en};
tlu_asi_ctl_msff_ctl_macro__width_5 mbist_addr_2_lat (
.scan_in(mbist_addr_2_lat_scanin),
.scan_out(mbist_addr_2_lat_scanout),
.din (mbist_addr [4:0] ),
.dout (mbist_addr_2 [4:0] ),
tlu_asi_ctl_msff_ctl_macro__width_1 mbist_tsa0_read_2_lat (
.scan_in(mbist_tsa0_read_2_lat_scanin),
.scan_out(mbist_tsa0_read_2_lat_scanout),
.din (mbist_tsa0_rd_en ),
.dout (mbist_tsa0_rd_en_2 ),
tlu_asi_ctl_msff_ctl_macro__width_1 mbist_tsa1_read_2_lat (
.scan_in(mbist_tsa1_read_2_lat_scanin),
.scan_out(mbist_tsa1_read_2_lat_scanout),
.din (mbist_tsa1_rd_en ),
.dout (mbist_tsa1_rd_en_2 ),
tlu_asi_ctl_msff_ctl_macro__width_1 mbist_tca_read_2_lat (
.scan_in(mbist_tca_read_2_lat_scanin),
.scan_out(mbist_tca_read_2_lat_scanout),
.dout (mbist_tca_rd_en_2 ),
tlu_asi_ctl_msff_ctl_macro__width_4 mbist_cmpsel_2_lat (
.scan_in(mbist_cmpsel_2_lat_scanin),
.scan_out(mbist_cmpsel_2_lat_scanout),
.din (mbist_cmpsel [3:0] ),
.dout (mbist_cmpsel_2 [3:0] ),
tlu_asi_ctl_msff_ctl_macro__width_8 mbist_wdata_2_lat (
.scan_in(mbist_wdata_2_lat_scanin),
.scan_out(mbist_wdata_2_lat_scanout),
.din (mbist_wdata [7:0] ),
.dout (mbist_wdata_2 [7:0] ),
assign asi_mbist_cmpsel[3:0] =
tlu_asi_ctl_msff_ctl_macro__width_1 mbist_tsa0_read_3_lat (
.scan_in(mbist_tsa0_read_3_lat_scanin),
.scan_out(mbist_tsa0_read_3_lat_scanout),
.din (mbist_tsa0_rd_en_2 ),
.dout (mbist_tsa0_rd_en_3 ),
tlu_asi_ctl_msff_ctl_macro__width_1 mbist_tsa1_read_3_lat (
.scan_in(mbist_tsa1_read_3_lat_scanin),
.scan_out(mbist_tsa1_read_3_lat_scanout),
.din (mbist_tsa1_rd_en_2 ),
.dout (mbist_tsa1_rd_en_3 ),
tlu_asi_ctl_msff_ctl_macro__width_1 mbist_tca_read_3_lat (
.scan_in(mbist_tca_read_3_lat_scanin),
.scan_out(mbist_tca_read_3_lat_scanout),
.din (mbist_tca_rd_en_2 ),
.dout (mbist_tca_rd_en_3 ),
tlu_asi_ctl_msff_ctl_macro__width_8 mbist_wdata_3_lat (
.scan_in(mbist_wdata_3_lat_scanin),
.scan_out(mbist_wdata_3_lat_scanout),
.din (mbist_wdata_2 [7:0] ),
.dout (mbist_wdata_3 [7:0] ),
assign asi_mbist_tel_en[1:0] =
{mbist_tsa1_rd_en_3, mbist_tsa0_rd_en_3} |
{2 {rd_tsa_pc_2 | rd_tsa_nopc_2 | rd_tsa_ecc_2 |
rd_tsa_pc_3 | rd_tsa_nopc_3 | rd_tsa_ecc_3 ||
wr_tsa_2 | wr_tsa_3 | ~pmen}};
tlu_asi_ctl_msff_ctl_macro__width_1 mbist_tsa0_read_4_lat (
.scan_in(mbist_tsa0_read_4_lat_scanin),
.scan_out(mbist_tsa0_read_4_lat_scanout),
.din (mbist_tsa0_rd_en_3 ),
.dout (mbist_tsa0_rd_en_4 ),
tlu_asi_ctl_msff_ctl_macro__width_1 mbist_tsa1_read_4_lat (
.scan_in(mbist_tsa1_read_4_lat_scanin),
.scan_out(mbist_tsa1_read_4_lat_scanout),
.din (mbist_tsa1_rd_en_3 ),
.dout (mbist_tsa1_rd_en_4 ),
assign compare_data_in[7:0] =
(mbist_wdata_2[7:0] & {8 {~mbist_tsa_3}}) |
(mbist_wdata_3[7:0] & {8 { mbist_tsa_3}}) ;
tlu_asi_ctl_msff_ctl_macro__width_8 compare_data_lat (
.scan_in(compare_data_lat_scanin),
.scan_out(compare_data_lat_scanout),
.din (compare_data_in [7:0] ),
.dout (compare_data [7:0] ),
assign asi_mbd_compare_data[7:0] =
mbist_tsa0_rd_en_3 | mbist_tsa1_rd_en_3;
assign asi_mbd_sel_tsd0 =
assign asi_mbd_sel_tsd1 =
tlu_asi_ctl_msff_ctl_macro__width_1 tsa0_fail_lat (
.scan_in(tsa0_fail_lat_scanin),
.scan_out(tsa0_fail_lat_scanout),
tlu_asi_ctl_msff_ctl_macro__width_1 tsa1_fail_lat (
.scan_in(tsa1_fail_lat_scanin),
.scan_out(tsa1_fail_lat_scanout),
tlu_asi_ctl_msff_ctl_macro__width_1 tca_fail_lat (
.scan_in(tca_fail_lat_scanin),
.scan_out(tca_fail_lat_scanout),
tlu_asi_ctl_msff_ctl_macro__width_1 compare_lat (
.scan_in(compare_lat_scanin),
.scan_out(compare_lat_scanout),
assign tlu_mbi_tsa0_fail =
assign tlu_mbi_tsa1_fail =
assign tlu_mbi_tca_fail =
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// Decode preempt_trap/_done_retry so that read controls can go to TSA in
// so read can occur in cycle 2
// so ECC error detect can occur in cycle 3
// so packet can transmit in cycle 4
assign data_0_59_unused =
assign data_0_57_unused =
assign data_0_56_unused =
ctl_0 & data_0[63] & ~data_0[62] & (data_0[61:60] == 2'b00);
ctl_0 & data_0[63] & ~data_0[62] & data_0[61] & ~data_0[60];
ctl_0 & data_0[63] & ~data_0[62] & (data_0[61:60] == 2'b11);
// Any PR between 0 and 3 (field is 5 bits)
pr_0 & (data_0[52:50] == 3'b000);
// Note that write to GL must preempt trap because EXU cannot handle
pr_0 & data_0[52] & ~data_0[59];
// HPR is 1, not 0, 3, 5, 6, or 1F
hpr_0 & ~data_0[50] & ~data_0[49] & data_0[48];
// All queue registers are ASI 25
asi_0 & (data_0[55:48] == 8'h25);
// TSA diagnostic ECC read at ASI 0x5B
asi_0 & (data_0[55:48] == 8'h5b);
// The following require access to the trap stack array (TSA)
// Even writes require a read, so block done and retry for both
assign preempt_done_retry_in[1:0] =
({2 {pr_tstack_0 | wr_gl_0 | htstate_0 | asi_25_0 | tsa_diag_0}} &
{data_0[58], ~data_0[58]}) |
// Need to preempt traps on writes to GL reg
// but these are held two cycles now so delay by two cycles
assign preempt_trap_in[1:0] =
{2 {wr_gl_2}} & {data_2[58], ~data_2[58]};
tlu_asi_ctl_msff_ctl_macro__width_4 preempt_trap_lat (
.scan_in(preempt_trap_lat_scanin),
.scan_out(preempt_trap_lat_scanout),
.din ({preempt_trap_in [1:0],
preempt_done_retry_in [1:0]}),
.dout ({preempt_trap [1:0],
preempt_done_retry [1:0]}),
assign asi_preempt_trap[1:0] =
assign asi_preempt_done_retry[1:0] =
// Handle fatal deferred and disrupting error registers
assign clesr_data[63:0] =
{dfd_desr_f[7], dfd_fesr_f[7],
dfd_desr_f[6], dfd_fesr_f[6],
dfd_desr_f[5], dfd_fesr_f[5],
dfd_desr_f[4], dfd_fesr_f[4],
dfd_desr_f[3], dfd_fesr_f[3],
dfd_desr_f[2], dfd_fesr_f[2],
dfd_desr_f[1], dfd_fesr_f[1],
dfd_desr_f[0], dfd_fesr_f[0],
assign clfesr_in[63:48] =
({16 {~(| clfesr_data[63:48])}} & clesr_data [63:48]) |
({16 { (| clesr_data [63:48])}} & clfesr_data[63:48]) ;
tlu_asi_ctl_msff_ctl_macro__width_16 clfesr_lat ( // FS:wmr_protect
.scan_in(clfesr_lat_wmr_scanin),
.scan_out(clfesr_lat_wmr_scanout),
.din (clfesr_in [63:48] ),
.dout (clfesr_data [63:48] ),
({64 {mbist_run}} & {8 {mbi_wdata[7:0]}}) |
({64 {sel_lsu & ~mbist_run}} & lsu_rngf_cdbus [63:0]) |
({64 {rd_clesr & ~mbist_run}} & clesr_data [63:0]) |
({64 {rd_clfesr& ~mbist_run}} & clfesr_in [63:0]) ;
assign asi_int_rec_mux_sel_in[2:0] =
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
// Stage the packet coming on the ring
// First cycle of the packet holds control and address information
// Second cycle holds the store/load data
tlu_asi_ctl_msff_ctl_macro__width_64 rng_stg1_data (
.scan_in(rng_stg1_data_scanin),
.scan_out(rng_stg1_data_scanout),
.din (data_1_in [63:0] ),
// register control bit, bit 64 indicates whether ctl packet or data packet
tlu_asi_ctl_msff_ctl_macro__width_1 ctl_1_lat (
.scan_in(ctl_1_lat_scanin),
.scan_out(ctl_1_lat_scanout),
.din (lsu_rngf_cdbus [64 ] ),
tlu_asi_ctl_msff_ctl_macro__width_8 hpstatehpriv_lat (
.scan_in(hpstatehpriv_lat_scanin),
.scan_out(hpstatehpriv_lat_scanout),
.din (tsd_hpstate_hpriv [7:0] ),
.dout (hpstatehpriv [7:0] ),
tlu_asi_ctl_msff_ctl_macro__width_8 pstatepriv_lat (
.scan_in(pstatepriv_lat_scanin),
.scan_out(pstatepriv_lat_scanout),
.din (tsd_pstate_priv [7:0] ),
.dout (pstatepriv [7:0] ),
(| (hpstatehpriv[7:0] & rd_tid_dec[7:0]));
(| (pstatepriv[7:0] & rd_tid_dec[7:0])) | hpstate_hpriv;
ctl_1 & data_1[63] & ~data_1[62] & (data_1[61:60] == 2'b00);
ctl_1 & data_1[63] & ~data_1[62] & (data_1[61:60] == 2'b01);
ctl_1 & data_1[63] & ~data_1[62] & (data_1[61:60] == 2'b10);
ctl_1 & data_1[63] & ~data_1[62] & (data_1[61:60] == 2'b11);
ctl_2 & data_2[63] & ~data_2[62] & (data_2[61:60] == 2'b00);
ctl_2 & data_2[63] & ~data_2[62] & (data_2[61:60] == 2'b01);
ctl_2 & data_2[63] & ~data_2[62] & (data_2[61:60] == 2'b10);
ctl_2 & data_2[63] & ~data_2[62] & (data_2[61:60] == 2'b11);
~data_1[61] & ~data_1[60];
asi & (data_1[55:48] == 8'h25) & (data_1[5:3] == 3'h0);
mondo_head & ~data_1[59];
asi & (data_1[55:48] == 8'h25) & (data_1[5:3] == 3'h1);
mondo_tail & ~data_1[59];
asi & (data_1[55:48] == 8'h25) & (data_1[5:3] == 3'h2);
device_head & data_1[59];
device_head & ~data_1[59];
asi & (data_1[55:48] == 8'h25) & (data_1[5:3] == 3'h3);
device_tail & data_1[59];
device_tail & ~data_1[59];
asi & (data_1[55:48] == 8'h25) & (data_1[5:3] == 3'h4);
res_err_head & data_1[59];
res_err_head & ~data_1[59];
asi & (data_1[55:48] == 8'h25) & (data_1[5:3] == 3'h5);
res_err_tail & data_1[59];
res_err_tail & ~data_1[59];
asi & (data_1[55:48] == 8'h25) & (data_1[5:3] == 3'h6);
assign rd_nonres_err_head =
nonres_err_head & data_1[59];
assign wr_nonres_err_head =
nonres_err_head & ~data_1[59];
asi & (data_1[55:48] == 8'h25) & (data_1[5:3] == 3'h7);
assign rd_nonres_err_tail =
nonres_err_tail & data_1[59];
assign wr_nonres_err_tail =
nonres_err_tail & ~data_1[59];
// Shadow copy of spec enable and IMMU enable bits in LSU control reg
// Only support write; LSU handles read
asi & (data_1[55:48] == 8'h45) & ~data_1[4] & ~data_1[3];
// DECR (only one per physical core)
asi & (data_1[55:48] == 8'h45) & ~data_1[4] & data_1[3];
asi & (data_1[55:48] == 8'h4c);
esr & (data_1[5:3] == 3'b000);
esr & (data_1[5:3] == 3'b001);
esr & (data_1[5:3] == 3'b100);
esr & (data_1[5:3] == 3'b101);
esr & (data_1[5:3] == 3'b010);
esr & (data_1[5:3] == 3'b011);
// instruction_va_watchpoint at 0x50/0x38
asi & (data_1[55:48] == 8'h50) & (data_1[5:3] == 3'b011);
asi_2 & (data_2[55:48] == 8'h50) & (data_2[5:3] == 3'b111);
// DSFSR at 0x58/0x18, DSFAR at 0x20
asi & (data_1[55:48] == 8'h58) & (data_1[5:3] == 3'b011);
asi & (data_1[55:48] == 8'h58) & (data_1[5:3] == 3'b100);
// Tick compare array ECC / data access at 0x5A/0x00-0x38
asi & (data_1[55:48] == 8'h5a);
tca_diag & ~data_1[5] & data_1[59];
tca_diag & data_1[5] & data_1[59];
// TSA ECC access at 0x5B/0x00-0x18
asi & (data_1[55:48] == 8'h5b);
tsa_diag & ~data_1[6] & data_1[59];
asi & (data_1[55:48] == 8'h72);
asi & (data_1[55:48] == 8'h74);
asr_2 & (data_2[55:48] == 8'h03);
// Covers ASR tick, PR tick, and ASR stick
((asr | pr) & (data_1[55:48] == 8'h04)) |
(asr & (data_1[55:48] == 8'h18));
tick & data_1[59] & (hpstate_hpriv | pstate_priv | tick_npt_1_);
tick & data_1[59] & ~(hpstate_hpriv | pstate_priv | tick_npt_1_);
tick & ~data_1[59] & hpstate_hpriv;
| (tick_npt_[7:0] & rd_tid_dec[7:0]);
asr_2 & (data_2[55:48] == 8'h05);
asr & (data_1[55:48] == 8'h14);
set_softint & ~data_1[59];
asr & (data_1[55:48] == 8'h15);
assign wr_clear_softint =
clear_softint & ~data_1[59];
asr & (data_1[55:48] == 8'h16);
asr & (data_1[55:48] == 8'h17);
// ASR stick covered by tick
asr & (data_1[55:48] == 8'h19);
stick_cmpr & data_1[59] & pstate_priv;
stick_cmpr & ~data_1[59] & pstate_priv;
pr & (data_1[55:48] == 8'h00);
pr & (data_1[55:48] == 8'h01);
pr & (data_1[55:48] == 8'h02);
pr & (data_1[55:48] == 8'h03);
// tick as PR 0x04 is covered in ASR section
pr_2 & (data_2[55:48] == 8'h05);
pr & (data_1[55:48] == 8'h06);
pr_2 & (data_2[55:48] == 8'h06);
pr & (data_1[55:48] == 8'h07);
pr & (data_1[55:48] == 8'h08);
pr & (data_1[55:48] == 8'h10);
hpr & (data_1[55:48] == 8'h00);
hpr_2 & (data_2[55:48] == 8'h00);
hpr & (data_1[55:48] == 8'h01);
hpr & (data_1[55:48] == 8'h03);
hpr_2 & (data_2[55:48] == 8'h05);
hpr & (data_1[55:48] == 8'h06);
hpr & (data_1[55:48] == 8'h1e) & data_1[59];
hpr & (data_1[55:48] == 8'h1e) & ~data_1[59];
hpr & (data_1[55:48] == 8'h1f);
hstick_cmpr & data_1[59];
hstick_cmpr & ~data_1[59];
// address to send to TSA
assign fast_tsa_rd_iqr_res_nonres =
fast_tsa_rd_iqr & data_1[5];
assign asi_tsa_rd_iqr_ecc =
assign asi_tsa_tid[1:0] =
assign asi_tsa_rd_addr[4:0] =
({3 {fast_tsa_rd_iqr & ~fast_rd_tsa_ecc}} & 3'b110) |
({3 {fast_tsa_rd_iqr_res_nonres & ~fast_rd_tsa_ecc}} & 3'b111) |
({3 { fast_rd_tsa_ecc}} & data_1[5:3])}) |
({5 {mbist_run}} & mbist_addr_2[4:0]) ;
rd_tick_cmpr | rd_stick_cmpr | rd_hstick_cmpr | rd_tca_ecc | rd_tca_data;
wr_tick_cmpr | wr_stick_cmpr | wr_hstick_cmpr;
// Hold TCA read address for RAS
tca_rd_addr[4] | wr_hstick_cmpr_2 | (tca_diag & data_1[4]);
tca_rd_addr[3] | wr_stick_cmpr_2 | (tca_diag & data_1[3]);
(data_1[58:56] & {3 {rd_tca }}) |
(data_2[58:56] & {3 {wr_tca_2}}) ;
assign asi_tca_addr[4:0] =
({5 {~mbist_run}} & tca_addr[4:0]) |
({5 { mbist_run}} & mbist_addr[4:0]) ;
assign asi_tca_addr_valid =
rd_tca | wr_tca_2 | mbist_run;
(wr_tca_2 & ~mbist_run) | (mbist_tca_wr_en & mbist_run);
assign rd_tid_dec [7:0] =
{ data_1[58] & data_1[57] & data_1[56],
data_1[58] & data_1[57] & ~data_1[56],
data_1[58] & ~data_1[57] & data_1[56],
data_1[58] & ~data_1[57] & ~data_1[56],
~data_1[58] & data_1[57] & data_1[56],
~data_1[58] & data_1[57] & ~data_1[56],
~data_1[58] & ~data_1[57] & data_1[56],
~data_1[58] & ~data_1[57] & ~data_1[56]};
// For tlu_ras_ctl and tlu_dfd_dp
// These are stored in the TSA
rd_tstate | rd_tt | rd_htstate |
rd_mondo_head | rd_mondo_tail |
rd_device_head | rd_device_tail |
rd_res_err_head | rd_res_err_tail |
rd_nonres_err_head | rd_nonres_err_tail;
wr_tstate_2 | wr_tt_2 | wr_htstate_2 |
wr_mondo_head_2 | wr_mondo_tail_2 |
wr_device_head_2 | wr_device_tail_2 |
wr_res_err_head_2 | wr_res_err_tail_2 |
wr_nonres_err_head_2 | wr_nonres_err_tail_2 |
wr_tstate_3 | wr_tt_3 | wr_htstate_3 |
wr_mondo_head_3 | wr_mondo_tail_3 |
wr_device_head_3 | wr_device_tail_3 |
wr_res_err_head_3 | wr_res_err_tail_3 |
wr_nonres_err_head_3 | wr_nonres_err_tail_3 |
// no rd_iqr[2:0] for mondo/res head
// rd_iqr[2] for device/nonres head
// rd_iqr[1] for mondo/res tail
// rd_iqr[0] for device/nonres tail
rd_device_head_2 | rd_nonres_err_head_2 ;
rd_mondo_tail_2 | rd_res_err_tail_2 ;
rd_device_tail_2 | rd_nonres_err_tail_2 ;
rd_nonres_err_tail_2 | rd_nonres_err_head_2 |
rd_res_err_tail_2 | rd_res_err_head_2 |
rd_device_tail_2 | rd_device_head_2 |
rd_mondo_tail_2 | rd_mondo_head_2 ;
// These are flopped in TSD before use
assign asi_rd_iqr [2:0] =
assign asi_rd_tpc [1:0] =
{2 {rd_tpc_2}} & {data_2[58], ~data_2[58]};
assign asi_rd_tnpc [1:0] =
{2 {rd_tnpc_2}} & {data_2[58], ~data_2[58]};
assign asi_rd_tstate [1:0] =
{2 {rd_tstate_2}} & {data_2[58], ~data_2[58]};
{2 {rd_tt_2}} & {data_2[58], ~data_2[58]};
assign asi_rd_htstate [1:0] =
{2 {rd_htstate_2}} & {data_2[58], ~data_2[58]};
assign asi_rd_iqr_reg [1:0] =
{2 {rd_iqr_reg_2}} & {data_2[58], ~data_2[58]};
assign asi_rd_inc_vec_2[7:0] =
{8 {rd_inc_vec_2}} & wr_tid_dec[7:0];
assign asi_rd_asireg[7:0] =
{8 {rd_asireg_2}} & wr_tid_dec[7:0];
{8 {rd_pc_2}} & wr_tid_dec[7:0];
assign asi_rd_h_pstate_tba [2:0] =
{superfast_hpr_2, data_2[57:56]};
assign asi_rd_tba_htba [1:0] =
{2 {rd_tba_2 | rd_htba_2}} & {data_2[58], ~data_2[58]};
assign asi_rd_pstate_hpstate [1:0] =
{2 {rd_pstate_2 | rd_hpstate_2}} & {data_2[58], ~data_2[58]};
rd_tl | rd_pil | rd_gl | rd_softint | rd_hintp;
rd_tick_cmpr | rd_stick_cmpr | rd_hstick_cmpr;
rd_asireg_2 | rd_pstate_2 | rd_hpstate_2;
{2 {wr_tpc | wr_tnpc | wr_tstate | wr_tt | wr_htstate |
wr_mondo_head | wr_mondo_tail | wr_device_head | wr_device_tail |
wr_res_err_head | wr_res_err_tail |
wr_nonres_err_head | wr_nonres_err_tail}} &
{data_1[58], ~data_1[58]} & {2 {~data_1[59]}};
assign asi_rmw_tsa[1:0] =
assign hver_value[63:0] =
{32'h003e0024, hver_mask_major_rev[3:0], hver_mask_minor_rev[3:0],
// Bit 63 is stored negative active
{ {56 {1'b0}}, cel_ecc[7:0]};
assign data_err_1[63:0] =
data_1[62] | priv_action,
(data_1[55:48] & ~{8 {priv_action}}) | {{6 {1'b0}}, priv_action, 1'b0},
{decr_reg[63:46], {46 {1'b0}}};
// Map of how the various registers get merged into the ASI bus in DFD,CTH,CER
// cer_asi_data 63:48 47:41 40:37 36:19 18:0
// cth_asi_data 63:48 47:41 40:37 36:19 18:0
// dfd_asi_data 63:48 47:41 40:37 36:19 18:0
// dsfar 63:48 47:41 40:37 36:19 18:0
assign dsfar_data[63:0] =
{{16 {1'b0}}, cer_asi_data[47:0]};
{{2 {1'b0}}, cer_asi_data[47:41], {55 {1'b0}}};
{cer_asi_data[18:11], {45 {1'b0}}, cer_asi_data[10:0]};
assign isfsr_data[63:0] =
{ {61 {1'b0}}, cer_asi_data[39:37]};
assign dsfsr_data[63:0] =
{ {60 {1'b0}}, cer_asi_data[40:37]};
~priv_action & ~rd_hver_2 & ~rd_cth_2 &
~rd_tca_ecc_2 & ~rd_tca_data_2 & ~rd_ceter_2 &
~rd_desr_2 & ~rd_fesr_2 & ~rd_dsfar_2 &
~rd_isfsr_2 & ~rd_dsfsr_2 & ~rd_decr_2 ;
({64 {sel_data1 }} & data_1 [63:0]) |
({64 {priv_action }} & data_err_1 [63:0]) |
({64 {rd_hver_2 }} & hver_value [63:0]) |
({64 {rd_cth_2 }} & cer_asi_data [63:0]) |
({64 {rd_cerer_2 }} & cer_asi_data [63:0]) |
({64 {rd_tca_ecc_2 }} & tic_ecc [63:0]) |
({64 {rd_tca_data_2}} & tic_data [63:0]) |
({64 {rd_ceter_2 }} & cer_asi_data [63:0]) |
({64 {rd_desr_2 }} & desr_data [63:0]) |
({64 {rd_fesr_2 }} & fesr_data [63:0]) |
({64 {rd_dsfar_2 }} & dsfar_data [63:0]) |
({64 {rd_isfsr_2 }} & isfsr_data [63:0]) |
({64 {rd_dsfsr_2 }} & dsfsr_data [63:0]) |
({64 {rd_decr_2 }} & decr_data [63:0]) ;
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
// pipe the packets and decoded control information
tlu_asi_ctl_msff_ctl_macro__width_64 stg2_data_lat (
.scan_in(stg2_data_lat_scanin),
.scan_out(stg2_data_lat_scanout),
.din (data_2_in [63:0] ),
tlu_asi_ctl_msff_ctl_macro__width_72 stg2_ctl_lat (
.scan_in(stg2_ctl_lat_scanin),
.scan_out(stg2_ctl_lat_scanout),
tlu_asi_ctl_msff_ctl_macro__width_8 wr_tid_dec_lat (
.scan_in(wr_tid_dec_lat_scanin),
.scan_out(wr_tid_dec_lat_scanout),
.din (rd_tid_dec [7:0] ),
.dout (wr_tid_dec [7:0] ),
assign asi_rd_softint[7:0] =
{8 {rd_softint_2}} & wr_tid_dec[7:0];
{8 {rd_tl_2}} & wr_tid_dec[7:0];
assign asi_rd_pil [7:0] =
{8 {rd_pil_2}} & wr_tid_dec[7:0];
{8 {rd_gl_2}} & wr_tid_dec[7:0];
assign asi_rd_hintp [7:0] =
{8 {rd_hintp_2}} & wr_tid_dec[7:0];
// send the store data out to the unit. Store data is in stage1 when control
// The data is accompanied by write control signal.
assign asi_wr_data_0[63:0] =
assign asi_wr_data_1[62:0] =
assign asi_tsd0_wr_data_12 =
assign asi_tsd0_wr_data_10_08[10:8] =
assign asi_tsd0_wr_data_05_00[5:0] =
assign asi_tsd1_wr_data_12 =
assign asi_tsd1_wr_data_10_08[10:8] =
assign asi_tsd1_wr_data_05_00[5:0] =
assign asi_tca_wr_data_63 =
(~data_1[63] & ~mbist_run) | (mbist_wdata[7] & mbist_run);
// TSA written one cycles later
assign asi_tsa_wr_data [47:0] =
(data_2 [47:0] & {48 {~mbist_run}}) |
(mbist_tsa_wdata [47:0] & {48 { mbist_run}}) ;
// MBIST data shifted because only store NPC down to bit 2
assign mbist_tsa_wdata[47:0] =
{mbist_wdata[5:0], {5 {mbist_wdata[7:0]}}, 2'b00};
// Functionally this should be 0; during MBIST it should be wdata[0]
assign asi_tsa_wr_data_npc_oor_va =
mbist_run & mbist_wdata[0];
// Functionally this should be 1; during MBIST it should be mbist_wdata[5]
assign asi_tsa_wr_data_npc_nonseq =
~mbist_run | mbist_wdata[5];
assign asi_ceter_tid[2:0] =
assign asi_wr_int_rec [7:0] =
{8 {wr_int_rec_2}} & wr_tid_dec[7:0];
assign asi_wr_any_int_rec =
assign asi_wr_asireg [7:0] =
{8 {wr_asireg_2}} & wr_tid_dec[7:0];
assign asi_wr_set_softint[7:0] =
{8 {wr_set_softint_2}} & wr_tid_dec[7:0];
assign asi_wr_clear_softint[7:0] =
{8 {wr_clear_softint_2}} & wr_tid_dec[7:0];
assign asi_wr_softint [7:0] =
{8 {wr_softint_2}} & wr_tid_dec[7:0];
assign asi_wr_tba [7:0] =
{8 {wr_tba_2}} & wr_tid_dec[7:0];
// Sent a cycle early and flopped locally to sink
assign asi_wr_pstate [7:0] =
{8 {wr_pstate}} & rd_tid_dec[7:0];
{8 {wr_tl_2}} & wr_tid_dec[7:0];
assign asi_wr_pil [7:0] =
{8 {wr_pil_2}} & wr_tid_dec[7:0];
{8 {wr_gl_2}} & wr_tid_dec[7:0];
// Sent a cycle early and flopped locally to sink
assign asi_wr_hpstate [7:0] =
{8 {wr_hpstate}} & rd_tid_dec[7:0];
assign asi_wr_hintp [7:0] =
{8 {wr_hintp_2}} & wr_tid_dec[7:0];
assign asi_wr_htba [7:0] =
{8 {wr_htba_2}} & wr_tid_dec[7:0];
assign asi_wr_isfsr[7:0] =
{8 {wr_isfsr_2}} & wr_tid_dec[7:0] ;
{2 {wr_iaw_2}} & {data_2[58], ~data_2[58]};
assign asi_wr_dsfsr[7:0] =
{8 {wr_dsfsr_2}} & wr_tid_dec[7:0] ;
assign asi_wr_dsfar[7:0] =
{8 {wr_dsfar_2}} & wr_tid_dec[7:0] ;
assign asi_trl_pstate_en[1:0] =
{2 {wr_hpstate_2 | wr_pstate_2}} & {data_2[58], ~data_2[58]};
// Pipe Interrupt Receive Register clear controls to check if the register
// is actually cleared out entirely
assign irl_any_cleared_in =
rd_inc_vec_2 | wr_int_rec_2;
tlu_asi_ctl_msff_ctl_macro__width_1 irl_any_cleared_lat (
.scan_in(irl_any_cleared_lat_scanin),
.scan_out(irl_any_cleared_lat_scanout),
.din (irl_any_cleared_in ),
.dout (irl_any_cleared ),
{ data_3[58] & data_3[57] & data_3[56],
data_3[58] & data_3[57] & ~data_3[56],
data_3[58] & ~data_3[57] & data_3[56],
data_3[58] & ~data_3[57] & ~data_3[56],
~data_3[58] & data_3[57] & data_3[56],
~data_3[58] & data_3[57] & ~data_3[56],
~data_3[58] & ~data_3[57] & data_3[56],
~data_3[58] & ~data_3[57] & ~data_3[56]};
assign asi_irl_cleared[7:0] =
{8 {irl_any_cleared}} & tid_dec_3[7:0];
// Maintain TICK.NPT per thread
// TICK.NPT PORs to a 1, so store negative active
assign tick_npt_in_[7:0] =
( (wr_tid_dec[7:0] & {8 {wr_tick_2}}) & {8 {~data_1[63]}}) |
(~(wr_tid_dec[7:0] & {8 {wr_tick_2}}) & tick_npt_[7:0]) ;
tlu_asi_ctl_msff_ctl_macro__width_8 tick_npt_inv_lat (
.scan_in(tick_npt_inv_lat_scanin),
.scan_out(tick_npt_inv_lat_scanout),
.din (tick_npt_in_ [7:0] ),
.dout (tick_npt_ [7:0] ),
| (tick_npt_[7:0] & wr_tid_dec[7:0]);
tlu_asi_ctl_msff_ctl_macro__width_1 tick_npt_3_inv_lat (
.scan_in(tick_npt_3_inv_lat_scanin),
.scan_out(tick_npt_3_inv_lat_scanout),
assign decr_reg_in[63:46] =
({18 {~wr_decr_2}} & decr_reg [63:46]) |
({18 { wr_decr_2}} & data_1 [63:46]) ;
tlu_asi_ctl_msff_ctl_macro__width_18 decr_lat (
.scan_in(decr_lat_scanin),
.scan_out(decr_lat_scanout),
.din (decr_reg_in [63:46] ),
.dout (decr_reg [63:46] ),
(trl1_asi_data[16:0] & {17 { data_3[58]}}) |
(trl0_asi_data[16:0] & {17 {~data_3[58]}}) };
(pct1_asi_data[47:2] & {46 { data_3[58]}}) |
(pct0_asi_data[47:2] & {46 {~data_3[58]}}) ;
(tsd1_asi_data[1:0] & { 2 { data_3[58]}}) |
(tsd0_asi_data[1:0] & { 2 {~data_3[58]}}) ;
assign tba_htba_data[64] =
assign tba_htba_data[63:48] =
{16 {(pct1_asi_data[47] & data_3[58]) |
(pct0_asi_data[47] & ~data_3[58])}} ;
assign tba_htba_data[47:0] =
assign tsa_nopc_data[64:0] =
assign tsa_pc_data[64] = 1'b0;
assign tsa_pc_data[63:48] =
({16 { data_3[58]}} & {16 {pct1_asi_data[47 ]}}) |
({16 {~data_3[58]}} & {16 {pct0_asi_data[47 ]}}) ;
assign tsa_pc_data[47:0] =
assign tsa_ecc_data[64:0] =
({16 { data_3[58]}} & tel1_ecc[15:0]) |
({16 {~data_3[58]}} & tel0_ecc[15:0]) };
{1'b0, ~tic_asi_data[63], tic_asi_data[62:0]};
// Force bits 6:0 of %stick to 1s
// Synthesis combined the rd_tic_3 and rd_tick_3 paths for bits 6:0
// rd_tick_3 is required in the data bits
assign tic_data_for_3[64:0] =
{{58 {1'b0}}, {7 {data_3[52] & rd_tick_3}}};
{1'b0, ~tick_npt_3_, tic_asi_data[62:0]} |
{{58 {1'b0}}, {7 {data_3[52] & rd_tick_3}}};
({{16 {pct1_asi_data[47]}}, pct1_asi_data[47:2]} & {62 { data_3[58]}}) |
({{16 {pct0_asi_data[47]}}, pct0_asi_data[47:2]} & {62 {~data_3[58]}}) ;
(pct1_asi_data[48] & data_3[58]) |
(pct0_asi_data[48] & ~data_3[58]) ;
assign rngf_cdbus_2[64:0] =
assign no_rd_3 = ~rd_trl_3 & ~rd_tsd_3 & ~rd_tba_htba_3 &
~rd_tsa_pc_3 & ~rd_tsa_ecc_3 & ~rd_tsa_nopc_3 &
~rd_tic_3 & ~rd_tick_3 & ~rd_pct_3;
({65 {no_rd_3 }} & rngf_cdbus_2 [64:0]) |
({65 {rd_trl_3 }} & trl_data [64:0]) |
({65 {rd_tsd_3 }} & tsd_data [64:0]) |
({65 {rd_tba_htba_3}} & tba_htba_data [64:0]) |
({65 {rd_tsa_pc_3 }} & tsa_pc_data [64:0]) |
({65 {rd_tsa_ecc_3 }} & tsa_ecc_data [64:0]) |
({65 {rd_tsa_nopc_3}} & tsa_nopc_data [64:0]) |
({65 {rd_tic_3 }} & tic_data_for_3 [64:0]) |
({65 {rd_tick_3 }} & tick_data [64:0]) |
({65 {rd_pct_3 }} & pct_data [64:0]) ;
rd_tca_ecc_2 | rd_tca_data_2;
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
// Mux previous results with TSA reads
tlu_asi_ctl_msff_ctl_macro__width_65 rng_stg3 (
.scan_in(rng_stg3_scanin),
.scan_out(rng_stg3_scanout),
.din (data_3_in [64:0] ),
tlu_asi_ctl_msff_ctl_macro__width_23 tsa_wr_lat (
.scan_in(tsa_wr_lat_scanin),
.scan_out(tsa_wr_lat_scanout),
// Since these access the TSA, need to send control one cycles later than
assign asi_wr_mondo_head [1:0] =
{2 {wr_mondo_head_3}} & {data_3[58], ~data_3[58]};
assign asi_wr_mondo_tail [1:0] =
{2 {wr_mondo_tail_3}} & {data_3[58], ~data_3[58]};
assign asi_wr_device_head [1:0] =
{2 {wr_device_head_3}} & {data_3[58], ~data_3[58]};
assign asi_wr_device_tail [1:0] =
{2 {wr_device_tail_3}} & {data_3[58], ~data_3[58]};
assign asi_wr_res_err_head [1:0] =
{2 {wr_res_err_head_3}} & {data_3[58], ~data_3[58]};
assign asi_wr_res_err_tail [1:0] =
{2 {wr_res_err_tail_3}} & {data_3[58], ~data_3[58]};
assign asi_wr_nonres_err_head [1:0] =
{2 {wr_nonres_err_head_3}} & {data_3[58], ~data_3[58]};
assign asi_wr_nonres_err_tail [1:0] =
{2 {wr_nonres_err_tail_3}} & {data_3[58], ~data_3[58]};
assign asi_wr_tpc [1:0] =
{2 {wr_tpc_3}} & {data_3[58], ~data_3[58]};
assign asi_wr_tnpc [1:0] =
({2 {wr_tnpc_3}} & {data_3[58], ~data_3[58]}) |
assign asi_wr_tstate [1:0] =
{2 {wr_tstate_3}} & {data_3[58], ~data_3[58]};
{2 {wr_tt_3}} & {data_3[58], ~data_3[58]};
assign asi_wr_htstate [1:0] =
{2 {wr_htstate_3}} & {data_3[58], ~data_3[58]};
// Do not need to check for interrupt if nonres_err registers are written
wr_mondo_head_3 | wr_mondo_tail_3 | wr_device_head_3 | wr_device_tail_3 |
wr_res_err_head_3 | wr_res_err_tail_3;
| (tlu_ceter_pscce[7:0] &
{ data_3[58] & data_3[57] & data_3[56],
data_3[58] & data_3[57] & ~data_3[56],
data_3[58] & ~data_3[57] & data_3[56],
data_3[58] & ~data_3[57] & ~data_3[56],
~data_3[58] & data_3[57] & data_3[56],
~data_3[58] & data_3[57] & ~data_3[56],
~data_3[58] & ~data_3[57] & data_3[56],
~data_3[58] & ~data_3[57] & ~data_3[56]});
rd_tic_3 & ~rd_tick_3 & check_ecc;
~(rd_tic_3 & ~rd_tick_3) & ~rd_tca_diag_3;
(rd_tsa_pc_3 | rd_tsa_nopc_3 | wr_tsa_3) & check_ecc;
assign kill_write_if_error_in =
tlu_asi_ctl_msff_ctl_macro__width_2 ecc_lat (
.scan_in(ecc_lat_scanin),
.scan_out(ecc_lat_scanout),
kill_write_if_error_in }),
((tel0_tsac & ~data_4[58]) |
(tel1_tsac & data_4[58]) ) & ptsacu;
((tel0_tsau & ~data_4[58]) |
(tel1_tsau & data_4[58]) ) & ptsacu;
// For killing trap stack write
{(tel1_tsac | tel1_tsau) & data_4[58] & kill_write_if_error,
(tel0_tsac | tel0_tsau) & ~data_4[58] & kill_write_if_error};
tlu_asi_ctl_msff_ctl_macro__width_2 tca_rd_addr_2_lat (
.scan_in(tca_rd_addr_2_lat_scanin),
.scan_out(tca_rd_addr_2_lat_scanout),
.din (tca_rd_addr [4:3] ),
.dout (tca_rd_addr_2 [4:3] ),
tlu_asi_ctl_msff_ctl_macro__width_2 tca_rd_addr_3_lat (
.scan_in(tca_rd_addr_3_lat_scanin),
.scan_out(tca_rd_addr_3_lat_scanout),
.din (tca_rd_addr_2 [4:3] ),
.dout (tca_rd_addr_3 [4:3] ),
tlu_asi_ctl_msff_ctl_macro__width_2 tca_rd_addr_4_lat (
.scan_in(tca_rd_addr_4_lat_scanin),
.scan_out(tca_rd_addr_4_lat_scanout),
.din (tca_rd_addr_3 [4:3] ),
.dout (tca_rd_addr_4 [4:3] ),
assign asi_ecc_tid[2:0] =
assign asi_tsacu_tid[2:0] =
assign tlu_tca_tid[2:0] =
assign tlu_tca_index[1:0] =
assign rngf_cdbus_3[64:0] =
({65 {~mmu_asi_read}} & rngf_cdbus_3 [64:0]) |
({65 { mmu_asi_read}} & mmu_asi_data [64:0]) ;
mmu_asi_cecc | mmu_asi_uecc | cel_tccp | cel_tcup | tsac | tsau;
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
tlu_asi_ctl_msff_ctl_macro__width_65 rng_stg4 (
.scan_in(rng_stg4_scanin),
.scan_out(rng_stg4_scanout),
.din (data_4_in [64:0] ),
tlu_asi_ctl_msff_ctl_macro__width_1 error_4_lat (
.scan_in(error_4_lat_scanin),
.scan_out(error_4_lat_scanout),
assign tlu_rngf_cdbus[64:0] =
assign tlu_rngf_cdbus_error =
assign check_qr_exc_in[3:0] =
{wr_iqr_3, data_3[58:56]};
tlu_asi_ctl_msff_ctl_macro__width_4 check_qr_exc_lat (
.scan_in(check_qr_exc_lat_scanin),
.scan_out(check_qr_exc_lat_scanout),
.din (check_qr_exc_in [3:0] ),
.dout (check_qr_exc [3:0] ),
assign asi_check_qr_exc[7:0] =
{ check_qr_exc[2] & check_qr_exc[1] & check_qr_exc[0],
check_qr_exc[2] & check_qr_exc[1] & ~check_qr_exc[0],
check_qr_exc[2] & ~check_qr_exc[1] & check_qr_exc[0],
check_qr_exc[2] & ~check_qr_exc[1] & ~check_qr_exc[0],
~check_qr_exc[2] & check_qr_exc[1] & check_qr_exc[0],
~check_qr_exc[2] & check_qr_exc[1] & ~check_qr_exc[0],
~check_qr_exc[2] & ~check_qr_exc[1] & check_qr_exc[0],
~check_qr_exc[2] & ~check_qr_exc[1] & ~check_qr_exc[0]};
//////////////////////////////////////////////////////////////////////////////
tlu_asi_ctl_msff_ctl_macro__width_11 error_inject_lat (
.scan_in(error_inject_lat_scanin),
.scan_out(error_inject_lat_scanout),
.din ({error_inject_enable,
error_inject_mask [7:0]}),
error_enable & error_tccu;
error_enable & error_tsau;
assign asi_error_mask[7:0] =
//////////////////////////////////////////////////////////////////////////////
// LSU control reg shadow copies
assign write_lsu_ctl[7:0] =
({8 { wr_lsu_ctl_2}} & wr_tid_dec[7:0]) &
tlu_lsu_clear_ctl_reg_[7:0];
assign hold_lsu_ctl[7:0] =
({8 {~wr_lsu_ctl_2}} | ~wr_tid_dec[7:0]) &
tlu_lsu_clear_ctl_reg_[7:0];
assign spec_enable_in[7:0] =
(write_lsu_ctl[7:0] & {8 {data_1[4]}}) |
( hold_lsu_ctl[7:0] & spec_enable[7:0]) ;
tlu_asi_ctl_msff_ctl_macro__width_8 spec_enable_lat (
.scan_in(spec_enable_lat_scanin),
.scan_out(spec_enable_lat_scanout),
.din (spec_enable_in [7:0] ),
.dout (spec_enable [7:0] ),
assign asi_spec_enable[7:0] =
assign tlu_spec_enable[7:0] =
assign immu_enable_in[7:0] =
(write_lsu_ctl[7:0] & {8 {data_1[2]}}) |
( hold_lsu_ctl[7:0] & immu_enable[7:0]) ;
tlu_asi_ctl_msff_ctl_macro__width_8 immu_enable_lat (
.scan_in(immu_enable_lat_scanin),
.scan_out(immu_enable_lat_scanout),
.din (immu_enable_in [7:0] ),
.dout (immu_enable [7:0] ),
assign asi_immu_enable[7:0] =
//////////////////////////////////////////////////////////////////////////////
tlu_asi_ctl_msff_ctl_macro__scanreverse_1__width_9 spare_8_0_lat (
.scan_out(spares_scanout),
{8 {wr_halt_2}} & wr_tid_dec[7:0];
assign asi_clear_spu_trap_req[7:0] =
{8 {rd_halt_2}} & wr_tid_dec[7:0];
supply0 vss; // <- port for ground
supply1 vdd; // <- port for power
assign pmen_lat_scanin = scan_in ;
assign stg1_en_lat_scanin = pmen_lat_scanout ;
assign stg2_en_lat_scanin = stg1_en_lat_scanout ;
assign stg3_en_lat_scanin = stg2_en_lat_scanout ;
assign stg4_en_lat_scanin = stg3_en_lat_scanout ;
assign mbist_run_lat_scanin = stg4_en_lat_scanout ;
assign mbist_tsa0_write_lat_scanin = mbist_run_lat_scanout ;
assign mbist_tsa1_write_lat_scanin = mbist_tsa0_write_lat_scanout;
assign mbist_tca_write_lat_scanin = mbist_tsa1_write_lat_scanout;
assign mbist_addr_lat_scanin = mbist_tca_write_lat_scanout;
assign mbist_tsa0_read_lat_scanin = mbist_addr_lat_scanout ;
assign mbist_tsa1_read_lat_scanin = mbist_tsa0_read_lat_scanout;
assign mbist_tca_read_lat_scanin = mbist_tsa1_read_lat_scanout;
assign mbist_cmpsel_lat_scanin = mbist_tca_read_lat_scanout;
assign mbist_addr_2_lat_scanin = mbist_cmpsel_lat_scanout ;
assign mbist_tsa0_read_2_lat_scanin = mbist_addr_2_lat_scanout ;
assign mbist_tsa1_read_2_lat_scanin = mbist_tsa0_read_2_lat_scanout;
assign mbist_tca_read_2_lat_scanin = mbist_tsa1_read_2_lat_scanout;
assign mbist_cmpsel_2_lat_scanin = mbist_tca_read_2_lat_scanout;
assign mbist_wdata_2_lat_scanin = mbist_cmpsel_2_lat_scanout;
assign mbist_tsa0_read_3_lat_scanin = mbist_wdata_2_lat_scanout;
assign mbist_tsa1_read_3_lat_scanin = mbist_tsa0_read_3_lat_scanout;
assign mbist_tca_read_3_lat_scanin = mbist_tsa1_read_3_lat_scanout;
assign mbist_wdata_3_lat_scanin = mbist_tca_read_3_lat_scanout;
assign mbist_tsa0_read_4_lat_scanin = mbist_wdata_3_lat_scanout;
assign mbist_tsa1_read_4_lat_scanin = mbist_tsa0_read_4_lat_scanout;
assign compare_data_lat_scanin = mbist_tsa1_read_4_lat_scanout;
assign tsa0_fail_lat_scanin = compare_data_lat_scanout ;
assign tsa1_fail_lat_scanin = tsa0_fail_lat_scanout ;
assign tca_fail_lat_scanin = tsa1_fail_lat_scanout ;
assign compare_lat_scanin = tca_fail_lat_scanout ;
assign preempt_trap_lat_scanin = compare_lat_scanout ;
assign rng_stg1_data_scanin = preempt_trap_lat_scanout ;
assign ctl_1_lat_scanin = rng_stg1_data_scanout ;
assign hpstatehpriv_lat_scanin = ctl_1_lat_scanout ;
assign pstatepriv_lat_scanin = hpstatehpriv_lat_scanout ;
assign stg2_data_lat_scanin = pstatepriv_lat_scanout ;
assign stg2_ctl_lat_scanin = stg2_data_lat_scanout ;
assign wr_tid_dec_lat_scanin = stg2_ctl_lat_scanout ;
assign irl_any_cleared_lat_scanin = wr_tid_dec_lat_scanout ;
assign tick_npt_inv_lat_scanin = irl_any_cleared_lat_scanout;
assign tick_npt_3_inv_lat_scanin = tick_npt_inv_lat_scanout ;
assign decr_lat_scanin = tick_npt_3_inv_lat_scanout;
assign rng_stg3_scanin = decr_lat_scanout ;
assign tsa_wr_lat_scanin = rng_stg3_scanout ;
assign ecc_lat_scanin = tsa_wr_lat_scanout ;
assign tca_rd_addr_2_lat_scanin = ecc_lat_scanout ;
assign tca_rd_addr_3_lat_scanin = tca_rd_addr_2_lat_scanout;
assign tca_rd_addr_4_lat_scanin = tca_rd_addr_3_lat_scanout;
assign rng_stg4_scanin = tca_rd_addr_4_lat_scanout;
assign error_4_lat_scanin = rng_stg4_scanout ;
assign check_qr_exc_lat_scanin = error_4_lat_scanout ;
assign error_inject_lat_scanin = check_qr_exc_lat_scanout ;
assign spec_enable_lat_scanin = error_inject_lat_scanout ;
assign immu_enable_lat_scanin = spec_enable_lat_scanout ;
assign spares_scanin = immu_enable_lat_scanout ;
assign scan_out = spares_scanout ;
assign clfesr_lat_wmr_scanin = wmr_scan_in ;
assign wmr_scan_out = clfesr_lat_wmr_scanout ;
// any PARAMS parms go into naming of macro
module tlu_asi_ctl_l1clkhdr_ctl_macro (
// any PARAMS parms go into naming of macro
module tlu_asi_ctl_msff_ctl_macro__width_1 (
assign fdin[0:0] = din[0:0];
// any PARAMS parms go into naming of macro
module tlu_asi_ctl_msff_ctl_macro__width_5 (
assign fdin[4:0] = din[4:0];
// any PARAMS parms go into naming of macro
module tlu_asi_ctl_msff_ctl_macro__width_4 (
assign fdin[3:0] = din[3:0];
// any PARAMS parms go into naming of macro
module tlu_asi_ctl_msff_ctl_macro__width_8 (
assign fdin[7:0] = din[7:0];
// any PARAMS parms go into naming of macro
module tlu_asi_ctl_msff_ctl_macro__width_16 (
assign fdin[15:0] = din[15:0];
.so({so[14:0],scan_out}),
// any PARAMS parms go into naming of macro
module tlu_asi_ctl_msff_ctl_macro__width_64 (
assign fdin[63:0] = din[63:0];
.so({so[62:0],scan_out}),
// any PARAMS parms go into naming of macro
module tlu_asi_ctl_msff_ctl_macro__width_72 (
assign fdin[71:0] = din[71:0];
.so({so[70:0],scan_out}),
// any PARAMS parms go into naming of macro
module tlu_asi_ctl_msff_ctl_macro__width_18 (
assign fdin[17:0] = din[17:0];
.so({so[16:0],scan_out}),
// any PARAMS parms go into naming of macro
module tlu_asi_ctl_msff_ctl_macro__width_65 (
assign fdin[64:0] = din[64:0];
.so({so[63:0],scan_out}),
// any PARAMS parms go into naming of macro
module tlu_asi_ctl_msff_ctl_macro__width_23 (
assign fdin[22:0] = din[22:0];
.so({so[21:0],scan_out}),
// any PARAMS parms go into naming of macro
module tlu_asi_ctl_msff_ctl_macro__width_2 (
assign fdin[1:0] = din[1:0];
// any PARAMS parms go into naming of macro
module tlu_asi_ctl_msff_ctl_macro__width_11 (
assign fdin[10:0] = din[10:0];
// any PARAMS parms go into naming of macro
module tlu_asi_ctl_msff_ctl_macro__scanreverse_1__width_9 (
assign fdin[8:0] = din[8:0];