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.

731 lines
28 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:
//*
//* NAME: iuq_axu_fu_rn.vhdl
//*
//*********************************************************************
(* block_type="leaf" *)
(* recursive_synthesis="2" *)
`include "tri_a2o.vh"
module iuq_axu_fu_rn #(
parameter FPR_POOL = 64,
parameter FPR_UCODE_POOL = 4,
parameter FPSCR_POOL_ENC = 5)
(
inout vdd,
inout gnd,
input [0:`NCLK_WIDTH-1] nclk,
input pc_iu_func_sl_thold_2, // acts as reset for non-ibm types
input pc_iu_sg_2,
input clkoff_b,
input act_dis,
input tc_ac_ccflush_dc,
input d_mode,
input delay_lclkr,
input mpw1_b,
input mpw2_b,
input func_scan_in,
output func_scan_out,
//-----------------------------
// Inputs to rename from decode
//-----------------------------
input iu_au_iu5_i0_vld,
input [0:2] iu_au_iu5_i0_ucode,
input iu_au_iu5_i0_rte_lq,
input iu_au_iu5_i0_rte_sq,
input iu_au_iu5_i0_rte_fx0,
input iu_au_iu5_i0_rte_fx1,
input iu_au_iu5_i0_rte_axu0,
input iu_au_iu5_i0_rte_axu1,
input iu_au_iu5_i0_ord,
input iu_au_iu5_i0_cord,
input [0:31] iu_au_iu5_i0_instr,
input [62-`EFF_IFAR_WIDTH:61] iu_au_iu5_i0_ifar,
input [0:9] iu_au_iu5_i0_gshare,
input [0:3] iu_au_iu5_i0_ilat,
input iu_au_iu5_i0_isload,
input iu_au_iu5_i0_t1_v,
input [0:2] iu_au_iu5_i0_t1_t,
input [0:`GPR_POOL_ENC-1] iu_au_iu5_i0_t1_a,
input iu_au_iu5_i0_t2_v,
input [0:2] iu_au_iu5_i0_t2_t,
input [0:`GPR_POOL_ENC-1] iu_au_iu5_i0_t2_a,
input iu_au_iu5_i0_t3_v,
input [0:2] iu_au_iu5_i0_t3_t,
input [0:`GPR_POOL_ENC-1] iu_au_iu5_i0_t3_a,
input iu_au_iu5_i0_s1_v,
input [0:2] iu_au_iu5_i0_s1_t,
input [0:`GPR_POOL_ENC-1] iu_au_iu5_i0_s1_a,
input iu_au_iu5_i0_s2_v,
input [0:2] iu_au_iu5_i0_s2_t,
input [0:`GPR_POOL_ENC-1] iu_au_iu5_i0_s2_a,
input iu_au_iu5_i0_s3_v,
input [0:2] iu_au_iu5_i0_s3_t,
input [0:`GPR_POOL_ENC-1] iu_au_iu5_i0_s3_a,
input iu_au_iu5_i1_vld,
input [0:2] iu_au_iu5_i1_ucode,
input iu_au_iu5_i1_rte_lq,
input iu_au_iu5_i1_rte_sq,
input iu_au_iu5_i1_rte_fx0,
input iu_au_iu5_i1_rte_fx1,
input iu_au_iu5_i1_rte_axu0,
input iu_au_iu5_i1_rte_axu1,
input iu_au_iu5_i1_ord,
input iu_au_iu5_i1_cord,
input [0:31] iu_au_iu5_i1_instr,
input [62-`EFF_IFAR_WIDTH:61] iu_au_iu5_i1_ifar,
input [0:9] iu_au_iu5_i1_gshare,
input [0:3] iu_au_iu5_i1_ilat,
input iu_au_iu5_i1_isload,
input iu_au_iu5_i1_t1_v,
input [0:2] iu_au_iu5_i1_t1_t,
input [0:`GPR_POOL_ENC-1] iu_au_iu5_i1_t1_a,
input iu_au_iu5_i1_t2_v,
input [0:2] iu_au_iu5_i1_t2_t,
input [0:`GPR_POOL_ENC-1] iu_au_iu5_i1_t2_a,
input iu_au_iu5_i1_t3_v,
input [0:2] iu_au_iu5_i1_t3_t,
input [0:`GPR_POOL_ENC-1] iu_au_iu5_i1_t3_a,
input iu_au_iu5_i1_s1_v,
input [0:2] iu_au_iu5_i1_s1_t,
input [0:`GPR_POOL_ENC-1] iu_au_iu5_i1_s1_a,
input iu_au_iu5_i1_s2_v,
input [0:2] iu_au_iu5_i1_s2_t,
input [0:`GPR_POOL_ENC-1] iu_au_iu5_i1_s2_a,
input iu_au_iu5_i1_s3_v,
input [0:2] iu_au_iu5_i1_s3_t,
input [0:`GPR_POOL_ENC-1] iu_au_iu5_i1_s3_a,
//-----------------------------
// SPR values
//-----------------------------
input spr_single_issue,
//-----------------------------
// Stall to decode
//-----------------------------
output au_iu_iu5_stall,
//----------------------------
// Completion Interface
//----------------------------
input cp_rn_i0_axu_exception_val,
input [0:3] cp_rn_i0_axu_exception,
input [0:`ITAG_SIZE_ENC-1] cp_rn_i0_itag,
input cp_rn_i0_t1_v,
input [0:2] cp_rn_i0_t1_t,
input [0:`GPR_POOL_ENC-1] cp_rn_i0_t1_p,
input [0:`GPR_POOL_ENC-1] cp_rn_i0_t1_a,
input cp_rn_i0_t2_v,
input [0:2] cp_rn_i0_t2_t,
input [0:`GPR_POOL_ENC-1] cp_rn_i0_t2_p,
input [0:`GPR_POOL_ENC-1] cp_rn_i0_t2_a,
input cp_rn_i0_t3_v,
input [0:2] cp_rn_i0_t3_t,
input [0:`GPR_POOL_ENC-1] cp_rn_i0_t3_p,
input [0:`GPR_POOL_ENC-1] cp_rn_i0_t3_a,
input cp_rn_i1_axu_exception_val,
input [0:3] cp_rn_i1_axu_exception,
input [0:`ITAG_SIZE_ENC-1] cp_rn_i1_itag,
input cp_rn_i1_t1_v,
input [0:2] cp_rn_i1_t1_t,
input [0:`GPR_POOL_ENC-1] cp_rn_i1_t1_p,
input [0:`GPR_POOL_ENC-1] cp_rn_i1_t1_a,
input cp_rn_i1_t2_v,
input [0:2] cp_rn_i1_t2_t,
input [0:`GPR_POOL_ENC-1] cp_rn_i1_t2_p,
input [0:`GPR_POOL_ENC-1] cp_rn_i1_t2_a,
input cp_rn_i1_t3_v,
input [0:2] cp_rn_i1_t3_t,
input [0:`GPR_POOL_ENC-1] cp_rn_i1_t3_p,
input [0:`GPR_POOL_ENC-1] cp_rn_i1_t3_a,
input cp_flush,
input br_iu_redirect,
//----------------------------------------------------------------
// Interface to Rename
//----------------------------------------------------------------
input iu_au_iu5_send_ok,
input [0:`ITAG_SIZE_ENC-1] iu_au_iu5_next_itag_i0,
input [0:`ITAG_SIZE_ENC-1] iu_au_iu5_next_itag_i1,
output au_iu_iu5_axu0_send_ok,
output au_iu_iu5_axu1_send_ok,
output [0:`GPR_POOL_ENC-1] au_iu_iu5_i0_t1_p,
output [0:`GPR_POOL_ENC-1] au_iu_iu5_i0_t2_p,
output [0:`GPR_POOL_ENC-1] au_iu_iu5_i0_t3_p,
output [0:`GPR_POOL_ENC-1] au_iu_iu5_i0_s1_p,
output [0:`GPR_POOL_ENC-1] au_iu_iu5_i0_s2_p,
output [0:`GPR_POOL_ENC-1] au_iu_iu5_i0_s3_p,
output [0:`ITAG_SIZE_ENC-1] au_iu_iu5_i0_s1_itag,
output [0:`ITAG_SIZE_ENC-1] au_iu_iu5_i0_s2_itag,
output [0:`ITAG_SIZE_ENC-1] au_iu_iu5_i0_s3_itag,
output [0:`GPR_POOL_ENC-1] au_iu_iu5_i1_t1_p,
output [0:`GPR_POOL_ENC-1] au_iu_iu5_i1_t2_p,
output [0:`GPR_POOL_ENC-1] au_iu_iu5_i1_t3_p,
output [0:`GPR_POOL_ENC-1] au_iu_iu5_i1_s1_p,
output [0:`GPR_POOL_ENC-1] au_iu_iu5_i1_s2_p,
output [0:`GPR_POOL_ENC-1] au_iu_iu5_i1_s3_p,
output au_iu_iu5_i1_s1_dep_hit,
output au_iu_iu5_i1_s2_dep_hit,
output au_iu_iu5_i1_s3_dep_hit,
output [0:`ITAG_SIZE_ENC-1] au_iu_iu5_i1_s1_itag,
output [0:`ITAG_SIZE_ENC-1] au_iu_iu5_i1_s2_itag,
output [0:`ITAG_SIZE_ENC-1] au_iu_iu5_i1_s3_itag
);
parameter cp_flush_offset = 0;
parameter br_iu_hold_offset = cp_flush_offset + 1;
parameter scan_right = br_iu_hold_offset + 1 - 1;
// scan
wire [0:scan_right] siv;
wire [0:scan_right] sov;
wire [0:1] map_siv;
wire [0:1] map_sov;
wire tidn;
wire tiup;
// Latch to delay the flush signal
wire cp_flush_d;
wire cp_flush_l2;
wire br_iu_hold_d;
wire br_iu_hold_l2;
// Source lookups from pools note may not be valid if source if type not of the right type
wire [0:`GPR_POOL_ENC-1] fpr_iu5_i0_src1_p;
wire [0:`GPR_POOL_ENC-1] fpr_iu5_i0_src2_p;
wire [0:`GPR_POOL_ENC-1] fpr_iu5_i0_src3_p;
wire [0:`GPR_POOL_ENC-1] fpr_iu5_i1_src1_p;
wire [0:`GPR_POOL_ENC-1] fpr_iu5_i1_src2_p;
wire [0:`GPR_POOL_ENC-1] fpr_iu5_i1_src3_p;
// Source lookups from pools note may not be valid if source if type not of the right type
wire [0:`ITAG_SIZE_ENC-1] fpr_iu5_i0_src1_itag;
wire [0:`ITAG_SIZE_ENC-1] fpr_iu5_i0_src2_itag;
wire [0:`ITAG_SIZE_ENC-1] fpr_iu5_i0_src3_itag;
wire [0:`ITAG_SIZE_ENC-1] fpr_iu5_i1_src1_itag;
wire [0:`ITAG_SIZE_ENC-1] fpr_iu5_i1_src2_itag;
wire [0:`ITAG_SIZE_ENC-1] fpr_iu5_i1_src3_itag;
// I1 dependency hit vs I0 for each source this is used by RV
wire fpr_s1_dep_hit;
wire fpr_s2_dep_hit;
wire fpr_s3_dep_hit;
// Free from completion to the fpr pool
wire fpr_cp_i0_wr_v;
wire [0:`GPR_POOL_ENC-1] fpr_cp_i0_wr_a;
wire [0:`GPR_POOL_ENC-1] fpr_cp_i0_wr_p;
wire [0:`ITAG_SIZE_ENC-1] fpr_cp_i0_wr_itag;
wire fpr_cp_i1_wr_v;
wire [0:`GPR_POOL_ENC-1] fpr_cp_i1_wr_a;
wire [0:`GPR_POOL_ENC-1] fpr_cp_i1_wr_p;
wire [0:`ITAG_SIZE_ENC-1] fpr_cp_i1_wr_itag;
wire fpr_spec_i0_wr_v;
wire fpr_spec_i0_wr_v_fast;
wire [0:`GPR_POOL_ENC-1] fpr_spec_i0_wr_a;
wire [0:`GPR_POOL_ENC-1] fpr_spec_i0_wr_p;
wire [0:`ITAG_SIZE_ENC-1] fpr_spec_i0_wr_itag;
wire fpr_spec_i1_wr_v;
wire fpr_spec_i1_wr_v_fast;
wire [0:`GPR_POOL_ENC-1] fpr_spec_i1_wr_a;
wire [0:`GPR_POOL_ENC-1] fpr_spec_i1_wr_p;
wire [0:`ITAG_SIZE_ENC-1] fpr_spec_i1_wr_itag;
wire next_fpr_0_v;
wire [0:`GPR_POOL_ENC-1] next_fpr_0;
wire next_fpr_1_v;
wire [0:`GPR_POOL_ENC-1] next_fpr_1;
wire fpscr_cp_i0_wr_v;
wire [0:FPSCR_POOL_ENC-1] fpscr_cp_i0_wr_a;
wire [0:FPSCR_POOL_ENC-1] fpscr_cp_i0_wr_p;
wire [0:`ITAG_SIZE_ENC-1] fpscr_cp_i0_wr_itag;
wire fpscr_cp_i1_wr_v;
wire [0:FPSCR_POOL_ENC-1] fpscr_cp_i1_wr_a;
wire [0:FPSCR_POOL_ENC-1] fpscr_cp_i1_wr_p;
wire [0:`ITAG_SIZE_ENC-1] fpscr_cp_i1_wr_itag;
wire fpscr_spec_i0_wr_v;
wire fpscr_spec_i0_wr_v_fast;
wire [0:FPSCR_POOL_ENC-1] fpscr_spec_i0_wr_a;
wire [0:FPSCR_POOL_ENC-1] fpscr_spec_i0_wr_p;
wire [0:`ITAG_SIZE_ENC-1] fpscr_spec_i0_wr_itag;
wire fpscr_spec_i1_wr_v;
wire fpscr_spec_i1_wr_v_fast;
wire [0:FPSCR_POOL_ENC-1] fpscr_spec_i1_wr_a;
wire [0:FPSCR_POOL_ENC-1] fpscr_spec_i1_wr_p;
wire [0:`ITAG_SIZE_ENC-1] fpscr_spec_i1_wr_itag;
wire next_fpscr_0_v;
wire [0:FPSCR_POOL_ENC-1] next_fpscr_0;
wire next_fpscr_1_v;
wire [0:FPSCR_POOL_ENC-1] next_fpscr_1;
wire [0:1] fpr_send_cnt;
wire [0:1] fpscr_send_cnt;
wire fpr_send_ok;
wire fpscr_send_ok;
wire send_instructions;
// Pervasive
wire pc_iu_func_sl_thold_1;
wire pc_iu_func_sl_thold_0;
wire pc_iu_func_sl_thold_0_b;
wire pc_iu_sg_1;
wire pc_iu_sg_0;
wire force_t;
// This signal compares credits left and issues LQ/FX instructions to FX when set
wire dual_issue_use_fx;
//--------------------------------------------------------------
assign tidn = 1'b0;
assign tiup = 1'b1;
assign cp_flush_d = cp_flush;
assign br_iu_hold_d = (br_iu_redirect | br_iu_hold_l2) & (~(cp_flush_l2));
assign fpr_send_cnt = ({(iu_au_iu5_i0_t2_v & (iu_au_iu5_i0_t2_t == `axu0_t)), (iu_au_iu5_i1_t2_v & (iu_au_iu5_i1_t2_t == `axu0_t))});
assign fpscr_send_cnt = ({(iu_au_iu5_i0_t1_v & (iu_au_iu5_i0_t1_t == `axu1_t)), (iu_au_iu5_i1_t1_v & (iu_au_iu5_i1_t1_t == `axu1_t))});
assign fpr_send_ok = (fpr_send_cnt == 2'b00) | ((fpr_send_cnt[0] ^ fpr_send_cnt[1]) & next_fpr_0_v) | (next_fpr_0_v & next_fpr_1_v);
assign fpscr_send_ok = (fpscr_send_cnt == 2'b00) | ((fpscr_send_cnt[0] ^ fpscr_send_cnt[1]) & next_fpscr_0_v) | (next_fpscr_0_v & next_fpscr_1_v);
assign au_iu_iu5_axu0_send_ok = fpr_send_ok & fpscr_send_ok;
assign au_iu_iu5_axu1_send_ok = 1'b1;
//todo... frn may not send instr due to other credits...
assign send_instructions = (fpr_send_ok & fpscr_send_ok & iu_au_iu5_send_ok & iu_au_iu5_i0_vld) & (~(br_iu_hold_l2));
assign dual_issue_use_fx = 1'b0;
//-----------------------------------------------------------------------
//-- Outputs
//-----------------------------------------------------------------------
assign au_iu_iu5_stall = (~(fpr_send_ok & fpscr_send_ok));
assign au_iu_iu5_i0_t1_p[0:`GPR_POOL_ENC - 1] = {1'b0,next_fpscr_0};
assign au_iu_iu5_i0_t2_p = next_fpr_0;
assign au_iu_iu5_i0_t3_p = 0;
assign au_iu_iu5_i0_s1_p = fpr_iu5_i0_src1_p;
assign au_iu_iu5_i0_s2_p = fpr_iu5_i0_src2_p;
assign au_iu_iu5_i0_s3_p = fpr_iu5_i0_src3_p;
assign au_iu_iu5_i0_s1_itag = fpr_iu5_i0_src1_itag;
assign au_iu_iu5_i0_s2_itag = fpr_iu5_i0_src2_itag;
assign au_iu_iu5_i0_s3_itag = fpr_iu5_i0_src3_itag;
assign au_iu_iu5_i1_t1_p[0:`GPR_POOL_ENC - 1] = {1'b0,next_fpscr_1};
assign au_iu_iu5_i1_t2_p = next_fpr_1;
assign au_iu_iu5_i1_t3_p = 0;
assign au_iu_iu5_i1_s1_p = fpr_iu5_i1_src1_p;
assign au_iu_iu5_i1_s2_p = fpr_iu5_i1_src2_p;
assign au_iu_iu5_i1_s3_p = fpr_iu5_i1_src3_p;
assign au_iu_iu5_i1_s1_itag = fpr_iu5_i1_src1_itag;
assign au_iu_iu5_i1_s2_itag = fpr_iu5_i1_src2_itag;
assign au_iu_iu5_i1_s3_itag = fpr_iu5_i1_src3_itag;
assign au_iu_iu5_i1_s1_dep_hit = fpr_s1_dep_hit & (iu_au_iu5_i1_s1_t == `axu0_t);
assign au_iu_iu5_i1_s2_dep_hit = fpr_s2_dep_hit & (iu_au_iu5_i1_s2_t == `axu0_t);
assign au_iu_iu5_i1_s3_dep_hit = fpr_s3_dep_hit & (iu_au_iu5_i1_s3_t == `axu0_t);
//-----------------------------------------------------------------------
//-- FPR Renamer
//-----------------------------------------------------------------------
// Gate the FPR write enable by killing its completion report to the rn mapper
assign fpr_cp_i0_wr_v = cp_rn_i0_t2_v & (cp_rn_i0_t2_t == `axu0_t) & (~(cp_rn_i0_axu_exception[0:3] == 4'b0101));
assign fpr_cp_i0_wr_a = cp_rn_i0_t2_a;
assign fpr_cp_i0_wr_p = cp_rn_i0_t2_p;
assign fpr_cp_i0_wr_itag = cp_rn_i0_itag;
assign fpr_cp_i1_wr_v = cp_rn_i1_t2_v & (cp_rn_i1_t2_t == `axu0_t) & (~(cp_rn_i1_axu_exception[0:3] == 4'b0101));
assign fpr_cp_i1_wr_a = cp_rn_i1_t2_a;
assign fpr_cp_i1_wr_p = cp_rn_i1_t2_p;
assign fpr_cp_i1_wr_itag = cp_rn_i1_itag;
assign fpr_spec_i0_wr_v = send_instructions & (~(fpr_send_cnt[0:1] == 2'b00));
assign fpr_spec_i0_wr_v_fast = (~(fpr_send_cnt[0:1] == 2'b00));
assign fpr_spec_i0_wr_a = (fpr_send_cnt[0] ? iu_au_iu5_i0_t2_a : 0) | (((~(fpr_send_cnt[0])) & fpr_send_cnt[1]) ? iu_au_iu5_i1_t2_a : 0);
assign fpr_spec_i0_wr_p = next_fpr_0;
assign fpr_spec_i0_wr_itag = (fpr_send_cnt[0] ? iu_au_iu5_next_itag_i0 : 0) | (((~(fpr_send_cnt[0])) & fpr_send_cnt[1]) ? iu_au_iu5_next_itag_i1 : 0);
assign fpr_spec_i1_wr_v = send_instructions & (fpr_send_cnt[0:1] == 2'b11);
assign fpr_spec_i1_wr_v_fast = (fpr_send_cnt[0:1] == 2'b11);
assign fpr_spec_i1_wr_a = iu_au_iu5_i1_t2_a;
assign fpr_spec_i1_wr_p = next_fpr_1;
assign fpr_spec_i1_wr_itag = iu_au_iu5_next_itag_i1;
assign fpr_s1_dep_hit = fpr_spec_i0_wr_v_fast & fpr_send_cnt[0] & (fpr_spec_i0_wr_a == iu_au_iu5_i1_s1_a);
assign fpr_s2_dep_hit = fpr_spec_i0_wr_v_fast & fpr_send_cnt[0] & (fpr_spec_i0_wr_a == iu_au_iu5_i1_s2_a);
assign fpr_s3_dep_hit = fpr_spec_i0_wr_v_fast & fpr_send_cnt[0] & (fpr_spec_i0_wr_a == iu_au_iu5_i1_s3_a);
iuq_rn_map #(.ARCHITECTED_REGISTER_DEPTH((32 + FPR_UCODE_POOL)), .REGISTER_RENAME_DEPTH(FPR_POOL), .STORAGE_WIDTH(`GPR_POOL_ENC)) fpr_rn_map(
.vdd(vdd),
.gnd(gnd),
.nclk(nclk),
.pc_iu_func_sl_thold_0_b(pc_iu_func_sl_thold_0_b),
.pc_iu_sg_0(pc_iu_sg_0),
.force_t(force_t),
.d_mode(d_mode),
.delay_lclkr(delay_lclkr),
.mpw1_b(mpw1_b),
.mpw2_b(mpw2_b),
.func_scan_in(map_siv[0]),
.func_scan_out(map_sov[0]),
.take_a(fpr_spec_i0_wr_v),
.take_b(fpr_spec_i1_wr_v),
.next_reg_a_val(next_fpr_0_v),
.next_reg_a(next_fpr_0),
.next_reg_b_val(next_fpr_1_v),
.next_reg_b(next_fpr_1),
.src1_a(iu_au_iu5_i0_s1_a), //fdec_frn_iu5_i0_s1_a,
.src1_p(fpr_iu5_i0_src1_p),
.src1_itag(fpr_iu5_i0_src1_itag),
.src2_a(iu_au_iu5_i0_s2_a), //fdec_frn_iu5_i0_s2_a,
.src2_p(fpr_iu5_i0_src2_p),
.src2_itag(fpr_iu5_i0_src2_itag),
.src3_a(iu_au_iu5_i0_s3_a), //fdec_frn_iu5_i0_s3_a,
.src3_p(fpr_iu5_i0_src3_p),
.src3_itag(fpr_iu5_i0_src3_itag),
.src4_a(iu_au_iu5_i1_s1_a), //fdec_frn_iu5_i1_s1_a,
.src4_p(fpr_iu5_i1_src1_p),
.src4_itag(fpr_iu5_i1_src1_itag),
.src5_a(iu_au_iu5_i1_s2_a), //fdec_frn_iu5_i1_s2_a,
.src5_p(fpr_iu5_i1_src2_p),
.src5_itag(fpr_iu5_i1_src2_itag),
.src6_a(iu_au_iu5_i1_s3_a), //fdec_frn_iu5_i1_s3_a,
.src6_p(fpr_iu5_i1_src3_p),
.src6_itag(fpr_iu5_i1_src3_itag),
.comp_0_wr_val(fpr_cp_i0_wr_v),
.comp_0_wr_arc(fpr_cp_i0_wr_a),
.comp_0_wr_rename(fpr_cp_i0_wr_p),
.comp_0_wr_itag(fpr_cp_i0_wr_itag),
.comp_1_wr_val(fpr_cp_i1_wr_v),
.comp_1_wr_arc(fpr_cp_i1_wr_a),
.comp_1_wr_rename(fpr_cp_i1_wr_p),
.comp_1_wr_itag(fpr_cp_i1_wr_itag),
.spec_0_wr_val(fpr_spec_i0_wr_v),
.spec_0_wr_val_fast(fpr_spec_i0_wr_v_fast),
.spec_0_wr_arc(fpr_spec_i0_wr_a),
.spec_0_wr_rename(fpr_spec_i0_wr_p),
.spec_0_wr_itag(fpr_spec_i0_wr_itag),
.spec_1_dep_hit_s1(fpr_s1_dep_hit),
.spec_1_dep_hit_s2(fpr_s2_dep_hit),
.spec_1_dep_hit_s3(fpr_s3_dep_hit),
.spec_1_wr_val(fpr_spec_i1_wr_v),
.spec_1_wr_val_fast(fpr_spec_i1_wr_v_fast),
.spec_1_wr_arc(fpr_spec_i1_wr_a),
.spec_1_wr_rename(fpr_spec_i1_wr_p),
.spec_1_wr_itag(fpr_spec_i1_wr_itag),
.flush_map(cp_flush_l2)
);
//-----------------------------------------------------------------------
//-- FPSCR Renamer
//-----------------------------------------------------------------------
assign fpscr_cp_i0_wr_v = cp_rn_i0_t1_v & (cp_rn_i0_t1_t == `axu1_t);
assign fpscr_cp_i0_wr_a = cp_rn_i0_t1_a[1:`GPR_POOL_ENC - 1];
assign fpscr_cp_i0_wr_p = cp_rn_i0_t1_p[1:`GPR_POOL_ENC - 1];
assign fpscr_cp_i0_wr_itag = cp_rn_i0_itag;
assign fpscr_cp_i1_wr_v = cp_rn_i1_t1_v & (cp_rn_i1_t1_t == `axu1_t);
assign fpscr_cp_i1_wr_a = cp_rn_i1_t1_a[1:`GPR_POOL_ENC - 1];
assign fpscr_cp_i1_wr_p = cp_rn_i1_t1_p[1:`GPR_POOL_ENC - 1];
assign fpscr_cp_i1_wr_itag = cp_rn_i1_itag;
assign fpscr_spec_i0_wr_v = send_instructions & (~(fpscr_send_cnt[0:1] == 2'b00));
assign fpscr_spec_i0_wr_v_fast = (~(fpscr_send_cnt[0:1] == 2'b00));
assign fpscr_spec_i0_wr_a = (fpscr_send_cnt[0] ? iu_au_iu5_i0_t1_a[1:`GPR_POOL_ENC - 1] : 0) | (((~(fpscr_send_cnt[0])) & fpscr_send_cnt[1]) ? iu_au_iu5_i1_t1_a[1:`GPR_POOL_ENC - 1] : 0);
assign fpscr_spec_i0_wr_p = next_fpscr_0;
assign fpscr_spec_i0_wr_itag = (fpscr_send_cnt[0] ? iu_au_iu5_next_itag_i0 : 0) | (((~(fpscr_send_cnt[0])) & fpscr_send_cnt[1]) ? iu_au_iu5_next_itag_i1 : 0);
assign fpscr_spec_i1_wr_v = send_instructions & (fpscr_send_cnt[0:1] == 2'b11);
assign fpscr_spec_i1_wr_v_fast = (fpscr_send_cnt[0:1] == 2'b11);
assign fpscr_spec_i1_wr_a = iu_au_iu5_i1_t1_a[1:`GPR_POOL_ENC - 1];
assign fpscr_spec_i1_wr_p = next_fpscr_1;
assign fpscr_spec_i1_wr_itag = iu_au_iu5_next_itag_i1;
`ifndef THREADS1
// 24 entries per thread for dual thread
iuq_rn_map #(.ARCHITECTED_REGISTER_DEPTH(1), .REGISTER_RENAME_DEPTH(24), .STORAGE_WIDTH(5)) fpscr_rn_map( //`GPR_POOL_ENC)
.vdd(vdd),
.gnd(gnd),
.nclk(nclk),
.pc_iu_func_sl_thold_0_b(pc_iu_func_sl_thold_0_b),
.pc_iu_sg_0(pc_iu_sg_0),
.force_t(force_t),
.d_mode(d_mode),
.delay_lclkr(delay_lclkr),
.mpw1_b(mpw1_b),
.mpw2_b(mpw2_b),
.func_scan_in(map_siv[1]),
.func_scan_out(map_sov[1]),
.take_a(fpscr_spec_i0_wr_v),
.take_b(fpscr_spec_i1_wr_v),
.next_reg_a_val(next_fpscr_0_v),
.next_reg_a(next_fpscr_0),
.next_reg_b_val(next_fpscr_1_v),
.next_reg_b(next_fpscr_1),
.src1_a(iu_au_iu5_i0_s1_a[1:`GPR_POOL_ENC - 1]),
.src1_p(),
.src1_itag(),
.src2_a(iu_au_iu5_i0_s2_a[1:`GPR_POOL_ENC - 1]),
.src2_p(),
.src2_itag(),
.src3_a(iu_au_iu5_i0_s3_a[1:`GPR_POOL_ENC - 1]),
.src3_p(),
.src3_itag(),
.src4_a(iu_au_iu5_i1_s1_a[1:`GPR_POOL_ENC - 1]),
.src4_p(),
.src4_itag(),
.src5_a(iu_au_iu5_i1_s2_a[1:`GPR_POOL_ENC - 1]),
.src5_p(),
.src5_itag(),
.src6_a(iu_au_iu5_i1_s3_a[1:`GPR_POOL_ENC - 1]),
.src6_p(),
.src6_itag(),
.comp_0_wr_val(fpscr_cp_i0_wr_v),
.comp_0_wr_arc(fpscr_cp_i0_wr_a),
.comp_0_wr_rename(fpscr_cp_i0_wr_p),
.comp_0_wr_itag(fpscr_cp_i0_wr_itag),
.comp_1_wr_val(fpscr_cp_i1_wr_v),
.comp_1_wr_arc(fpscr_cp_i1_wr_a),
.comp_1_wr_rename(fpscr_cp_i1_wr_p),
.comp_1_wr_itag(fpscr_cp_i1_wr_itag),
.spec_0_wr_val(fpscr_spec_i0_wr_v),
.spec_0_wr_val_fast(fpscr_spec_i0_wr_v_fast),
.spec_0_wr_arc(fpscr_spec_i0_wr_a),
.spec_0_wr_rename(fpscr_spec_i0_wr_p),
.spec_0_wr_itag(fpscr_spec_i0_wr_itag),
.spec_1_dep_hit_s1(gnd),
.spec_1_dep_hit_s2(gnd),
.spec_1_dep_hit_s3(gnd),
.spec_1_wr_val(fpscr_spec_i1_wr_v),
.spec_1_wr_val_fast(fpscr_spec_i1_wr_v_fast),
.spec_1_wr_arc(fpscr_spec_i1_wr_a),
.spec_1_wr_rename(fpscr_spec_i1_wr_p),
.spec_1_wr_itag(fpscr_spec_i1_wr_itag),
.flush_map(cp_flush_l2)
);
`else
// 32 if single thread
iuq_rn_map #(.ARCHITECTED_REGISTER_DEPTH(1), .REGISTER_RENAME_DEPTH(32), .STORAGE_WIDTH(5)) fpscr_rn_map( //`GPR_POOL_ENC)
.vdd(vdd),
.gnd(gnd),
.nclk(nclk),
.pc_iu_func_sl_thold_0_b(pc_iu_func_sl_thold_0_b),
.pc_iu_sg_0(pc_iu_sg_0),
.force_t(force_t),
.d_mode(d_mode),
.delay_lclkr(delay_lclkr),
.mpw1_b(mpw1_b),
.mpw2_b(mpw2_b),
.func_scan_in(map_siv[1]),
.func_scan_out(map_sov[1]),
.take_a(fpscr_spec_i0_wr_v),
.take_b(fpscr_spec_i1_wr_v),
.next_reg_a_val(next_fpscr_0_v),
.next_reg_a(next_fpscr_0),
.next_reg_b_val(next_fpscr_1_v),
.next_reg_b(next_fpscr_1),
.src1_a(iu_au_iu5_i0_s1_a[1:`GPR_POOL_ENC - 1]),
.src1_p(),
.src1_itag(),
.src2_a(iu_au_iu5_i0_s2_a[1:`GPR_POOL_ENC - 1]),
.src2_p(),
.src2_itag(),
.src3_a(iu_au_iu5_i0_s3_a[1:`GPR_POOL_ENC - 1]),
.src3_p(),
.src3_itag(),
.src4_a(iu_au_iu5_i1_s1_a[1:`GPR_POOL_ENC - 1]),
.src4_p(),
.src4_itag(),
.src5_a(iu_au_iu5_i1_s2_a[1:`GPR_POOL_ENC - 1]),
.src5_p(),
.src5_itag(),
.src6_a(iu_au_iu5_i1_s3_a[1:`GPR_POOL_ENC - 1]),
.src6_p(),
.src6_itag(),
.comp_0_wr_val(fpscr_cp_i0_wr_v),
.comp_0_wr_arc(fpscr_cp_i0_wr_a),
.comp_0_wr_rename(fpscr_cp_i0_wr_p),
.comp_0_wr_itag(fpscr_cp_i0_wr_itag),
.comp_1_wr_val(fpscr_cp_i1_wr_v),
.comp_1_wr_arc(fpscr_cp_i1_wr_a),
.comp_1_wr_rename(fpscr_cp_i1_wr_p),
.comp_1_wr_itag(fpscr_cp_i1_wr_itag),
.spec_0_wr_val(fpscr_spec_i0_wr_v),
.spec_0_wr_val_fast(fpscr_spec_i0_wr_v_fast),
.spec_0_wr_arc(fpscr_spec_i0_wr_a),
.spec_0_wr_rename(fpscr_spec_i0_wr_p),
.spec_0_wr_itag(fpscr_spec_i0_wr_itag),
.spec_1_dep_hit_s1(gnd),
.spec_1_dep_hit_s2(gnd),
.spec_1_dep_hit_s3(gnd),
.spec_1_wr_val(fpscr_spec_i1_wr_v),
.spec_1_wr_val_fast(fpscr_spec_i1_wr_v_fast),
.spec_1_wr_arc(fpscr_spec_i1_wr_a),
.spec_1_wr_rename(fpscr_spec_i1_wr_p),
.spec_1_wr_itag(fpscr_spec_i1_wr_itag),
.flush_map(cp_flush_l2)
);
`endif
tri_rlmlatch_p #(.INIT(0)) cp_flush_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_flush_offset]),
.scout(sov[cp_flush_offset]),
.din(cp_flush_d),
.dout(cp_flush_l2)
);
tri_rlmlatch_p #(.INIT(0)) br_iu_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[br_iu_hold_offset]),
.scout(sov[br_iu_hold_offset]),
.din(br_iu_hold_d),
.dout(br_iu_hold_l2)
);
//-----------------------------------------------
// pervasive
//-----------------------------------------------
tri_plat #(.WIDTH(2)) perv_2to1_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.flush(tc_ac_ccflush_dc),
.din({pc_iu_func_sl_thold_2,pc_iu_sg_2}),
.q({pc_iu_func_sl_thold_1,pc_iu_sg_1})
);
tri_plat #(.WIDTH(2)) perv_1to0_reg(
.vd(vdd),
.gd(gnd),
.nclk(nclk),
.flush(tc_ac_ccflush_dc),
.din({pc_iu_func_sl_thold_1,pc_iu_sg_1}),
.q({pc_iu_func_sl_thold_0,pc_iu_sg_0})
);
tri_lcbor perv_lcbor(
.clkoff_b(clkoff_b),
.thold(pc_iu_func_sl_thold_0),
.sg(pc_iu_sg_0),
.act_dis(act_dis),
.force_t(force_t),
.thold_b(pc_iu_func_sl_thold_0_b)
);
assign map_siv = {func_scan_in, map_sov[0]};
assign siv = {sov[1:scan_right], map_sov[1]};
assign func_scan_out = sov[0];
endmodule