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.
1416 lines
57 KiB
Verilog
1416 lines
57 KiB
Verilog
3 years ago
|
// © IBM Corp. 2020
|
||
|
// Licensed under the Apache License, Version 2.0 (the "License"), as modified by
|
||
|
// the terms below; you may not use the files in this repository except in
|
||
|
// compliance with the License as modified.
|
||
|
// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
|
||
|
//
|
||
|
// Modified Terms:
|
||
|
//
|
||
|
// 1) For the purpose of the patent license granted to you in Section 3 of the
|
||
|
// License, the "Work" hereby includes implementations of the work of authorship
|
||
|
// in physical form.
|
||
|
//
|
||
|
// 2) Notwithstanding any terms to the contrary in the License, any licenses
|
||
|
// necessary for implementation of the Work that are available from OpenPOWER
|
||
|
// via the Power ISA End User License Agreement (EULA) are explicitly excluded
|
||
|
// hereunder, and may be obtained from OpenPOWER under the terms and conditions
|
||
|
// of the EULA.
|
||
|
//
|
||
|
// Unless required by applicable law or agreed to in writing, the reference design
|
||
|
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||
|
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
|
||
|
// for the specific language governing permissions and limitations under the License.
|
||
|
//
|
||
|
// Additional rights, including the ability to physically implement a softcore that
|
||
|
// is compliant with the required sections of the Power ISA Specification, are
|
||
|
// available at no cost under the terms of the OpenPOWER Power ISA EULA, which can be
|
||
|
// obtained (along with the Power ISA) here: https://openpowerfoundation.org.
|
||
|
|
||
|
// Description: XU LSU Store Data Rotator Wrapper
|
||
|
//
|
||
|
//*****************************************************************************
|
||
|
|
||
|
// ##########################################################################################
|
||
|
// VHDL Contents
|
||
|
// 1) Load Queue
|
||
|
// 2) Store Queue
|
||
|
// 3) Load/Store Queue Control
|
||
|
// ##########################################################################################
|
||
|
|
||
|
`timescale 1 ns / 1 ns
|
||
|
|
||
|
`include "tri_a2o.vh"
|
||
|
|
||
|
// parameter EXPAND_TYPE = 2; // 0 = ibm (Umbra), 1 = non-ibm, 2 = ibm (MPG)
|
||
|
// `define LOAD_CREDITS 16
|
||
|
// `define STORE_CREDITS 32
|
||
|
// parameter ITAG_SIZE_ENC = 7;
|
||
|
// parameter CL_SIZE = 6; // 6 => 64B CLINE, 7 => 128B CLINE
|
||
|
// parameter THREADS = 2; // Number of Threads in the system
|
||
|
// parameter STQ_DATA_SIZE = 64; // 64 or 128 Bit store data sizes supported
|
||
|
// parameter REAL_IFAR_WIDTH = 42; // real addressing bits
|
||
|
|
||
|
module lq_arb(
|
||
|
imq_arb_iuq_ld_req_avail,
|
||
|
imq_arb_iuq_tid,
|
||
|
imq_arb_iuq_usr_def,
|
||
|
imq_arb_iuq_wimge,
|
||
|
imq_arb_iuq_p_addr,
|
||
|
imq_arb_iuq_ttype,
|
||
|
imq_arb_iuq_opSize,
|
||
|
imq_arb_iuq_cTag,
|
||
|
imq_arb_mmq_ld_req_avail,
|
||
|
imq_arb_mmq_st_req_avail,
|
||
|
imq_arb_mmq_tid,
|
||
|
imq_arb_mmq_usr_def,
|
||
|
imq_arb_mmq_wimge,
|
||
|
imq_arb_mmq_p_addr,
|
||
|
imq_arb_mmq_ttype,
|
||
|
imq_arb_mmq_opSize,
|
||
|
imq_arb_mmq_cTag,
|
||
|
imq_arb_mmq_st_data,
|
||
|
ldq_arb_ld_req_pwrToken,
|
||
|
ldq_arb_ld_req_avail,
|
||
|
ldq_arb_tid,
|
||
|
ldq_arb_usr_def,
|
||
|
ldq_arb_wimge,
|
||
|
ldq_arb_p_addr,
|
||
|
ldq_arb_ttype,
|
||
|
ldq_arb_opSize,
|
||
|
ldq_arb_cTag,
|
||
|
stq_arb_stq1_stg_act,
|
||
|
stq_arb_st_req_avail,
|
||
|
stq_arb_stq3_cmmt_val,
|
||
|
stq_arb_stq3_cmmt_reject,
|
||
|
stq_arb_stq3_req_val,
|
||
|
stq_arb_stq3_tid,
|
||
|
stq_arb_stq3_usrDef,
|
||
|
stq_arb_stq3_wimge,
|
||
|
stq_arb_stq3_p_addr,
|
||
|
stq_arb_stq3_ttype,
|
||
|
stq_arb_stq3_opSize,
|
||
|
stq_arb_stq3_byteEn,
|
||
|
stq_arb_stq3_cTag,
|
||
|
dat_lsq_stq4_128data,
|
||
|
ldq_arb_rel1_stg_act,
|
||
|
ldq_arb_rel1_data_sel,
|
||
|
ldq_arb_rel1_data,
|
||
|
ldq_arb_rel1_blk_store,
|
||
|
ldq_arb_rel1_axu_val,
|
||
|
ldq_arb_rel1_op_size,
|
||
|
ldq_arb_rel1_addr,
|
||
|
ldq_arb_rel1_ci,
|
||
|
ldq_arb_rel1_byte_swap,
|
||
|
ldq_arb_rel1_thrd_id,
|
||
|
ldq_arb_rel2_rdat_sel,
|
||
|
stq_arb_stq1_axu_val,
|
||
|
stq_arb_stq1_epid_val,
|
||
|
stq_arb_stq1_opSize,
|
||
|
stq_arb_stq1_p_addr,
|
||
|
stq_arb_stq1_wimge_i,
|
||
|
stq_arb_stq1_store_data,
|
||
|
stq_arb_stq1_byte_swap,
|
||
|
stq_arb_stq1_thrd_id,
|
||
|
stq_arb_release_itag_vld,
|
||
|
stq_arb_release_itag,
|
||
|
stq_arb_release_tid,
|
||
|
l2_lsq_req_ld_pop,
|
||
|
l2_lsq_req_st_pop,
|
||
|
l2_lsq_req_st_gather,
|
||
|
ctl_lsq_stq3_icswx_data,
|
||
|
ldq_arb_rel2_rd_data,
|
||
|
arb_ldq_rel2_wrt_data,
|
||
|
arb_stq_cred_avail,
|
||
|
arb_ldq_ldq_unit_sel,
|
||
|
arb_imq_iuq_unit_sel,
|
||
|
arb_imq_mmq_unit_sel,
|
||
|
lsq_ctl_stq1_axu_val,
|
||
|
lsq_ctl_stq1_epid_val,
|
||
|
lsq_dat_stq1_le_mode,
|
||
|
lsq_dat_stq1_op_size,
|
||
|
lsq_dat_stq1_addr,
|
||
|
lsq_dat_stq2_store_data,
|
||
|
lsq_ctl_stq1_addr,
|
||
|
lsq_ctl_stq1_ci,
|
||
|
lsq_ctl_stq1_thrd_id,
|
||
|
lsq_ctl_stq_release_itag_vld,
|
||
|
lsq_ctl_stq_release_itag,
|
||
|
lsq_ctl_stq_release_tid,
|
||
|
lsq_l2_pwrToken,
|
||
|
lsq_l2_valid,
|
||
|
lsq_l2_tid,
|
||
|
lsq_l2_p_addr,
|
||
|
lsq_l2_wimge,
|
||
|
lsq_l2_usrDef,
|
||
|
lsq_l2_byteEn,
|
||
|
lsq_l2_ttype,
|
||
|
lsq_l2_opSize,
|
||
|
lsq_l2_coreTag,
|
||
|
lsq_l2_dataToken,
|
||
|
lsq_l2_st_data,
|
||
|
ctl_lsq_spr_lsucr0_b2b,
|
||
|
xu_lq_spr_xucr0_cred,
|
||
|
xu_lq_spr_xucr0_cls,
|
||
|
lq_pc_err_l2credit_overrun,
|
||
|
vdd,
|
||
|
gnd,
|
||
|
nclk,
|
||
|
sg_0,
|
||
|
func_sl_thold_0_b,
|
||
|
func_sl_force,
|
||
|
func_slp_sl_thold_0_b,
|
||
|
func_slp_sl_force,
|
||
|
d_mode_dc,
|
||
|
delay_lclkr_dc,
|
||
|
mpw1_dc_b,
|
||
|
mpw2_dc_b,
|
||
|
scan_in,
|
||
|
scan_out
|
||
|
);
|
||
|
|
||
|
// IUQ Request to the L2
|
||
|
input imq_arb_iuq_ld_req_avail;
|
||
|
input [0:1] imq_arb_iuq_tid;
|
||
|
input [0:3] imq_arb_iuq_usr_def;
|
||
|
input [0:4] imq_arb_iuq_wimge;
|
||
|
input [64-`REAL_IFAR_WIDTH:63] imq_arb_iuq_p_addr;
|
||
|
input [0:5] imq_arb_iuq_ttype;
|
||
|
input [0:2] imq_arb_iuq_opSize;
|
||
|
input [0:4] imq_arb_iuq_cTag;
|
||
|
|
||
|
// MMQ Request to the L2
|
||
|
input imq_arb_mmq_ld_req_avail;
|
||
|
input imq_arb_mmq_st_req_avail;
|
||
|
input [0:1] imq_arb_mmq_tid;
|
||
|
input [0:3] imq_arb_mmq_usr_def;
|
||
|
input [0:4] imq_arb_mmq_wimge;
|
||
|
input [64-`REAL_IFAR_WIDTH:63] imq_arb_mmq_p_addr;
|
||
|
input [0:5] imq_arb_mmq_ttype;
|
||
|
input [0:2] imq_arb_mmq_opSize;
|
||
|
input [0:4] imq_arb_mmq_cTag;
|
||
|
input [0:15] imq_arb_mmq_st_data;
|
||
|
|
||
|
// LDQ Request to the L2
|
||
|
input ldq_arb_ld_req_pwrToken;
|
||
|
input ldq_arb_ld_req_avail;
|
||
|
input [0:1] ldq_arb_tid;
|
||
|
input [0:3] ldq_arb_usr_def;
|
||
|
input [0:4] ldq_arb_wimge;
|
||
|
input [64-`REAL_IFAR_WIDTH:63] ldq_arb_p_addr;
|
||
|
input [0:5] ldq_arb_ttype;
|
||
|
input [0:2] ldq_arb_opSize;
|
||
|
input [0:4] ldq_arb_cTag;
|
||
|
|
||
|
// Store Type Request to L2
|
||
|
input stq_arb_stq1_stg_act;
|
||
|
input stq_arb_st_req_avail;
|
||
|
input stq_arb_stq3_cmmt_val;
|
||
|
input stq_arb_stq3_cmmt_reject;
|
||
|
input stq_arb_stq3_req_val;
|
||
|
input [0:1] stq_arb_stq3_tid;
|
||
|
input [0:3] stq_arb_stq3_usrDef;
|
||
|
input [0:4] stq_arb_stq3_wimge;
|
||
|
input [64-`REAL_IFAR_WIDTH:63] stq_arb_stq3_p_addr;
|
||
|
input [0:5] stq_arb_stq3_ttype;
|
||
|
input [0:2] stq_arb_stq3_opSize;
|
||
|
input [0:15] stq_arb_stq3_byteEn;
|
||
|
input [0:4] stq_arb_stq3_cTag;
|
||
|
input [0:127] dat_lsq_stq4_128data;
|
||
|
|
||
|
// Common Between LDQ and STQ
|
||
|
input ldq_arb_rel1_stg_act;
|
||
|
input ldq_arb_rel1_data_sel;
|
||
|
input [0:127] ldq_arb_rel1_data;
|
||
|
input ldq_arb_rel1_blk_store;
|
||
|
input ldq_arb_rel1_axu_val;
|
||
|
input [0:2] ldq_arb_rel1_op_size;
|
||
|
input [64-`REAL_IFAR_WIDTH:63] ldq_arb_rel1_addr;
|
||
|
input ldq_arb_rel1_ci;
|
||
|
input ldq_arb_rel1_byte_swap;
|
||
|
input [0:`THREADS-1] ldq_arb_rel1_thrd_id;
|
||
|
input ldq_arb_rel2_rdat_sel;
|
||
|
input stq_arb_stq1_axu_val;
|
||
|
input stq_arb_stq1_epid_val;
|
||
|
input [0:2] stq_arb_stq1_opSize;
|
||
|
input [64-`REAL_IFAR_WIDTH:63] stq_arb_stq1_p_addr;
|
||
|
input stq_arb_stq1_wimge_i;
|
||
|
input [(128-`STQ_DATA_SIZE):127] stq_arb_stq1_store_data;
|
||
|
input stq_arb_stq1_byte_swap;
|
||
|
input [0:`THREADS-1] stq_arb_stq1_thrd_id;
|
||
|
input stq_arb_release_itag_vld;
|
||
|
input [0:`ITAG_SIZE_ENC-1] stq_arb_release_itag;
|
||
|
input [0:`THREADS-1] stq_arb_release_tid;
|
||
|
|
||
|
// L2 Credit Control
|
||
|
input l2_lsq_req_ld_pop;
|
||
|
input l2_lsq_req_st_pop;
|
||
|
input l2_lsq_req_st_gather;
|
||
|
|
||
|
// ICSWX Data to be sent to the L2
|
||
|
input [0:26] ctl_lsq_stq3_icswx_data;
|
||
|
|
||
|
// Interface with Reload Data Queue
|
||
|
input [0:143] ldq_arb_rel2_rd_data;
|
||
|
output [0:143] arb_ldq_rel2_wrt_data;
|
||
|
|
||
|
// L2 Credits Available
|
||
|
output arb_stq_cred_avail;
|
||
|
|
||
|
// Unit Selected to Send Request to the L2
|
||
|
output arb_ldq_ldq_unit_sel;
|
||
|
output arb_imq_iuq_unit_sel;
|
||
|
output arb_imq_mmq_unit_sel;
|
||
|
|
||
|
// Common Between LDQ and STQ
|
||
|
output lsq_ctl_stq1_axu_val;
|
||
|
output lsq_ctl_stq1_epid_val;
|
||
|
output lsq_dat_stq1_le_mode;
|
||
|
output [0:2] lsq_dat_stq1_op_size;
|
||
|
output [52:63] lsq_dat_stq1_addr;
|
||
|
output [0:143] lsq_dat_stq2_store_data;
|
||
|
output [64-`REAL_IFAR_WIDTH:63-`CL_SIZE] lsq_ctl_stq1_addr;
|
||
|
output lsq_ctl_stq1_ci;
|
||
|
output [0:`THREADS-1] lsq_ctl_stq1_thrd_id;
|
||
|
|
||
|
// STCX/ICSWX Itag Complete
|
||
|
output lsq_ctl_stq_release_itag_vld;
|
||
|
output [0:`ITAG_SIZE_ENC-1] lsq_ctl_stq_release_itag;
|
||
|
output [0:`THREADS-1] lsq_ctl_stq_release_tid;
|
||
|
|
||
|
// L2 Request Signals
|
||
|
output lsq_l2_pwrToken;
|
||
|
output lsq_l2_valid;
|
||
|
output [0:1] lsq_l2_tid;
|
||
|
output [64-`REAL_IFAR_WIDTH:63] lsq_l2_p_addr;
|
||
|
output [0:4] lsq_l2_wimge;
|
||
|
output [0:3] lsq_l2_usrDef;
|
||
|
output [0:15] lsq_l2_byteEn;
|
||
|
output [0:5] lsq_l2_ttype;
|
||
|
output [0:2] lsq_l2_opSize;
|
||
|
output [0:4] lsq_l2_coreTag;
|
||
|
output lsq_l2_dataToken;
|
||
|
output [0:127] lsq_l2_st_data;
|
||
|
|
||
|
// SPR Bits
|
||
|
input ctl_lsq_spr_lsucr0_b2b; // LSUCR0[B2B] Mode enabled
|
||
|
input xu_lq_spr_xucr0_cred; // XUCR0[CRED] Mode enabled
|
||
|
input xu_lq_spr_xucr0_cls; // XUCR0[CLS] Mode enabled
|
||
|
|
||
|
// Pervasive Error Report
|
||
|
output lq_pc_err_l2credit_overrun;
|
||
|
|
||
|
// Pervasive
|
||
|
|
||
|
|
||
|
inout vdd;
|
||
|
|
||
|
|
||
|
inout gnd;
|
||
|
|
||
|
(* pin_data="PIN_FUNCTION=/G_CLK/CAP_LIMIT=/99999/" *)
|
||
|
|
||
|
input [0:`NCLK_WIDTH-1] nclk;
|
||
|
input sg_0;
|
||
|
input func_sl_thold_0_b;
|
||
|
input func_sl_force;
|
||
|
input func_slp_sl_thold_0_b;
|
||
|
input func_slp_sl_force;
|
||
|
input d_mode_dc;
|
||
|
input delay_lclkr_dc;
|
||
|
input mpw1_dc_b;
|
||
|
input mpw2_dc_b;
|
||
|
|
||
|
(* pin_data="PIN_FUNCTION=/SCAN_IN/" *)
|
||
|
|
||
|
input scan_in;
|
||
|
|
||
|
(* pin_data="PIN_FUNCTION=/SCAN_OUT/" *)
|
||
|
|
||
|
output scan_out;
|
||
|
|
||
|
//--------------------------
|
||
|
// signals
|
||
|
//--------------------------
|
||
|
|
||
|
wire [0:2] lsq_dat_stq1_op_size_int;
|
||
|
wire [52:63] ldq_dat_stq1_addr_int;
|
||
|
wire [0:`THREADS-1] ldq_stq1_thrd_id;
|
||
|
wire [64-`REAL_IFAR_WIDTH:63] ldq_stq_stq1_addr;
|
||
|
wire ldq_stq_stq1_le_mode;
|
||
|
wire req_l2_val_d;
|
||
|
wire req_l2_val_q;
|
||
|
wire req_l2_ld_sent_d;
|
||
|
wire req_l2_ld_sent_q;
|
||
|
wire [0:3] req_sel_usrDef_d;
|
||
|
wire [0:3] req_sel_usrDef_q;
|
||
|
wire [0:15] req_sel_byteEn_d;
|
||
|
wire [0:15] req_sel_byteEn_q;
|
||
|
wire [0:4] req_sel_wimge_d;
|
||
|
wire [0:4] req_sel_wimge_q;
|
||
|
wire [64-`REAL_IFAR_WIDTH:63] req_sel_p_addr_d;
|
||
|
wire [64-`REAL_IFAR_WIDTH:63] req_sel_p_addr_q;
|
||
|
wire [0:5] req_sel_ttype_d;
|
||
|
wire [0:5] req_sel_ttype_q;
|
||
|
wire [0:1] req_sel_tid_d;
|
||
|
wire [0:1] req_sel_tid_q;
|
||
|
wire [0:2] req_sel_opSize_d;
|
||
|
wire [0:2] req_sel_opSize_q;
|
||
|
wire [0:4] req_sel_cTag_d;
|
||
|
wire [0:4] req_sel_cTag_q;
|
||
|
wire [0:3] unit_req_sel_usrDef;
|
||
|
wire [0:4] unit_req_sel_wimge;
|
||
|
wire [64-`REAL_IFAR_WIDTH:63] unit_req_sel_p_addr;
|
||
|
wire [0:5] unit_req_sel_ttype;
|
||
|
wire [0:1] unit_req_sel_tid;
|
||
|
wire [0:2] unit_req_sel_opSize;
|
||
|
wire [0:4] unit_req_sel_cTag;
|
||
|
wire [0:3] unit_req_val;
|
||
|
wire [0:3] unit_last_sel_d;
|
||
|
wire [0:3] unit_last_sel_q;
|
||
|
wire [0:3] queue_unit_sel;
|
||
|
wire req_l2_sent;
|
||
|
wire req_l2_ld_pwrToken;
|
||
|
wire req_l2_ld_val;
|
||
|
wire req_l2_st_val;
|
||
|
wire req_l2_act;
|
||
|
wire ld_type_credAvail;
|
||
|
wire st_type_credAvail;
|
||
|
wire st_req_noCreds;
|
||
|
wire st_req_2inpipe;
|
||
|
wire st_req_1inpipe;
|
||
|
wire st_req_0Creds;
|
||
|
wire st2_req_val;
|
||
|
wire st3_req_val;
|
||
|
wire mmq1_req_val;
|
||
|
wire mmq2_req_val_d;
|
||
|
wire mmq2_req_val_q;
|
||
|
wire mmq3_req_val_d;
|
||
|
wire mmq3_req_val_q;
|
||
|
wire stq4_data_override_d;
|
||
|
wire stq4_data_override_q;
|
||
|
wire stq2_req_val_d;
|
||
|
wire stq2_req_val_q;
|
||
|
wire stq3_icswx_val;
|
||
|
wire [64-`REAL_IFAR_WIDTH:63] req_l2_st_p_addr;
|
||
|
wire [0:4] req_l2_st_wimge;
|
||
|
wire [0:3] req_l2_st_usrDef;
|
||
|
wire [0:5] req_l2_st_ttype;
|
||
|
wire [0:1] req_l2_st_tid;
|
||
|
wire [0:2] req_l2_st_opSize;
|
||
|
wire ld_st_noCred_flp_d;
|
||
|
wire ld_st_noCred_flp_q;
|
||
|
wire stq3_store_type_cmmt;
|
||
|
wire stq3_store_type_rej;
|
||
|
wire st_rej_hold_cred_d;
|
||
|
wire st_rej_hold_cred_q;
|
||
|
wire ld_noCred_hold_d;
|
||
|
wire ld_noCred_hold_q;
|
||
|
wire ld_noCred_release;
|
||
|
wire ld_pop_rcvd_d;
|
||
|
wire ld_pop_rcvd_q;
|
||
|
wire ld_cred_blk_rst;
|
||
|
wire ld_cred_blk_run;
|
||
|
wire ld_cred_blk_zero;
|
||
|
wire [0:3] ld_cred_blk_decr;
|
||
|
wire [0:3] ld_cred_blk_init;
|
||
|
wire [0:3] ld_cred_blk_cnt_d;
|
||
|
wire [0:3] ld_cred_blk_cnt_q;
|
||
|
wire load_req_sent;
|
||
|
wire [0:4] load_cred_incr;
|
||
|
wire [0:4] load_cred_decr;
|
||
|
wire [0:1] load_cred_sel;
|
||
|
wire [0:4] load_cred_cnt_d;
|
||
|
wire [0:4] load_cred_cnt_q;
|
||
|
wire ld_cred_err_d;
|
||
|
wire ld_cred_err_q;
|
||
|
wire ld_req_0Creds;
|
||
|
wire ld_req_noCreds;
|
||
|
wire store_req_sent;
|
||
|
wire [0:5] store_cred_incr;
|
||
|
wire [0:5] store_cred_incr2;
|
||
|
wire [0:5] store_cred_decr;
|
||
|
wire [0:2] store_cred_sel;
|
||
|
wire [0:5] store_cred_cnt_d;
|
||
|
wire [0:5] store_cred_cnt_q;
|
||
|
wire st_cred_err_d;
|
||
|
wire st_cred_err_q;
|
||
|
wire [0:26] stq4_req_st_data_d;
|
||
|
wire [0:26] stq4_req_st_data_q;
|
||
|
wire [0:127] req_l2_st_data;
|
||
|
wire [0:143] stq2_store_data;
|
||
|
wire [0:127] stq2_store_data_d;
|
||
|
wire [0:127] stq2_store_data_q;
|
||
|
wire [0:15] stq2_store_parity;
|
||
|
wire [0:143] rel2_wrt_data;
|
||
|
wire spr_lsucr0_b2b_d;
|
||
|
wire spr_lsucr0_b2b_q;
|
||
|
wire spr_xucr0_cred_d;
|
||
|
wire spr_xucr0_cred_q;
|
||
|
wire spr_xucr0_cls_d;
|
||
|
wire spr_xucr0_cls_q;
|
||
|
wire st_b2b_st_dis;
|
||
|
wire ld_b2b_ld_dis;
|
||
|
wire stq1_stg_act;
|
||
|
wire lsq_l2credit_overrun;
|
||
|
wire [0:4] ld_cred_max;
|
||
|
wire [0:5] st_cred_max;
|
||
|
|
||
|
//--------------------------
|
||
|
// constants
|
||
|
//--------------------------
|
||
|
|
||
|
parameter req_l2_val_offset = 0;
|
||
|
parameter req_l2_ld_sent_offset = req_l2_val_offset + 1;
|
||
|
parameter req_sel_usrDef_offset = req_l2_ld_sent_offset + 1;
|
||
|
parameter req_sel_byteEn_offset = req_sel_usrDef_offset + 4;
|
||
|
parameter req_sel_wimge_offset = req_sel_byteEn_offset + 16;
|
||
|
parameter req_sel_p_addr_offset = req_sel_wimge_offset + 5;
|
||
|
parameter req_sel_ttype_offset = req_sel_p_addr_offset + `REAL_IFAR_WIDTH;
|
||
|
parameter req_sel_tid_offset = req_sel_ttype_offset + 6;
|
||
|
parameter req_sel_opSize_offset = req_sel_tid_offset + 2;
|
||
|
parameter req_sel_cTag_offset = req_sel_opSize_offset + 3;
|
||
|
parameter unit_last_sel_offset = req_sel_cTag_offset + 5;
|
||
|
parameter load_cred_cnt_offset = unit_last_sel_offset + 4;
|
||
|
parameter ld_cred_err_offset = load_cred_cnt_offset + 5;
|
||
|
parameter ld_st_noCred_flp_offset = ld_cred_err_offset + 1;
|
||
|
parameter st_rej_hold_cred_offset = ld_st_noCred_flp_offset + 1;
|
||
|
parameter ld_noCred_hold_offset = st_rej_hold_cred_offset + 1;
|
||
|
parameter ld_pop_rcvd_offset = ld_noCred_hold_offset + 1;
|
||
|
parameter ld_cred_blk_cnt_offset = ld_pop_rcvd_offset + 1;
|
||
|
parameter store_cred_cnt_offset = ld_cred_blk_cnt_offset + 4;
|
||
|
parameter st_cred_err_offset = store_cred_cnt_offset + 6;
|
||
|
parameter spr_lsucr0_b2b_offset = st_cred_err_offset + 1;
|
||
|
parameter spr_xucr0_cred_offset = spr_lsucr0_b2b_offset + 1;
|
||
|
parameter spr_xucr0_cls_offset = spr_xucr0_cred_offset + 1;
|
||
|
parameter stq2_req_val_offset = spr_xucr0_cls_offset + 1;
|
||
|
parameter mmq2_req_val_offset = stq2_req_val_offset + 1;
|
||
|
parameter mmq3_req_val_offset = mmq2_req_val_offset + 1;
|
||
|
parameter stq4_data_override_offset = mmq3_req_val_offset + 1;
|
||
|
parameter stq4_req_st_data_offset = stq4_data_override_offset + 1;
|
||
|
parameter stq2_store_data_offset = stq4_req_st_data_offset + 27;
|
||
|
parameter scan_right = stq2_store_data_offset + 128 - 1;
|
||
|
|
||
|
wire tiup;
|
||
|
wire [0:scan_right] siv;
|
||
|
wire [0:scan_right] sov;
|
||
|
|
||
|
assign tiup = 1'b1;
|
||
|
|
||
|
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||
|
// LSU Config Bits
|
||
|
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||
|
|
||
|
// LSUCR0[B2B] Back-2-Back allowed for same type of L2 request
|
||
|
// 1 => Back-2-Back allowed
|
||
|
// 0 => Back-2-Back not allowed, LSI Mode
|
||
|
assign spr_lsucr0_b2b_d = ctl_lsq_spr_lsucr0_b2b;
|
||
|
|
||
|
// XUCR0[CRED] L2 Credit Control
|
||
|
// 1 => Can only send one load or store when there is 1 store credit and 1 load credit
|
||
|
// 0 => No restrictions when there is 1 store credit and 1 load credit
|
||
|
assign spr_xucr0_cred_d = xu_lq_spr_xucr0_cred;
|
||
|
|
||
|
// XUCR0[CLS] 128 Byte Cacheline Enabled
|
||
|
// 1 => 128 Byte Cacheline
|
||
|
// 0 => 64 Byte Cacheline
|
||
|
assign spr_xucr0_cls_d = xu_lq_spr_xucr0_cls;
|
||
|
|
||
|
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||
|
// Select Between LDQ and STQ Common
|
||
|
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||
|
// Reloads have higher priority than Commit Pipe
|
||
|
|
||
|
assign lsq_ctl_stq1_axu_val = (ldq_arb_rel1_blk_store == 1'b1) ? ldq_arb_rel1_axu_val :
|
||
|
stq_arb_stq1_axu_val;
|
||
|
|
||
|
assign lsq_ctl_stq1_epid_val = stq_arb_stq1_epid_val & (~ldq_arb_rel1_blk_store);
|
||
|
|
||
|
assign lsq_dat_stq1_op_size_int = (ldq_arb_rel1_blk_store == 1'b1) ? ldq_arb_rel1_op_size :
|
||
|
stq_arb_stq1_opSize;
|
||
|
|
||
|
assign ldq_stq_stq1_addr = (ldq_arb_rel1_blk_store == 1'b1) ? ldq_arb_rel1_addr :
|
||
|
stq_arb_stq1_p_addr;
|
||
|
|
||
|
assign lsq_ctl_stq1_ci = (ldq_arb_rel1_blk_store == 1'b1) ? ldq_arb_rel1_ci :
|
||
|
stq_arb_stq1_wimge_i;
|
||
|
|
||
|
assign ldq_stq_stq1_le_mode = (ldq_arb_rel1_blk_store == 1'b1) ? ldq_arb_rel1_byte_swap :
|
||
|
stq_arb_stq1_byte_swap;
|
||
|
|
||
|
assign ldq_stq1_thrd_id = (ldq_arb_rel1_blk_store == 1'b1) ? ldq_arb_rel1_thrd_id :
|
||
|
stq_arb_stq1_thrd_id;
|
||
|
|
||
|
assign ldq_dat_stq1_addr_int = ldq_stq_stq1_addr[52:63];
|
||
|
|
||
|
assign lsq_dat_stq1_op_size = lsq_dat_stq1_op_size_int;
|
||
|
assign lsq_dat_stq1_addr = ldq_dat_stq1_addr_int[52:63];
|
||
|
assign lsq_ctl_stq1_thrd_id = ldq_stq1_thrd_id;
|
||
|
assign lsq_ctl_stq1_addr = ldq_stq_stq1_addr[64 - `REAL_IFAR_WIDTH:63 - `CL_SIZE];
|
||
|
assign lsq_dat_stq1_le_mode = ldq_stq_stq1_le_mode;
|
||
|
assign stq1_stg_act = ldq_arb_rel1_stg_act | stq_arb_stq1_stg_act;
|
||
|
|
||
|
assign lsq_ctl_stq_release_itag_vld = stq_arb_release_itag_vld;
|
||
|
assign lsq_ctl_stq_release_itag = stq_arb_release_itag;
|
||
|
assign lsq_ctl_stq_release_tid = stq_arb_release_tid;
|
||
|
|
||
|
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||
|
// Store Data Muxing
|
||
|
// Data that needs to be rotated or written to the cache
|
||
|
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||
|
|
||
|
generate
|
||
|
if (`STQ_DATA_SIZE == 128) begin : stqDat128
|
||
|
// Select between L2 reload Data and Store Data
|
||
|
assign stq2_store_data_d = (ldq_arb_rel1_data_sel == 1'b1) ? ldq_arb_rel1_data :
|
||
|
stq_arb_stq1_store_data;
|
||
|
end
|
||
|
endgenerate
|
||
|
|
||
|
generate
|
||
|
if (`STQ_DATA_SIZE == 64) begin : stqDat64
|
||
|
assign stq2_store_data_d[0:63] = ldq_arb_rel1_data[0:63];
|
||
|
|
||
|
// Select between L2 reload Data and Store Data
|
||
|
assign stq2_store_data_d[64:127] = (ldq_arb_rel1_data_sel == 1'b1) ? ldq_arb_rel1_data[64:127] :
|
||
|
stq_arb_stq1_store_data[64:127];
|
||
|
end
|
||
|
endgenerate
|
||
|
|
||
|
generate begin : parGen
|
||
|
genvar t;
|
||
|
for (t = 0; t <= 15; t = t + 1) begin : parGen
|
||
|
assign stq2_store_parity[t] = ^(stq2_store_data_q[t * 8:(t * 8) + 7]);
|
||
|
end
|
||
|
end
|
||
|
endgenerate
|
||
|
|
||
|
assign rel2_wrt_data = {stq2_store_data_q, stq2_store_parity};
|
||
|
|
||
|
// Select betweeen L2/Store and Reload Queue Data
|
||
|
assign stq2_store_data = (ldq_arb_rel2_rdat_sel == 1'b1) ? ldq_arb_rel2_rd_data :
|
||
|
rel2_wrt_data;
|
||
|
|
||
|
assign lsq_dat_stq2_store_data = stq2_store_data;
|
||
|
assign arb_ldq_rel2_wrt_data = rel2_wrt_data;
|
||
|
|
||
|
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||
|
// L2 Credit Control
|
||
|
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||
|
|
||
|
// Need to flip the no credit available to ldq and stq when running in XUCR0[CRED] mode and there are no load credits or store credits
|
||
|
// Cant send both load and store requests out, need to pick one, so will ping pong between load and store
|
||
|
// Want to hold flp to point to load if the store was rejected and didnt commit to the L1/L2
|
||
|
// 1 => Load Queue has no Credit
|
||
|
// 0 => Store Queue has no Credit
|
||
|
assign ld_st_noCred_flp_d = spr_xucr0_cred_q & (~ld_st_noCred_flp_q | ld_noCred_hold_q);
|
||
|
assign stq3_store_type_cmmt = stq_arb_stq3_cmmt_val | mmq3_req_val_q;
|
||
|
assign stq3_store_type_rej = stq_arb_stq3_cmmt_reject & ~mmq3_req_val_q;
|
||
|
assign st_rej_hold_cred_d = spr_xucr0_cred_q & (stq3_store_type_rej | (st_rej_hold_cred_q & ~stq_arb_stq3_cmmt_val));
|
||
|
assign ld_noCred_hold_d = spr_xucr0_cred_q & (load_req_sent | (ld_noCred_hold_q & ~ld_noCred_release));
|
||
|
assign ld_noCred_release = ld_pop_rcvd_q & ~|(ld_cred_blk_cnt_q) & ~st_rej_hold_cred_q;
|
||
|
assign ld_pop_rcvd_d = l2_lsq_req_ld_pop | (ld_pop_rcvd_q & ~load_req_sent);
|
||
|
|
||
|
assign ld_cred_blk_rst = spr_xucr0_cred_q & l2_lsq_req_ld_pop;
|
||
|
assign ld_cred_blk_run = |(ld_cred_blk_cnt_q);
|
||
|
assign ld_cred_blk_zero = stq3_store_type_cmmt | stq3_store_type_rej;
|
||
|
assign ld_cred_blk_decr = ld_cred_blk_cnt_q - 4'b0001;
|
||
|
assign ld_cred_blk_init = {1'b1, spr_xucr0_cls_q, 2'b00};
|
||
|
assign ld_cred_blk_cnt_d = ld_cred_blk_rst ? ld_cred_blk_init :
|
||
|
ld_cred_blk_zero ? 4'b0000 :
|
||
|
ld_cred_blk_run ? ld_cred_blk_decr :
|
||
|
ld_cred_blk_cnt_q;
|
||
|
|
||
|
// Load Credit Control
|
||
|
assign load_req_sent = |(unit_req_val);
|
||
|
assign load_cred_incr = load_cred_cnt_q + 5'b00001;
|
||
|
assign load_cred_decr = load_cred_cnt_q - 5'b00001;
|
||
|
assign load_cred_sel = {l2_lsq_req_ld_pop, load_req_sent};
|
||
|
|
||
|
assign load_cred_cnt_d = (load_cred_sel == 2'b10) ? load_cred_incr :
|
||
|
(load_cred_sel == 2'b01) ? load_cred_decr :
|
||
|
load_cred_cnt_q;
|
||
|
|
||
|
assign ld_req_0Creds = (load_cred_cnt_q == 5'b00000);
|
||
|
assign ld_req_noCreds = ld_req_0Creds | (spr_xucr0_cred_q & (st_req_0Creds | st_req_1inpipe | st_req_2inpipe | ld_st_noCred_flp_q));
|
||
|
assign ld_type_credAvail = ~(ld_req_noCreds | ld_b2b_ld_dis);
|
||
|
assign ld_cred_max = 5'd`LOAD_CREDITS;
|
||
|
assign ld_cred_err_d = (load_cred_cnt_q > ld_cred_max);
|
||
|
assign ld_b2b_ld_dis = req_l2_ld_sent_q & (~spr_lsucr0_b2b_q);
|
||
|
|
||
|
// Store Credit Control
|
||
|
assign store_req_sent = stq_arb_stq3_req_val | mmq3_req_val_q;
|
||
|
assign store_cred_incr = store_cred_cnt_q + 6'b00001;
|
||
|
assign store_cred_incr2 = store_cred_cnt_q + 6'b00010;
|
||
|
assign store_cred_decr = store_cred_cnt_q - 6'b00001;
|
||
|
assign store_cred_sel = {l2_lsq_req_st_pop, l2_lsq_req_st_gather, store_req_sent};
|
||
|
|
||
|
//000 store_cred_cnt_q
|
||
|
//001 store_cred_decr
|
||
|
//010 store_cred_incr
|
||
|
//011 store_cred_cnt_q
|
||
|
//100 store_cred_incr
|
||
|
//101 store_cred_cnt_q
|
||
|
//110 store_cred_incr2
|
||
|
//111 store_cred_incr
|
||
|
|
||
|
assign store_cred_cnt_d = (store_cred_sel == 3'b001) ? store_cred_decr :
|
||
|
(store_cred_sel == 3'b110) ? store_cred_incr2 :
|
||
|
(store_cred_sel == 3'b000) ? store_cred_cnt_q :
|
||
|
(store_cred_sel == 3'b011) ? store_cred_cnt_q :
|
||
|
(store_cred_sel == 3'b101) ? store_cred_cnt_q :
|
||
|
store_cred_incr;
|
||
|
|
||
|
assign st_cred_max = 6'd`STORE_CREDITS;
|
||
|
assign st_cred_err_d = (store_cred_cnt_q > st_cred_max);
|
||
|
assign st_req_2inpipe = (store_cred_cnt_q == 6'b000010) & st2_req_val & st3_req_val;
|
||
|
assign st_req_1inpipe = (store_cred_cnt_q == 6'b000001) & (st2_req_val ^ st3_req_val);
|
||
|
assign st_req_0Creds = (store_cred_cnt_q == 6'b000000);
|
||
|
assign st_req_noCreds = st_req_0Creds | st_req_1inpipe | st_req_2inpipe | (spr_xucr0_cred_q & (ld_req_0Creds | ~ld_st_noCred_flp_q));
|
||
|
assign st_type_credAvail = ~(st_req_noCreds | st_b2b_st_dis);
|
||
|
assign st2_req_val = mmq2_req_val_q | stq2_req_val_q;
|
||
|
assign st3_req_val = (mmq3_req_val_q | stq_arb_stq3_req_val);
|
||
|
assign stq2_req_val_d = stq_arb_st_req_avail & (~mmq1_req_val);
|
||
|
assign stq3_icswx_val = (stq_arb_stq3_ttype[0:4] == 5'b10011);
|
||
|
assign st_b2b_st_dis = st2_req_val & (~spr_lsucr0_b2b_q);
|
||
|
|
||
|
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||
|
// L2 Request Arbiter
|
||
|
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||
|
|
||
|
// Need to block off request when store request is about to be sent to L2
|
||
|
assign unit_req_val[0] = ldq_arb_ld_req_avail & ld_type_credAvail & (~req_l2_st_val);
|
||
|
assign unit_req_val[1] = imq_arb_iuq_ld_req_avail & ld_type_credAvail & (~req_l2_st_val);
|
||
|
assign unit_req_val[2] = imq_arb_mmq_ld_req_avail & ld_type_credAvail & (~req_l2_st_val);
|
||
|
assign unit_req_val[3] = 1'b0;
|
||
|
|
||
|
assign queue_unit_sel[0] = (unit_last_sel_q[0] & (~(|(unit_req_val[1:3]))) & unit_req_val[0]) |
|
||
|
(unit_last_sel_q[1] & (~(|(unit_req_val[2:3]))) & unit_req_val[0]) |
|
||
|
(unit_last_sel_q[2] & (~unit_req_val[3]) & unit_req_val[0]) |
|
||
|
(unit_last_sel_q[3] & unit_req_val[0]);
|
||
|
|
||
|
assign queue_unit_sel[1] = (unit_last_sel_q[0] & unit_req_val[1]) |
|
||
|
(unit_last_sel_q[1] & (~(|(({unit_req_val[0], unit_req_val[2:3]})))) & unit_req_val[1]) |
|
||
|
(unit_last_sel_q[2] & (~(|(({unit_req_val[0], unit_req_val[3]})))) & unit_req_val[1]) |
|
||
|
(unit_last_sel_q[3] & (~unit_req_val[0]) & unit_req_val[1]);
|
||
|
|
||
|
assign queue_unit_sel[2] = (unit_last_sel_q[0] & (~unit_req_val[1]) & unit_req_val[2]) |
|
||
|
(unit_last_sel_q[1] & unit_req_val[2]) |
|
||
|
(unit_last_sel_q[2] & (~(|(({unit_req_val[0:1], unit_req_val[3]})))) & unit_req_val[2]) |
|
||
|
(unit_last_sel_q[3] & (~(|(unit_req_val[0:1]))) & unit_req_val[2]);
|
||
|
|
||
|
assign queue_unit_sel[3] = (unit_last_sel_q[0] & (~(|(unit_req_val[1:2]))) & unit_req_val[3]) |
|
||
|
(unit_last_sel_q[1] & (~unit_req_val[2]) & unit_req_val[3]) |
|
||
|
(unit_last_sel_q[2] & unit_req_val[3]) |
|
||
|
(unit_last_sel_q[3] & (~(|(unit_req_val[0:2]))) & unit_req_val[3]);
|
||
|
|
||
|
assign unit_last_sel_d = (req_l2_sent == 1'b1) ? queue_unit_sel :
|
||
|
unit_last_sel_q;
|
||
|
|
||
|
// Unit Select
|
||
|
assign unit_req_sel_usrDef = (ldq_arb_usr_def & {4{queue_unit_sel[0]}}) |
|
||
|
(imq_arb_iuq_usr_def & {4{queue_unit_sel[1]}}) |
|
||
|
(imq_arb_mmq_usr_def & {4{queue_unit_sel[2]}});
|
||
|
|
||
|
assign unit_req_sel_wimge = (ldq_arb_wimge & {5{queue_unit_sel[0]}}) |
|
||
|
(imq_arb_iuq_wimge & {5{queue_unit_sel[1]}}) |
|
||
|
(imq_arb_mmq_wimge & {5{queue_unit_sel[2]}});
|
||
|
|
||
|
assign unit_req_sel_p_addr = (ldq_arb_p_addr & {`REAL_IFAR_WIDTH{queue_unit_sel[0]}}) |
|
||
|
(imq_arb_iuq_p_addr & {`REAL_IFAR_WIDTH{queue_unit_sel[1]}}) |
|
||
|
(imq_arb_mmq_p_addr & {`REAL_IFAR_WIDTH{queue_unit_sel[2]}});
|
||
|
|
||
|
assign unit_req_sel_ttype = (ldq_arb_ttype & {6{queue_unit_sel[0]}}) |
|
||
|
(imq_arb_iuq_ttype & {6{queue_unit_sel[1]}}) |
|
||
|
(imq_arb_mmq_ttype & {6{queue_unit_sel[2]}});
|
||
|
|
||
|
assign unit_req_sel_tid = (ldq_arb_tid & {2{queue_unit_sel[0]}}) |
|
||
|
(imq_arb_iuq_tid & {2{queue_unit_sel[1]}}) |
|
||
|
(imq_arb_mmq_tid & {2{queue_unit_sel[2]}});
|
||
|
|
||
|
assign unit_req_sel_opSize = (ldq_arb_opSize & {3{queue_unit_sel[0]}}) |
|
||
|
(imq_arb_iuq_opSize & {3{queue_unit_sel[1]}}) |
|
||
|
(imq_arb_mmq_opSize & {3{queue_unit_sel[2]}});
|
||
|
|
||
|
assign unit_req_sel_cTag = (ldq_arb_cTag & {5{queue_unit_sel[0]}}) |
|
||
|
(imq_arb_iuq_cTag & {5{queue_unit_sel[1]}}) |
|
||
|
(imq_arb_mmq_cTag & {5{queue_unit_sel[2]}});
|
||
|
|
||
|
assign req_l2_sent = |(queue_unit_sel);
|
||
|
assign req_l2_ld_pwrToken = (ldq_arb_ld_req_pwrToken | imq_arb_iuq_ld_req_avail | imq_arb_mmq_ld_req_avail) & ld_type_credAvail;
|
||
|
assign req_l2_ld_val = (ldq_arb_ld_req_avail | imq_arb_iuq_ld_req_avail | imq_arb_mmq_ld_req_avail) & ld_type_credAvail;
|
||
|
assign req_l2_ld_sent_d = req_l2_ld_val;
|
||
|
assign req_l2_st_val = (stq_arb_stq3_req_val | mmq3_req_val_q);
|
||
|
assign req_l2_val_d = req_l2_ld_val | stq_arb_stq3_req_val | mmq3_req_val_q;
|
||
|
assign req_l2_act = ldq_arb_ld_req_pwrToken | imq_arb_iuq_ld_req_avail | imq_arb_mmq_ld_req_avail | stq_arb_stq3_req_val | mmq3_req_val_q;
|
||
|
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||
|
|
||
|
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||
|
// MMQ Store Type Request Delay
|
||
|
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||
|
|
||
|
assign mmq1_req_val = imq_arb_mmq_st_req_avail & st_type_credAvail & (~(mmq2_req_val_q | mmq3_req_val_q));
|
||
|
assign mmq2_req_val_d = mmq1_req_val;
|
||
|
assign mmq3_req_val_d = mmq2_req_val_q;
|
||
|
assign stq4_data_override_d = mmq3_req_val_q | stq3_icswx_val;
|
||
|
|
||
|
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||
|
// Mux Between Store and other requests
|
||
|
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||
|
|
||
|
assign req_l2_st_p_addr = (mmq3_req_val_q == 1'b0) ? stq_arb_stq3_p_addr :
|
||
|
imq_arb_mmq_p_addr;
|
||
|
|
||
|
assign req_l2_st_wimge = (mmq3_req_val_q == 1'b0) ? stq_arb_stq3_wimge :
|
||
|
imq_arb_mmq_wimge;
|
||
|
|
||
|
assign req_l2_st_usrDef = (mmq3_req_val_q == 1'b0) ? stq_arb_stq3_usrDef :
|
||
|
imq_arb_mmq_usr_def;
|
||
|
|
||
|
assign req_sel_byteEn_d = stq_arb_stq3_byteEn & {16{(~mmq3_req_val_q)}};
|
||
|
|
||
|
assign req_l2_st_ttype = (mmq3_req_val_q == 1'b0) ? stq_arb_stq3_ttype :
|
||
|
imq_arb_mmq_ttype;
|
||
|
|
||
|
assign req_l2_st_tid = (mmq3_req_val_q == 1'b0) ? stq_arb_stq3_tid :
|
||
|
imq_arb_mmq_tid;
|
||
|
|
||
|
assign req_l2_st_opSize = stq_arb_stq3_opSize & {3{(~mmq3_req_val_q)}};
|
||
|
|
||
|
assign req_sel_p_addr_d = (req_l2_st_val == 1'b1) ? req_l2_st_p_addr :
|
||
|
unit_req_sel_p_addr;
|
||
|
|
||
|
assign req_sel_wimge_d = (req_l2_st_val == 1'b1) ? req_l2_st_wimge :
|
||
|
unit_req_sel_wimge;
|
||
|
|
||
|
assign req_sel_usrDef_d = (req_l2_st_val == 1'b1) ? req_l2_st_usrDef :
|
||
|
unit_req_sel_usrDef;
|
||
|
|
||
|
assign req_sel_ttype_d = (req_l2_st_val == 1'b1) ? req_l2_st_ttype :
|
||
|
unit_req_sel_ttype;
|
||
|
|
||
|
assign req_sel_tid_d = (req_l2_st_val == 1'b1) ? req_l2_st_tid :
|
||
|
unit_req_sel_tid;
|
||
|
|
||
|
assign req_sel_opSize_d = (req_l2_st_val == 1'b1) ? req_l2_st_opSize :
|
||
|
unit_req_sel_opSize;
|
||
|
|
||
|
assign req_sel_cTag_d = (req_l2_st_val == 1'b1) ? stq_arb_stq3_cTag :
|
||
|
unit_req_sel_cTag;
|
||
|
|
||
|
// Select between icswx and mmu request
|
||
|
// ICSWX Store Data Format
|
||
|
// (0:2) => ~GS,PR,DS
|
||
|
// (3:9) => "0000000"
|
||
|
// (10:31) => RS(10:31)
|
||
|
// (32:39) => LPID
|
||
|
// (40:41) => "00"
|
||
|
// (42:55) => PID
|
||
|
// TLBIVAX Store Data Format
|
||
|
// (0:31) => unusedBits
|
||
|
// (32:39) => LPAR_ID
|
||
|
// (40:44) => Reserved
|
||
|
// (45:47) => IND,GS,L
|
||
|
// (48:55) => unusedBits
|
||
|
assign stq4_req_st_data_d[3:18] = (mmq3_req_val_q == 1'b1) ? imq_arb_mmq_st_data[0:15] :
|
||
|
ctl_lsq_stq3_icswx_data[3:18];
|
||
|
|
||
|
assign stq4_req_st_data_d[0:2] = ctl_lsq_stq3_icswx_data[0:2];
|
||
|
assign stq4_req_st_data_d[19:26] = ctl_lsq_stq3_icswx_data[19:26];
|
||
|
|
||
|
assign req_l2_st_data[32:55] = (stq4_data_override_q == 1'b0) ? dat_lsq_stq4_128data[32:55] :
|
||
|
stq4_req_st_data_q[3:26];
|
||
|
|
||
|
assign req_l2_st_data[0:2] = (stq4_data_override_q == 1'b0) ? dat_lsq_stq4_128data[0:2] :
|
||
|
stq4_req_st_data_q[0:2];
|
||
|
|
||
|
assign req_l2_st_data[3:9] = dat_lsq_stq4_128data[3:9] & {7{(~stq4_data_override_q)}};
|
||
|
assign req_l2_st_data[10:31] = dat_lsq_stq4_128data[10:31];
|
||
|
assign req_l2_st_data[56:127] = dat_lsq_stq4_128data[56:127];
|
||
|
|
||
|
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||
|
|
||
|
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||
|
// Outputs
|
||
|
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||
|
assign lsq_l2credit_overrun = ld_cred_err_q | st_cred_err_q;
|
||
|
|
||
|
tri_direct_err_rpt #(.WIDTH(1)) err_rpt(
|
||
|
.vd(vdd),
|
||
|
.gd(gnd),
|
||
|
.err_in(lsq_l2credit_overrun),
|
||
|
.err_out(lq_pc_err_l2credit_overrun)
|
||
|
);
|
||
|
|
||
|
// Credits Available
|
||
|
assign arb_stq_cred_avail = st_type_credAvail & (~imq_arb_mmq_st_req_avail);
|
||
|
|
||
|
// Unit Selected to Send request to L2
|
||
|
assign arb_ldq_ldq_unit_sel = queue_unit_sel[0];
|
||
|
assign arb_imq_iuq_unit_sel = queue_unit_sel[1];
|
||
|
assign arb_imq_mmq_unit_sel = queue_unit_sel[2] | mmq3_req_val_q;
|
||
|
|
||
|
// L2 Request
|
||
|
assign lsq_l2_pwrToken = req_l2_ld_pwrToken | stq_arb_stq3_req_val | mmq3_req_val_q;
|
||
|
assign lsq_l2_valid = req_l2_val_q;
|
||
|
assign lsq_l2_tid = req_sel_tid_q;
|
||
|
assign lsq_l2_p_addr = req_sel_p_addr_q;
|
||
|
assign lsq_l2_wimge = req_sel_wimge_q;
|
||
|
assign lsq_l2_usrDef = req_sel_usrDef_q;
|
||
|
assign lsq_l2_byteEn = req_sel_byteEn_q;
|
||
|
assign lsq_l2_ttype = req_sel_ttype_q;
|
||
|
assign lsq_l2_opSize = req_sel_opSize_q;
|
||
|
assign lsq_l2_coreTag = req_sel_cTag_q;
|
||
|
assign lsq_l2_dataToken = stq_arb_stq3_req_val | mmq3_req_val_q;
|
||
|
assign lsq_l2_st_data = req_l2_st_data;
|
||
|
|
||
|
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||
|
// REGISTERS
|
||
|
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||
|
|
||
|
|
||
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) req_l2_val_reg(
|
||
|
.vd(vdd),
|
||
|
.gd(gnd),
|
||
|
.nclk(nclk),
|
||
|
.act(tiup),
|
||
|
.force_t(func_slp_sl_force),
|
||
|
.d_mode(d_mode_dc),
|
||
|
.delay_lclkr(delay_lclkr_dc),
|
||
|
.mpw1_b(mpw1_dc_b),
|
||
|
.mpw2_b(mpw2_dc_b),
|
||
|
.thold_b(func_slp_sl_thold_0_b),
|
||
|
.sg(sg_0),
|
||
|
.scin(siv[req_l2_val_offset]),
|
||
|
.scout(sov[req_l2_val_offset]),
|
||
|
.din(req_l2_val_d),
|
||
|
.dout(req_l2_val_q)
|
||
|
);
|
||
|
|
||
|
|
||
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) req_l2_ld_sent_reg(
|
||
|
.vd(vdd),
|
||
|
.gd(gnd),
|
||
|
.nclk(nclk),
|
||
|
.act(tiup),
|
||
|
.force_t(func_slp_sl_force),
|
||
|
.d_mode(d_mode_dc),
|
||
|
.delay_lclkr(delay_lclkr_dc),
|
||
|
.mpw1_b(mpw1_dc_b),
|
||
|
.mpw2_b(mpw2_dc_b),
|
||
|
.thold_b(func_slp_sl_thold_0_b),
|
||
|
.sg(sg_0),
|
||
|
.scin(siv[req_l2_ld_sent_offset]),
|
||
|
.scout(sov[req_l2_ld_sent_offset]),
|
||
|
.din(req_l2_ld_sent_d),
|
||
|
.dout(req_l2_ld_sent_q)
|
||
|
);
|
||
|
|
||
|
|
||
|
tri_rlmreg_p #(.WIDTH(4), .INIT(0), .NEEDS_SRESET(1)) req_sel_usrDef_reg(
|
||
|
.vd(vdd),
|
||
|
.gd(gnd),
|
||
|
.nclk(nclk),
|
||
|
.act(req_l2_act),
|
||
|
.force_t(func_slp_sl_force),
|
||
|
.d_mode(d_mode_dc),
|
||
|
.delay_lclkr(delay_lclkr_dc),
|
||
|
.mpw1_b(mpw1_dc_b),
|
||
|
.mpw2_b(mpw2_dc_b),
|
||
|
.thold_b(func_slp_sl_thold_0_b),
|
||
|
.sg(sg_0),
|
||
|
.scin(siv[req_sel_usrDef_offset:req_sel_usrDef_offset + 4 - 1]),
|
||
|
.scout(sov[req_sel_usrDef_offset:req_sel_usrDef_offset + 4 - 1]),
|
||
|
.din(req_sel_usrDef_d),
|
||
|
.dout(req_sel_usrDef_q)
|
||
|
);
|
||
|
|
||
|
|
||
|
tri_rlmreg_p #(.WIDTH(16), .INIT(0), .NEEDS_SRESET(1)) req_sel_byteEn_reg(
|
||
|
.vd(vdd),
|
||
|
.gd(gnd),
|
||
|
.nclk(nclk),
|
||
|
.act(req_l2_act),
|
||
|
.force_t(func_slp_sl_force),
|
||
|
.d_mode(d_mode_dc),
|
||
|
.delay_lclkr(delay_lclkr_dc),
|
||
|
.mpw1_b(mpw1_dc_b),
|
||
|
.mpw2_b(mpw2_dc_b),
|
||
|
.thold_b(func_slp_sl_thold_0_b),
|
||
|
.sg(sg_0),
|
||
|
.scin(siv[req_sel_byteEn_offset:req_sel_byteEn_offset + 16 - 1]),
|
||
|
.scout(sov[req_sel_byteEn_offset:req_sel_byteEn_offset + 16 - 1]),
|
||
|
.din(req_sel_byteEn_d),
|
||
|
.dout(req_sel_byteEn_q)
|
||
|
);
|
||
|
|
||
|
|
||
|
tri_rlmreg_p #(.WIDTH(5), .INIT(0), .NEEDS_SRESET(1)) req_sel_wimge_reg(
|
||
|
.vd(vdd),
|
||
|
.gd(gnd),
|
||
|
.nclk(nclk),
|
||
|
.act(req_l2_act),
|
||
|
.force_t(func_slp_sl_force),
|
||
|
.d_mode(d_mode_dc),
|
||
|
.delay_lclkr(delay_lclkr_dc),
|
||
|
.mpw1_b(mpw1_dc_b),
|
||
|
.mpw2_b(mpw2_dc_b),
|
||
|
.thold_b(func_slp_sl_thold_0_b),
|
||
|
.sg(sg_0),
|
||
|
.scin(siv[req_sel_wimge_offset:req_sel_wimge_offset + 5 - 1]),
|
||
|
.scout(sov[req_sel_wimge_offset:req_sel_wimge_offset + 5 - 1]),
|
||
|
.din(req_sel_wimge_d),
|
||
|
.dout(req_sel_wimge_q)
|
||
|
);
|
||
|
|
||
|
|
||
|
tri_rlmreg_p #(.WIDTH(`REAL_IFAR_WIDTH), .INIT(0), .NEEDS_SRESET(1)) req_sel_p_addr_reg(
|
||
|
.vd(vdd),
|
||
|
.gd(gnd),
|
||
|
.nclk(nclk),
|
||
|
.act(req_l2_act),
|
||
|
.force_t(func_slp_sl_force),
|
||
|
.d_mode(d_mode_dc),
|
||
|
.delay_lclkr(delay_lclkr_dc),
|
||
|
.mpw1_b(mpw1_dc_b),
|
||
|
.mpw2_b(mpw2_dc_b),
|
||
|
.thold_b(func_slp_sl_thold_0_b),
|
||
|
.sg(sg_0),
|
||
|
.scin(siv[req_sel_p_addr_offset:req_sel_p_addr_offset + `REAL_IFAR_WIDTH - 1]),
|
||
|
.scout(sov[req_sel_p_addr_offset:req_sel_p_addr_offset + `REAL_IFAR_WIDTH - 1]),
|
||
|
.din(req_sel_p_addr_d),
|
||
|
.dout(req_sel_p_addr_q)
|
||
|
);
|
||
|
|
||
|
|
||
|
tri_rlmreg_p #(.WIDTH(6), .INIT(0), .NEEDS_SRESET(1)) req_sel_ttype_reg(
|
||
|
.vd(vdd),
|
||
|
.gd(gnd),
|
||
|
.nclk(nclk),
|
||
|
.act(req_l2_act),
|
||
|
.force_t(func_slp_sl_force),
|
||
|
.d_mode(d_mode_dc),
|
||
|
.delay_lclkr(delay_lclkr_dc),
|
||
|
.mpw1_b(mpw1_dc_b),
|
||
|
.mpw2_b(mpw2_dc_b),
|
||
|
.thold_b(func_slp_sl_thold_0_b),
|
||
|
.sg(sg_0),
|
||
|
.scin(siv[req_sel_ttype_offset:req_sel_ttype_offset + 6 - 1]),
|
||
|
.scout(sov[req_sel_ttype_offset:req_sel_ttype_offset + 6 - 1]),
|
||
|
.din(req_sel_ttype_d),
|
||
|
.dout(req_sel_ttype_q)
|
||
|
);
|
||
|
|
||
|
|
||
|
tri_rlmreg_p #(.WIDTH(2), .INIT(0), .NEEDS_SRESET(1)) req_sel_tid_reg(
|
||
|
.vd(vdd),
|
||
|
.gd(gnd),
|
||
|
.nclk(nclk),
|
||
|
.act(req_l2_act),
|
||
|
.force_t(func_slp_sl_force),
|
||
|
.d_mode(d_mode_dc),
|
||
|
.delay_lclkr(delay_lclkr_dc),
|
||
|
.mpw1_b(mpw1_dc_b),
|
||
|
.mpw2_b(mpw2_dc_b),
|
||
|
.thold_b(func_slp_sl_thold_0_b),
|
||
|
.sg(sg_0),
|
||
|
.scin(siv[req_sel_tid_offset:req_sel_tid_offset + 2 - 1]),
|
||
|
.scout(sov[req_sel_tid_offset:req_sel_tid_offset + 2 - 1]),
|
||
|
.din(req_sel_tid_d),
|
||
|
.dout(req_sel_tid_q)
|
||
|
);
|
||
|
|
||
|
|
||
|
tri_rlmreg_p #(.WIDTH(3), .INIT(0), .NEEDS_SRESET(1)) req_sel_opSize_reg(
|
||
|
.vd(vdd),
|
||
|
.gd(gnd),
|
||
|
.nclk(nclk),
|
||
|
.act(req_l2_act),
|
||
|
.force_t(func_slp_sl_force),
|
||
|
.d_mode(d_mode_dc),
|
||
|
.delay_lclkr(delay_lclkr_dc),
|
||
|
.mpw1_b(mpw1_dc_b),
|
||
|
.mpw2_b(mpw2_dc_b),
|
||
|
.thold_b(func_slp_sl_thold_0_b),
|
||
|
.sg(sg_0),
|
||
|
.scin(siv[req_sel_opSize_offset:req_sel_opSize_offset + 3 - 1]),
|
||
|
.scout(sov[req_sel_opSize_offset:req_sel_opSize_offset + 3 - 1]),
|
||
|
.din(req_sel_opSize_d),
|
||
|
.dout(req_sel_opSize_q)
|
||
|
);
|
||
|
|
||
|
|
||
|
tri_rlmreg_p #(.WIDTH(5), .INIT(0), .NEEDS_SRESET(1)) req_sel_cTag_reg(
|
||
|
.vd(vdd),
|
||
|
.gd(gnd),
|
||
|
.nclk(nclk),
|
||
|
.act(req_l2_act),
|
||
|
.force_t(func_slp_sl_force),
|
||
|
.d_mode(d_mode_dc),
|
||
|
.delay_lclkr(delay_lclkr_dc),
|
||
|
.mpw1_b(mpw1_dc_b),
|
||
|
.mpw2_b(mpw2_dc_b),
|
||
|
.thold_b(func_slp_sl_thold_0_b),
|
||
|
.sg(sg_0),
|
||
|
.scin(siv[req_sel_cTag_offset:req_sel_cTag_offset + 5 - 1]),
|
||
|
.scout(sov[req_sel_cTag_offset:req_sel_cTag_offset + 5 - 1]),
|
||
|
.din(req_sel_cTag_d),
|
||
|
.dout(req_sel_cTag_q)
|
||
|
);
|
||
|
|
||
|
|
||
|
tri_rlmreg_p #(.WIDTH(4), .INIT(1), .NEEDS_SRESET(1)) unit_last_sel_reg(
|
||
|
.vd(vdd),
|
||
|
.gd(gnd),
|
||
|
.nclk(nclk),
|
||
|
.act(tiup),
|
||
|
.force_t(func_slp_sl_force),
|
||
|
.d_mode(d_mode_dc),
|
||
|
.delay_lclkr(delay_lclkr_dc),
|
||
|
.mpw1_b(mpw1_dc_b),
|
||
|
.mpw2_b(mpw2_dc_b),
|
||
|
.thold_b(func_slp_sl_thold_0_b),
|
||
|
.sg(sg_0),
|
||
|
.scin(siv[unit_last_sel_offset:unit_last_sel_offset + 4 - 1]),
|
||
|
.scout(sov[unit_last_sel_offset:unit_last_sel_offset + 4 - 1]),
|
||
|
.din(unit_last_sel_d),
|
||
|
.dout(unit_last_sel_q)
|
||
|
);
|
||
|
|
||
|
|
||
|
tri_rlmreg_p #(.WIDTH(5), .INIT(`LOAD_CREDITS), .NEEDS_SRESET(1)) load_cred_cnt_reg(
|
||
|
.vd(vdd),
|
||
|
.gd(gnd),
|
||
|
.nclk(nclk),
|
||
|
.act(tiup),
|
||
|
.force_t(func_slp_sl_force),
|
||
|
.d_mode(d_mode_dc),
|
||
|
.delay_lclkr(delay_lclkr_dc),
|
||
|
.mpw1_b(mpw1_dc_b),
|
||
|
.mpw2_b(mpw2_dc_b),
|
||
|
.thold_b(func_slp_sl_thold_0_b),
|
||
|
.sg(sg_0),
|
||
|
.scin(siv[load_cred_cnt_offset:load_cred_cnt_offset + 5 - 1]),
|
||
|
.scout(sov[load_cred_cnt_offset:load_cred_cnt_offset + 5 - 1]),
|
||
|
.din(load_cred_cnt_d),
|
||
|
.dout(load_cred_cnt_q)
|
||
|
);
|
||
|
|
||
|
|
||
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ld_cred_err_reg(
|
||
|
.vd(vdd),
|
||
|
.gd(gnd),
|
||
|
.nclk(nclk),
|
||
|
.act(tiup),
|
||
|
.force_t(func_slp_sl_force),
|
||
|
.d_mode(d_mode_dc),
|
||
|
.delay_lclkr(delay_lclkr_dc),
|
||
|
.mpw1_b(mpw1_dc_b),
|
||
|
.mpw2_b(mpw2_dc_b),
|
||
|
.thold_b(func_slp_sl_thold_0_b),
|
||
|
.sg(sg_0),
|
||
|
.scin(siv[ld_cred_err_offset]),
|
||
|
.scout(sov[ld_cred_err_offset]),
|
||
|
.din(ld_cred_err_d),
|
||
|
.dout(ld_cred_err_q)
|
||
|
);
|
||
|
|
||
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ld_st_noCred_flp_reg(
|
||
|
.vd(vdd),
|
||
|
.gd(gnd),
|
||
|
.nclk(nclk),
|
||
|
.act(tiup),
|
||
|
.force_t(func_slp_sl_force),
|
||
|
.d_mode(d_mode_dc),
|
||
|
.delay_lclkr(delay_lclkr_dc),
|
||
|
.mpw1_b(mpw1_dc_b),
|
||
|
.mpw2_b(mpw2_dc_b),
|
||
|
.thold_b(func_slp_sl_thold_0_b),
|
||
|
.sg(sg_0),
|
||
|
.scin(siv[ld_st_noCred_flp_offset]),
|
||
|
.scout(sov[ld_st_noCred_flp_offset]),
|
||
|
.din(ld_st_noCred_flp_d),
|
||
|
.dout(ld_st_noCred_flp_q)
|
||
|
);
|
||
|
|
||
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) st_rej_hold_cred_reg(
|
||
|
.vd(vdd),
|
||
|
.gd(gnd),
|
||
|
.nclk(nclk),
|
||
|
.act(tiup),
|
||
|
.force_t(func_slp_sl_force),
|
||
|
.d_mode(d_mode_dc),
|
||
|
.delay_lclkr(delay_lclkr_dc),
|
||
|
.mpw1_b(mpw1_dc_b),
|
||
|
.mpw2_b(mpw2_dc_b),
|
||
|
.thold_b(func_slp_sl_thold_0_b),
|
||
|
.sg(sg_0),
|
||
|
.scin(siv[st_rej_hold_cred_offset]),
|
||
|
.scout(sov[st_rej_hold_cred_offset]),
|
||
|
.din(st_rej_hold_cred_d),
|
||
|
.dout(st_rej_hold_cred_q)
|
||
|
);
|
||
|
|
||
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ld_noCred_hold_reg(
|
||
|
.vd(vdd),
|
||
|
.gd(gnd),
|
||
|
.nclk(nclk),
|
||
|
.act(tiup),
|
||
|
.force_t(func_slp_sl_force),
|
||
|
.d_mode(d_mode_dc),
|
||
|
.delay_lclkr(delay_lclkr_dc),
|
||
|
.mpw1_b(mpw1_dc_b),
|
||
|
.mpw2_b(mpw2_dc_b),
|
||
|
.thold_b(func_slp_sl_thold_0_b),
|
||
|
.sg(sg_0),
|
||
|
.scin(siv[ld_noCred_hold_offset]),
|
||
|
.scout(sov[ld_noCred_hold_offset]),
|
||
|
.din(ld_noCred_hold_d),
|
||
|
.dout(ld_noCred_hold_q)
|
||
|
);
|
||
|
|
||
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) ld_pop_rcvd_reg(
|
||
|
.vd(vdd),
|
||
|
.gd(gnd),
|
||
|
.nclk(nclk),
|
||
|
.act(tiup),
|
||
|
.force_t(func_slp_sl_force),
|
||
|
.d_mode(d_mode_dc),
|
||
|
.delay_lclkr(delay_lclkr_dc),
|
||
|
.mpw1_b(mpw1_dc_b),
|
||
|
.mpw2_b(mpw2_dc_b),
|
||
|
.thold_b(func_slp_sl_thold_0_b),
|
||
|
.sg(sg_0),
|
||
|
.scin(siv[ld_pop_rcvd_offset]),
|
||
|
.scout(sov[ld_pop_rcvd_offset]),
|
||
|
.din(ld_pop_rcvd_d),
|
||
|
.dout(ld_pop_rcvd_q)
|
||
|
);
|
||
|
|
||
|
tri_rlmreg_p #(.WIDTH(4), .INIT(0), .NEEDS_SRESET(1)) ld_cred_blk_cnt_reg(
|
||
|
.vd(vdd),
|
||
|
.gd(gnd),
|
||
|
.nclk(nclk),
|
||
|
.act(tiup),
|
||
|
.force_t(func_slp_sl_force),
|
||
|
.d_mode(d_mode_dc),
|
||
|
.delay_lclkr(delay_lclkr_dc),
|
||
|
.mpw1_b(mpw1_dc_b),
|
||
|
.mpw2_b(mpw2_dc_b),
|
||
|
.thold_b(func_slp_sl_thold_0_b),
|
||
|
.sg(sg_0),
|
||
|
.scin(siv[ld_cred_blk_cnt_offset:ld_cred_blk_cnt_offset + 4 - 1]),
|
||
|
.scout(sov[ld_cred_blk_cnt_offset:ld_cred_blk_cnt_offset + 4 - 1]),
|
||
|
.din(ld_cred_blk_cnt_d),
|
||
|
.dout(ld_cred_blk_cnt_q)
|
||
|
);
|
||
|
|
||
|
tri_rlmreg_p #(.WIDTH(6), .INIT(`STORE_CREDITS), .NEEDS_SRESET(1)) store_cred_cnt_reg(
|
||
|
.vd(vdd),
|
||
|
.gd(gnd),
|
||
|
.nclk(nclk),
|
||
|
.act(tiup),
|
||
|
.force_t(func_slp_sl_force),
|
||
|
.d_mode(d_mode_dc),
|
||
|
.delay_lclkr(delay_lclkr_dc),
|
||
|
.mpw1_b(mpw1_dc_b),
|
||
|
.mpw2_b(mpw2_dc_b),
|
||
|
.thold_b(func_slp_sl_thold_0_b),
|
||
|
.sg(sg_0),
|
||
|
.scin(siv[store_cred_cnt_offset:store_cred_cnt_offset + 6 - 1]),
|
||
|
.scout(sov[store_cred_cnt_offset:store_cred_cnt_offset + 6 - 1]),
|
||
|
.din(store_cred_cnt_d),
|
||
|
.dout(store_cred_cnt_q)
|
||
|
);
|
||
|
|
||
|
|
||
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) st_cred_err_reg(
|
||
|
.vd(vdd),
|
||
|
.gd(gnd),
|
||
|
.nclk(nclk),
|
||
|
.act(tiup),
|
||
|
.force_t(func_slp_sl_force),
|
||
|
.d_mode(d_mode_dc),
|
||
|
.delay_lclkr(delay_lclkr_dc),
|
||
|
.mpw1_b(mpw1_dc_b),
|
||
|
.mpw2_b(mpw2_dc_b),
|
||
|
.thold_b(func_slp_sl_thold_0_b),
|
||
|
.sg(sg_0),
|
||
|
.scin(siv[st_cred_err_offset]),
|
||
|
.scout(sov[st_cred_err_offset]),
|
||
|
.din(st_cred_err_d),
|
||
|
.dout(st_cred_err_q)
|
||
|
);
|
||
|
|
||
|
|
||
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) spr_lsucr0_b2b_reg(
|
||
|
.vd(vdd),
|
||
|
.gd(gnd),
|
||
|
.nclk(nclk),
|
||
|
.act(tiup),
|
||
|
.force_t(func_slp_sl_force),
|
||
|
.d_mode(d_mode_dc),
|
||
|
.delay_lclkr(delay_lclkr_dc),
|
||
|
.mpw1_b(mpw1_dc_b),
|
||
|
.mpw2_b(mpw2_dc_b),
|
||
|
.thold_b(func_slp_sl_thold_0_b),
|
||
|
.sg(sg_0),
|
||
|
.scin(siv[spr_lsucr0_b2b_offset]),
|
||
|
.scout(sov[spr_lsucr0_b2b_offset]),
|
||
|
.din(spr_lsucr0_b2b_d),
|
||
|
.dout(spr_lsucr0_b2b_q)
|
||
|
);
|
||
|
|
||
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) spr_xucr0_cred_reg(
|
||
|
.vd(vdd),
|
||
|
.gd(gnd),
|
||
|
.nclk(nclk),
|
||
|
.act(tiup),
|
||
|
.force_t(func_slp_sl_force),
|
||
|
.d_mode(d_mode_dc),
|
||
|
.delay_lclkr(delay_lclkr_dc),
|
||
|
.mpw1_b(mpw1_dc_b),
|
||
|
.mpw2_b(mpw2_dc_b),
|
||
|
.thold_b(func_slp_sl_thold_0_b),
|
||
|
.sg(sg_0),
|
||
|
.scin(siv[spr_xucr0_cred_offset]),
|
||
|
.scout(sov[spr_xucr0_cred_offset]),
|
||
|
.din(spr_xucr0_cred_d),
|
||
|
.dout(spr_xucr0_cred_q)
|
||
|
);
|
||
|
|
||
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) spr_xucr0_cls_reg(
|
||
|
.vd(vdd),
|
||
|
.gd(gnd),
|
||
|
.nclk(nclk),
|
||
|
.act(tiup),
|
||
|
.force_t(func_slp_sl_force),
|
||
|
.d_mode(d_mode_dc),
|
||
|
.delay_lclkr(delay_lclkr_dc),
|
||
|
.mpw1_b(mpw1_dc_b),
|
||
|
.mpw2_b(mpw2_dc_b),
|
||
|
.thold_b(func_slp_sl_thold_0_b),
|
||
|
.sg(sg_0),
|
||
|
.scin(siv[spr_xucr0_cls_offset]),
|
||
|
.scout(sov[spr_xucr0_cls_offset]),
|
||
|
.din(spr_xucr0_cls_d),
|
||
|
.dout(spr_xucr0_cls_q)
|
||
|
);
|
||
|
|
||
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) stq2_req_val_reg(
|
||
|
.vd(vdd),
|
||
|
.gd(gnd),
|
||
|
.nclk(nclk),
|
||
|
.act(tiup),
|
||
|
.force_t(func_sl_force),
|
||
|
.d_mode(d_mode_dc),
|
||
|
.delay_lclkr(delay_lclkr_dc),
|
||
|
.mpw1_b(mpw1_dc_b),
|
||
|
.mpw2_b(mpw2_dc_b),
|
||
|
.thold_b(func_sl_thold_0_b),
|
||
|
.sg(sg_0),
|
||
|
.scin(siv[stq2_req_val_offset]),
|
||
|
.scout(sov[stq2_req_val_offset]),
|
||
|
.din(stq2_req_val_d),
|
||
|
.dout(stq2_req_val_q)
|
||
|
);
|
||
|
|
||
|
|
||
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) mmq2_req_val_reg(
|
||
|
.vd(vdd),
|
||
|
.gd(gnd),
|
||
|
.nclk(nclk),
|
||
|
.act(tiup),
|
||
|
.force_t(func_slp_sl_force),
|
||
|
.d_mode(d_mode_dc),
|
||
|
.delay_lclkr(delay_lclkr_dc),
|
||
|
.mpw1_b(mpw1_dc_b),
|
||
|
.mpw2_b(mpw2_dc_b),
|
||
|
.thold_b(func_slp_sl_thold_0_b),
|
||
|
.sg(sg_0),
|
||
|
.scin(siv[mmq2_req_val_offset]),
|
||
|
.scout(sov[mmq2_req_val_offset]),
|
||
|
.din(mmq2_req_val_d),
|
||
|
.dout(mmq2_req_val_q)
|
||
|
);
|
||
|
|
||
|
|
||
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) mmq3_req_val_reg(
|
||
|
.vd(vdd),
|
||
|
.gd(gnd),
|
||
|
.nclk(nclk),
|
||
|
.act(tiup),
|
||
|
.force_t(func_slp_sl_force),
|
||
|
.d_mode(d_mode_dc),
|
||
|
.delay_lclkr(delay_lclkr_dc),
|
||
|
.mpw1_b(mpw1_dc_b),
|
||
|
.mpw2_b(mpw2_dc_b),
|
||
|
.thold_b(func_slp_sl_thold_0_b),
|
||
|
.sg(sg_0),
|
||
|
.scin(siv[mmq3_req_val_offset]),
|
||
|
.scout(sov[mmq3_req_val_offset]),
|
||
|
.din(mmq3_req_val_d),
|
||
|
.dout(mmq3_req_val_q)
|
||
|
);
|
||
|
|
||
|
|
||
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) stq4_data_override_reg(
|
||
|
.vd(vdd),
|
||
|
.gd(gnd),
|
||
|
.nclk(nclk),
|
||
|
.act(tiup),
|
||
|
.force_t(func_slp_sl_force),
|
||
|
.d_mode(d_mode_dc),
|
||
|
.delay_lclkr(delay_lclkr_dc),
|
||
|
.mpw1_b(mpw1_dc_b),
|
||
|
.mpw2_b(mpw2_dc_b),
|
||
|
.thold_b(func_slp_sl_thold_0_b),
|
||
|
.sg(sg_0),
|
||
|
.scin(siv[stq4_data_override_offset]),
|
||
|
.scout(sov[stq4_data_override_offset]),
|
||
|
.din(stq4_data_override_d),
|
||
|
.dout(stq4_data_override_q)
|
||
|
);
|
||
|
|
||
|
|
||
|
tri_rlmreg_p #(.WIDTH(27), .INIT(0), .NEEDS_SRESET(1)) stq4_req_st_data_reg(
|
||
|
.vd(vdd),
|
||
|
.gd(gnd),
|
||
|
.nclk(nclk),
|
||
|
.act(req_l2_act),
|
||
|
.force_t(func_slp_sl_force),
|
||
|
.d_mode(d_mode_dc),
|
||
|
.delay_lclkr(delay_lclkr_dc),
|
||
|
.mpw1_b(mpw1_dc_b),
|
||
|
.mpw2_b(mpw2_dc_b),
|
||
|
.thold_b(func_slp_sl_thold_0_b),
|
||
|
.sg(sg_0),
|
||
|
.scin(siv[stq4_req_st_data_offset:stq4_req_st_data_offset + 27 - 1]),
|
||
|
.scout(sov[stq4_req_st_data_offset:stq4_req_st_data_offset + 27 - 1]),
|
||
|
.din(stq4_req_st_data_d),
|
||
|
.dout(stq4_req_st_data_q)
|
||
|
);
|
||
|
|
||
|
|
||
|
tri_rlmreg_p #(.WIDTH(128), .INIT(0), .NEEDS_SRESET(1)) stq2_store_data_reg(
|
||
|
.vd(vdd),
|
||
|
.gd(gnd),
|
||
|
.nclk(nclk),
|
||
|
.act(stq1_stg_act),
|
||
|
.force_t(func_sl_force),
|
||
|
.d_mode(d_mode_dc),
|
||
|
.delay_lclkr(delay_lclkr_dc),
|
||
|
.mpw1_b(mpw1_dc_b),
|
||
|
.mpw2_b(mpw2_dc_b),
|
||
|
.thold_b(func_sl_thold_0_b),
|
||
|
.sg(sg_0),
|
||
|
.scin(siv[stq2_store_data_offset:stq2_store_data_offset + 128 - 1]),
|
||
|
.scout(sov[stq2_store_data_offset:stq2_store_data_offset + 128 - 1]),
|
||
|
.din(stq2_store_data_d),
|
||
|
.dout(stq2_store_data_q)
|
||
|
);
|
||
|
|
||
|
assign siv[0:scan_right] = {sov[1:scan_right], scan_in};
|
||
|
assign scan_out = sov[0];
|
||
|
|
||
|
endmodule
|