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.
1923 lines
78 KiB
Verilog
1923 lines
78 KiB
Verilog
// © IBM Corp. 2020
|
|
// Licensed under the Apache License, Version 2.0 (the "License"), as modified by
|
|
// the terms below; you may not use the files in this repository except in
|
|
// compliance with the License as modified.
|
|
// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Modified Terms:
|
|
//
|
|
// 1) For the purpose of the patent license granted to you in Section 3 of the
|
|
// License, the "Work" hereby includes implementations of the work of authorship
|
|
// in physical form.
|
|
//
|
|
// 2) Notwithstanding any terms to the contrary in the License, any licenses
|
|
// necessary for implementation of the Work that are available from OpenPOWER
|
|
// via the Power ISA End User License Agreement (EULA) are explicitly excluded
|
|
// hereunder, and may be obtained from OpenPOWER under the terms and conditions
|
|
// of the EULA.
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, the reference design
|
|
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
|
|
// for the specific language governing permissions and limitations under the License.
|
|
//
|
|
// Additional rights, including the ability to physically implement a softcore that
|
|
// is compliant with the required sections of the Power ISA Specification, are
|
|
// available at no cost under the terms of the OpenPOWER Power ISA EULA, which can be
|
|
// obtained (along with the Power ISA) here: https://openpowerfoundation.org.
|
|
|
|
`timescale 1 ns / 1 ns
|
|
|
|
//********************************************************************
|
|
//*
|
|
//* TITLE: Instruction Select
|
|
//*
|
|
//* NAME: iuq_ic_select.v
|
|
//*
|
|
//*********************************************************************
|
|
|
|
`include "tri_a2o.vh"
|
|
|
|
module iuq_ic_select(
|
|
inout vdd,
|
|
inout gnd,
|
|
|
|
(* pin_data ="PIN_FUNCTION=/G_CLK/" *)
|
|
input [0:`NCLK_WIDTH-1] nclk,
|
|
input pc_iu_func_sl_thold_0_b,
|
|
input pc_iu_func_slp_sl_thold_0_b,
|
|
input pc_iu_sg_0,
|
|
input force_t,
|
|
input funcslp_force,
|
|
input d_mode,
|
|
input delay_lclkr,
|
|
input mpw1_b,
|
|
input mpw2_b,
|
|
(* pin_data ="PIN_FUNCTION=/SCAN_IN/" *)
|
|
input func_scan_in,
|
|
(* pin_data ="PIN_FUNCTION=/SCAN_OUT/" *)
|
|
output func_scan_out,
|
|
|
|
input [0:`THREADS-1] pc_iu_ram_active,
|
|
input [0:`THREADS-1] pc_iu_pm_fetch_halt,
|
|
input [0:`THREADS-1] xu_iu_run_thread,
|
|
input [0:`THREADS-1] cp_ic_stop,
|
|
input [0:`THREADS-1] xu_iu_msr_cm, // 0=32bit, 1=64bit address mode
|
|
|
|
input [0:`THREADS-1] cp_flush,
|
|
input [0:`THREADS-1] cp_flush_into_uc,
|
|
input [0:`THREADS-1] br_iu_redirect,
|
|
input [62-`EFF_IFAR_ARCH:61] br_iu_bta,
|
|
input [62-`EFF_IFAR_ARCH:61] cp_iu0_t0_flush_ifar,
|
|
`ifndef THREADS1
|
|
input [62-`EFF_IFAR_ARCH:61] cp_iu0_t1_flush_ifar,
|
|
`endif
|
|
input [0:`THREADS-1] cp_iu0_flush_2ucode,
|
|
input [0:`THREADS-1] cp_iu0_flush_2ucode_type,
|
|
input [0:`THREADS-1] cp_iu0_flush_nonspec,
|
|
|
|
output [0:`THREADS-1] ic_cp_nonspec_hit,
|
|
|
|
input an_ac_back_inv, // Arrives 1 cycle before addr
|
|
input [64-`REAL_IFAR_WIDTH:57] an_ac_back_inv_addr,
|
|
input an_ac_back_inv_target, // connect to bit(0); arrives 1 cycle before addr
|
|
|
|
input spr_ic_prefetch_dis,
|
|
input spr_ic_ierat_byp_dis,
|
|
|
|
input spr_ic_idir_read,
|
|
input [51:57] spr_ic_idir_row,
|
|
|
|
output [3:8] ic_perf_t0_event,
|
|
`ifndef THREADS1
|
|
output [3:8] ic_perf_t1_event,
|
|
`endif
|
|
|
|
output iu_ierat_iu0_val,
|
|
output [0:`THREADS-1] iu_ierat_iu0_thdid,
|
|
output [0:51] iu_ierat_iu0_ifar,
|
|
output iu_ierat_iu0_nonspec,
|
|
output iu_ierat_iu0_prefetch,
|
|
output [0:`THREADS-1] iu_ierat_flush,
|
|
output iu_ierat_ium1_back_inv,
|
|
input [0:`THREADS-1] ierat_iu_hold_req,
|
|
input [0:`THREADS-1] ierat_iu_iu2_flush_req,
|
|
input ierat_iu_iu2_miss,
|
|
input ierat_iu_cam_change,
|
|
|
|
// MMU Connections
|
|
input [0:`THREADS-1] mm_iu_hold_req,
|
|
input [0:`THREADS-1] mm_iu_hold_done,
|
|
input [0:`THREADS-1] mm_iu_bus_snoop_hold_req,
|
|
input [0:`THREADS-1] mm_iu_bus_snoop_hold_done,
|
|
|
|
// ICBI Interface to IU
|
|
input [0:`THREADS-1] lq_iu_icbi_val,
|
|
input [64-`REAL_IFAR_WIDTH:57] lq_iu_icbi_addr,
|
|
output [0:`THREADS-1] iu_lq_icbi_complete,
|
|
|
|
// IU IC Miss
|
|
input [0:`THREADS-1] icm_ics_iu0_preload_val,
|
|
input [50:59] icm_ics_iu0_preload_ifar,
|
|
input [0:`THREADS-1] icm_ics_prefetch_req,
|
|
input [0:`THREADS-1] icm_ics_prefetch_sm_idle,
|
|
|
|
input [0:`THREADS-1] icm_ics_hold_thread,
|
|
input icm_ics_hold_iu0,
|
|
input icm_ics_iu3_miss_match,
|
|
input [0:`THREADS-1] icm_ics_iu3_ecc_fp_cancel,
|
|
|
|
output [46:52] ics_icm_iu0_t0_ifar,
|
|
`ifndef THREADS1
|
|
output [46:52] ics_icm_iu0_t1_ifar,
|
|
`endif
|
|
output ics_icm_iu0_inval,
|
|
output [51:57] ics_icm_iu0_inval_addr,
|
|
output [0:`THREADS-1] ics_icm_iu2_flush,
|
|
|
|
// IU IC Dir
|
|
output ics_icd_dir_rd_act,
|
|
output [0:1] ics_icd_data_rd_act,
|
|
output ics_icd_iu0_valid,
|
|
output [0:`THREADS-1] ics_icd_iu0_tid,
|
|
output [62-`EFF_IFAR_ARCH:61] ics_icd_iu0_ifar,
|
|
output ics_icd_iu0_index51,
|
|
output ics_icd_iu0_inval,
|
|
output ics_icd_iu0_2ucode,
|
|
output ics_icd_iu0_2ucode_type,
|
|
output ics_icd_iu0_prefetch,
|
|
output ics_icd_iu0_read_erat,
|
|
output ics_icd_iu0_spr_idir_read,
|
|
|
|
output [0:`THREADS-1] ics_icd_iu1_flush,
|
|
output [0:`THREADS-1] ics_icd_iu2_flush,
|
|
input icd_ics_iu1_valid,
|
|
input [0:`THREADS-1] icd_ics_iu1_tid,
|
|
input [62-`EFF_IFAR_WIDTH:61] icd_ics_iu1_ifar,
|
|
input icd_ics_iu1_2ucode,
|
|
input icd_ics_iu1_2ucode_type,
|
|
input [0:`THREADS-1] icd_ics_iu1_read_erat,
|
|
input [0:`THREADS-1] icd_ics_iu3_miss_flush,
|
|
input [0:`THREADS-1] icd_ics_iu2_wrong_ra_flush,
|
|
input [0:`THREADS-1] icd_ics_iu2_cam_etc_flush,
|
|
input [62-`EFF_IFAR_WIDTH:61] icd_ics_iu2_ifar_eff,
|
|
input icd_ics_iu2_2ucode,
|
|
input icd_ics_iu2_2ucode_type,
|
|
input icd_ics_iu2_valid,
|
|
input [0:`THREADS-1] icd_ics_iu2_read_erat_error,
|
|
input [0:`THREADS-1] icd_ics_iu3_parity_flush,
|
|
input [62-`EFF_IFAR_WIDTH:61] icd_ics_iu3_ifar,
|
|
input icd_ics_iu3_2ucode,
|
|
input icd_ics_iu3_2ucode_type,
|
|
|
|
// BP
|
|
output [0:`THREADS-1] ic_bp_iu0_val,
|
|
output [50:59] ic_bp_iu0_ifar,
|
|
output [0:`THREADS-1] ic_bp_iu2_flush,
|
|
|
|
//iu5 hold/redirect
|
|
input [0:`THREADS-1] bp_ic_iu2_redirect,
|
|
input [0:`THREADS-1] bp_ic_iu3_redirect,
|
|
input [0:`THREADS-1] bp_ic_iu4_redirect,
|
|
input [62-`EFF_IFAR_WIDTH:61] bp_ic_t0_redirect_ifar,
|
|
`ifndef THREADS1
|
|
input [62-`EFF_IFAR_WIDTH:61] bp_ic_t1_redirect_ifar,
|
|
`endif
|
|
|
|
// ucode
|
|
input [0:`THREADS-1] uc_ic_hold,
|
|
input [0:`THREADS-1] uc_iu4_flush,
|
|
input [62-`EFF_IFAR_WIDTH:61] uc_iu4_t0_flush_ifar,
|
|
`ifndef THREADS1
|
|
input [62-`EFF_IFAR_WIDTH:61] uc_iu4_t1_flush_ifar,
|
|
`endif
|
|
|
|
//Instruction Buffer
|
|
`ifndef THREADS1
|
|
input [0:`IBUFF_DEPTH/4-1] ib_ic_t1_need_fetch,
|
|
`endif
|
|
input [0:`IBUFF_DEPTH/4-1] ib_ic_t0_need_fetch,
|
|
|
|
input event_bus_enable
|
|
);
|
|
|
|
// iuq_ic_select
|
|
|
|
localparam [0:31] value_1 = 32'h00000001;
|
|
|
|
parameter an_ac_back_inv_offset = 0;
|
|
parameter an_ac_back_inv_target_offset = an_ac_back_inv_offset + 1;
|
|
parameter an_ac_back_inv_addr_offset = an_ac_back_inv_target_offset + 1;
|
|
parameter spr_idir_read_offset = an_ac_back_inv_addr_offset + `REAL_IFAR_WIDTH - 6;
|
|
parameter spr_idir_row_offset = spr_idir_read_offset + 1;
|
|
parameter oldest_prefetch_offset = spr_idir_row_offset + 7;
|
|
parameter iu0_need_prefetch_offset = oldest_prefetch_offset + `THREADS - 1;
|
|
parameter iu0_prefetch_ifar_offset = iu0_need_prefetch_offset + `THREADS;
|
|
parameter lq_iu_icbi_val_offset = iu0_prefetch_ifar_offset + (`THREADS) * (`EFF_IFAR_WIDTH - 4);
|
|
parameter lq_iu_icbi_addr_offset = lq_iu_icbi_val_offset + `THREADS * `THREADS; //4
|
|
parameter back_inv_offset = lq_iu_icbi_addr_offset + (`THREADS) * (`REAL_IFAR_WIDTH - 6);
|
|
parameter back_inv_icbi_offset = back_inv_offset + 1;
|
|
parameter xu_iu_msr_cm_offset = back_inv_icbi_offset + `THREADS;
|
|
parameter xu_iu_msr_cm2_offset = xu_iu_msr_cm_offset + `THREADS;
|
|
parameter xu_iu_msr_cm3_offset = xu_iu_msr_cm2_offset + `THREADS;
|
|
parameter xu_iu_run_thread_offset = xu_iu_msr_cm3_offset + `THREADS;
|
|
parameter cp_ic_stop_offset = xu_iu_run_thread_offset + `THREADS; //2
|
|
parameter pc_iu_pm_fetch_halt_offset = cp_ic_stop_offset + `THREADS; //2
|
|
parameter ierat_hold_offset = pc_iu_pm_fetch_halt_offset + `THREADS; //2
|
|
parameter iu0_2ucode_offset = ierat_hold_offset + `THREADS; //2
|
|
parameter iu0_2ucode_type_offset = iu0_2ucode_offset + `THREADS; //2
|
|
parameter iu0_flip_index51_offset = iu0_2ucode_type_offset + `THREADS; //2
|
|
parameter iu0_last_tid_sent_offset = iu0_flip_index51_offset + `THREADS; //2
|
|
parameter iu0_sent_offset = iu0_last_tid_sent_offset + 1 * (`THREADS - 1); //1
|
|
parameter iu0_ifar_offset = iu0_sent_offset + `THREADS * 3 * (`IBUFF_DEPTH/4);
|
|
parameter stored_erat_ifar_offset = iu0_ifar_offset + `THREADS * `EFF_IFAR_ARCH;
|
|
parameter stored_erat_valid_offset = stored_erat_ifar_offset + `THREADS * (`EFF_IFAR_WIDTH - 10);
|
|
parameter mm_hold_req_offset = stored_erat_valid_offset + `THREADS;
|
|
parameter mm_bus_snoop_hold_req_offset = mm_hold_req_offset + `THREADS; //2
|
|
parameter cp_flush_offset = mm_bus_snoop_hold_req_offset + `THREADS; //2
|
|
parameter cp_flush_into_uc_offset = cp_flush_offset + `THREADS; //2
|
|
parameter cp_flush_ifar_offset = cp_flush_into_uc_offset + `THREADS; //2
|
|
parameter cp_flush_2ucode_offset = cp_flush_ifar_offset + `THREADS * `EFF_IFAR_ARCH;
|
|
parameter cp_flush_2ucode_type_offset = cp_flush_2ucode_offset + `THREADS; //2
|
|
parameter cp_flush_nonspec_offset = cp_flush_2ucode_type_offset + `THREADS; //2
|
|
parameter br_iu_redirect_offset = cp_flush_nonspec_offset + `THREADS; //2
|
|
parameter br_iu_bta_offset = br_iu_redirect_offset + `THREADS; //2
|
|
parameter next_fetch_nonspec_offset = br_iu_bta_offset + `EFF_IFAR_ARCH;
|
|
parameter iu1_nonspec_offset = next_fetch_nonspec_offset + `THREADS;
|
|
parameter iu2_nonspec_offset = iu1_nonspec_offset + `THREADS;
|
|
parameter perf_event_offset = iu2_nonspec_offset + `THREADS;
|
|
parameter scan_right = perf_event_offset + `THREADS * 6 - 1;
|
|
|
|
wire tiup;
|
|
|
|
// Latch inputs
|
|
wire an_ac_back_inv_d;
|
|
wire an_ac_back_inv_l2;
|
|
|
|
wire an_ac_back_inv_target_d;
|
|
wire an_ac_back_inv_target_l2;
|
|
|
|
wire [64-`REAL_IFAR_WIDTH:57] an_ac_back_inv_addr_d;
|
|
wire [64-`REAL_IFAR_WIDTH:57] an_ac_back_inv_addr_l2;
|
|
|
|
wire spr_idir_read_d;
|
|
wire spr_idir_read_l2;
|
|
|
|
wire [51:57] spr_idir_row_d;
|
|
wire [51:57] spr_idir_row_l2;
|
|
|
|
wire oldest_prefetch_d;
|
|
wire oldest_prefetch_l2;
|
|
|
|
wire [0:`THREADS-1] iu0_need_prefetch_d;
|
|
wire [0:`THREADS-1] iu0_need_prefetch_l2;
|
|
|
|
wire [62-`EFF_IFAR_WIDTH:57] iu0_prefetch_ifar_d[0:`THREADS-1];
|
|
wire [62-`EFF_IFAR_WIDTH:57] iu0_prefetch_ifar_l2[0:`THREADS-1];
|
|
|
|
wire [0:`THREADS*`THREADS-1] lq_iu_icbi_val_d; // 2*2
|
|
wire [0:`THREADS*`THREADS-1] lq_iu_icbi_val_l2; // 2*2
|
|
|
|
wire [64-`REAL_IFAR_WIDTH:57] lq_iu_icbi_addr_d[0:`THREADS-1];
|
|
wire [64-`REAL_IFAR_WIDTH:57] lq_iu_icbi_addr_l2[0:`THREADS-1];
|
|
|
|
wire back_inv_d;
|
|
wire back_inv_l2;
|
|
|
|
wire [0:`THREADS-1] back_inv_icbi_d;
|
|
wire [0:`THREADS-1] back_inv_icbi_l2;
|
|
|
|
wire [0:`THREADS-1] xu_iu_run_thread_d;
|
|
wire [0:`THREADS-1] xu_iu_run_thread_l2;
|
|
|
|
wire [0:`THREADS-1] xu_iu_msr_cm_d;
|
|
wire [0:`THREADS-1] xu_iu_msr_cm_l2;
|
|
|
|
wire [0:`THREADS-1] xu_iu_msr_cm2_d;
|
|
wire [0:`THREADS-1] xu_iu_msr_cm2_l2;
|
|
|
|
wire [0:`THREADS-1] xu_iu_msr_cm3_d;
|
|
wire [0:`THREADS-1] xu_iu_msr_cm3_l2;
|
|
|
|
wire [0:`THREADS-1] cp_ic_stop_d;
|
|
wire [0:`THREADS-1] cp_ic_stop_l2;
|
|
|
|
wire [0:`THREADS-1] pc_iu_pm_fetch_halt_d;
|
|
wire [0:`THREADS-1] pc_iu_pm_fetch_halt_l2;
|
|
|
|
wire [0:`THREADS-1] ierat_hold_d;
|
|
wire [0:`THREADS-1] ierat_hold_l2;
|
|
|
|
// Current IFARs for each of the threads
|
|
reg [62-`EFF_IFAR_ARCH:61] iu0_ifar_temp[0:`THREADS-1];
|
|
wire [62-`EFF_IFAR_ARCH:61] iu0_ifar_d[0:`THREADS-1];
|
|
wire [62-`EFF_IFAR_ARCH:61] iu0_ifar_l2[0:`THREADS-1];
|
|
|
|
reg [0:`THREADS-1] iu0_2ucode_d;
|
|
wire [0:`THREADS-1] iu0_2ucode_l2;
|
|
reg [0:`THREADS-1] iu0_2ucode_type_d;
|
|
wire [0:`THREADS-1] iu0_2ucode_type_l2;
|
|
|
|
wire [0:`THREADS-1] iu0_flip_index51_d;
|
|
wire [0:`THREADS-1] iu0_flip_index51_l2;
|
|
|
|
wire [62-`EFF_IFAR_WIDTH:51] stored_erat_ifar_d[0:`THREADS-1];
|
|
wire [62-`EFF_IFAR_WIDTH:51] stored_erat_ifar_l2[0:`THREADS-1];
|
|
wire [0:`THREADS-1] stored_erat_valid_d;
|
|
wire [0:`THREADS-1] stored_erat_valid_l2;
|
|
|
|
wire [0:`THREADS-1] mm_hold_req_d;
|
|
wire [0:`THREADS-1] mm_hold_req_l2;
|
|
|
|
wire [0:`THREADS-1] mm_bus_snoop_hold_req_d;
|
|
wire [0:`THREADS-1] mm_bus_snoop_hold_req_l2;
|
|
|
|
wire [0:`THREADS-1] cp_flush_l2;
|
|
wire [0:`THREADS-1] cp_flush_into_uc_l2;
|
|
wire [0:`THREADS-1] br_iu_redirect_d;
|
|
wire [62-`EFF_IFAR_ARCH:61] cp_flush_ifar_d[0:`THREADS-1];
|
|
wire [0:`THREADS-1] br_iu_redirect_l2;
|
|
wire [62-`EFF_IFAR_ARCH:61] br_iu_bta_l2;
|
|
wire [62-`EFF_IFAR_ARCH:61] cp_flush_ifar_l2[0:`THREADS-1];
|
|
wire [0:`THREADS-1] cp_flush_2ucode_l2;
|
|
wire [0:`THREADS-1] cp_flush_2ucode_type_l2;
|
|
wire [0:`THREADS-1] cp_flush_nonspec_l2;
|
|
|
|
wire [0:`THREADS-1] next_fetch_nonspec_d;
|
|
wire [0:`THREADS-1] next_fetch_nonspec_l2;
|
|
|
|
wire [0:`THREADS-1] iu1_nonspec_d;
|
|
wire [0:`THREADS-1] iu2_nonspec_d;
|
|
wire [0:`THREADS-1] iu1_nonspec_l2;
|
|
wire [0:`THREADS-1] iu2_nonspec_l2;
|
|
|
|
wire iu0_last_tid_sent_d;
|
|
wire iu0_last_tid_sent_l2;
|
|
|
|
// Used to keep track of the commands in flight to IB
|
|
reg [0:2] iu0_sent_d[0:`THREADS-1][0:(`IBUFF_DEPTH/4)-1];
|
|
wire [0:2] iu0_sent_l2[0:`THREADS-1][0:(`IBUFF_DEPTH/4)-1];
|
|
|
|
wire [3:8] perf_event_d[0:`THREADS-1];
|
|
wire [3:8] perf_event_l2[0:`THREADS-1];
|
|
|
|
wire [62-`EFF_IFAR_WIDTH:61] bp_ic_redirect_ifar[0:`THREADS-1];
|
|
wire [62-`EFF_IFAR_WIDTH:61] uc_iu4_flush_ifar[0:`THREADS-1];
|
|
wire [0:`IBUFF_DEPTH/4-1] ib_ic_need_fetch[0:`THREADS-1];
|
|
|
|
|
|
wire [62-`EFF_IFAR_WIDTH:57] new_prefetch_ifar;
|
|
wire prefetch_wrap;
|
|
wire [0:`THREADS-1] msr_cm_changed;
|
|
wire [0:`THREADS-1] oldest_prefetch_v;
|
|
wire [0:`THREADS-1] iu2_prefetch_retry;
|
|
wire [0:`THREADS-1] iu0_prefetch_ifar_act;
|
|
wire [0:`THREADS-1] prefetch_addr_outside_range;
|
|
wire [0:`THREADS-1] flush_prefetch;
|
|
wire [0:`THREADS-1] prefetch_ready;
|
|
wire [0:`THREADS-1] next_prefetch;
|
|
wire [0:`THREADS-1] send_prefetch;
|
|
|
|
wire back_inv_addr_act;
|
|
|
|
wire [0:`THREADS-1] toggle_flip;
|
|
|
|
wire [0:`THREADS-1] iu0_need_new_erat;
|
|
wire [0:`THREADS-1] clear_erat_valid;
|
|
wire [0:`THREADS-1] stored_erat_act;
|
|
wire [0:`THREADS-1] iu0_cross_4k_fetch;
|
|
wire [0:`THREADS-1] iu0_cross_4k_prefetch;
|
|
wire [0:`THREADS-1] iu0_cross_4k;
|
|
wire [0:`THREADS-1] iu0_read_erat;
|
|
|
|
wire [0:`THREADS-1] hold_thread;
|
|
wire [0:`THREADS-1] hold_thread_perf_lite;
|
|
wire [0:`THREADS-1] hold_prefetch;
|
|
wire iu0_erat_valid;
|
|
wire [0:`THREADS-1] iu0_erat_tid;
|
|
|
|
wire [0:`THREADS-1] need_fetch_reduce;
|
|
reg [0:(`IBUFF_DEPTH/4)-1] need_fetch[0:`THREADS-1] /*verilator split_var*/;
|
|
reg [0:(`IBUFF_DEPTH/4)-1] next_fetch[0:`THREADS-1];
|
|
reg [0:(`IBUFF_DEPTH/4)-2] shift1_sent[0:`THREADS-1];
|
|
reg [0:`THREADS-1] shift1_sent_reduce;
|
|
reg [0:(`IBUFF_DEPTH/4)-3] shift2_sent[0:`THREADS-1];
|
|
reg [0:`THREADS-1] shift2_sent_reduce;
|
|
|
|
reg [0:`THREADS-1] set_sent;
|
|
wire [0:`THREADS-1] thread_ready;
|
|
wire iu0_valid;
|
|
wire [0:`THREADS-1] iu0_tid;
|
|
wire [0:`THREADS-1] iu0_flush;
|
|
wire [0:`THREADS-1] iu1_flush;
|
|
wire [0:`THREADS-1] iu2_flush;
|
|
wire [0:`THREADS-1] iu3_flush;
|
|
wire [0:`THREADS-1] iu1_ecc_flush;
|
|
|
|
wire [0:1] data_rd_act;
|
|
|
|
wire [62-`EFF_IFAR_ARCH:61] iu0_ifar;
|
|
|
|
wire block_spr_idir_read;
|
|
|
|
// scan
|
|
wire [0:scan_right] siv;
|
|
wire [0:scan_right] sov;
|
|
|
|
// BEGIN
|
|
|
|
//tidn <= '0';
|
|
assign tiup = 1'b1;
|
|
|
|
assign br_iu_redirect_d = br_iu_redirect & (~(cp_flush_l2));
|
|
|
|
assign cp_flush_ifar_d[0] = cp_iu0_t0_flush_ifar;
|
|
assign bp_ic_redirect_ifar[0] = bp_ic_t0_redirect_ifar;
|
|
assign uc_iu4_flush_ifar[0] = uc_iu4_t0_flush_ifar;
|
|
assign ib_ic_need_fetch[0] = ib_ic_t0_need_fetch;
|
|
`ifndef THREADS1
|
|
assign cp_flush_ifar_d[1] = cp_iu0_t1_flush_ifar;
|
|
assign bp_ic_redirect_ifar[1] = bp_ic_t1_redirect_ifar;
|
|
assign uc_iu4_flush_ifar[1] = uc_iu4_t1_flush_ifar;
|
|
assign ib_ic_need_fetch[1] = ib_ic_t1_need_fetch;
|
|
`endif
|
|
|
|
// Added logic for Erat invalidates
|
|
assign mm_hold_req_d = (mm_iu_hold_req | mm_hold_req_l2) & (~(mm_iu_hold_done));
|
|
|
|
assign mm_bus_snoop_hold_req_d = (mm_iu_bus_snoop_hold_req | mm_bus_snoop_hold_req_l2) & (~(mm_iu_bus_snoop_hold_done));
|
|
|
|
//---------------------------------------------------------------------
|
|
// SPR IDir Read
|
|
//---------------------------------------------------------------------
|
|
assign block_spr_idir_read = back_inv_l2 | icm_ics_hold_iu0;
|
|
|
|
assign spr_idir_read_d = spr_ic_idir_read | (spr_idir_read_l2 & block_spr_idir_read); // Invalidates & dir writes have priority
|
|
|
|
assign spr_idir_row_d = spr_ic_idir_row;
|
|
|
|
assign ics_icd_iu0_spr_idir_read = spr_idir_read_l2 & (~block_spr_idir_read);
|
|
|
|
//---------------------------------------------------------------------
|
|
// Prefetch
|
|
//---------------------------------------------------------------------
|
|
assign new_prefetch_ifar = icd_ics_iu2_ifar_eff[62 - `EFF_IFAR_WIDTH:57] + value_1[36-`EFF_IFAR_WIDTH:31]; // ??? Need to change if cls = 128 B
|
|
assign prefetch_wrap = ~|(new_prefetch_ifar);
|
|
|
|
// Prefetch request based off of old msr_cm value could occur two cycles after change, so need 3 latches
|
|
assign msr_cm_changed = (xu_iu_msr_cm_d ^ xu_iu_msr_cm_l2) | // prefetch request same cycle or earlier
|
|
(xu_iu_msr_cm_l2 ^ xu_iu_msr_cm2_l2) | // prefetch request 1 cycle after change
|
|
(xu_iu_msr_cm2_l2 ^ xu_iu_msr_cm3_l2); // prefetch request 2 cycles after change
|
|
|
|
// icm_ics_prefetch_req & (ierat_iu_iu2_flush_req and iu2_prefetch) are mutually exclusive,
|
|
// since you cannot have both iu2_valid & iu2_prefetch at the same time
|
|
// Check iu0_need_prefetch=0 to make sure newer prefetch req didn't sneak in last two cycles
|
|
assign oldest_prefetch_d = ((icm_ics_prefetch_req[`THREADS - 1] | iu2_prefetch_retry[0]) == 1'b1) ? 1'b0 : // Thread 1 or Thr 0 when single thread
|
|
((icm_ics_prefetch_req[0] | iu2_prefetch_retry[`THREADS - 1]) == 1'b1) ? 1'b1 :
|
|
oldest_prefetch_l2;
|
|
|
|
assign oldest_prefetch_v[0] = (~oldest_prefetch_l2);
|
|
|
|
`ifndef THREADS1 // THREADS > 1
|
|
assign oldest_prefetch_v[`THREADS - 1] = oldest_prefetch_l2;
|
|
`endif
|
|
|
|
generate
|
|
begin : xhdl1
|
|
genvar i;
|
|
for (i = 0; i < `THREADS; i = i + 1)
|
|
begin : gen_prefetch
|
|
assign iu2_prefetch_retry[i] = (ierat_iu_iu2_flush_req[i] | icd_ics_iu2_cam_etc_flush[i]) & (~icd_ics_iu2_valid) & (~iu0_need_prefetch_l2[i]);
|
|
|
|
assign iu0_need_prefetch_d[i] = ((icm_ics_prefetch_req[i] & (~prefetch_wrap)) | // don't wrap around
|
|
(iu0_need_prefetch_l2[i] & (~send_prefetch[i]) & (~flush_prefetch[i])) |
|
|
(iu2_prefetch_retry[i] & (~flush_prefetch[i]))) &
|
|
(~spr_ic_prefetch_dis) & (~msr_cm_changed[i]);
|
|
|
|
assign iu0_prefetch_ifar_act[i] = (icm_ics_prefetch_req[i] & (~prefetch_wrap)) | iu2_prefetch_retry[i];
|
|
|
|
assign iu0_prefetch_ifar_d[i] = (icd_ics_iu2_valid == 1'b1) ? new_prefetch_ifar :
|
|
icd_ics_iu2_ifar_eff[62 - `EFF_IFAR_WIDTH:57]; // prefetch collision w/ ierat op (ierat_iu_iu2_flush_req)
|
|
|
|
assign prefetch_addr_outside_range[i] = bp_ic_redirect_ifar[i][46:52] != iu0_prefetch_ifar_l2[i][46:52];
|
|
assign flush_prefetch[i] = cp_flush_l2[i] | br_iu_redirect_l2[i] | (bp_ic_iu4_redirect[i] & prefetch_addr_outside_range[i]);
|
|
end
|
|
end
|
|
endgenerate
|
|
|
|
assign prefetch_ready = iu0_need_prefetch_l2 & icm_ics_prefetch_sm_idle & (~hold_prefetch);
|
|
|
|
assign next_prefetch = ((&(prefetch_ready)) == 1'b1) ? oldest_prefetch_v : // both are valid, choose oldest
|
|
prefetch_ready; // 1 or 0 are valid
|
|
|
|
assign send_prefetch = next_prefetch & (~flush_prefetch);
|
|
|
|
//---------------------------------------------------------------------
|
|
// IU0
|
|
//---------------------------------------------------------------------
|
|
assign an_ac_back_inv_d = an_ac_back_inv;
|
|
assign an_ac_back_inv_target_d = an_ac_back_inv_target;
|
|
assign an_ac_back_inv_addr_d = an_ac_back_inv_addr;
|
|
assign back_inv_addr_act = an_ac_back_inv_l2 & an_ac_back_inv_target_l2;
|
|
|
|
generate
|
|
begin
|
|
if (`THREADS == 1)
|
|
begin : gen_icbi_val_t1
|
|
assign lq_iu_icbi_val_d[0] = lq_iu_icbi_val[0] | (lq_iu_icbi_val_l2[0] & an_ac_back_inv_l2 & an_ac_back_inv_target_l2);
|
|
end
|
|
|
|
// Two-deep buffer, with 2 bits for Thread0&1
|
|
if (`THREADS == 2)
|
|
begin : gen_icbi_val_t2
|
|
assign lq_iu_icbi_val_d[0:`THREADS - 1] = ((an_ac_back_inv_l2 & an_ac_back_inv_target_l2 &
|
|
(|(lq_iu_icbi_val_l2[0:`THREADS - 1]))) == 1'b1) ? lq_iu_icbi_val_l2[0:`THREADS - 1] :
|
|
((|(lq_iu_icbi_val_l2[2:3])) == 1'b1) ? lq_iu_icbi_val_l2[2:3] :
|
|
lq_iu_icbi_val;
|
|
|
|
assign lq_iu_icbi_val_d[2:3] = (an_ac_back_inv_l2 & an_ac_back_inv_target_l2 & (|(lq_iu_icbi_val_l2[2:3])) == 1'b1) ? lq_iu_icbi_val_l2[2:3] :
|
|
(an_ac_back_inv_l2 & an_ac_back_inv_target_l2 & (|(lq_iu_icbi_val_l2[0:`THREADS - 1])) == 1'b1) ? lq_iu_icbi_val :
|
|
2'b00;
|
|
end
|
|
|
|
genvar i;
|
|
for (i = 0; i < `THREADS; i = i + 1)
|
|
begin : gen_icbi_addr
|
|
assign lq_iu_icbi_addr_d[i] = lq_iu_icbi_addr;
|
|
end
|
|
end
|
|
endgenerate
|
|
|
|
assign iu_lq_icbi_complete = {`THREADS{~(an_ac_back_inv_l2 & an_ac_back_inv_target_l2)}} & lq_iu_icbi_val_l2[0:`THREADS - 1];
|
|
|
|
assign back_inv_d = (an_ac_back_inv_l2 & an_ac_back_inv_target_l2) | (|(lq_iu_icbi_val_l2[0:`THREADS - 1]));
|
|
assign back_inv_icbi_d = {`THREADS{~(an_ac_back_inv_l2 & an_ac_back_inv_target_l2)}} & lq_iu_icbi_val_l2[0:`THREADS - 1];
|
|
|
|
assign iu_ierat_ium1_back_inv = back_inv_d;
|
|
|
|
assign xu_iu_msr_cm_d = xu_iu_msr_cm;
|
|
assign xu_iu_msr_cm2_d = xu_iu_msr_cm_l2;
|
|
assign xu_iu_msr_cm3_d = xu_iu_msr_cm2_l2;
|
|
|
|
assign xu_iu_run_thread_d = xu_iu_run_thread;
|
|
assign cp_ic_stop_d = cp_ic_stop;
|
|
assign pc_iu_pm_fetch_halt_d = pc_iu_pm_fetch_halt;
|
|
|
|
assign ierat_hold_d = ierat_iu_hold_req;
|
|
|
|
// This keeps track of the commands in flight to IB
|
|
// Note: icm_ics_iu0_preload_val should only be on if hold_thread='1' because of icm_ics_hold_iu0
|
|
|
|
//always @(iu0_sent_l2 or ib_ic_need_fetch or iu0_tid or need_fetch or next_fetch or shift1_sent or shift1_sent_reduce or shift2_sent or shift2_sent_reduce or set_sent or iu0_flush or iu1_flush or iu2_flush or icm_ics_iu0_preload_val)
|
|
always @ (*)
|
|
begin: sent_proc
|
|
reg [0:1] any_sent[0:`THREADS-1]; //(`THREADS)(0 to 1);
|
|
reg any_lower_fetch;
|
|
// (* analysis_not_referenced="true" *)
|
|
integer t;
|
|
// (* analysis_not_referenced="true" *)
|
|
integer i;
|
|
// (* analysis_not_referenced="true" *)
|
|
integer j;
|
|
|
|
for (t = 0; t < `THREADS; t = t + 1)
|
|
begin
|
|
for (i = 0; i < `IBUFF_DEPTH/4; i = i + 1)
|
|
need_fetch[t][i] = ib_ic_need_fetch[t][i] & (~|(iu0_sent_l2[t][i]));
|
|
|
|
next_fetch[t][0] = need_fetch[t][0];
|
|
for (i = 1; i < `IBUFF_DEPTH/4; i = i + 1)
|
|
begin
|
|
any_lower_fetch = 0;
|
|
for (j=0; j < i; j = j + 1)
|
|
begin
|
|
any_lower_fetch = need_fetch[t][j] | any_lower_fetch;
|
|
end
|
|
|
|
next_fetch[t][i] = need_fetch[t][i] & (~any_lower_fetch);
|
|
end
|
|
|
|
// need to shift as buffer gets emptier
|
|
for (i = 0; i < ((`IBUFF_DEPTH/4) - 1); i = i + 1)
|
|
shift1_sent[t][i] = next_fetch[t][i] & (|(iu0_sent_l2[t][i + 1]));
|
|
shift1_sent_reduce[t] = |(shift1_sent[t]);
|
|
|
|
for (i = 0; i < ((`IBUFF_DEPTH/4) - 2); i = i + 1)
|
|
shift2_sent[t][i] = next_fetch[t][i] & (|(iu0_sent_l2[t][i + 2]));
|
|
shift2_sent_reduce[t] = |(shift2_sent[t]);
|
|
|
|
any_sent[t] = 2'b00;
|
|
for (i = 0; i < `IBUFF_DEPTH/4; i = i + 1)
|
|
begin
|
|
any_sent[t][0] = any_sent[t][0] | iu0_sent_l2[t][i][0];
|
|
any_sent[t][1] = any_sent[t][1] | iu0_sent_l2[t][i][1];
|
|
end
|
|
|
|
set_sent[t] = (iu0_tid[t] | icm_ics_iu0_preload_val[t]) & (~iu0_flush[t]);
|
|
|
|
for (i = 0; i < `IBUFF_DEPTH/4; i = i + 1)
|
|
iu0_sent_d[t][i] = iu0_sent_l2[t][i];
|
|
|
|
if (shift1_sent_reduce[t] == 1'b1) // shift 1
|
|
begin
|
|
for (i = 0; i < `IBUFF_DEPTH/4; i = i + 1)
|
|
begin
|
|
// swap with current last position
|
|
if (any_sent[t][0] == 1'b1)
|
|
iu0_sent_d[t][i][0] = set_sent[t] & iu0_sent_l2[t][i][0];
|
|
else if (any_sent[t][1] == 1'b1)
|
|
iu0_sent_d[t][i][0] = set_sent[t] & iu0_sent_l2[t][i][1];
|
|
else
|
|
iu0_sent_d[t][i][0] = set_sent[t] & iu0_sent_l2[t][i][2];
|
|
end
|
|
|
|
// shift down
|
|
for (i = 0; i < ((`IBUFF_DEPTH/4) - 1); i = i + 1)
|
|
begin
|
|
iu0_sent_d[t][i][1] = iu0_sent_l2[t][i + 1][0] & (~(iu1_flush[t]));
|
|
iu0_sent_d[t][i][2] = iu0_sent_l2[t][i + 1][1] & (~(iu2_flush[t]));
|
|
end
|
|
iu0_sent_d[t][(`IBUFF_DEPTH/4) - 1][1] = 1'b0;
|
|
iu0_sent_d[t][(`IBUFF_DEPTH/4) - 1][2] = 1'b0;
|
|
end
|
|
|
|
else if (shift2_sent_reduce[t] == 1'b1) // shift 2
|
|
begin
|
|
for (i = 0; i < ((`IBUFF_DEPTH/4) - 1); i = i + 1)
|
|
begin
|
|
// swap with current last position & shift down one
|
|
if (any_sent[t][0] == 1'b1)
|
|
iu0_sent_d[t][i][0] = set_sent[t] & iu0_sent_l2[t][i + 1][0];
|
|
else if (any_sent[t][1] == 1'b1)
|
|
iu0_sent_d[t][i][0] = set_sent[t] & iu0_sent_l2[t][i + 1][1];
|
|
else
|
|
iu0_sent_d[t][i][0] = set_sent[t] & iu0_sent_l2[t][i + 1][2];
|
|
end
|
|
iu0_sent_d[t][(`IBUFF_DEPTH/4) - 1][0] = 1'b0;
|
|
|
|
// shift down
|
|
for (i = 0; i < ((`IBUFF_DEPTH/4) - 2); i = i + 1)
|
|
begin
|
|
iu0_sent_d[t][i][1] = iu0_sent_l2[t][i + 2][0] & (~(iu1_flush[t]));
|
|
iu0_sent_d[t][i][2] = iu0_sent_l2[t][i + 2][1] & (~(iu2_flush[t]));
|
|
end
|
|
iu0_sent_d[t][(`IBUFF_DEPTH/4) - 1][1] = 1'b0;
|
|
iu0_sent_d[t][(`IBUFF_DEPTH/4) - 1][2] = 1'b0;
|
|
|
|
iu0_sent_d[t][(`IBUFF_DEPTH/4) - 2][1] = 1'b0;
|
|
iu0_sent_d[t][(`IBUFF_DEPTH/4) - 2][2] = 1'b0;
|
|
end
|
|
|
|
else
|
|
begin
|
|
// no shifting
|
|
for (i = 0; i < `IBUFF_DEPTH/4; i = i + 1)
|
|
begin
|
|
iu0_sent_d[t][i][0] = set_sent[t] & next_fetch[t][i];
|
|
//(next_fetch(i) and not(hold_thread) and not(iu0_flush)) or
|
|
//(next_load(i) and not (iu0_flush));
|
|
iu0_sent_d[t][i][1] = iu0_sent_l2[t][i][0] & (~(iu1_flush[t]));
|
|
iu0_sent_d[t][i][2] = iu0_sent_l2[t][i][1] & (~(iu2_flush[t]));
|
|
end
|
|
end
|
|
end // t loop
|
|
end
|
|
|
|
assign thread_ready = need_fetch_reduce & (~hold_thread);
|
|
|
|
`ifdef THREADS1 //(`THREADS == 1)
|
|
assign iu0_tid[0] = thread_ready[0];
|
|
`endif
|
|
`ifndef THREADS1 //(`THREADS == 2)
|
|
assign iu0_tid[0] = thread_ready[0] & ((iu0_last_tid_sent_l2 == 1'b1) | ((~thread_ready[1])));
|
|
assign iu0_tid[1] = thread_ready[1] & ((iu0_last_tid_sent_l2 == 1'b0) | ((~thread_ready[0])));
|
|
`endif
|
|
|
|
assign iu0_last_tid_sent_d = (iu0_valid == 1'b1) ? iu0_tid[`THREADS - 1] :
|
|
iu0_last_tid_sent_l2;
|
|
|
|
// We drop hold thread on the last beat of data, so there's 1 cycle where we might have sent the next ifar
|
|
assign iu1_ecc_flush = {`THREADS{icd_ics_iu1_valid}} & icd_ics_iu1_tid & icm_ics_iu3_ecc_fp_cancel;
|
|
|
|
always @ (*)
|
|
begin: iu0_ifar_proc
|
|
//(* analysis_not_referenced="true" *)
|
|
integer i;
|
|
|
|
iu0_2ucode_d = iu0_2ucode_l2;
|
|
iu0_2ucode_type_d = iu0_2ucode_type_l2;
|
|
|
|
for (i = 0; i < `THREADS; i = i + 1)
|
|
begin
|
|
iu0_ifar_temp[i] = iu0_ifar_l2[i];
|
|
|
|
if ((cp_flush_l2[i] == 1'b1) & (cp_flush_into_uc_l2[i] == 1'b0))
|
|
begin
|
|
iu0_ifar_temp[i] = cp_flush_ifar_l2[i];
|
|
iu0_2ucode_d[i] = cp_flush_2ucode_l2[i] & (~pc_iu_ram_active[i]);
|
|
iu0_2ucode_type_d[i] = cp_flush_2ucode_type_l2[i] & (~pc_iu_ram_active[i]);
|
|
end
|
|
else if ((cp_flush_l2[i] == 1'b1) & (cp_flush_into_uc_l2[i] == 1'b1))
|
|
begin
|
|
iu0_ifar_temp[i] = cp_flush_ifar_l2[i] + 1;
|
|
iu0_2ucode_d[i] = 1'b0;
|
|
iu0_2ucode_type_d[i] = 1'b0;
|
|
end
|
|
else if (br_iu_redirect_l2[i] == 1'b1)
|
|
begin
|
|
iu0_ifar_temp[i] = br_iu_bta_l2;
|
|
iu0_2ucode_d[i] = 1'b0;
|
|
iu0_2ucode_type_d[i] = 1'b0;
|
|
end
|
|
else if (uc_iu4_flush[i] == 1'b1)
|
|
begin
|
|
iu0_ifar_temp[i] = {iu0_ifar_l2[i][62-`EFF_IFAR_ARCH:62-`EFF_IFAR_WIDTH-1], uc_iu4_flush_ifar[i]};
|
|
iu0_2ucode_d[i] = 1'b0;
|
|
iu0_2ucode_type_d[i] = 1'b0;
|
|
end
|
|
else if (bp_ic_iu4_redirect[i] == 1'b1)
|
|
begin
|
|
iu0_ifar_temp[i] = {iu0_ifar_l2[i][62-`EFF_IFAR_ARCH:62-`EFF_IFAR_WIDTH-1], bp_ic_redirect_ifar[i]};
|
|
iu0_2ucode_d[i] = 1'b0;
|
|
iu0_2ucode_type_d[i] = 1'b0;
|
|
end
|
|
else if (icd_ics_iu3_parity_flush[i] == 1'b1 | (icd_ics_iu3_miss_flush[i] & icm_ics_iu3_miss_match))
|
|
begin
|
|
iu0_ifar_temp[i] = {iu0_ifar_l2[i][62-`EFF_IFAR_ARCH:62-`EFF_IFAR_WIDTH-1], icd_ics_iu3_ifar};
|
|
iu0_2ucode_d[i] = icd_ics_iu3_2ucode;
|
|
iu0_2ucode_type_d[i] = icd_ics_iu3_2ucode_type;
|
|
end
|
|
else if (icd_ics_iu3_miss_flush[i] == 1'b1) // and not icm_ics_iu2_miss_match
|
|
begin
|
|
iu0_ifar_temp[i] = {iu0_ifar_l2[i][62-`EFF_IFAR_ARCH:62-`EFF_IFAR_WIDTH-1], (icd_ics_iu3_ifar[62-`EFF_IFAR_WIDTH:59] + value_1[34-`EFF_IFAR_WIDTH:31]), 2'b00};
|
|
iu0_2ucode_d[i] = 1'b0;
|
|
iu0_2ucode_type_d[i] = 1'b0;
|
|
end
|
|
else if ((bp_ic_iu3_redirect[i] == 1'b1) & (icm_ics_iu3_ecc_fp_cancel[i] == 1'b0))
|
|
begin
|
|
iu0_ifar_temp[i] = {iu0_ifar_l2[i][62-`EFF_IFAR_ARCH:62-`EFF_IFAR_WIDTH-1], bp_ic_redirect_ifar[i]};
|
|
iu0_2ucode_d[i] = 1'b0;
|
|
iu0_2ucode_type_d[i] = 1'b0;
|
|
end
|
|
// for ierat flush, only update ifar if iu2_valid (i.e. not iu2_prefetch)
|
|
else if ((((ierat_iu_iu2_flush_req[i] | icd_ics_iu2_cam_etc_flush[i]) & icd_ics_iu2_valid) |
|
|
icd_ics_iu2_wrong_ra_flush[i]) == 1'b1)
|
|
begin
|
|
iu0_ifar_temp[i] = {iu0_ifar_l2[i][62-`EFF_IFAR_ARCH:62-`EFF_IFAR_WIDTH-1], icd_ics_iu2_ifar_eff};
|
|
iu0_2ucode_d[i] = icd_ics_iu2_2ucode;
|
|
iu0_2ucode_type_d[i] = icd_ics_iu2_2ucode_type;
|
|
end
|
|
else if ((bp_ic_iu2_redirect[i] == 1'b1) & (icm_ics_iu3_ecc_fp_cancel[i] == 1'b0))
|
|
begin
|
|
iu0_ifar_temp[i] = {iu0_ifar_l2[i][62-`EFF_IFAR_ARCH:62-`EFF_IFAR_WIDTH-1], bp_ic_redirect_ifar[i]};
|
|
iu0_2ucode_d[i] = 1'b0;
|
|
iu0_2ucode_type_d[i] = 1'b0;
|
|
end
|
|
else if(iu1_ecc_flush[i] == 1'b1)
|
|
begin
|
|
iu0_ifar_temp[i] = {iu0_ifar_l2[i][62-`EFF_IFAR_ARCH:62-`EFF_IFAR_WIDTH-1], icd_ics_iu1_ifar};
|
|
iu0_2ucode_d[i] = icd_ics_iu1_2ucode;
|
|
iu0_2ucode_type_d[i] = icd_ics_iu1_2ucode_type;
|
|
end
|
|
else if (iu0_tid[i] == 1'b1)
|
|
begin
|
|
iu0_ifar_temp[i] = {iu0_ifar_l2[i][62-`EFF_IFAR_ARCH:62-`EFF_IFAR_WIDTH-1], (iu0_ifar_l2[i][62-`EFF_IFAR_WIDTH:59] + value_1[34-`EFF_IFAR_WIDTH:31]), 2'b00};
|
|
iu0_2ucode_d[i] = 1'b0;
|
|
iu0_2ucode_type_d[i] = 1'b0;
|
|
end
|
|
end
|
|
end // iu0_ifar_proc
|
|
|
|
generate
|
|
begin : xhdl4
|
|
genvar t;
|
|
for (t = 0; t < `THREADS; t = t + 1)
|
|
begin : thread_iu0_ifar_mask
|
|
genvar i;
|
|
for (i = (62 - `EFF_IFAR_ARCH); i < 62; i = i + 1)
|
|
begin : iu0_ifar0_mask
|
|
if (i < 32)
|
|
begin
|
|
assign iu0_ifar_d[t][i] = (xu_iu_msr_cm[t] & iu0_ifar_temp[t][i]);
|
|
end
|
|
if (i >= 32)
|
|
begin
|
|
assign iu0_ifar_d[t][i] = iu0_ifar_temp[t][i];
|
|
end
|
|
end
|
|
end
|
|
end
|
|
endgenerate
|
|
|
|
assign toggle_flip = icd_ics_iu2_wrong_ra_flush & (~ierat_iu_iu2_flush_req) & (~iu3_flush);
|
|
assign iu0_flip_index51_d = ( toggle_flip & (~iu0_flip_index51_l2)) |
|
|
((~toggle_flip) & iu0_flip_index51_l2);
|
|
|
|
//---------------------------------------------------------------------
|
|
// Stored ERAT
|
|
//---------------------------------------------------------------------
|
|
// Keep 42:51 to compare, and flush if cp or br flush
|
|
|
|
generate
|
|
begin : xhdl5
|
|
genvar i;
|
|
for (i = 0; i < `THREADS; i = i + 1)
|
|
begin : stored_erat_gen
|
|
assign stored_erat_act[i] = iu0_read_erat[i] & (~spr_ic_ierat_byp_dis);
|
|
assign stored_erat_ifar_d[i] = iu0_ifar[62-`EFF_IFAR_WIDTH:51];
|
|
|
|
assign iu0_cross_4k_fetch[i] = (iu0_ifar_l2[i][62-`EFF_IFAR_WIDTH:51] != stored_erat_ifar_l2[i]);
|
|
assign iu0_cross_4k_prefetch[i] = (iu0_prefetch_ifar_l2[i][62-`EFF_IFAR_WIDTH:51] != stored_erat_ifar_l2[i]);
|
|
|
|
assign iu0_cross_4k[i] = (iu0_tid[i] & iu0_cross_4k_fetch[i]) |
|
|
(next_prefetch[i] & iu0_cross_4k_prefetch[i]);
|
|
|
|
assign iu0_read_erat[i] = (iu0_erat_valid & iu0_erat_tid[i]) &
|
|
((~stored_erat_valid_l2[i]) | iu0_need_new_erat[i] | next_fetch_nonspec_l2[i] | spr_ic_ierat_byp_dis);
|
|
|
|
// This is a subset of clear_erat_valid that does not include any of the flush terms
|
|
// (because we would be dropping fetch anyways if it is flushed). For timing & helps power.
|
|
assign iu0_need_new_erat[i] = (iu0_cross_4k[i] & (~bp_ic_iu4_redirect[i])) |
|
|
ierat_iu_cam_change | icd_ics_iu2_read_erat_error[i];
|
|
|
|
assign clear_erat_valid[i] = cp_flush_l2[i] | br_iu_redirect_l2[i] | (iu0_cross_4k[i] & (~bp_ic_iu4_redirect[i])) | // Might be on new page
|
|
ierat_iu_cam_change | icd_ics_iu2_read_erat_error[i] |
|
|
(icd_ics_iu2_valid & ierat_iu_iu2_flush_req[i]) |
|
|
(icd_ics_iu1_read_erat[i] & iu1_flush[i]); // not going to be stored
|
|
|
|
assign stored_erat_valid_d[i] = (~spr_ic_ierat_byp_dis) &
|
|
((iu0_read_erat[i] & (~iu0_flush[i])) | (stored_erat_valid_l2[i] & (~clear_erat_valid[i])));
|
|
end
|
|
end
|
|
endgenerate
|
|
|
|
assign ics_icd_iu0_read_erat = |(iu0_read_erat);
|
|
|
|
//---------------------------------------------------------------------
|
|
// Outputs
|
|
//---------------------------------------------------------------------
|
|
// ???? Do I want to split up threaded/non-threaded signals?
|
|
generate
|
|
begin : xhdl6
|
|
genvar i;
|
|
for (i = 0; i < `THREADS; i = i + 1)
|
|
begin : hold_t
|
|
assign hold_thread[i] = (~xu_iu_run_thread_l2[i] & ~next_fetch_nonspec_l2[i]) | cp_ic_stop_l2[i] | pc_iu_pm_fetch_halt_l2[i] | mm_hold_req_l2[i] | mm_bus_snoop_hold_req_l2[i] |
|
|
ierat_hold_l2[i] | back_inv_l2 | icm_ics_hold_iu0 | spr_idir_read_l2 | uc_ic_hold[i] | icm_ics_hold_thread[i];
|
|
|
|
// Everything except icm_ics_hold_iu0
|
|
assign hold_thread_perf_lite[i] = (~xu_iu_run_thread_l2[i] & ~next_fetch_nonspec_l2[i]) | cp_ic_stop_l2[i] | pc_iu_pm_fetch_halt_l2[i] | mm_hold_req_l2[i] | mm_bus_snoop_hold_req_l2[i] |
|
|
ierat_hold_l2[i] | back_inv_l2 | spr_idir_read_l2 | uc_ic_hold[i] | icm_ics_hold_thread[i];
|
|
|
|
assign hold_prefetch[i] = (~xu_iu_run_thread_l2[i]) | cp_ic_stop_l2[i] | pc_iu_pm_fetch_halt_l2[i] | mm_hold_req_l2[i] | mm_bus_snoop_hold_req_l2[i] |
|
|
ierat_hold_l2[i] | back_inv_l2 | icm_ics_hold_iu0 | spr_idir_read_l2 | (|(need_fetch_reduce & (~hold_thread)));
|
|
end
|
|
|
|
//genvar i;
|
|
for (i = 0; i < `THREADS; i = i + 1)
|
|
begin : gen_need_fetch_reduce
|
|
assign need_fetch_reduce[i] = |(need_fetch[i]);
|
|
end
|
|
end
|
|
endgenerate
|
|
|
|
assign iu0_erat_valid = |(need_fetch_reduce & (~hold_thread)) | (|(prefetch_ready));
|
|
assign iu0_erat_tid = iu0_tid | next_prefetch;
|
|
assign iu_ierat_iu0_val = |(iu0_read_erat);
|
|
assign iu_ierat_iu0_thdid = iu0_erat_tid;
|
|
assign iu_ierat_iu0_prefetch = |(prefetch_ready) & (~(|(need_fetch_reduce & (~hold_thread))));
|
|
|
|
generate
|
|
begin : xhdl8
|
|
genvar i;
|
|
for (i = 0; i < 52; i = i + 1)
|
|
begin : ierat_ifar
|
|
if (i < 62 - `EFF_IFAR_ARCH)
|
|
assign iu_ierat_iu0_ifar[i] = 1'b0;
|
|
if (i >= 62 - `EFF_IFAR_ARCH)
|
|
assign iu_ierat_iu0_ifar[i] = iu0_ifar[i];
|
|
end
|
|
end
|
|
endgenerate
|
|
|
|
assign next_fetch_nonspec_d = (~cp_flush) &
|
|
(cp_flush_nonspec_l2 | (next_fetch_nonspec_l2 & (~iu0_tid)) |
|
|
({`THREADS{icd_ics_iu2_valid}} & ierat_iu_iu2_flush_req & iu2_nonspec_l2));
|
|
assign iu_ierat_iu0_nonspec = |(next_fetch_nonspec_l2 & iu0_tid);
|
|
|
|
assign iu1_nonspec_d = {`THREADS{iu0_erat_valid}} & iu0_erat_tid & next_fetch_nonspec_l2 & (~cp_flush);
|
|
assign iu2_nonspec_d = iu1_nonspec_l2 & (~cp_flush);
|
|
|
|
// Tell CP if nonspec hit in ierat
|
|
assign ic_cp_nonspec_hit = iu2_nonspec_l2 & ~{`THREADS{ierat_iu_iu2_miss}} &
|
|
~cp_flush_l2 & ~({`THREADS{icd_ics_iu2_valid}} & ierat_iu_iu2_flush_req & iu2_nonspec_l2);
|
|
|
|
assign iu_ierat_flush = cp_flush_l2 | uc_iu4_flush | icd_ics_iu3_miss_flush | ({`THREADS{icd_ics_iu2_valid}} & icd_ics_iu2_cam_etc_flush) |
|
|
icd_ics_iu2_wrong_ra_flush | icd_ics_iu3_parity_flush | (bp_ic_iu2_redirect & (~icm_ics_iu3_ecc_fp_cancel)) | (bp_ic_iu3_redirect & (~icm_ics_iu3_ecc_fp_cancel)) | bp_ic_iu4_redirect | br_iu_redirect_l2 | iu1_ecc_flush;
|
|
assign ics_icm_iu2_flush = cp_flush_l2 | uc_iu4_flush | icd_ics_iu3_parity_flush |
|
|
(bp_ic_iu3_redirect & (~icm_ics_iu3_ecc_fp_cancel) & (~icd_ics_iu3_miss_flush)) | bp_ic_iu4_redirect | br_iu_redirect_l2;
|
|
assign ics_icd_iu1_flush = cp_flush_l2 | uc_iu4_flush | ({`THREADS{icd_ics_iu2_valid}} & (ierat_iu_iu2_flush_req | icd_ics_iu2_cam_etc_flush)) |
|
|
icd_ics_iu3_miss_flush | icd_ics_iu2_wrong_ra_flush | icd_ics_iu3_parity_flush | (bp_ic_iu2_redirect & (~icm_ics_iu3_ecc_fp_cancel)) | (bp_ic_iu3_redirect & (~icm_ics_iu3_ecc_fp_cancel)) | bp_ic_iu4_redirect | br_iu_redirect_l2 | iu1_ecc_flush;
|
|
assign ics_icd_iu2_flush = cp_flush_l2 | uc_iu4_flush | ierat_iu_iu2_flush_req | icd_ics_iu2_cam_etc_flush | icd_ics_iu3_miss_flush | icd_ics_iu2_wrong_ra_flush | (bp_ic_iu3_redirect & (~icm_ics_iu3_ecc_fp_cancel)) | icd_ics_iu3_parity_flush | bp_ic_iu4_redirect | br_iu_redirect_l2;
|
|
|
|
assign ic_bp_iu2_flush = ierat_iu_iu2_flush_req | icd_ics_iu2_cam_etc_flush | icd_ics_iu2_wrong_ra_flush;
|
|
|
|
assign iu0_flush = cp_flush_l2 | uc_iu4_flush | ({`THREADS{icd_ics_iu2_valid}} & (ierat_iu_iu2_flush_req | icd_ics_iu2_cam_etc_flush)) |
|
|
icd_ics_iu3_miss_flush | icd_ics_iu2_wrong_ra_flush | icd_ics_iu3_parity_flush | (bp_ic_iu2_redirect & (~icm_ics_iu3_ecc_fp_cancel)) | (bp_ic_iu3_redirect & (~icm_ics_iu3_ecc_fp_cancel)) | bp_ic_iu4_redirect | br_iu_redirect_l2 | iu1_ecc_flush;
|
|
|
|
assign iu1_flush = cp_flush_l2 | uc_iu4_flush | ierat_iu_iu2_flush_req | ({`THREADS{icd_ics_iu2_valid}} & icd_ics_iu2_cam_etc_flush) |
|
|
icd_ics_iu3_miss_flush | icd_ics_iu2_wrong_ra_flush | icd_ics_iu3_parity_flush | (bp_ic_iu2_redirect & (~icm_ics_iu3_ecc_fp_cancel)) | (bp_ic_iu3_redirect & (~icm_ics_iu3_ecc_fp_cancel)) | bp_ic_iu4_redirect | br_iu_redirect_l2 | iu1_ecc_flush;
|
|
|
|
assign iu2_flush = cp_flush_l2 | uc_iu4_flush | ierat_iu_iu2_flush_req | ({`THREADS{icd_ics_iu2_valid}} & icd_ics_iu2_cam_etc_flush) |
|
|
icd_ics_iu3_miss_flush | icd_ics_iu2_wrong_ra_flush | icd_ics_iu3_parity_flush | (bp_ic_iu3_redirect & (~icm_ics_iu3_ecc_fp_cancel)) | bp_ic_iu4_redirect | br_iu_redirect_l2;
|
|
|
|
assign iu3_flush = cp_flush_l2 | uc_iu4_flush | icd_ics_iu3_parity_flush | bp_ic_iu4_redirect | br_iu_redirect_l2 |
|
|
(icd_ics_iu3_miss_flush & {`THREADS{icm_ics_iu3_miss_match}}); // used by toggle_flip. If miss matches, will use old page; if miss hits, next address should be the same that caused wrong_ra, so want to flip for new page
|
|
|
|
assign ics_icm_iu0_t0_ifar = iu0_ifar_l2[0][46:52];
|
|
`ifndef THREADS1
|
|
assign ics_icm_iu0_t1_ifar = iu0_ifar_l2[1][46:52];
|
|
`endif
|
|
|
|
assign ics_icd_dir_rd_act = |(need_fetch_reduce & (~(hold_thread))) | back_inv_l2 | (spr_idir_read_l2 & ~icm_ics_hold_iu0) | (|(prefetch_ready));
|
|
assign data_rd_act[0] = (iu0_tid[0] & (~(iu0_ifar_l2[0][51] ^ iu0_flip_index51_l2[0]))) | (iu0_tid[`THREADS - 1] & (~(iu0_ifar_l2[`THREADS - 1][51] ^ iu0_flip_index51_l2[`THREADS - 1])));
|
|
assign data_rd_act[1] = (iu0_tid[0] & (iu0_ifar_l2[0][51] ^ iu0_flip_index51_l2[0])) | (iu0_tid[`THREADS - 1] & (iu0_ifar_l2[`THREADS - 1][51] ^ iu0_flip_index51_l2[`THREADS - 1]));
|
|
assign ics_icd_data_rd_act = data_rd_act;
|
|
|
|
assign iu0_valid = |(iu0_tid & (~iu0_flush));
|
|
assign ics_icd_iu0_valid = iu0_valid;
|
|
assign ics_icd_iu0_tid = iu0_tid | next_prefetch;
|
|
|
|
generate
|
|
begin
|
|
if (`THREADS == 1)
|
|
begin : gen_bp_iu0_val_t0
|
|
assign ic_bp_iu0_val[0] = iu0_tid[0] | icm_ics_iu0_preload_val[0];
|
|
end
|
|
|
|
if (`THREADS == 2)
|
|
begin : gen_bp_iu0_val
|
|
assign ic_bp_iu0_val[0] = (iu0_tid[0] & (~icm_ics_iu0_preload_val[`THREADS - 1])) | icm_ics_iu0_preload_val[0];
|
|
assign ic_bp_iu0_val[`THREADS - 1] = (iu0_tid[`THREADS - 1] & (~icm_ics_iu0_preload_val[0])) | icm_ics_iu0_preload_val[`THREADS - 1];
|
|
end
|
|
end
|
|
endgenerate
|
|
|
|
assign ic_bp_iu0_ifar = (|(icm_ics_iu0_preload_val) == 1'b1) ? icm_ics_iu0_preload_ifar[50:59] :
|
|
(iu0_tid[0] == 1'b1) ? iu0_ifar_l2[0][50:59] :
|
|
iu0_ifar_l2[`THREADS - 1][50:59];
|
|
|
|
generate
|
|
begin
|
|
if (`EFF_IFAR_ARCH > (`REAL_IFAR_WIDTH-2))
|
|
begin : iu0_ifar_gen0
|
|
|
|
assign iu0_ifar = ({`EFF_IFAR_ARCH{(~(back_inv_l2 | spr_idir_read_l2)) & iu0_tid[0]}} & iu0_ifar_l2[0]) |
|
|
({`EFF_IFAR_ARCH{(~(back_inv_l2 | spr_idir_read_l2)) & iu0_tid[`THREADS-1]}} & iu0_ifar_l2[`THREADS-1]) | // should be duplicate if 1 thread
|
|
({ {(`EFF_IFAR_ARCH - `REAL_IFAR_WIDTH + 2){1'b0}}, ({(`REAL_IFAR_WIDTH-6){(back_inv_l2 & (~|(back_inv_icbi_l2)))}} & an_ac_back_inv_addr_l2), 4'b0000 }) |
|
|
({ {(`EFF_IFAR_ARCH - `REAL_IFAR_WIDTH + 2){1'b0}}, ({(`REAL_IFAR_WIDTH-6){back_inv_icbi_l2[0]}} & lq_iu_icbi_addr_l2[0]), 4'b0000 }) | // back_inv_l2 includes back_inv_icbi_l2, was redundant
|
|
({ {(`EFF_IFAR_ARCH - `REAL_IFAR_WIDTH + 2){1'b0}}, ({(`REAL_IFAR_WIDTH-6){back_inv_icbi_l2[`THREADS - 1]}} & lq_iu_icbi_addr_l2[`THREADS - 1]), 4'b0000}) |
|
|
({ {(`EFF_IFAR_ARCH - 11){1'b0}}, ({7{(~(back_inv_l2)) & spr_idir_read_l2}} & spr_idir_row_l2), 4'b0000}) |
|
|
({ ({(`EFF_IFAR_ARCH-4){next_prefetch[0]}} & {iu0_ifar_l2[0][62-`EFF_IFAR_ARCH:62-`EFF_IFAR_WIDTH-1], iu0_prefetch_ifar_l2[0]}), 4'b0000}) |
|
|
({ ({(`EFF_IFAR_ARCH-4){next_prefetch[`THREADS - 1]}} & {iu0_ifar_l2[`THREADS-1][62-`EFF_IFAR_ARCH:62-`EFF_IFAR_WIDTH-1], iu0_prefetch_ifar_l2[`THREADS-1]}), 4'b0000});
|
|
end
|
|
|
|
if (`EFF_IFAR_ARCH <= (`REAL_IFAR_WIDTH-2))
|
|
begin : iu0_ifar_gen1
|
|
assign iu0_ifar = ({`EFF_IFAR_ARCH{(~(back_inv_l2 | spr_idir_read_l2)) & iu0_tid[0]}} & iu0_ifar_l2[0]) |
|
|
({`EFF_IFAR_ARCH{(~(back_inv_l2 | spr_idir_read_l2)) & iu0_tid[`THREADS-1]}} & iu0_ifar_l2[`THREADS-1]) |
|
|
({ ({`EFF_IFAR_ARCH-4{back_inv_l2 & (~|(back_inv_icbi_l2))}} & an_ac_back_inv_addr_l2[62-`EFF_IFAR_ARCH:57]), 4'b0000}) |
|
|
({ ({`EFF_IFAR_ARCH-4{back_inv_icbi_l2[0]}} & lq_iu_icbi_addr_l2[0][62-`EFF_IFAR_ARCH:57]), 4'b0000}) | // back_inv_l2 includes back_inv_icbi_l2, was redundant
|
|
({ ({`EFF_IFAR_ARCH-4{back_inv_icbi_l2[`THREADS-1]}} & lq_iu_icbi_addr_l2[`THREADS-1][62-`EFF_IFAR_ARCH:57]), 4'b0000}) |
|
|
({ {(`EFF_IFAR_ARCH - 11){1'b0}}, ({7{(~(back_inv_l2)) & spr_idir_read_l2}} & spr_idir_row_l2), 4'b0000}) |
|
|
({ ({(`EFF_IFAR_ARCH-4){next_prefetch[0]}} & {iu0_ifar_l2[0][62-`EFF_IFAR_ARCH:62-`EFF_IFAR_WIDTH-1], iu0_prefetch_ifar_l2[0]}), 4'b0000}) |
|
|
({ ({(`EFF_IFAR_ARCH-4){next_prefetch[`THREADS-1]}} & {iu0_ifar_l2[`THREADS-1][62-`EFF_IFAR_ARCH:62-`EFF_IFAR_WIDTH-1], iu0_prefetch_ifar_l2[`THREADS-1]}), 4'b0000});
|
|
end
|
|
end
|
|
endgenerate
|
|
|
|
assign ics_icd_iu0_ifar = iu0_ifar;
|
|
assign ics_icd_iu0_index51 = ( ((~(back_inv_l2 | spr_idir_read_l2)) & iu0_tid[0]) & (iu0_ifar_l2[0][51] ^ iu0_flip_index51_l2[0])) |
|
|
( ((~(back_inv_l2 | spr_idir_read_l2)) & iu0_tid[`THREADS - 1]) & (iu0_ifar_l2[`THREADS - 1][51] ^ iu0_flip_index51_l2[`THREADS - 1])) | // should be duplicate if `THREADS=1
|
|
( (back_inv_l2 & (~|(back_inv_icbi_l2))) & an_ac_back_inv_addr_l2[51]) |
|
|
( back_inv_icbi_l2[0] & lq_iu_icbi_addr_l2[0][51]) | // back_inv_l2 includes back_inv_icbi_l2, was redundant
|
|
( back_inv_icbi_l2[`THREADS - 1] & lq_iu_icbi_addr_l2[`THREADS - 1][51]) |
|
|
( ((~(back_inv_l2)) & spr_idir_read_l2) & spr_idir_row_l2[51]) |
|
|
( next_prefetch[0] & (iu0_prefetch_ifar_l2[0][51] ^ iu0_flip_index51_l2[0])) |
|
|
( next_prefetch[`THREADS - 1] & (iu0_prefetch_ifar_l2[`THREADS - 1][51] ^ iu0_flip_index51_l2[`THREADS - 1]));
|
|
|
|
assign ics_icd_iu0_2ucode = |(iu0_2ucode_l2 & iu0_tid);
|
|
assign ics_icd_iu0_2ucode_type = |(iu0_2ucode_type_l2 & iu0_tid);
|
|
|
|
assign ics_icd_iu0_inval = back_inv_l2;
|
|
assign ics_icm_iu0_inval = back_inv_l2;
|
|
|
|
assign ics_icm_iu0_inval_addr = ( {7{back_inv_l2 & (~|(back_inv_icbi_l2))}} & an_ac_back_inv_addr_l2[51:57]) |
|
|
( {7{back_inv_icbi_l2[0]}} & lq_iu_icbi_addr_l2[0][51:57]) |
|
|
( {7{back_inv_icbi_l2[`THREADS - 1]}} & lq_iu_icbi_addr_l2[`THREADS - 1][51:57]);
|
|
|
|
// Block prefetch if new prefetch req on this thread
|
|
assign ics_icd_iu0_prefetch = |(send_prefetch & ~(icm_ics_prefetch_req & ~{`THREADS{prefetch_wrap}}));
|
|
|
|
//---------------------------------------------------------------------
|
|
// Performance Events
|
|
//---------------------------------------------------------------------
|
|
|
|
generate
|
|
begin : xhdl9
|
|
genvar i;
|
|
for (i = 0; i < `THREADS; i = i + 1)
|
|
begin : perf
|
|
// Reload Collisions - Blocked by reload writing into the cache
|
|
assign perf_event_d[i][3] = icm_ics_hold_iu0 & need_fetch_reduce[i] & ~hold_thread_perf_lite[i];
|
|
|
|
// IU0 Redirected - any flush condition
|
|
assign perf_event_d[i][4] = iu0_flush[i];
|
|
|
|
// Various flushes: BP iu2, BP iu3, BP iu4, uc
|
|
assign perf_event_d[i][5] = bp_ic_iu2_redirect[i] & ~icm_ics_iu3_ecc_fp_cancel[i];
|
|
assign perf_event_d[i][6] = bp_ic_iu3_redirect[i] & ~icm_ics_iu3_ecc_fp_cancel[i];
|
|
assign perf_event_d[i][7] = bp_ic_iu4_redirect[i];
|
|
assign perf_event_d[i][8] = uc_iu4_flush[i];
|
|
end
|
|
end
|
|
endgenerate
|
|
|
|
assign ic_perf_t0_event = perf_event_l2[0];
|
|
`ifndef THREADS1
|
|
assign ic_perf_t1_event = perf_event_l2[1];
|
|
`endif
|
|
|
|
//---------------------------------------------------------------------
|
|
// Latches
|
|
//---------------------------------------------------------------------
|
|
|
|
tri_rlmlatch_p #(.INIT(0)) an_ac_back_inv_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_slp_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(funcslp_force),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[an_ac_back_inv_offset]),
|
|
.scout(sov[an_ac_back_inv_offset]),
|
|
.din(an_ac_back_inv_d),
|
|
.dout(an_ac_back_inv_l2)
|
|
);
|
|
|
|
tri_rlmlatch_p #(.INIT(0)) an_ac_back_inv_target_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_slp_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(funcslp_force),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[an_ac_back_inv_target_offset]),
|
|
.scout(sov[an_ac_back_inv_target_offset]),
|
|
.din(an_ac_back_inv_target_d),
|
|
.dout(an_ac_back_inv_target_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(`REAL_IFAR_WIDTH-6), .INIT(0)) an_ac_back_inv_addr_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(back_inv_addr_act), //back_inv_d,
|
|
.thold_b(pc_iu_func_slp_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(funcslp_force),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[an_ac_back_inv_addr_offset:an_ac_back_inv_addr_offset + (`REAL_IFAR_WIDTH-6) - 1]),
|
|
.scout(sov[an_ac_back_inv_addr_offset:an_ac_back_inv_addr_offset + (`REAL_IFAR_WIDTH-6) - 1]),
|
|
.din(an_ac_back_inv_addr_d),
|
|
.dout(an_ac_back_inv_addr_l2)
|
|
);
|
|
|
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) spr_idir_read_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[spr_idir_read_offset]),
|
|
.scout(sov[spr_idir_read_offset]),
|
|
.din(spr_idir_read_d),
|
|
.dout(spr_idir_read_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(7), .INIT(0), .NEEDS_SRESET(0)) spr_idir_row_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[spr_idir_row_offset:spr_idir_row_offset + 7 - 1]),
|
|
.scout(sov[spr_idir_row_offset:spr_idir_row_offset + 7 - 1]),
|
|
.din(spr_idir_row_d),
|
|
.dout(spr_idir_row_l2)
|
|
);
|
|
|
|
generate
|
|
begin
|
|
if (`THREADS == 1)
|
|
begin : gen_oldest_t1
|
|
assign oldest_prefetch_l2 = oldest_prefetch_d & 1'b0;
|
|
end
|
|
|
|
if (`THREADS > 1)
|
|
begin : gen_oldest_t2
|
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) oldest_prefetch_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[oldest_prefetch_offset]),
|
|
.scout(sov[oldest_prefetch_offset]),
|
|
.din(oldest_prefetch_d),
|
|
.dout(oldest_prefetch_l2)
|
|
);
|
|
end
|
|
end
|
|
endgenerate
|
|
|
|
tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0)) iu0_need_prefetch_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[iu0_need_prefetch_offset:iu0_need_prefetch_offset + `THREADS - 1]),
|
|
.scout(sov[iu0_need_prefetch_offset:iu0_need_prefetch_offset + `THREADS - 1]),
|
|
.din(iu0_need_prefetch_d),
|
|
.dout(iu0_need_prefetch_l2)
|
|
);
|
|
|
|
generate
|
|
begin : xhdl10
|
|
genvar i;
|
|
for (i = 0; i < `THREADS; i = i + 1)
|
|
begin : t
|
|
tri_rlmreg_p #(.WIDTH(`EFF_IFAR_WIDTH-4), .INIT(0)) iu0_prefetch_ifar_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(iu0_prefetch_ifar_act[i]),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[iu0_prefetch_ifar_offset + i * (`EFF_IFAR_WIDTH-4):iu0_prefetch_ifar_offset + ((i + 1) * (`EFF_IFAR_WIDTH-4)) - 1]),
|
|
.scout(sov[iu0_prefetch_ifar_offset + i * (`EFF_IFAR_WIDTH-4):iu0_prefetch_ifar_offset + ((i + 1) * (`EFF_IFAR_WIDTH-4)) - 1]),
|
|
.din(iu0_prefetch_ifar_d[i]),
|
|
.dout(iu0_prefetch_ifar_l2[i])
|
|
);
|
|
end
|
|
end
|
|
endgenerate
|
|
|
|
tri_rlmreg_p #(.WIDTH((`THREADS*`THREADS-1+1)), .INIT(0)) lq_iu_icbi_val_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[lq_iu_icbi_val_offset:lq_iu_icbi_val_offset + (`THREADS*`THREADS-1+1) - 1]),
|
|
.scout(sov[lq_iu_icbi_val_offset:lq_iu_icbi_val_offset + (`THREADS*`THREADS-1+1) - 1]),
|
|
.din(lq_iu_icbi_val_d),
|
|
.dout(lq_iu_icbi_val_l2)
|
|
);
|
|
|
|
generate
|
|
begin : xhdl11
|
|
genvar i;
|
|
for (i = 0; i < `THREADS; i = i + 1)
|
|
begin : t
|
|
tri_rlmreg_p #(.WIDTH(`REAL_IFAR_WIDTH-6), .INIT(0)) lq_iu_icbi_addr_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(lq_iu_icbi_val[i]),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[lq_iu_icbi_addr_offset + i * (`REAL_IFAR_WIDTH-6):lq_iu_icbi_addr_offset + ((i + 1) * (`REAL_IFAR_WIDTH-6)) - 1]),
|
|
.scout(sov[lq_iu_icbi_addr_offset + i * (`REAL_IFAR_WIDTH-6):lq_iu_icbi_addr_offset + ((i + 1) * (`REAL_IFAR_WIDTH-6)) - 1]),
|
|
.din(lq_iu_icbi_addr_d[i]),
|
|
.dout(lq_iu_icbi_addr_l2[i])
|
|
);
|
|
end
|
|
end
|
|
endgenerate
|
|
|
|
tri_rlmlatch_p #(.INIT(0)) back_inv_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_slp_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(funcslp_force),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[back_inv_offset]),
|
|
.scout(sov[back_inv_offset]),
|
|
.din(back_inv_d),
|
|
.dout(back_inv_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0)) back_inv_icbi_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[back_inv_icbi_offset:back_inv_icbi_offset + `THREADS - 1]),
|
|
.scout(sov[back_inv_icbi_offset:back_inv_icbi_offset + `THREADS - 1]),
|
|
.din(back_inv_icbi_d),
|
|
.dout(back_inv_icbi_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0)) xu_iu_run_thread_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[xu_iu_run_thread_offset:xu_iu_run_thread_offset + `THREADS - 1]),
|
|
.scout(sov[xu_iu_run_thread_offset:xu_iu_run_thread_offset + `THREADS - 1]),
|
|
.din(xu_iu_run_thread_d),
|
|
.dout(xu_iu_run_thread_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0)) xu_iu_msr_cm_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[xu_iu_msr_cm_offset:xu_iu_msr_cm_offset + `THREADS - 1]),
|
|
.scout(sov[xu_iu_msr_cm_offset:xu_iu_msr_cm_offset + `THREADS - 1]),
|
|
.din(xu_iu_msr_cm_d),
|
|
.dout(xu_iu_msr_cm_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0)) xu_iu_msr_cm2_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[xu_iu_msr_cm2_offset:xu_iu_msr_cm2_offset + `THREADS - 1]),
|
|
.scout(sov[xu_iu_msr_cm2_offset:xu_iu_msr_cm2_offset + `THREADS - 1]),
|
|
.din(xu_iu_msr_cm2_d),
|
|
.dout(xu_iu_msr_cm2_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0)) xu_iu_msr_cm3_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[xu_iu_msr_cm3_offset:xu_iu_msr_cm3_offset + `THREADS - 1]),
|
|
.scout(sov[xu_iu_msr_cm3_offset:xu_iu_msr_cm3_offset + `THREADS - 1]),
|
|
.din(xu_iu_msr_cm3_d),
|
|
.dout(xu_iu_msr_cm3_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0)) cp_ic_stop_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[cp_ic_stop_offset:cp_ic_stop_offset + `THREADS - 1]),
|
|
.scout(sov[cp_ic_stop_offset:cp_ic_stop_offset + `THREADS - 1]),
|
|
.din(cp_ic_stop_d),
|
|
.dout(cp_ic_stop_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0)) pc_iu_pm_fetch_halt_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[pc_iu_pm_fetch_halt_offset:pc_iu_pm_fetch_halt_offset + `THREADS - 1]),
|
|
.scout(sov[pc_iu_pm_fetch_halt_offset:pc_iu_pm_fetch_halt_offset + `THREADS - 1]),
|
|
.din(pc_iu_pm_fetch_halt_d),
|
|
.dout(pc_iu_pm_fetch_halt_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0)) ierat_hold_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[ierat_hold_offset:ierat_hold_offset + `THREADS - 1]),
|
|
.scout(sov[ierat_hold_offset:ierat_hold_offset + `THREADS - 1]),
|
|
.din(ierat_hold_d),
|
|
.dout(ierat_hold_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0)) iu0_2ucode_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_slp_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(funcslp_force),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[iu0_2ucode_offset:iu0_2ucode_offset + `THREADS - 1]),
|
|
.scout(sov[iu0_2ucode_offset:iu0_2ucode_offset + `THREADS - 1]),
|
|
.din(iu0_2ucode_d),
|
|
.dout(iu0_2ucode_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0)) iu0_2ucode_type_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_slp_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(funcslp_force),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[iu0_2ucode_type_offset:iu0_2ucode_type_offset + `THREADS - 1]),
|
|
.scout(sov[iu0_2ucode_type_offset:iu0_2ucode_type_offset + `THREADS - 1]),
|
|
.din(iu0_2ucode_type_d),
|
|
.dout(iu0_2ucode_type_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0)) iu0_flip_index51_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[iu0_flip_index51_offset:iu0_flip_index51_offset + `THREADS - 1]),
|
|
.scout(sov[iu0_flip_index51_offset:iu0_flip_index51_offset + `THREADS - 1]),
|
|
.din(iu0_flip_index51_d),
|
|
.dout(iu0_flip_index51_l2)
|
|
);
|
|
|
|
generate
|
|
begin
|
|
if (`THREADS == 1)
|
|
begin : gen_last_tid_t1
|
|
assign iu0_last_tid_sent_l2 = 1'b0 & iu0_last_tid_sent_d;
|
|
end
|
|
|
|
if (`THREADS > 1)
|
|
begin : gen_last_tid_t2
|
|
tri_rlmlatch_p #(.INIT(0)) iu0_last_tid_sent_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[iu0_last_tid_sent_offset]),
|
|
.scout(sov[iu0_last_tid_sent_offset]),
|
|
.din(iu0_last_tid_sent_d),
|
|
.dout(iu0_last_tid_sent_l2)
|
|
);
|
|
end
|
|
end
|
|
endgenerate
|
|
|
|
generate
|
|
begin : xhdl13
|
|
genvar t;
|
|
for (t = 0; t < `THREADS; t = t + 1)
|
|
begin : th
|
|
genvar i;
|
|
for (i = 0; i < `IBUFF_DEPTH/4; i = i + 1)
|
|
begin : ibuff
|
|
tri_rlmreg_p #(.WIDTH(3), .INIT(0)) iu0_sent_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[iu0_sent_offset + (t * (`IBUFF_DEPTH/4) + i) * 3:iu0_sent_offset + (t * (`IBUFF_DEPTH/4) + i + 1) * 3 - 1]),
|
|
.scout(sov[iu0_sent_offset + (t * (`IBUFF_DEPTH/4) + i) * 3:iu0_sent_offset + (t * (`IBUFF_DEPTH/4) + i + 1) * 3 - 1]),
|
|
.din(iu0_sent_d[t][i]),
|
|
.dout(iu0_sent_l2[t][i])
|
|
);
|
|
end
|
|
end
|
|
end
|
|
endgenerate
|
|
|
|
// IU0
|
|
generate
|
|
begin : xhdl14
|
|
genvar t;
|
|
for (t = 0; t < `THREADS; t = t + 1)
|
|
begin : th
|
|
genvar i;
|
|
for (i = 0; i < `EFF_IFAR_ARCH; i = i + 1)
|
|
begin : q_gen
|
|
if((62-`EFF_IFAR_ARCH+i) > 31)
|
|
tri_rlmlatch_p #(.INIT(1), .NEEDS_SRESET(1)) iu0_ifar_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_slp_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(funcslp_force),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[iu0_ifar_offset + t * `EFF_IFAR_ARCH + i]),
|
|
.scout(sov[iu0_ifar_offset + t * `EFF_IFAR_ARCH + i]),
|
|
.din(iu0_ifar_d[t][62 - `EFF_IFAR_ARCH + i]),
|
|
.dout(iu0_ifar_l2[t][62 - `EFF_IFAR_ARCH + i])
|
|
);
|
|
else
|
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) iu0_ifar_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_slp_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(funcslp_force),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[iu0_ifar_offset + t * `EFF_IFAR_ARCH + i]),
|
|
.scout(sov[iu0_ifar_offset + t * `EFF_IFAR_ARCH + i]),
|
|
.din(iu0_ifar_d[t][62 - `EFF_IFAR_ARCH + i]),
|
|
.dout(iu0_ifar_l2[t][62 - `EFF_IFAR_ARCH + i])
|
|
);
|
|
end
|
|
end
|
|
end
|
|
endgenerate
|
|
|
|
generate
|
|
begin : xhdl15
|
|
if (`INCLUDE_IERAT_BYPASS == 0)
|
|
begin : gen0
|
|
genvar i;
|
|
for (i = 0; i < `THREADS; i = i + 1)
|
|
begin : t
|
|
//assign stored_erat_ifar_l2[i] = gate_and(1'b0, stored_erat_ifar_d[i]); // ..._d part is to get rid of unused warnings
|
|
//assign stored_erat_valid_l2[i] = gate_and(1'b0, stored_erat_valid_d[i]); // '0'
|
|
end
|
|
|
|
assign sov[stored_erat_ifar_offset:stored_erat_valid_offset + `THREADS - 1] = siv[stored_erat_ifar_offset:stored_erat_valid_offset + `THREADS - 1];
|
|
end
|
|
|
|
if (`INCLUDE_IERAT_BYPASS == 1)
|
|
begin : gen1
|
|
genvar i;
|
|
for (i = 0; i < `THREADS; i = i + 1)
|
|
begin : t
|
|
tri_rlmreg_p #(.WIDTH(`EFF_IFAR_WIDTH-10), .INIT(0)) stored_erat_ifar_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(stored_erat_act[i]),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[stored_erat_ifar_offset + i * (`EFF_IFAR_WIDTH-10):stored_erat_ifar_offset + ((i + 1) * (`EFF_IFAR_WIDTH-10)) - 1]),
|
|
.scout(sov[stored_erat_ifar_offset + i * (`EFF_IFAR_WIDTH-10):stored_erat_ifar_offset + ((i + 1) * (`EFF_IFAR_WIDTH-10)) - 1]),
|
|
.din(stored_erat_ifar_d[i]),
|
|
.dout(stored_erat_ifar_l2[i])
|
|
);
|
|
end
|
|
end
|
|
|
|
tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0)) stored_erat_valid_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_slp_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(funcslp_force),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[stored_erat_valid_offset:stored_erat_valid_offset + `THREADS - 1]),
|
|
.scout(sov[stored_erat_valid_offset:stored_erat_valid_offset + `THREADS - 1]),
|
|
.din(stored_erat_valid_d),
|
|
.dout(stored_erat_valid_l2)
|
|
);
|
|
end
|
|
endgenerate
|
|
|
|
tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0)) mm_hold_req_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_slp_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(funcslp_force),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[mm_hold_req_offset:mm_hold_req_offset + `THREADS - 1]),
|
|
.scout(sov[mm_hold_req_offset:mm_hold_req_offset + `THREADS - 1]),
|
|
.din(mm_hold_req_d),
|
|
.dout(mm_hold_req_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0)) mm_bus_snoop_hold_req_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_slp_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(funcslp_force),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[mm_bus_snoop_hold_req_offset:mm_bus_snoop_hold_req_offset + `THREADS - 1]),
|
|
.scout(sov[mm_bus_snoop_hold_req_offset:mm_bus_snoop_hold_req_offset + `THREADS - 1]),
|
|
.din(mm_bus_snoop_hold_req_d),
|
|
.dout(mm_bus_snoop_hold_req_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0)) cp_flush_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_slp_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(funcslp_force),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[cp_flush_offset:cp_flush_offset + `THREADS - 1]),
|
|
.scout(sov[cp_flush_offset:cp_flush_offset + `THREADS - 1]),
|
|
.din(cp_flush),
|
|
.dout(cp_flush_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0)) cp_flush_into_uc_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_slp_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(funcslp_force),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[cp_flush_into_uc_offset:cp_flush_into_uc_offset + `THREADS - 1]),
|
|
.scout(sov[cp_flush_into_uc_offset:cp_flush_into_uc_offset + `THREADS - 1]),
|
|
.din(cp_flush_into_uc),
|
|
.dout(cp_flush_into_uc_l2)
|
|
);
|
|
|
|
generate
|
|
begin : xhdl17
|
|
genvar i;
|
|
for (i = 0; i < `THREADS; i = i + 1)
|
|
begin : t
|
|
tri_rlmreg_p #(.WIDTH(`EFF_IFAR_ARCH), .INIT(0)) cp_flush_ifar_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_slp_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(funcslp_force),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[cp_flush_ifar_offset + i * `EFF_IFAR_ARCH:cp_flush_ifar_offset + (i + 1) * `EFF_IFAR_ARCH - 1]),
|
|
.scout(sov[cp_flush_ifar_offset + i * `EFF_IFAR_ARCH:cp_flush_ifar_offset + (i + 1) * `EFF_IFAR_ARCH - 1]),
|
|
.din(cp_flush_ifar_d[i]),
|
|
.dout(cp_flush_ifar_l2[i])
|
|
);
|
|
end
|
|
end
|
|
endgenerate
|
|
|
|
tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0)) cp_flush_2ucode_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_slp_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(funcslp_force),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[cp_flush_2ucode_offset:cp_flush_2ucode_offset + `THREADS - 1]),
|
|
.scout(sov[cp_flush_2ucode_offset:cp_flush_2ucode_offset + `THREADS - 1]),
|
|
.din(cp_iu0_flush_2ucode),
|
|
.dout(cp_flush_2ucode_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0)) cp_flush_2ucode_type_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_slp_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(funcslp_force),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[cp_flush_2ucode_type_offset:cp_flush_2ucode_type_offset + `THREADS - 1]),
|
|
.scout(sov[cp_flush_2ucode_type_offset:cp_flush_2ucode_type_offset + `THREADS - 1]),
|
|
.din(cp_iu0_flush_2ucode_type),
|
|
.dout(cp_flush_2ucode_type_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0)) cp_flush_nonspec_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_slp_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(funcslp_force),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[cp_flush_nonspec_offset:cp_flush_nonspec_offset + `THREADS - 1]),
|
|
.scout(sov[cp_flush_nonspec_offset:cp_flush_nonspec_offset + `THREADS - 1]),
|
|
.din(cp_iu0_flush_nonspec),
|
|
.dout(cp_flush_nonspec_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0)) br_iu_redirect_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[br_iu_redirect_offset:br_iu_redirect_offset + `THREADS - 1]),
|
|
.scout(sov[br_iu_redirect_offset:br_iu_redirect_offset + `THREADS - 1]),
|
|
.din(br_iu_redirect_d),
|
|
.dout(br_iu_redirect_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(`EFF_IFAR_ARCH), .INIT(0)) br_iu_bta_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[br_iu_bta_offset:br_iu_bta_offset + `EFF_IFAR_ARCH - 1]),
|
|
.scout(sov[br_iu_bta_offset:br_iu_bta_offset + `EFF_IFAR_ARCH - 1]),
|
|
.din(br_iu_bta),
|
|
.dout(br_iu_bta_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0)) next_fetch_nonspec_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[next_fetch_nonspec_offset:next_fetch_nonspec_offset + `THREADS - 1]),
|
|
.scout(sov[next_fetch_nonspec_offset:next_fetch_nonspec_offset + `THREADS - 1]),
|
|
.din(next_fetch_nonspec_d),
|
|
.dout(next_fetch_nonspec_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0)) iu1_nonspec_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[iu1_nonspec_offset:iu1_nonspec_offset + `THREADS - 1]),
|
|
.scout(sov[iu1_nonspec_offset:iu1_nonspec_offset + `THREADS - 1]),
|
|
.din(iu1_nonspec_d),
|
|
.dout(iu1_nonspec_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0)) iu2_nonspec_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[iu2_nonspec_offset:iu2_nonspec_offset + `THREADS - 1]),
|
|
.scout(sov[iu2_nonspec_offset:iu2_nonspec_offset + `THREADS - 1]),
|
|
.din(iu2_nonspec_d),
|
|
.dout(iu2_nonspec_l2)
|
|
);
|
|
|
|
generate
|
|
begin : xhdl18
|
|
genvar i;
|
|
for (i = 0; i < `THREADS; i = i + 1)
|
|
begin : t
|
|
tri_rlmreg_p #(.WIDTH(6), .INIT(0)) perf_event_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(event_bus_enable),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[perf_event_offset + i * 6:perf_event_offset + (i + 1) * 6 - 1]),
|
|
.scout(sov[perf_event_offset + i * 6:perf_event_offset + (i + 1) * 6 - 1]),
|
|
.din(perf_event_d[i]),
|
|
.dout(perf_event_l2[i])
|
|
);
|
|
end
|
|
end
|
|
endgenerate
|
|
|
|
//---------------------------------------------------------------------
|
|
// Scan
|
|
//---------------------------------------------------------------------
|
|
assign siv[0:scan_right] = {sov[1:scan_right], func_scan_in};
|
|
assign func_scan_out = sov[0];
|
|
|
|
endmodule
|