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.
351 lines
15 KiB
VHDL
351 lines
15 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 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 xuq_agen is
|
|
generic( expand_type : integer := 2 ); -- 0 - ibm tech, 1 - other );
|
|
port(
|
|
x :in std_ulogic_vector(0 to 63) ;
|
|
y :in std_ulogic_vector(0 to 63) ;
|
|
snoop_addr :in std_ulogic_vector(0 to 51) ; --new snoop_address
|
|
snoop_sel :in std_ulogic ;
|
|
binv_val :in std_ulogic ;
|
|
mode64 :in std_ulogic ; -- 1 per byte [0:31]
|
|
dir_ig_57_b :in std_ulogic ; -- when this is low , bit 57 becomes "1" .
|
|
|
|
|
|
sum_non_erat :out std_ulogic_vector(0 to 63) ; -- for compares and uses other than array address
|
|
sum :out std_ulogic_vector(0 to 51) ; -- 0:51 for erat
|
|
sum_arr_dir01 :out std_ulogic_vector(53 to 57) ;
|
|
sum_arr_dir23 :out std_ulogic_vector(53 to 57) ;
|
|
sum_arr_dir45 :out std_ulogic_vector(53 to 57) ;
|
|
sum_arr_dir67 :out std_ulogic_vector(53 to 57) ;
|
|
|
|
z :in std_ulogic_vector(53 to 57) ;-- 5 bits of compare data
|
|
way :in std_ulogic_vector(0 to 7) ;-- 8 bit vector use to be in array model
|
|
inv1_val_b :in std_ulogic ;
|
|
ex1_cache_acc_b :in std_ulogic ;
|
|
rel3_val :in std_ulogic ;
|
|
ary_write_act_01 :out std_ulogic ;
|
|
ary_write_act_23 :out std_ulogic ;
|
|
ary_write_act_45 :out std_ulogic ;
|
|
ary_write_act_67 :out std_ulogic ;
|
|
ary_write_act :out std_ulogic_vector(0 to 3) ;
|
|
match_oth :out std_ulogic ;
|
|
vdd :inout power_logic;
|
|
gnd :inout power_logic
|
|
|
|
);
|
|
|
|
|
|
|
|
end xuq_agen; -- ENTITY
|
|
|
|
architecture xuq_agen of xuq_agen is
|
|
|
|
constant tiup : std_ulogic := '1';
|
|
constant tidn : std_ulogic := '0';
|
|
|
|
|
|
|
|
signal sum_int, sum_non_erat_b :std_ulogic_vector(0 to 51);
|
|
signal sum_0 :std_ulogic_vector(0 to 51);
|
|
signal sum_1 :std_ulogic_vector(0 to 51);
|
|
signal g08 :std_ulogic_vector(1 to 7);
|
|
signal t08 :std_ulogic_vector(1 to 6);
|
|
signal c64_b :std_ulogic_vector(1 to 7);
|
|
signal x_b, y_b :std_ulogic_vector(0 to 63);
|
|
|
|
|
|
|
|
|
|
|
|
signal addr_sel, addr_nsel, addr_sel_64, addr_nsel_64 :std_ulogic;
|
|
|
|
signal sum_arr :std_ulogic_vector(53 to 57); -- 0:11
|
|
signal sum_arr_lv1_0_b :std_ulogic_vector(53 to 57);
|
|
signal sum_arr_lv1_1_b :std_ulogic_vector(53 to 57);
|
|
|
|
|
|
|
|
begin
|
|
|
|
|
|
addr_nsel_64 <= mode64 and not (snoop_sel and not binv_val) ;
|
|
addr_nsel <= not (snoop_sel and not binv_val) ;
|
|
addr_sel_64 <= (snoop_sel and not binv_val) ;
|
|
addr_sel <= (snoop_sel and not binv_val) ;
|
|
|
|
|
|
-- assume pins come in the top
|
|
-- start global carry along the top .
|
|
-- byte groups (0 near top) stretch out along the macro.
|
|
|
|
u_xi: x_b(0 to 63) <= not( x(0 to 63) ); -- receiving inverter near pin
|
|
u_yi: y_b(0 to 63) <= not( y(0 to 63) ); -- receiving inverter near pin
|
|
|
|
--//##################################################
|
|
--//## local part of byte group
|
|
--//##################################################
|
|
|
|
loc_0: entity work.xuq_agen_loca(xuq_agen_loca) port map(
|
|
addr_sel => addr_sel_64 ,--i--
|
|
addr_nsel => addr_nsel_64 ,--i--
|
|
addr(0 to 7) => snoop_addr(0 to 7) ,--i--
|
|
x_b(0 to 7) => x_b(0 to 7) ,--i--
|
|
y_b(0 to 7) => y_b(0 to 7) ,--i--
|
|
sum_0(0 to 7) => sum_0(0 to 7) ,--o--
|
|
sum_1(0 to 7) => sum_1(0 to 7) );--o--
|
|
|
|
loc_1: entity work.xuq_agen_loca(xuq_agen_loca) port map(
|
|
addr_sel => addr_sel_64 ,--i--
|
|
addr_nsel => addr_nsel_64 ,--i--
|
|
addr(0 to 7) => snoop_addr(8 to 15) ,--i--
|
|
x_b(0 to 7) => x_b(8 to 15) ,--i--
|
|
y_b(0 to 7) => y_b(8 to 15) ,--i--
|
|
sum_0(0 to 7) => sum_0(8 to 15) ,--o--
|
|
sum_1(0 to 7) => sum_1(8 to 15) );--o--
|
|
|
|
loc_2: entity work.xuq_agen_loca(xuq_agen_loca) port map(
|
|
addr_sel => addr_sel_64 ,--i--
|
|
addr_nsel => addr_nsel_64 ,--i--
|
|
addr(0 to 7) => snoop_addr(16 to 23) ,--i--
|
|
x_b(0 to 7) => x_b(16 to 23) ,--i--
|
|
y_b(0 to 7) => y_b(16 to 23) ,--i--
|
|
sum_0(0 to 7) => sum_0(16 to 23) ,--o--
|
|
sum_1(0 to 7) => sum_1(16 to 23) );--o--
|
|
|
|
loc_3: entity work.xuq_agen_loca(xuq_agen_loca) port map(
|
|
addr_sel => addr_sel_64 ,--i--
|
|
addr_nsel => addr_nsel_64 ,--i--
|
|
addr(0 to 7) => snoop_addr(24 to 31) ,--i--
|
|
x_b(0 to 7) => x_b(24 to 31) ,--i--
|
|
y_b(0 to 7) => y_b(24 to 31) ,--i--
|
|
sum_0(0 to 7) => sum_0(24 to 31) ,--o--
|
|
sum_1(0 to 7) => sum_1(24 to 31) );--o--
|
|
|
|
loc_4: entity work.xuq_agen_loca(xuq_agen_loca) port map(
|
|
addr_sel => addr_sel ,--i--
|
|
addr_nsel => addr_nsel ,--i--
|
|
addr(0 to 7) => snoop_addr(32 to 39) ,--i--
|
|
x_b(0 to 7) => x_b(32 to 39) ,--i--
|
|
y_b(0 to 7) => y_b(32 to 39) ,--i--
|
|
sum_0(0 to 7) => sum_0(32 to 39) ,--o--
|
|
sum_1(0 to 7) => sum_1(32 to 39) );--o--
|
|
|
|
loc_5: entity work.xuq_agen_loca(xuq_agen_loca) port map(
|
|
addr_sel => addr_sel ,--i--
|
|
addr_nsel => addr_nsel ,--i--
|
|
addr(0 to 7) => snoop_addr(40 to 47) ,--i--
|
|
x_b(0 to 7) => x_b(40 to 47) ,--i--
|
|
y_b(0 to 7) => y_b(40 to 47) ,--i--
|
|
sum_0(0 to 7) => sum_0(40 to 47) ,--o--
|
|
sum_1(0 to 7) => sum_1(40 to 47) );--o--
|
|
|
|
loc_6: entity work.xuq_agen_locae(xuq_agen_locae) port map(
|
|
addr_sel => addr_sel ,--i--
|
|
addr_nsel => addr_nsel ,--i--
|
|
addr(0 to 3) => snoop_addr(48 to 51) ,--i--
|
|
x_b(0 to 7) => x_b(48 to 55) ,--i--
|
|
y_b(0 to 7) => y_b(48 to 55) ,--i--
|
|
sum_0(0 to 3) => sum_0(48 to 51) ,--o--
|
|
sum_1(0 to 3) => sum_1(48 to 51) );--o--
|
|
|
|
|
|
--//##################################################
|
|
--//## local part of global carry
|
|
--//##################################################
|
|
|
|
gclc_1: entity work.xuq_agen_glbloc(xuq_agen_glbloc) port map(
|
|
x_b(0 to 7) => x_b(8 to 15) ,--i--
|
|
y_b(0 to 7) => y_b(8 to 15) ,--i--
|
|
g08 => g08(1) ,--o--
|
|
t08 => t08(1) );--o--
|
|
|
|
gclc_2: entity work.xuq_agen_glbloc(xuq_agen_glbloc) port map(
|
|
x_b(0 to 7) => x_b(16 to 23) ,--i--
|
|
y_b(0 to 7) => y_b(16 to 23) ,--i--
|
|
g08 => g08(2) ,--o--
|
|
t08 => t08(2) );--o--
|
|
|
|
gclc_3: entity work.xuq_agen_glbloc(xuq_agen_glbloc) port map(
|
|
x_b(0 to 7) => x_b(24 to 31) ,--i--
|
|
y_b(0 to 7) => y_b(24 to 31) ,--i--
|
|
g08 => g08(3) ,--o--
|
|
t08 => t08(3) );--o--
|
|
|
|
gclc_4: entity work.xuq_agen_glbloc(xuq_agen_glbloc) port map(
|
|
x_b(0 to 7) => x_b(32 to 39) ,--i--
|
|
y_b(0 to 7) => y_b(32 to 39) ,--i--
|
|
g08 => g08(4) ,--o--
|
|
t08 => t08(4) );--o--
|
|
|
|
gclc_5: entity work.xuq_agen_glbloc(xuq_agen_glbloc) port map(
|
|
x_b(0 to 7) => x_b(40 to 47) ,--i--
|
|
y_b(0 to 7) => y_b(40 to 47) ,--i--
|
|
g08 => g08(5) ,--o--
|
|
t08 => t08(5) );--o--
|
|
|
|
gclc_6: entity work.xuq_agen_glbloc(xuq_agen_glbloc) port map(
|
|
x_b(0 to 7) => x_b(48 to 55) ,--i--
|
|
y_b(0 to 7) => y_b(48 to 55) ,--i--
|
|
g08 => g08(6) ,--o--
|
|
t08 => t08(6) );--o--
|
|
|
|
gclc_7: entity work.xuq_agen_glbloc_lsb(xuq_agen_glbloc_lsb) port map(
|
|
x_b(0 to 7) => x_b(56 to 63) ,--i--
|
|
y_b(0 to 7) => y_b(56 to 63) ,--i--
|
|
g08 => g08(7) );--o--
|
|
-- t08 => t08(7) );--o--
|
|
|
|
|
|
--//##################################################
|
|
--//## global part of global carry {replicate ending of global carry vertical)
|
|
--//##################################################
|
|
|
|
gc: entity work.xuq_agen_glbglb(xuq_agen_glbglb) port map(
|
|
g08(1 to 7) => g08(1 to 7) ,--i--
|
|
t08(1 to 6) => t08(1 to 6) ,--i--
|
|
c64_b(1 to 7) => c64_b(1 to 7) );--o--
|
|
|
|
|
|
|
|
--//##################################################
|
|
--//## final mux (vertical)
|
|
--//##################################################
|
|
|
|
fm_0: entity work.xuq_agen_csmux(xuq_agen_csmux) port map(
|
|
ci_b => c64_b(1) ,--i--
|
|
sum_0(0 to 7) => sum_0 (0 to 7) ,--i--
|
|
sum_1(0 to 7) => sum_1 (0 to 7) ,--i--
|
|
sum (0 to 7) => sum_int (0 to 7) );--o--
|
|
|
|
fm_1: entity work.xuq_agen_csmux(xuq_agen_csmux) port map(
|
|
ci_b => c64_b(2) ,--i--
|
|
sum_0(0 to 7) => sum_0 (8 to 15) ,--i--
|
|
sum_1(0 to 7) => sum_1 (8 to 15) ,--i--
|
|
sum (0 to 7) => sum_int (8 to 15) );--o--
|
|
|
|
fm_2: entity work.xuq_agen_csmux(xuq_agen_csmux) port map(
|
|
ci_b => c64_b(3) ,--i--
|
|
sum_0(0 to 7) => sum_0 (16 to 23) ,--i--
|
|
sum_1(0 to 7) => sum_1 (16 to 23) ,--i--
|
|
sum (0 to 7) => sum_int (16 to 23) );--o--
|
|
|
|
fm_3: entity work.xuq_agen_csmux(xuq_agen_csmux) port map(
|
|
ci_b => c64_b(4) ,--i--
|
|
sum_0(0 to 7) => sum_0 (24 to 31) ,--i--
|
|
sum_1(0 to 7) => sum_1 (24 to 31) ,--i--
|
|
sum (0 to 7) => sum_int (24 to 31) );--o--
|
|
|
|
fm_4: entity work.xuq_agen_csmux(xuq_agen_csmux) port map(
|
|
ci_b => c64_b(5) ,--i--
|
|
sum_0(0 to 7) => sum_0 (32 to 39) ,--i--
|
|
sum_1(0 to 7) => sum_1 (32 to 39) ,--i--
|
|
sum (0 to 7) => sum_int (32 to 39) );--o--
|
|
|
|
fm_5: entity work.xuq_agen_csmux(xuq_agen_csmux) port map(
|
|
ci_b => c64_b(6) ,--i--
|
|
sum_0(0 to 7) => sum_0 (40 to 47) ,--i--
|
|
sum_1(0 to 7) => sum_1 (40 to 47) ,--i--
|
|
sum (0 to 7) => sum_int (40 to 47) );--o--
|
|
|
|
|
|
fm_6: entity work.xuq_agen_csmuxe(xuq_agen_csmuxe) port map( -- just the 4 msb of the byte go to erat
|
|
ci_b => c64_b(7) ,--i--
|
|
sum_0(0 to 3) => sum_0 (48 to 51) ,--i--
|
|
sum_1(0 to 3) => sum_1 (48 to 51) ,--i--
|
|
sum (0 to 3) => sum_int (48 to 51) );--o--
|
|
|
|
kog: entity work.xuq_agen_lo(xuq_agen_lo) port map( -- 12 lsbs are for the DIRECTORY
|
|
dir_ig_57_b => dir_ig_57_b ,--i--xuq_agen_lo(kog) // force dir addr 57 to "1"
|
|
x_b (0 to 11) => x_b (52 to 63) ,--i--xuq_agen_lo(kog)
|
|
y_b (0 to 11) => y_b (52 to 63) ,--i--xuq_agen_lo(kog)
|
|
sum (0 to 11) => sum_non_erat(52 to 63) ,--o--xuq_agen_lo(kog) // for the compares etc
|
|
sum_arr(1 to 5) => sum_arr (53 to 57) );--o--xuq_agen_lo(kog) // for the array address
|
|
|
|
|
|
u_non_b: sum_non_erat_b(0 to 51) <= not( sum_int(0 to 51) );
|
|
u_non: sum_non_erat (0 to 51) <= not( sum_non_erat_b(0 to 51) );
|
|
|
|
sum(0 to 51) <= sum_int(0 to 51) ; --rename-- to ERAT only
|
|
|
|
|
|
-- ###################################
|
|
-- # repower network for directory
|
|
-- ###################################
|
|
|
|
|
|
u_sum_lv1_1: sum_arr_lv1_1_b(53 to 57) <= not( sum_arr (53 to 57) ); -- 4x
|
|
u_sum_lv2_0: sum_arr_dir01(53 to 57) <= not( sum_arr_lv1_1_b(53 to 57) ); -- 4x --output--
|
|
u_sum_lv2_1: sum_arr_dir45(53 to 57) <= not( sum_arr_lv1_1_b(53 to 57) ); -- 4x --output--
|
|
|
|
|
|
u_sum_lv1_0: sum_arr_lv1_0_b(53 to 57) <= not( sum_arr (53 to 57) ); -- 6x
|
|
u_sum_lv2_2: sum_arr_dir23(53 to 57) <= not( sum_arr_lv1_0_b(53 to 57) ); -- 4x --output--
|
|
u_sum_lv2_3: sum_arr_dir67(53 to 57) <= not( sum_arr_lv1_0_b(53 to 57) ); -- 4x --output--
|
|
|
|
|
|
-- ######################################################################
|
|
-- ## this experimental piece is for directory read/write collisions
|
|
-- ######################################################################
|
|
-- it is a multi-mode 4 or 5 bit compare
|
|
|
|
agcmp: entity work.xuq_agen_cmp(xuq_agen_cmp) port map( -- 11 lsbs are for the DIRECTORY
|
|
x_b(53 to 63) => x_b(53 to 63) ,--i--agcmp--
|
|
y_b(53 to 63) => y_b(53 to 63) ,--i--agcmp--
|
|
z (53 to 57) => z (53 to 57) ,--i--agcmp-- (compare data)
|
|
inv1_val_b => inv1_val_b ,--i--agcmp--
|
|
ex1_cache_acc_b => ex1_cache_acc_b ,--i--agamp--
|
|
dir_ig_57_b => dir_ig_57_b ,--i--agcmp--
|
|
rel3_val => rel3_val ,--i--agcmp--
|
|
way(0 to 7) => way(0 to 7) ,--i--agcmp--
|
|
ary_write_act_01 => ary_write_act_01 ,--o--agcmp--
|
|
ary_write_act_23 => ary_write_act_23 ,--o--agcmp--
|
|
ary_write_act_45 => ary_write_act_45 ,--o--agcmp--
|
|
ary_write_act_67 => ary_write_act_67 ,--o--agcmp--
|
|
ary_write_act => ary_write_act ,
|
|
match_oth => match_oth ,--o--agcmp-- for other uses
|
|
vdd => vdd ,
|
|
gnd => gnd);
|
|
|
|
|
|
end; -- xuq_agen ARCHITECTURE
|