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.

333 lines
13 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;
USE ieee.std_logic_1164.ALL ;
LIBRARY IBM;
USE ibm.std_ulogic_support.ALL;
USE ibm.std_ulogic_function_support.ALL;
library support;
use support.power_logic_pkg.all;
entity mmq_tlb_lrat_matchline is
generic (real_addr_width : integer := 42;
lpid_width : integer := 8;
lrat_maxsize_log2 : integer := 40;
lrat_minsize_log2 : integer := 20;
have_xbit : integer := 1;
num_pgsizes : integer := 8;
have_cmpmask : integer := 1;
cmpmask_width : integer := 7);
port(
vdd : inout power_logic;
gnd : inout power_logic;
addr_in : in std_ulogic_vector(64-real_addr_width to 64-lrat_minsize_log2-1);
addr_enable : in std_ulogic;
entry_size : in std_ulogic_vector(0 to 3);
entry_cmpmask : in std_ulogic_vector(0 to cmpmask_width-1);
entry_xbit : in std_ulogic;
entry_xbitmask : in std_ulogic_vector(0 to cmpmask_width-1);
entry_lpn : in std_ulogic_vector(64-real_addr_width to 64-lrat_minsize_log2-1);
entry_lpid : in std_ulogic_vector(0 to lpid_width-1);
comp_lpid : in std_ulogic_vector(0 to lpid_width-1);
lpid_enable : in std_ulogic;
entry_v : in std_ulogic;
match : out std_ulogic;
dbg_addr_match : out std_ulogic;
dbg_lpid_match : out std_ulogic
);
-- synopsys translate_off
-- synopsys translate_on
end mmq_tlb_lrat_matchline;
architecture mmq_tlb_lrat_matchline of mmq_tlb_lrat_matchline is
signal entry_lpn_b : std_ulogic_vector(64-lrat_maxsize_log2 to 64-lrat_minsize_log2-1);
signal function_24_43 : std_ulogic;
signal function_26_43 : std_ulogic;
signal function_30_43 : std_ulogic;
signal function_32_43 : std_ulogic;
signal function_34_43 : std_ulogic;
signal function_36_43 : std_ulogic;
signal function_40_43 : std_ulogic;
signal pgsize_eq_16M : std_ulogic;
signal pgsize_eq_256M : std_ulogic;
signal pgsize_eq_1G : std_ulogic;
signal pgsize_eq_4G : std_ulogic;
signal pgsize_eq_16G : std_ulogic;
signal pgsize_eq_256G : std_ulogic;
signal pgsize_eq_1T : std_ulogic;
signal pgsize_gte_16M : std_ulogic;
signal pgsize_gte_256M : std_ulogic;
signal pgsize_gte_1G : std_ulogic;
signal pgsize_gte_4G : std_ulogic;
signal pgsize_gte_16G : std_ulogic;
signal pgsize_gte_256G : std_ulogic;
signal pgsize_gte_1T : std_ulogic;
signal comp_or_24_25 : std_ulogic;
signal comp_or_26_29 : std_ulogic;
signal comp_or_30_31 : std_ulogic;
signal comp_or_32_33 : std_ulogic;
signal comp_or_34_35 : std_ulogic;
signal comp_or_36_39 : std_ulogic;
signal comp_or_40_43 : std_ulogic;
signal match_line : std_ulogic_vector(64-real_addr_width to 64-lrat_minsize_log2+lpid_width-1);
signal addr_match : std_ulogic;
signal lpid_match : std_ulogic;
signal unused_dc : std_ulogic;
-- synopsys translate_off
-- synopsys translate_on
begin
match_line(64-real_addr_width to 64-lrat_minsize_log2+lpid_width-1) <= not(
(entry_lpn(64-real_addr_width to 64-lrat_minsize_log2-1) & entry_lpid(0 to lpid_width-1)) xor
(addr_in(64-real_addr_width to 64-lrat_minsize_log2-1) & comp_lpid(0 to lpid_width-1))
);
numpgsz8 : if num_pgsizes = 8 generate
entry_lpn_b(64-lrat_maxsize_log2 to 64-lrat_minsize_log2-1) <= not(entry_lpn(64-lrat_maxsize_log2 to 64-lrat_minsize_log2-1));
gen_nocmpmask80 : if have_cmpmask = 0 generate
pgsize_eq_16M <= '1' when (entry_size="0111")
else '0';
pgsize_eq_256M <= '1' when (entry_size="1001")
else '0';
pgsize_eq_1G <= '1' when (entry_size="1010")
else '0';
pgsize_eq_4G <= '1' when (entry_size="1011")
else '0';
pgsize_eq_16G <= '1' when (entry_size="1100")
else '0';
pgsize_eq_256G <= '1' when (entry_size="1110")
else '0';
pgsize_eq_1T <= '1' when (entry_size="1111")
else '0';
pgsize_gte_16M <= '1' when (entry_size="0111" or
pgsize_gte_256M='1')
else '0';
pgsize_gte_256M <= '1' when (entry_size="1001" or
pgsize_gte_1G='1')
else '0';
pgsize_gte_1G <= '1' when (entry_size="1010" or
pgsize_gte_4G='1')
else '0';
pgsize_gte_4G <= '1' when (entry_size="1011" or
pgsize_gte_16G='1')
else '0';
pgsize_gte_16G <= '1' when (entry_size="1100" or
pgsize_gte_256G='1')
else '0';
pgsize_gte_256G <= '1' when (entry_size="1110" or
pgsize_gte_1T='1')
else '0';
pgsize_gte_1T <= '1' when (entry_size="1111")
else '0';
end generate gen_nocmpmask80;
gen_cmpmask80 : if have_cmpmask = 1 generate
pgsize_gte_1T <= entry_cmpmask(0);
pgsize_gte_256G <= entry_cmpmask(1);
pgsize_gte_16G <= entry_cmpmask(2);
pgsize_gte_4G <= entry_cmpmask(3);
pgsize_gte_1G <= entry_cmpmask(4);
pgsize_gte_256M <= entry_cmpmask(5);
pgsize_gte_16M <= entry_cmpmask(6);
pgsize_eq_1T <= entry_xbitmask(0);
pgsize_eq_256G <= entry_xbitmask(1);
pgsize_eq_16G <= entry_xbitmask(2);
pgsize_eq_4G <= entry_xbitmask(3);
pgsize_eq_1G <= entry_xbitmask(4);
pgsize_eq_256M <= entry_xbitmask(5);
pgsize_eq_16M <= entry_xbitmask(6);
end generate gen_cmpmask80;
gen_noxbit80 : if have_xbit = 0 generate
function_24_43 <= '0';
function_26_43 <= '0';
function_30_43 <= '0';
function_32_43 <= '0';
function_34_43 <= '0';
function_36_43 <= '0';
function_40_43 <= '0';
end generate gen_noxbit80;
gen_xbit80 : if (have_xbit /= 0 and real_addr_width=42) generate
function_24_43 <= not(entry_xbit) or
not(pgsize_eq_1T) or
or_reduce(entry_lpn_b(24 to 43) and addr_in(24 to 43));
function_26_43 <= not(entry_xbit) or
not(pgsize_eq_256G) or
or_reduce(entry_lpn_b(26 to 43) and addr_in(26 to 43));
function_30_43 <= not(entry_xbit) or
not(pgsize_eq_16G) or
or_reduce(entry_lpn_b(30 to 43) and addr_in(30 to 43));
function_32_43 <= not(entry_xbit) or
not(pgsize_eq_4G) or
or_reduce(entry_lpn_b(32 to 43) and addr_in(32 to 43));
function_34_43 <= not(entry_xbit) or
not(pgsize_eq_1G) or
or_reduce(entry_lpn_b(34 to 43) and addr_in(34 to 43));
function_36_43 <= not(entry_xbit) or
not(pgsize_eq_256M) or
or_reduce(entry_lpn_b(36 to 43) and addr_in(36 to 43));
function_40_43 <= not(entry_xbit) or
not(pgsize_eq_16M) or
or_reduce(entry_lpn_b(40 to 43) and addr_in(40 to 43));
end generate gen_xbit80;
gen_xbit81 : if (have_xbit /= 0 and real_addr_width=32) generate
function_24_43 <= '1';
function_26_43 <= '1';
function_30_43 <= '1';
function_32_43 <= '1';
function_34_43 <= not(entry_xbit) or
not(pgsize_eq_1G) or
or_reduce(entry_lpn_b(34 to 43) and addr_in(34 to 43));
function_36_43 <= not(entry_xbit) or
not(pgsize_eq_256M) or
or_reduce(entry_lpn_b(36 to 43) and addr_in(36 to 43));
function_40_43 <= not(entry_xbit) or
not(pgsize_eq_16M) or
or_reduce(entry_lpn_b(40 to 43) and addr_in(40 to 43));
end generate gen_xbit81;
gen_comp80 : if real_addr_width=42 generate
comp_or_24_25 <= and_reduce(match_line(24 to 25)) or pgsize_gte_1T;
comp_or_26_29 <= and_reduce(match_line(26 to 29)) or pgsize_gte_256G;
comp_or_30_31 <= and_reduce(match_line(30 to 31)) or pgsize_gte_16G;
comp_or_32_33 <= and_reduce(match_line(32 to 33)) or pgsize_gte_4G;
comp_or_34_35 <= and_reduce(match_line(34 to 35)) or pgsize_gte_1G;
comp_or_36_39 <= and_reduce(match_line(36 to 39)) or pgsize_gte_256M;
comp_or_40_43 <= and_reduce(match_line(40 to 43)) or pgsize_gte_16M;
end generate gen_comp80;
gen_comp81 : if real_addr_width=32 generate
comp_or_24_25 <= '1';
comp_or_26_29 <= '1';
comp_or_30_31 <= '1';
comp_or_32_33 <= '1';
comp_or_34_35 <= and_reduce(match_line(34 to 35)) or pgsize_gte_1G;
comp_or_36_39 <= and_reduce(match_line(36 to 39)) or pgsize_gte_256M;
comp_or_40_43 <= and_reduce(match_line(40 to 43)) or pgsize_gte_16M;
end generate gen_comp81;
gen_noxbit81 : if (have_xbit = 0 and real_addr_width=42) generate
addr_match <= ( and_reduce(match_line(22 to 23)) and
comp_or_24_25 and
comp_or_26_29 and
comp_or_30_31 and
comp_or_32_33 and
comp_or_34_35 and
comp_or_36_39 and
comp_or_40_43 ) or
not(addr_enable);
end generate gen_noxbit81;
gen_noxbit82 : if (have_xbit = 0 and real_addr_width=32) generate
addr_match <= ( and_reduce(match_line(32 to 33)) and
comp_or_34_35 and
comp_or_36_39 and
comp_or_40_43 ) or
not(addr_enable);
end generate gen_noxbit82;
gen_xbit82 : if (have_xbit /= 0 and real_addr_width=42) generate
addr_match <= (and_reduce(match_line(22 to 23)) and
comp_or_24_25 and
comp_or_26_29 and
comp_or_30_31 and
comp_or_32_33 and
comp_or_34_35 and
comp_or_36_39 and
comp_or_40_43 and
function_24_43 and
function_26_43 and
function_30_43 and
function_32_43 and
function_34_43 and
function_36_43 and
function_40_43) or
not(addr_enable);
end generate gen_xbit82;
gen_xbit83 : if (have_xbit /= 0 and real_addr_width=32) generate
addr_match <= (and_reduce(match_line(32 to 33)) and
comp_or_34_35 and
comp_or_36_39 and
comp_or_40_43 and
function_34_43 and
function_36_43 and
function_40_43) or
not(addr_enable);
end generate gen_xbit83;
end generate numpgsz8;
lpid_match <= and_reduce(match_line(64-lrat_minsize_log2 to 64-lrat_minsize_log2+lpid_width-1)) or
not(or_reduce(entry_lpid(0 to 7))) or
not(lpid_enable);
match <= addr_match and
lpid_match and
entry_v;
dbg_addr_match <= addr_match;
dbg_lpid_match <= lpid_match;
gen_unused0 : if have_cmpmask = 0 generate
unused_dc <= '0';
end generate gen_unused0;
gen_unused1 : if have_cmpmask = 1 generate
unused_dc <= or_reduce(entry_size);
end generate gen_unused1;
end mmq_tlb_lrat_matchline;