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.

277 lines
14 KiB
VHDL

-- © 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.
library ieee,ibm,support,tri,work;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ibm.std_ulogic_unsigned.all;
use ibm.std_ulogic_support.all;
use ibm.std_ulogic_function_support.all;
use support.power_logic_pkg.all;
use tri.tri_latches_pkg.all;
use ibm.std_ulogic_ao_support.all;
use ibm.std_ulogic_mux_support.all;
entity iuq_ic_dir_cmp is
generic( expand_type: integer := 2 ); -- 0 - ibm tech, 1 - other );
port(
vdd :inout power_logic;
gnd :inout power_logic;
nclk :in clk_logic;
delay_lclkr :in std_ulogic;-- LCB input
mpw1_b :in std_ulogic;-- LCB input
mpw2_b :in std_ulogic;-- LCB input
forcee :in std_ulogic;-- LCB input
sg_0 :in std_ulogic;-- LCB input
thold_0_b :in std_ulogic;-- LCB input
scan_in :in std_ulogic;--perv
scan_out :out std_ulogic;--perv
dir_dataout_act :in std_ulogic; --act
iu2_endian :in std_ulogic ;--LE
ierat_iu_iu2_rpn :in std_ulogic_vector(22 to 51) ;--erat
iu2_dir_dataout_0_d :in std_ulogic_vector(22 to 52) ;--directory
iu2_dir_dataout_1_d :in std_ulogic_vector(22 to 52) ;--directory
iu2_dir_dataout_2_d :in std_ulogic_vector(22 to 52) ;--directory
iu2_dir_dataout_3_d :in std_ulogic_vector(22 to 52) ;--directory
ierat_iu_iu2_rpn_noncmp :out std_ulogic_vector(22 to 51) ;-- for noncritical uses of rpn
iu2_dir_dataout_0_noncmp :out std_ulogic_vector(22 to 52) ;-- for spr mux
iu2_dir_dataout_1_noncmp :out std_ulogic_vector(22 to 52) ;-- for spr mux
iu2_dir_dataout_2_noncmp :out std_ulogic_vector(22 to 52) ;-- for spr mux
iu2_dir_dataout_3_noncmp :out std_ulogic_vector(22 to 52) ;-- for spr mux
iu2_dir_rd_val :in std_ulogic_vector(0 to 3) ;
iu2_rd_way_tag_hit :out std_ulogic_vector(0 to 3) ;-- excludes LE
iu2_rd_way_hit :out std_ulogic_vector(0 to 3) ;-- includes LE --2009jun22
iu2_rd_way_hit_insmux_b :out std_ulogic_vector(0 to 3) -- includes LE --2009jun22
);
-- synopsys translate_off
-- synopsys translate_on
end iuq_ic_dir_cmp; -- ENTITY
architecture iuq_ic_dir_cmp of iuq_ic_dir_cmp is
constant tiup : std_ulogic := '1';
constant tidn : std_ulogic := '0';
signal dir_lclk :clk_logic;
signal dir_d1clk :std_ulogic;
signal dir_d2clk :std_ulogic;
signal iu2_dir_dataout_0_l2_b , dir0_q , dir0_si, dir0_so , dir0_slow_b :std_ulogic_vector(0 to 30) ;
signal iu2_dir_dataout_1_l2_b , dir1_q , dir1_si, dir1_so , dir1_slow_b :std_ulogic_vector(0 to 30) ;
signal iu2_dir_dataout_2_l2_b , dir2_q , dir2_si, dir2_so , dir2_slow_b :std_ulogic_vector(0 to 30) ;
signal iu2_dir_dataout_3_l2_b , dir3_q , dir3_si, dir3_so , dir3_slow_b :std_ulogic_vector(0 to 30) ;
signal dir_eq_b :std_ulogic_vector(0 to 3);
signal dir_val_le_b, le_cmp :std_ulogic_vector(0 to 3) ;
-- synopsys translate_off
-- synopsys translate_on
signal erat_i1_b :std_ulogic_vector(0 to 29) ;
-- synopsys translate_off
-- synopsys translate_on
-- synopsys translate_off
-- synopsys translate_on
signal iu2_rd_way_hit_0 :std_ulogic_vector(0 to 3) ;
signal iu2_rd_way_hit_1x_b :std_ulogic_vector(0 to 3) ;
signal iu2_rd_way_hit_1y_b :std_ulogic_vector(0 to 3) ;
signal iu2_rd_way_hit_2x :std_ulogic_vector(0 to 3) ;
-- synopsys translate_off
-- synopsys translate_on
begin
-- ################################################################
-- # inverters from latches
-- ################################################################
u_dir0_q: dir0_q(0 to 30) <= not( iu2_dir_dataout_0_l2_b(0 to 30) );
u_dir1_q: dir1_q(0 to 30) <= not( iu2_dir_dataout_1_l2_b(0 to 30) );
u_dir2_q: dir2_q(0 to 30) <= not( iu2_dir_dataout_2_l2_b(0 to 30) );
u_dir3_q: dir3_q(0 to 30) <= not( iu2_dir_dataout_3_l2_b(0 to 30) );
u_dir0_slowi: dir0_slow_b(0 to 30) <= not( dir0_q(0 to 30) );-- tiny
u_dir1_slowi: dir1_slow_b(0 to 30) <= not( dir1_q(0 to 30) );-- tiny
u_dir2_slowi: dir2_slow_b(0 to 30) <= not( dir2_q(0 to 30) );-- tiny
u_dir3_slowi: dir3_slow_b(0 to 30) <= not( dir3_q(0 to 30) );-- tiny
iu2_dir_dataout_0_noncmp(22 to 52) <= not dir0_slow_b(0 to 30) ;--output-- buffered off
iu2_dir_dataout_1_noncmp(22 to 52) <= not dir1_slow_b(0 to 30) ;--output-- buffered off
iu2_dir_dataout_2_noncmp(22 to 52) <= not dir2_slow_b(0 to 30) ;--output-- buffered off
iu2_dir_dataout_3_noncmp(22 to 52) <= not dir3_slow_b(0 to 30) ;--output-- buffered off
u_erat_i1: erat_i1_b(0 to 29) <= not( ierat_iu_iu2_rpn(22 to 51) );
ierat_iu_iu2_rpn_noncmp(22 to 51) <= ierat_iu_iu2_rpn(22 to 51);
-- ################################################################
-- # directory compares against erat
-- ################################################################
cmp0: entity work.iuq_ic_dir_cmp30(iuq_ic_dir_cmp30) port map(
d0_b(0 to 29) => erat_i1_b (0 to 29) ,--i--iuq_ic_dir_cmp30(dir0cmp)
d1 (0 to 29) => dir0_q (0 to 29) ,--i--iuq_ic_dir_cmp30(dir0cmp)
eq_b => dir_eq_b(0) );--o--iuq_ic_dir_cmp30(dir0cmp)
cmp1: entity work.iuq_ic_dir_cmp30(iuq_ic_dir_cmp30) port map(
d0_b(0 to 29) => erat_i1_b (0 to 29) ,--i--iuq_ic_dir_cmp30(dir1cmp)
d1 (0 to 29) => dir1_q (0 to 29) ,--i--iuq_ic_dir_cmp30(dir1cmp)
eq_b => dir_eq_b(1) );--o--iuq_ic_dir_cmp30(dir1cmp)
cmp2: entity work.iuq_ic_dir_cmp30(iuq_ic_dir_cmp30) port map(
d0_b(0 to 29) => erat_i1_b (0 to 29) ,--i--iuq_ic_dir_cmp30(dir2cmp)
d1 (0 to 29) => dir2_q (0 to 29) ,--i--iuq_ic_dir_cmp30(dir2cmp)
eq_b => dir_eq_b(2) );--o--iuq_ic_dir_cmp30(dir2cmp)
cmp3: entity work.iuq_ic_dir_cmp30(iuq_ic_dir_cmp30) port map(
d0_b(0 to 29) => erat_i1_b (0 to 29) ,--i--iuq_ic_dir_cmp30(dir3cmp)
d1 (0 to 29) => dir3_q (0 to 29) ,--i--iuq_ic_dir_cmp30(dir3cmp)
eq_b => dir_eq_b(3) );--o--iuq_ic_dir_cmp30(dir3cmp)
u_match30: iu2_rd_way_tag_hit(0 to 3) <= not( dir_eq_b(0 to 3) );
u_match31: iu2_rd_way_hit_0(0 to 3) <= not( dir_eq_b(0 to 3) or dir_val_le_b(0 to 3) );
u_match31_1x: iu2_rd_way_hit_1x_b (0 to 3) <= not( iu2_rd_way_hit_0(0 to 3) ) ; --x11 --2009jun22
u_match31_1y: iu2_rd_way_hit_1y_b (0 to 3) <= not( iu2_rd_way_hit_0(0 to 3) ) ; --x11 --2009jun22
u_match31_2x: iu2_rd_way_hit_2x (0 to 3) <= not( iu2_rd_way_hit_1x_b(0 to 3) ) ; --x13 --2009jun22
iu2_rd_way_hit (0 to 3) <= not( iu2_rd_way_hit_1y_b(0 to 3) );--unsized --output-- --2009jun22
u_match31_3x: iu2_rd_way_hit_insmux_b(0 to 3) <= not( iu2_rd_way_hit_2x (0 to 3) ) ; --x13 --output-- --2009jun22
dir_val_le_b(0 to 3) <= not( iu2_dir_rd_val(0 to 3) and le_cmp(0 to 3) ); -- not sized, not placed
le_cmp(0) <= ( dir0_q(30) xnor iu2_endian );-- not sized, not placed
le_cmp(1) <= ( dir1_q(30) xnor iu2_endian );-- not sized, not placed
le_cmp(2) <= ( dir2_q(30) xnor iu2_endian );-- not sized, not placed
le_cmp(3) <= ( dir3_q(30) xnor iu2_endian );-- not sized, not placed
-- ################################################################
-- # Latches
-- ################################################################
iu2_dir_dataout_0_lat: entity tri.tri_inv_nlats generic map (width => 31, btr=> "NLI0001_X2_A12TH", needs_sreset => 0, expand_type => expand_type) port map (
VD => vdd ,
GD => gnd ,
LCLK => dir_lclk ,
D1CLK => dir_d1clk ,
D2CLK => dir_d2clk ,
SCANIN => dir0_si ,
SCANOUT => dir0_so ,
D => iu2_dir_dataout_0_d(22 to 52) ,
QB => iu2_dir_dataout_0_l2_b(0 to 30) );
iu2_dir_dataout_1_lat: entity tri.tri_inv_nlats generic map (width => 31, btr=> "NLI0001_X2_A12TH", needs_sreset => 0, expand_type => expand_type) port map (
VD => vdd ,
GD => gnd ,
LCLK => dir_lclk ,
D1CLK => dir_d1clk ,
D2CLK => dir_d2clk ,
SCANIN => dir1_si ,
SCANOUT => dir1_so ,
D => iu2_dir_dataout_1_d(22 to 52) ,
QB => iu2_dir_dataout_1_l2_b(0 to 30) );
iu2_dir_dataout_2_lat: entity tri.tri_inv_nlats generic map (width => 31, btr=> "NLI0001_X2_A12TH", needs_sreset => 0, expand_type => expand_type) port map (
VD => vdd ,
GD => gnd ,
LCLK => dir_lclk ,
D1CLK => dir_d1clk ,
D2CLK => dir_d2clk ,
SCANIN => dir2_si ,
SCANOUT => dir2_so ,
D => iu2_dir_dataout_2_d(22 to 52) ,
QB => iu2_dir_dataout_2_l2_b(0 to 30) );
iu2_dir_dataout_3_lat: entity tri.tri_inv_nlats generic map (width => 31, btr=> "NLI0001_X2_A12TH", needs_sreset => 0, expand_type => expand_type) port map (
VD => vdd ,
GD => gnd ,
LCLK => dir_lclk ,
D1CLK => dir_d1clk ,
D2CLK => dir_d2clk ,
SCANIN => dir3_si ,
SCANOUT => dir3_so ,
D => iu2_dir_dataout_3_d(22 to 52) ,
QB => iu2_dir_dataout_3_l2_b(0 to 30) );
dir0_si(0 to 30) <= scan_in & dir0_so(0 to 29);
dir1_si(0 to 30) <= dir1_so(1 to 30) & dir0_so(30);
dir2_si(0 to 30) <= dir1_so(0) & dir2_so(0 to 29) ;
dir3_si(0 to 30) <= dir3_so(1 to 30) & dir2_so(30) ;
scan_out <= dir3_so(0) ;
-- ###############################################################
-- # LCBs
-- ###############################################################
dir_lcb : tri_lcbnd generic map (expand_type => expand_type) port map(
nclk => nclk ,--in
vd => vdd ,--inout
gd => gnd ,--inout
act => dir_dataout_act ,--in
delay_lclkr => delay_lclkr ,--in
mpw1_b => mpw1_b ,--in
mpw2_b => mpw2_b ,--in
forcee => forcee,--in
sg => sg_0 ,--in
thold_b => thold_0_b ,--in
d1clk => dir_d1clk ,--out
d2clk => dir_d2clk ,--out
lclk => dir_lclk );--out
--=###############################################################
end; -- iuq_ic_dir_cmp ARCHITECTURE