// ========== Copyright Header Begin ==========================================
// OpenSPARC T2 Processor File: tlu_tsd_dp.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 asireg_lat_wmr_scanin;
wire asireg_lat_wmr_scanout;
wire htba3_lat_wmr_scanin;
wire htba3_lat_wmr_scanout;
wire htba2_lat_wmr_scanin;
wire htba2_lat_wmr_scanout;
wire htba1_lat_wmr_scanin;
wire htba1_lat_wmr_scanout;
wire htba0_lat_wmr_scanin;
wire htba0_lat_wmr_scanout;
wire tba3_lat_wmr_scanin;
wire tba3_lat_wmr_scanout;
wire tba2_lat_wmr_scanin;
wire tba2_lat_wmr_scanout;
wire tba1_lat_wmr_scanin;
wire tba1_lat_wmr_scanout;
wire tba0_lat_wmr_scanin;
wire tba0_lat_wmr_scanout;
wire [10:0] shadow_pstate;
wire [12:0] arch_pstate3;
wire [12:0] arch_pstate2;
wire [12:0] arch_pstate1;
wire [12:0] arch_pstate0;
wire [12:0] arch_hpstate3;
wire [12:0] arch_hpstate2;
wire [12:0] arch_hpstate1;
wire [12:0] arch_hpstate0;
wire [12:0] asi_tsd_wr_data_crit;
wire [10:0] asi_hpstate3;
wire [10:0] asi_hpstate2;
wire [10:0] asi_hpstate1;
wire [10:0] asi_hpstate0;
wire [10:0] don_ret_pstate;
wire read_tpc_lat_scanin;
wire read_tpc_lat_scanout;
wire [47:2] tpc_mod_crit;
wire tpc_oor_va_mod_crit;
wire read_tnpc_lat_scanin;
wire read_tnpc_lat_scanout;
wire [47:2] tnpc_mod_crit;
wire tnpc_oor_va_mod_crit;
wire tnpc_nonseq_mod_crit;
wire read_tstate_lat_scanin;
wire read_tstate_lat_scanout;
wire [29:0] tstate_mod_crit;
wire [8:0] trap_type_mod_crit;
wire [8:0] trap_type_mod;
wire shadow_tpc_lat_scanin;
wire shadow_tpc_lat_scanout;
wire wr_tnpc_lat_scanout;
wire wr_tstate_lat_scanin;
wire wr_tstate_lat_scanout;
wire shadow_tt_lat_scanin;
wire shadow_tt_lat_scanout;
wire [2:0] rd_h_pstate_tba;
wire [47:0] asi_h_pstate;
wire [47:0] tsa_asi_data;
input spc_aclk_wmr; // Warm reset (non)scan
input [1:0] trl_shscanid; // Select which thread to shadow
input [47:2] pct_tsa_npc;
input pct_tsa_npc_oor_va;
input pct_tsa_npc_nonseq;
input [8:0] trl_tsa_trap_type;
input [4:0] trl_asireg_sel; // Which asireg to update?
input trl_asireg_en; // Power management
input [3:0] trl_thread_sel; // Which thread to redirect?
input [2:0] trl_tba_sel; // Which thread & to HPRIV?
input [4:0] trl_pstate_thread_sel; // Which thread to update pstate?
input [3:0] trl_don_ret_pstate_sel; // Which thread takes done / retry?
input trl_pstate_en; // Power management
input trl_tsd_tsa_en; // Power management
input trl_tsd_tsa_wd_en; // Power management
input trl_capture_ss; // Capture signal for TPC and TT
input [29:0] tsa_rd_data;
input [8:0] tsa_trap_type;
input asi_wr_device_head;
input asi_wr_device_tail;
input asi_wr_res_err_head;
input asi_wr_res_err_tail;
input asi_wr_nonres_err_head;
input asi_wr_nonres_err_tail;
input asi_rd_iqr_reg; // Read any interrupt queue reg
input [2:0] asi_rd_iqr; // encoded TID for IQR read
input [3:0] asi_wr_pstate;
input [3:0] asi_wr_hpstate;
input [3:0] asi_rd_asireg;
input [3:0] asi_wr_asireg;
input [2:0] asi_rd_h_pstate_tba;
input asi_rd_pstate_hpstate;
input [47:14] asi_wr_data_47_14;
input [7:0] asi_wr_data_07_00;
input asi_tsd_wr_data_12;
input [10:8] asi_tsd_wr_data_10_08;
input [5:0] asi_tsd_wr_data_05_00;
input [47:0] asi_tsa_wr_data;
input asi_tsa_wr_data_npc_oor_va;
input asi_tsa_wr_data_npc_nonseq;
input [7:0] asi_mbist_ecc_in; // MBIST write data (not really ECC)
input asi_mbist_run; // MBIST
input [3:0] asi_mbist_cmpsel; // MBIST
input [15:0] tel_ecc; // MBIST
output wmr_scan_out; // Warm reset (non)scan
output [47:14] tsd_tba; // Trap Base Address
output [47:2] tsd_wr_tpc;
output tsd_wr_tpc_oor_va;
output [47:2] tsd_wr_tnpc;
output tsd_wr_tnpc_oor_va;
output tsd_wr_tnpc_nonseq;
output [29:0] tsd_wr_data;
output [8:0] tsd_wr_trap_type;
output tsd_mrqr_exc_; // Mondo or Res Err Queue Register exc
output tsd_dqr_exc_; // Device Queue Register exception
output [47:2] tsd_asi_data_;
output [1:0] tsd_asi_data;
output [135:0] tsd_ted_mra_rd_data;
output [3:0] tsd_hpstate_ibe;
output [3:0] tsd_hpstate_red;
output [3:0] tsd_hpstate_hpriv;
output [3:0] tsd_hpstate_tlz;
output [3:0] tsd_pstate_tct;
output [3:0] tsd_pstate_priv;
output [3:0] tsd_pstate_ie;
output [3:0] tsd_pstate_am;
output tsd_htstate_hpriv; // For saturating GL restore
output [10:0] tsd_shadow_pstate;
output [47:2] tsd_shadow_tpc;
output [8:0] tsd_shadow_tt;
output [31:0] tsd_mbist_data; // MBIST
output [3:0] tsd_itlb_bypass;
output [3:0] tlu_itlb_bypass;
output [3:0] tlu_lsu_hpstate_hpriv;
output [3:0] tlu_lsu_pstate_priv;
output [3:0] tlu_ifu_hpstate_hpriv;
output [3:0] tlu_ifu_pstate_priv;
output [3:0] tlu_pmu_hpstate_hpriv;
output [3:0] tlu_pmu_pstate_priv;
output [3:0] tlu_dec_hpstate_hpriv;
output [3:0] tlu_dec_pstate_priv;
output [3:0] tlu_dec_pstate_pef;
output [3:0] tlu_pstate_cle;
output [3:0] tlu_pstate_am;
////////////////////////////////////////////////////////////////////////////////
assign test = tcu_dectest;
tlu_tsd_dp_buff_macro__width_4 clk_control_buf (
////////////////////////////////////////////////////////////////////////////////
// Buffer off noncritical writes
tlu_tsd_dp_buff_macro__width_34 wr_data_47_14_buf (
.din (asi_wr_data_47_14 [47:14] ),
tlu_tsd_dp_buff_macro__width_8 wr_data_07_00_buf (
.din (asi_wr_data_07_00 [7:0] ),
////////////////////////////////////////////////////////////////////////////////
// Shadow copy of ASI registers
tlu_tsd_dp_msff_macro__mux_aope__ports_5__stack_48c__width_32 asireg_lat ( // FS:wmr_protect
.scan_in(asireg_lat_wmr_scanin),
.scan_out(asireg_lat_wmr_scanout),
.sel3 (asi_wr_asireg [3 ] ),
.sel2 (asi_wr_asireg [2 ] ),
.sel1 (asi_wr_asireg [1 ] ),
.sel0 (asi_wr_asireg [0 ] ),
tlu_tsd_dp_mux_macro__mux_aonpe__ports_5__stack_48c__width_32 asireg_mux
.sel4 (trl_asireg_sel [4 ] ),
.sel3 (trl_asireg_sel [3 ] ),
.sel2 (trl_asireg_sel [2 ] ),
.sel1 (trl_asireg_sel [1 ] ),
.sel0 (trl_asireg_sel [0 ] ),
////////////////////////////////////////////////////////////////////////////////
// Trap Base Addresses and Hyperprivileged TBAs
tlu_tsd_dp_msff_macro__left_14__stack_48c__width_34 htba3_lat ( // FS:wmr_protect
.scan_in(htba3_lat_wmr_scanin),
.scan_out(htba3_lat_wmr_scanout),
tlu_tsd_dp_msff_macro__left_14__stack_48c__width_34 htba2_lat ( // FS:wmr_protect
.scan_in(htba2_lat_wmr_scanin),
.scan_out(htba2_lat_wmr_scanout),
tlu_tsd_dp_msff_macro__left_14__stack_48c__width_34 htba1_lat ( // FS:wmr_protect
.scan_in(htba1_lat_wmr_scanin),
.scan_out(htba1_lat_wmr_scanout),
tlu_tsd_dp_msff_macro__left_14__stack_48c__width_34 htba0_lat ( // FS:wmr_protect
.scan_in(htba0_lat_wmr_scanin),
.scan_out(htba0_lat_wmr_scanout),
tlu_tsd_dp_msff_macro__left_15__stack_48c__width_33 tba3_lat ( // FS:wmr_protect
.scan_in(tba3_lat_wmr_scanin),
.scan_out(tba3_lat_wmr_scanout),
tlu_tsd_dp_msff_macro__left_15__stack_48c__width_33 tba2_lat ( // FS:wmr_protect
.scan_in(tba2_lat_wmr_scanin),
.scan_out(tba2_lat_wmr_scanout),
tlu_tsd_dp_msff_macro__left_15__stack_48c__width_33 tba1_lat ( // FS:wmr_protect
.scan_in(tba1_lat_wmr_scanin),
.scan_out(tba1_lat_wmr_scanout),
tlu_tsd_dp_msff_macro__left_15__stack_48c__width_33 tba0_lat ( // FS:wmr_protect
.scan_in(tba0_lat_wmr_scanin),
.scan_out(tba0_lat_wmr_scanout),
////////////////////////////////////////////////////////////////////////////////
tlu_tsd_dp_mux_macro__dmux_8x__left_14__mux_aodec__ports_8__stack_48c__width_34 tba_mux (
.sel (trl_tba_sel [2:0] ),
////////////////////////////////////////////////////////////////////////////////
// Note that Niagara 1 did not implement MM (bits 7:6 of PSTATE)
// Name IBE RED HPRIV TLZ TCT CLE TLE PEF AM PRIV IE
// Architected Position 10 5 2 0 12 9 8 4 3 2 1
// Physical Position 10 5 6 0 7 9 8 4 3 2 1
tlu_tsd_dp_msff_macro__mux_aonpe__ports_5__stack_48c__width_44 pstate_lat (
.scan_in(pstate_lat_scanin),
.scan_out(pstate_lat_scanout),
.din0 ({wdr_pstate3 [10:0],
.din1 ({wdr_pstate3 [10:0],
.din2 ({wdr_pstate3 [10:0],
.din3 ({new_pstate3 [10:0],
.din4 ({wdr_pstate3 [10:0],
.sel0 (trl_pstate_thread_sel [0 ] ),
.sel1 (trl_pstate_thread_sel [1 ] ),
.sel2 (trl_pstate_thread_sel [2 ] ),
.sel3 (trl_pstate_thread_sel [3 ] ),
.sel4 (trl_pstate_thread_sel [4 ] ),
.dout ({pstate3_reg [10:0],
tlu_tsd_dp_mux_macro__mux_aodec__ports_4__stack_48c__width_11 shadow_pstate_mux (
.din0 (pstate0_reg [10:0] ),
.din1 (pstate1_reg [10:0] ),
.din2 (pstate2_reg [10:0] ),
.din3 (pstate3_reg [10:0] ),
.sel (trl_shscanid [1:0] ),
.dout (shadow_pstate [10:0] )
assign tsd_shadow_pstate[10:0] =
assign arch_pstate3[12:0] =
{pstate3_reg[7], 2'b00, pstate3_reg[9:8], 3'b000, pstate3_reg[4:1],
assign arch_pstate2[12:0] =
{pstate2_reg[7], 2'b00, pstate2_reg[9:8], 3'b000, pstate2_reg[4:1],
assign arch_pstate1[12:0] =
{pstate1_reg[7], 2'b00, pstate1_reg[9:8], 3'b000, pstate1_reg[4:1],
assign arch_pstate0[12:0] =
{pstate0_reg[7], 2'b00, pstate0_reg[9:8], 3'b000, pstate0_reg[4:1],
assign arch_hpstate3[12:0] =
{{2 {1'b0}}, pstate3_reg[10], {4 {1'b0}}, pstate3_reg[5],
{2 {1'b0}}, pstate3_reg[6], 1'b0, pstate3_reg[0]};
assign arch_hpstate2[12:0] =
{{2 {1'b0}}, pstate2_reg[10], {4 {1'b0}}, pstate2_reg[5],
{2 {1'b0}}, pstate2_reg[6], 1'b0, pstate2_reg[0]};
assign arch_hpstate1[12:0] =
{{2 {1'b0}}, pstate1_reg[10], {4 {1'b0}}, pstate1_reg[5],
{2 {1'b0}}, pstate1_reg[6], 1'b0, pstate1_reg[0]};
assign arch_hpstate0[12:0] =
{{2 {1'b0}}, pstate0_reg[10], {4 {1'b0}}, pstate0_reg[5],
{2 {1'b0}}, pstate0_reg[6], 1'b0, pstate0_reg[0]};
tlu_tsd_dp_buff_macro__rep_1__stack_48c__width_48 pmu_pstate_buf (
.din ({ pstate3_reg [9 ],
{5 {pstate0_reg [2 ]}}}),
.dout ({tlu_pstate_cle [3 ],
tlu_pmu_hpstate_hpriv [3 ],
tlu_lsu_hpstate_hpriv [3 ],
tlu_dec_hpstate_hpriv [3 ],
tlu_ifu_hpstate_hpriv [3 ],
tlu_pmu_pstate_priv [3 ],
tlu_lsu_pstate_priv [3 ],
tlu_dec_pstate_priv [3 ],
tlu_ifu_pstate_priv [3 ],
tlu_pmu_hpstate_hpriv [2 ],
tlu_lsu_hpstate_hpriv [2 ],
tlu_dec_hpstate_hpriv [2 ],
tlu_ifu_hpstate_hpriv [2 ],
tlu_pmu_pstate_priv [2 ],
tlu_lsu_pstate_priv [2 ],
tlu_dec_pstate_priv [2 ],
tlu_ifu_pstate_priv [2 ],
tlu_pmu_hpstate_hpriv [1 ],
tlu_lsu_hpstate_hpriv [1 ],
tlu_dec_hpstate_hpriv [1 ],
tlu_ifu_hpstate_hpriv [1 ],
tlu_pmu_pstate_priv [1 ],
tlu_lsu_pstate_priv [1 ],
tlu_dec_pstate_priv [1 ],
tlu_ifu_pstate_priv [1 ],
tlu_pmu_hpstate_hpriv [0 ],
tlu_lsu_hpstate_hpriv [0 ],
tlu_dec_hpstate_hpriv [0 ],
tlu_ifu_hpstate_hpriv [0 ],
tlu_pmu_pstate_priv [0 ],
tlu_lsu_pstate_priv [0 ],
tlu_dec_pstate_priv [0 ],
tlu_ifu_pstate_priv [0 ],
assign tsd_pstate_tct[3:0] =
{pstate3_reg[7], pstate2_reg[7], pstate1_reg[7], pstate0_reg[7]};
assign tlu_pstate_am[3:0] =
{pstate3_reg[3], pstate2_reg[3], pstate1_reg[3], pstate0_reg[3]};
assign tsd_pstate_am[3:0] =
{pstate3_reg[3], pstate2_reg[3], pstate1_reg[3], pstate0_reg[3]};
assign tsd_pstate_ie[3:0] =
{pstate3_reg[1], pstate2_reg[1], pstate1_reg[1], pstate0_reg[1]};
assign tsd_hpstate_ibe[3:0] =
{pstate3_reg[10], pstate2_reg[10], pstate1_reg[10], pstate0_reg[10]};
assign tsd_hpstate_red[3:0] =
{pstate3_reg[5], pstate2_reg[5], pstate1_reg[5], pstate0_reg[5]};
assign tsd_hpstate_tlz[3:0] =
{pstate3_reg[0], pstate2_reg[0], pstate1_reg[0], pstate0_reg[0]};
// Bypass ITLB if in RED state or in HPRIV
tlu_tsd_dp_or_macro__ports_2__stack_4r__width_4 itlb_bypass_or (
.din0 ({pstate3_reg [5 ],
.din1 ({pstate3_reg [6 ],
.dout (tlu_itlb_bypass [3:0] )
tlu_tsd_dp_buff_macro__rep_1__stack_4r__width_4 itlb_bypass_buf (
.din (tlu_itlb_bypass [3:0] ),
.dout (tsd_itlb_bypass [3:0] )
assign asi_tsd_wr_data_crit[12] =
assign asi_tsd_wr_data_crit[10:8] =
asi_tsd_wr_data_10_08[10:8];
assign asi_tsd_wr_data_crit[5:0] =
asi_tsd_wr_data_05_00[5:0];
// Mux in ASI writes of PSTATE
tlu_tsd_dp_mux_macro__mux_aope__ports_5__stack_48c__width_44 asi_pstate_mux (
.din4 ({pstate3_reg [10:0],
.din3 ({pstate3_reg [10 ],
asi_tsd_wr_data_crit [9:8],
asi_tsd_wr_data_crit [12 ],
asi_tsd_wr_data_crit [4:1],
.din2 ({pstate3_reg [10:0],
asi_tsd_wr_data_crit [9:8],
asi_tsd_wr_data_crit [12 ],
asi_tsd_wr_data_crit [4:1],
.din1 ({pstate3_reg [10:0],
asi_tsd_wr_data_crit [9:8],
asi_tsd_wr_data_crit [12 ],
asi_tsd_wr_data_crit [4:1],
.din0 ({pstate3_reg [10:0],
asi_tsd_wr_data_crit [9:8],
asi_tsd_wr_data_crit [12 ],
asi_tsd_wr_data_crit [4:1],
.dout ({asi_pstate3 [10:0],
// Mux in ASI writes of HPSTATE
tlu_tsd_dp_mux_macro__mux_aope__ports_5__stack_48c__width_44 asi_hpstate_mux (
.din4 ({asi_pstate3 [10:0],
.din3 ({asi_tsd_wr_data_crit [10 ],
asi_tsd_wr_data_crit [2 ],
asi_tsd_wr_data_crit [5 ],
asi_tsd_wr_data_crit [0 ],
.din2 ({asi_pstate3 [10:0],
asi_tsd_wr_data_crit [10 ],
asi_tsd_wr_data_crit [2 ],
asi_tsd_wr_data_crit [5 ],
asi_tsd_wr_data_crit [0 ],
.din1 ({asi_pstate3 [10:0],
asi_tsd_wr_data_crit [10 ],
asi_tsd_wr_data_crit [2 ],
asi_tsd_wr_data_crit [5 ],
asi_tsd_wr_data_crit [0 ],
.din0 ({asi_pstate3 [10:0],
asi_tsd_wr_data_crit [10 ],
asi_tsd_wr_data_crit [2 ],
asi_tsd_wr_data_crit [5 ],
asi_tsd_wr_data_crit [0 ]}),
.sel3 (wr_hpstate [3 ] ),
.sel2 (wr_hpstate [2 ] ),
.sel1 (wr_hpstate [1 ] ),
.sel0 (wr_hpstate [0 ] ),
.dout ({asi_hpstate3 [10:0],
// Mux in done and retry H/PSTATE restores if ECC is good
tlu_tsd_dp_mux_macro__mux_aope__ports_5__stack_48c__width_44 don_ret_mux (
.din4 ({asi_hpstate3 [10:0],
.din3 ({don_ret_pstate [10:0],
.din2 ({asi_hpstate3 [10:0],
.din1 ({asi_hpstate3 [10:0],
.din0 ({asi_hpstate3 [10:0],
.sel3 (trl_don_ret_pstate_sel [3 ] ),
.sel2 (trl_don_ret_pstate_sel [2 ] ),
.sel1 (trl_don_ret_pstate_sel [1 ] ),
.sel0 (trl_don_ret_pstate_sel [0 ] ),
.dout ({wdr_pstate3 [10:0],
tlu_tsd_dp_mux_macro__mux_aonpe__ports_3__stack_48c__width_44 trap_pstate_mux (
// Normal trap to hypervisor
// IBE to 0, HPRIV to 1, RED to 0, TCT to 0, CLE to 0, PEF to 0,
// AM to 0, PRIV to 0, IE to 0
// Normal trap not to hypervisor
// HPRIV unchanged, RED to 0, TCT to 0, PEF to 1, AM to 0, PRIV to 1,
// IE to 0, CLE set to TLE
.din1 ({pstate3_reg [10 ],
.din0 ({11'b00001110100 ,
.sel1 (trl_stay_in_priv ),
.dout ({new_pstate3 [10:0],
////////////////////////////////////////////////////////////////////////////////
// Handle read-modify-write ASI accesses
tlu_tsd_dp_msff_macro__left_1__minbuff_1__stack_48c__width_47 read_tpc_lat (
.scan_in(read_tpc_lat_scanin),
.scan_out(read_tpc_lat_scanout),
.dout ({tpc_mod_crit [47:2],
tlu_tsd_dp_buff_macro__left_1__rep_1__stack_48c__width_47 read_tpc_buf (
.din ({tpc_mod_crit [47:2],
tlu_tsd_dp_msff_macro__minbuff_1__stack_48c__width_48 read_tnpc_lat (
.scan_in(read_tnpc_lat_scanin),
.scan_out(read_tnpc_lat_scanout),
.dout ({tnpc_mod_crit [47:2],
tlu_tsd_dp_buff_macro__rep_1__stack_48c__width_48 read_tnpc_buf (
.din ({tnpc_mod_crit [47:2],
tlu_tsd_dp_msff_macro__left_7__minbuff_1__stack_48c__width_41 read_tstate_lat (
.scan_in(read_tstate_lat_scanin),
.scan_out(read_tstate_lat_scanout),
.dout ({gl_mod_crit [1:0],
trap_type_mod_crit [8:0]}),
tlu_tsd_dp_buff_macro__left_6__stack_48c__width_42 read_tstate_buf (
.din ({gl_mod_crit [1:0],
trap_type_mod_crit [8:0],
assign tsd_ted_mra_rd_data[135:0] =
trap_type_mod_crit [8:0],
tlu_tsd_dp_msff_macro__left_1__mux_aope__ports_8__stack_48c__width_47 wr_tpc_lat (
.scan_in(wr_tpc_lat_scanin),
.scan_out(wr_tpc_lat_scanout),
.din0 ({asi_mbist_ecc_in [3:0],
{5 {asi_mbist_ecc_in [7:0]}},
.din1 ({asi_tsa_wr_data [47:2],
.din2 ({asi_tsa_wr_data [17:6], // Mondo or Res Head
asi_tsa_wr_data [17:6], // Device or Nonres Head
.din4 ({asi_tsa_wr_data [17:6], // Mondo or Res Head
asi_tsa_wr_data [17:6], // Device or Nonres Head
.din7 ({pct_tsa_pc [47:2],
.sel2 (asi_wr_mondo_head ),
.sel3 (asi_wr_device_head ),
.sel4 (asi_wr_res_err_head ),
.sel5 (asi_wr_nonres_err_head ),
.en (trl_tsd_tsa_wd_en ),
.dout ({tsd_wr_tpc [47:2],
tlu_tsd_dp_msff_macro__left_2__minbuff_1__stack_48c__width_46 shadow_tpc_lat (
.scan_in(shadow_tpc_lat_scanin),
.scan_out(shadow_tpc_lat_scanout),
.din (tsd_wr_tpc [47:2] ),
.dout (tsd_shadow_tpc [47:2] ),
// Check Interrupt Queue Registers on write to any of them
// (qualification occurs in tlu_fls_ctl)
// Convert queue registers to 12 bit.
tlu_tsd_dp_cmp_macro__width_12 mondo_res_err_cmp (
.din0 (tsd_wr_tpc [47:36] ),
.din1 (tsd_wr_tnpc [47:36] ),
tlu_tsd_dp_cmp_macro__width_12 device_cmp (
.din0 (tsd_wr_tpc [35:24] ),
.din1 (tsd_wr_tnpc [35:24] ),
// MBIST writes factored into asi_tsa_wr_data for TNPC
tlu_tsd_dp_msff_macro__mux_aope__ports_8__stack_48c__width_48 wr_tnpc_lat (
.scan_in(wr_tnpc_lat_scanin),
.scan_out(wr_tnpc_lat_scanout),
.din0 ({asi_tsa_wr_data [47:2],
asi_tsa_wr_data_npc_oor_va ,
asi_tsa_wr_data_npc_nonseq }),
.din2 ({asi_tsa_wr_data [17:6], // Mondo or Res Tail
.din3 ({tnpc_mod [47:36],
asi_tsa_wr_data [17:6], // Device or Nonres Tail
.din4 ({asi_tsa_wr_data [17:6], // Mondo or Res Tail
.din5 ({tnpc_mod [47:36],
asi_tsa_wr_data [17:6], // Device or Nonres Tail
.din7 ({pct_tsa_npc [47:2],
.sel2 (asi_wr_mondo_tail ),
.sel3 (asi_wr_device_tail ),
.sel4 (asi_wr_res_err_tail ),
.sel5 (asi_wr_nonres_err_tail ),
.en (trl_tsd_tsa_wd_en ),
.dout ({tsd_wr_tnpc [47:2],
tlu_tsd_dp_msff_macro__mux_aope__ports_8__stack_48c__width_41 wr_tstate_lat (
.scan_in(wr_tstate_lat_scanin),
.scan_out(wr_tstate_lat_scanout),
.din0 ({asi_mbist_ecc_in [4:0],
{4 {asi_mbist_ecc_in [7:0]}},
asi_mbist_ecc_in [7:4]}),
.din3 ({asi_tsa_wr_data [41:40], // GL
asi_tsa_wr_data [39:32], // CCR
asi_tsa_wr_data [31:24], // ASI
asi_tsa_wr_data [17:16], // CLE, TLE
asi_tsa_wr_data [20 ], // TCT
tstate_mod [9 ], // HPRIV
asi_tsa_wr_data [12:9], // PEF, AM, PRIV, IE
asi_tsa_wr_data [2:0], // CWP
trap_type_mod [8:0]}), // Trap Type
tstate_mod [29:0], // Everything but Trap Type
asi_tsa_wr_data [8:0]}), // Trap Type
.din5 ({gl_mod [1:0], // GL
tstate_mod [29:22], // CCR
tstate_mod [21:14], // ASI
asi_tsa_wr_data [10 ], // IBE
tstate_mod [12:11], // CLE, TLE
asi_tsa_wr_data [2 ], // HPRIV
asi_tsa_wr_data [5 ], // RED
tstate_mod [7:4], // PEF, AM, PRIV, IE
asi_tsa_wr_data [0 ], // TLZ
trap_type_mod [8:0]}), // Trap Type
tstate_mod [29:0], // Everything but Trap Type
trap_type_mod [8:0]}), // Trap Type
.din7 ({trl_tsa_gl [1:0],
trl_tsa_trap_type [8:0]}),
.en (trl_tsd_tsa_wd_en ),
tsd_wr_trap_type [8:0]}),
tlu_tsd_dp_buff_macro__rep_1__stack_48c__width_30 ccr_cwp_asi_buf (
.din (tsd_wr_data [29:0] ),
tlu_tsd_dp_msff_macro__stack_48c__width_9 shadow_tt_lat (
.scan_in(shadow_tt_lat_scanin),
.scan_out(shadow_tt_lat_scanout),
.din (tsd_wr_trap_type [8:0] ),
.dout (tsd_shadow_tt [8:0] ),
////////////////////////////////////////////////////////////////////////////////
// Build write vector for Trap Stack Array
// GL CCR ASI (H)PSTATE CWP TT PC nPC
// 41 40 39 32 31 24 19 8 4 0
// GL, TT, PC, nPC concatenated at the array instantiation
// Also implement HTSTATE
tlu_tsd_dp_mux_macro__mux_aonpe__ports_4__stack_48c__width_30 tsa_write_lat (
.sel0 (trl_thread_sel [0 ] ),
.sel1 (trl_thread_sel [1 ] ),
.sel2 (trl_thread_sel [2 ] ),
.sel3 (trl_thread_sel [3 ] ),
.dout (tsa_wr_data [29:0] )
////////////////////////////////////////////////////////////////////////////////
tlu_tsd_dp_msff_macro__left_11__stack_48c__width_26 rd_ctl_lat (
.scan_in(rd_ctl_lat_scanin),
.scan_out(rd_ctl_lat_scanout),
asi_rd_h_pstate_tba [2:0],
tlu_tsd_dp_mux_macro__mux_aodec__ports_8__stack_48c__width_13 asi_php_mux (
.din0 (arch_pstate0 [12:0] ),
.din1 (arch_pstate1 [12:0] ),
.din2 (arch_pstate2 [12:0] ),
.din3 (arch_pstate3 [12:0] ),
.din4 (arch_hpstate0 [12:0] ),
.din5 (arch_hpstate1 [12:0] ),
.din6 (arch_hpstate2 [12:0] ),
.din7 (arch_hpstate3 [12:0] ),
.sel (rd_h_pstate_tba[2:0] ),
.dout (asi_h_pstate [12:0] )
assign asi_h_pstate[47:13] =
tlu_tsd_dp_mux_macro__left_14__mux_aodec__ports_8__stack_48c__width_34 asi_pstate_tba_mux (
.sel (rd_h_pstate_tba[2:0] ),
.dout (asi_h_tba [47:14] )
tlu_tsd_dp_mux_macro__dmux_8x__mux_aonpe__ports_6__stack_48c__width_48 asi_data_mux (
.din4 (asi_h_tba [47:0] ),
.din5 (asi_h_pstate [47:0] ),
.sel5 (rd_pstate_hpstate ),
tlu_tsd_dp_mux_macro__left_6__mux_aope__ports_4__stack_48c__width_12 iqr_mux (
.din0 (tnpc_mod [35:24] ), // Device or Nonres Tail
.din1 (tnpc_mod [47:36] ), // Mondo or Res Tail
.din2 (tpc_mod [35:24] ), // Device or Nonres Head
.din3 (tpc_mod [47:36] ), // Mondo or Res Head
.dout (iqr_ungated [17:6] )
// Have to force this off since it's just ORed into downstream logic...
tlu_tsd_dp_and_macro__left_6__ports_2__stack_48c__width_12 iqr_and (
.din0 (iqr_ungated [17:6] ),
.din1 ({12 {rd_iqr_reg}} ),
assign pstate_mod[10:0] =
tlu_tsd_dp_mux_macro__mux_aonpe__ports_5__stack_48c__width_48 tsa_asi_data_mux (
tstate_mod [29:14], // CCR, ASI
pstate_mod [9:8], // CLE, TLE
pstate_mod [4:1], // PEF, AM, PRIV, IE
tstate_mod [2:0]}), // CWP
pstate_mod [6 ], // HPRIV
pstate_mod [0 ]}), // TLZ
.dout (tsa_asi_data [47:0] )
tlu_tsd_dp_nor_macro__ports_3__stack_48c__width_48 asi_data_nor (
.din0 (asi_data [47:0] ),
.din1 (tsa_asi_data [47:0] ),
.dout (asi_data_ [47:0] )
tlu_tsd_dp_buff_macro__left_2__rep_1__stack_48c__width_46 asi_data_b_buf (
.din (asi_data_ [47:2] ),
.dout (tsd_asi_data_ [47:2] )
tlu_tsd_dp_inv_macro__stack_48c__width_2 asi_data_inv (
.dout (tsd_asi_data [1:0] )
////////////////////////////////////////////////////////////////////////////////
tlu_tsd_dp_msff_macro__width_4 cmpsel_lat (
.scan_in(cmpsel_lat_scanin),
.scan_out(cmpsel_lat_scanout),
.din (asi_mbist_cmpsel [3:0] ),
tlu_tsd_dp_buff_macro__dbuff_32x__width_1 tst_mux_rep0 (
.dout (tcu_muxtest_rep0 )
tlu_tsd_dp_mux_macro__mux_pgpe__ports_5__stack_48c__width_32 mbist_mux (
.din3 ({tstate_mod [26:0],
.din2 ({trap_type_mod [3:0],
.din0 (tnpc_mod [33:2] ),
.muxtst (tcu_muxtest_rep0 ),
.dout (tsd_mbist_data [31:0] ),
assign pstate_lat_scanin = scan_in ;
assign read_tpc_lat_scanin = pstate_lat_scanout ;
assign read_tnpc_lat_scanin = read_tpc_lat_scanout ;
assign read_tstate_lat_scanin = read_tnpc_lat_scanout ;
assign wr_tpc_lat_scanin = read_tstate_lat_scanout ;
assign shadow_tpc_lat_scanin = wr_tpc_lat_scanout ;
assign wr_tnpc_lat_scanin = shadow_tpc_lat_scanout ;
assign wr_tstate_lat_scanin = wr_tnpc_lat_scanout ;
assign shadow_tt_lat_scanin = wr_tstate_lat_scanout ;
assign rd_ctl_lat_scanin = shadow_tt_lat_scanout ;
assign cmpsel_lat_scanin = rd_ctl_lat_scanout ;
assign scan_out = cmpsel_lat_scanout ;
assign asireg_lat_wmr_scanin = wmr_scan_in ;
assign htba3_lat_wmr_scanin = asireg_lat_wmr_scanout ;
assign htba2_lat_wmr_scanin = htba3_lat_wmr_scanout ;
assign htba1_lat_wmr_scanin = htba2_lat_wmr_scanout ;
assign htba0_lat_wmr_scanin = htba1_lat_wmr_scanout ;
assign tba3_lat_wmr_scanin = htba0_lat_wmr_scanout ;
assign tba2_lat_wmr_scanin = tba3_lat_wmr_scanout ;
assign tba1_lat_wmr_scanin = tba2_lat_wmr_scanout ;
assign tba0_lat_wmr_scanin = tba1_lat_wmr_scanout ;
assign wmr_scan_out = tba0_lat_wmr_scanout ;
module tlu_tsd_dp_buff_macro__width_4 (
module tlu_tsd_dp_buff_macro__width_34 (
module tlu_tsd_dp_buff_macro__width_8 (
// any PARAMS parms go into naming of macro
module tlu_tsd_dp_msff_macro__mux_aope__ports_5__stack_48c__width_32 (
.so({so[30:0],scan_out}),
// general mux macro for pass-gate and and-or muxes with/wout priority encoders
// also for pass-gate with decoder
// any PARAMS parms go into naming of macro
module tlu_tsd_dp_mux_macro__mux_aonpe__ports_5__stack_48c__width_32 (
cl_dp1_muxbuff5_8x c0_0 (
// any PARAMS parms go into naming of macro
module tlu_tsd_dp_msff_macro__left_14__stack_48c__width_34 (
.so({so[32:0],scan_out}),
// any PARAMS parms go into naming of macro
module tlu_tsd_dp_msff_macro__left_15__stack_48c__width_33 (
.so({so[31:0],scan_out}),
// general mux macro for pass-gate and and-or muxes with/wout priority encoders
// also for pass-gate with decoder
// any PARAMS parms go into naming of macro
module tlu_tsd_dp_mux_macro__dmux_8x__left_14__mux_aodec__ports_8__stack_48c__width_34 (
// any PARAMS parms go into naming of macro
module tlu_tsd_dp_msff_macro__mux_aonpe__ports_5__stack_48c__width_44 (
cl_dp1_muxbuff5_8x c1_0 (
.so({so[42:0],scan_out}),
// general mux macro for pass-gate and and-or muxes with/wout priority encoders
// also for pass-gate with decoder
// any PARAMS parms go into naming of macro
module tlu_tsd_dp_mux_macro__mux_aodec__ports_4__stack_48c__width_11 (
module tlu_tsd_dp_buff_macro__rep_1__stack_48c__width_48 (
// or macro for ports = 2,3
module tlu_tsd_dp_or_macro__ports_2__stack_4r__width_4 (
module tlu_tsd_dp_buff_macro__rep_1__stack_4r__width_4 (
// general mux macro for pass-gate and and-or muxes with/wout priority encoders
// also for pass-gate with decoder
// any PARAMS parms go into naming of macro
module tlu_tsd_dp_mux_macro__mux_aope__ports_5__stack_48c__width_44 (
// general mux macro for pass-gate and and-or muxes with/wout priority encoders
// also for pass-gate with decoder
// any PARAMS parms go into naming of macro
module tlu_tsd_dp_mux_macro__mux_aonpe__ports_3__stack_48c__width_44 (
cl_dp1_muxbuff3_8x c0_0 (
// any PARAMS parms go into naming of macro
module tlu_tsd_dp_msff_macro__left_1__minbuff_1__stack_48c__width_47 (
.so({so[45:0],scan_out}),
module tlu_tsd_dp_buff_macro__left_1__rep_1__stack_48c__width_47 (
// any PARAMS parms go into naming of macro
module tlu_tsd_dp_msff_macro__minbuff_1__stack_48c__width_48 (
.so({so[46:0],scan_out}),
// any PARAMS parms go into naming of macro
module tlu_tsd_dp_msff_macro__left_7__minbuff_1__stack_48c__width_41 (
.so({so[39:0],scan_out}),
module tlu_tsd_dp_buff_macro__left_6__stack_48c__width_42 (
// any PARAMS parms go into naming of macro
module tlu_tsd_dp_msff_macro__left_1__mux_aope__ports_8__stack_48c__width_47 (
.so({so[45:0],scan_out}),
// any PARAMS parms go into naming of macro
module tlu_tsd_dp_msff_macro__left_2__minbuff_1__stack_48c__width_46 (
.so({so[44:0],scan_out}),
// comparator macro (output is 1 if both inputs are equal; 0 otherwise)
module tlu_tsd_dp_cmp_macro__width_12 (
// any PARAMS parms go into naming of macro
module tlu_tsd_dp_msff_macro__mux_aope__ports_8__stack_48c__width_48 (
.so({so[46:0],scan_out}),
// any PARAMS parms go into naming of macro
module tlu_tsd_dp_msff_macro__mux_aope__ports_8__stack_48c__width_41 (
.so({so[39:0],scan_out}),
module tlu_tsd_dp_buff_macro__rep_1__stack_48c__width_30 (
// any PARAMS parms go into naming of macro
module tlu_tsd_dp_msff_macro__stack_48c__width_9 (
// general mux macro for pass-gate and and-or muxes with/wout priority encoders
// also for pass-gate with decoder
// any PARAMS parms go into naming of macro
module tlu_tsd_dp_mux_macro__mux_aonpe__ports_4__stack_48c__width_30 (
cl_dp1_muxbuff4_8x c0_0 (
// any PARAMS parms go into naming of macro
module tlu_tsd_dp_msff_macro__left_11__stack_48c__width_26 (
.so({so[24:0],scan_out}),
// general mux macro for pass-gate and and-or muxes with/wout priority encoders
// also for pass-gate with decoder
// any PARAMS parms go into naming of macro
module tlu_tsd_dp_mux_macro__mux_aodec__ports_8__stack_48c__width_13 (
// general mux macro for pass-gate and and-or muxes with/wout priority encoders
// also for pass-gate with decoder
// any PARAMS parms go into naming of macro
module tlu_tsd_dp_mux_macro__left_14__mux_aodec__ports_8__stack_48c__width_34 (
// general mux macro for pass-gate and and-or muxes with/wout priority encoders
// also for pass-gate with decoder
// any PARAMS parms go into naming of macro
module tlu_tsd_dp_mux_macro__dmux_8x__mux_aonpe__ports_6__stack_48c__width_48 (
cl_dp1_muxbuff6_8x c0_0 (
// general mux macro for pass-gate and and-or muxes with/wout priority encoders
// also for pass-gate with decoder
// any PARAMS parms go into naming of macro
module tlu_tsd_dp_mux_macro__left_6__mux_aope__ports_4__stack_48c__width_12 (
// and macro for ports = 2,3,4
module tlu_tsd_dp_and_macro__left_6__ports_2__stack_48c__width_12 (
// general mux macro for pass-gate and and-or muxes with/wout priority encoders
// also for pass-gate with decoder
// any PARAMS parms go into naming of macro
module tlu_tsd_dp_mux_macro__mux_aonpe__ports_5__stack_48c__width_48 (
cl_dp1_muxbuff5_8x c0_0 (
// nor macro for ports = 2,3
module tlu_tsd_dp_nor_macro__ports_3__stack_48c__width_48 (
module tlu_tsd_dp_buff_macro__left_2__rep_1__stack_48c__width_46 (
module tlu_tsd_dp_inv_macro__stack_48c__width_2 (
// any PARAMS parms go into naming of macro
module tlu_tsd_dp_msff_macro__width_4 (
module tlu_tsd_dp_buff_macro__dbuff_32x__width_1 (
// general mux macro for pass-gate and and-or muxes with/wout priority encoders
// also for pass-gate with decoder
// any PARAMS parms go into naming of macro
module tlu_tsd_dp_mux_macro__mux_pgpe__ports_5__stack_48c__width_32 (