📄 mmutlb.vhd
字号:
-------------------------------------------------------------------------------- This file is a part of the GRLIB VHDL IP LIBRARY-- Copyright (C) 2003, Gaisler Research---- This program is free software; you can redistribute it and/or modify-- it under the terms of the GNU General Public License as published by-- the Free Software Foundation; either version 2 of the License, or-- (at your option) any later version.---- This program is distributed in the hope that it will be useful,-- but WITHOUT ANY WARRANTY; without even the implied warranty of-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the-- GNU General Public License for more details.---- You should have received a copy of the GNU General Public License-- along with this program; if not, write to the Free Software-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ------------------------------------------------------------------------------- Entity: mmutlb-- File: mmutlb.vhd-- Author: Konrad Eisele, Jiri Gaisler, Gaisler Research-- Description: MMU TLB logic------------------------------------------------------------------------------library ieee;use ieee.std_logic_1164.all;library grlib;use grlib.amba.all;use grlib.stdlib.all;library techmap;use techmap.gencomp.all;library gaisler;use gaisler.libiu.all;use gaisler.libcache.all;use gaisler.leon3.all;use gaisler.mmuconfig.all;use gaisler.mmuiface.all;use gaisler.libmmu.all;entity mmutlb is generic ( tech : integer range 0 to NTECH := 0; entries : integer range 2 to 32 := 8; tlb_type : integer range 0 to 3 := 1; tlb_rep : integer range 0 to 1 := 1 ); port ( rst : in std_logic; clk : in std_logic; tlbi : in mmutlb_in_type; tlbo : out mmutlb_out_type; two : in mmutw_out_type; twi : out mmutw_in_type );end mmutlb;architecture rtl of mmutlb is constant M_TLB_FASTWRITE : integer range 0 to 3 := conv_integer(conv_std_logic_vector(tlb_type,2) and conv_std_logic_vector(2,2)); -- fast writebuffer constant entries_log : integer := log2(entries); constant entries_max : std_logic_vector(entries_log-1 downto 0) := conv_std_logic_vector(entries-1, entries_log); type states is (idle, match, walk, pack, flush, sync, diag, dofault); type tlb_rtype is record s1_valid : std_logic; s2_tlbstate : states; s2_valid : std_logic; s2_entry : std_logic_vector(entries_log-1 downto 0); s2_hm : std_logic; s2_needsync : std_logic; s2_data : std_logic_vector(31 downto 0); s2_isid : mmu_idcache; s2_su : std_logic; s2_read : std_logic; s2_flush : std_logic; walk_use : std_logic; walk_transdata : mmuidc_data_out_type; walk_fault : mmutlbfault_out_type; nrep : std_logic_vector(entries_log-1 downto 0); tpos : std_logic_vector(entries_log-1 downto 0); touch : std_logic; sync_isw : std_logic; hold : std_logic; end record; signal c,r : tlb_rtype; -- tlb cams component mmutlbcam generic ( tlb_type : integer range 0 to 3 := 1 ); port ( rst : in std_logic; clk : in std_logic; tlbcami : in mmutlbcam_in_type; tlbcamo : out mmutlbcam_out_type ); end component; signal tlbcami : mmutlbcami_a (M_ENT_MAX-1 downto 0); signal tlbcamo : mmutlbcamo_a (M_ENT_MAX-1 downto 0); -- least recently used component mmulru generic ( entries : integer := 8 ); port ( clk : in std_logic; rst : in std_logic; lrui : in mmulru_in_type; lruo : out mmulru_out_type ); end component; signal lrui : mmulru_in_type; signal lruo : mmulru_out_type; -- data-ram syncram signals signal dr1_addr : std_logic_vector(entries_log-1 downto 0); signal dr1_datain : std_logic_vector(29 downto 0); signal dr1_dataout : std_logic_vector(29 downto 0); signal dr1_enable : std_logic; signal dr1_write : std_logic;begin p0: process (clk, rst, r, c, tlbi, two, tlbcamo, dr1_dataout, lruo) variable v : tlb_rtype; variable finish, selstate : std_logic; variable cam_hitaddr : std_logic_vector(M_ENT_MAX_LOG -1 downto 0); variable cam_hit_all : std_logic; variable mtag,ftag : tlbcam_tfp; -- tlb cam input variable tlbcam_trans_op : std_logic; variable tlbcam_write_op : std_logic_vector(entries-1 downto 0); variable tlbcam_flush_op : std_logic; -- tw inputs variable twi_walk_op_ur : std_logic; variable twi_data : std_logic_vector(31 downto 0); variable twi_areq_ur : std_logic; variable twi_aaddr : std_logic_vector(31 downto 0); variable twi_adata : std_logic_vector(31 downto 0); variable two_error : std_logic; -- lru inputs variable lrui_touch : std_logic; variable lrui_touchmin : std_logic; variable lrui_pos : std_logic_vector(entries_log-1 downto 0); -- syncram inputs variable dr1write : std_logic; -- hit tlbcam's output variable ACC : std_logic_vector(2 downto 0); variable PTE : std_logic_vector(31 downto 0); variable LVL : std_logic_vector(1 downto 0); variable CAC : std_logic; variable NEEDSYNC : std_logic; -- wb hit tlbcam's output variable wb_i_entry : integer range 0 to M_ENT_MAX-1; variable wb_ACC : std_logic_vector(2 downto 0); variable wb_PTE : std_logic_vector(31 downto 0); variable wb_LVL : std_logic_vector(1 downto 0); variable wb_CAC : std_logic; variable wb_fault_pro, wb_fault_pri : std_logic; variable wb_WBNEEDSYNC : std_logic; variable twACC : std_logic_vector(2 downto 0); variable tWLVL : std_logic_vector(1 downto 0); variable twPTE : std_logic_vector(31 downto 0); variable twNEEDSYNC : std_logic; variable tlbcam_tagin : tlbcam_tfp; variable tlbcam_tagwrite : tlbcam_reg; variable store : std_logic; variable reppos : std_logic_vector(entries_log-1 downto 0); variable i_entry : integer range 0 to M_ENT_MAX-1; variable i_reppos : integer range 0 to M_ENT_MAX-1; variable fault_pro, fault_pri : std_logic; variable fault_mexc, fault_trans, fault_inv, fault_access : std_logic; variable transdata : mmuidc_data_out_type; variable fault : mmutlbfault_out_type; variable savewalk : std_logic; variable tlbo_s1finished : std_logic; variable wb_transdata : mmuidc_data_out_type; variable cam_addr : std_logic_vector(31 downto 0); begin v := r; cam_addr := tlbi.transdata.data; wb_i_entry := 0; wb_ACC := (others => '0'); wb_PTE := (others => '0'); wb_LVL := (others => '0'); wb_CAC := '0'; wb_fault_pro := '0'; wb_fault_pri := '0'; wb_WBNEEDSYNC := '0'; if (M_TLB_FASTWRITE /= 0) and (tlbi.trans_op = '0') then cam_addr := tlbi.transdata.wb_data; end if; wb_transdata.finish := '0'; wb_transdata.data := (others => '0'); wb_transdata.cache := '0'; wb_transdata.accexc := '0'; finish := '0'; selstate := '0'; cam_hitaddr := (others => '0'); cam_hit_all := '0'; mtag.TYP := (others => '0'); mtag.I1 := (others => '0'); mtag.I2 := (others => '0'); mtag.I3 := (others => '0'); mtag.CTX := (others => '0'); mtag.M := '0'; ftag.TYP := (others => '0'); ftag.I1 := (others => '0'); ftag.I2 := (others => '0'); ftag.I3 := (others => '0'); ftag.CTX := (others => '0'); ftag.M := '0'; tlbcam_trans_op := '0'; tlbcam_write_op := (others => '0'); tlbcam_flush_op := '0'; twi_walk_op_ur := '0'; twi_data := (others => '0'); twi_areq_ur := '0'; twi_aaddr := (others => '0'); twi_adata := (others => '0'); two_error := '0'; lrui_touch:= '0'; lrui_touchmin:= '0'; lrui_pos := (others => '0'); dr1write := '0'; ACC := (others => '0'); PTE := (others => '0'); LVL := (others => '0'); CAC := '0'; NEEDSYNC := '0'; twACC := (others => '0'); tWLVL := (others => '0'); twPTE := (others => '0'); twNEEDSYNC := '0'; tlbcam_tagin.TYP := (others => '0'); tlbcam_tagin.I1 := (others => '0'); tlbcam_tagin.I2 := (others => '0'); tlbcam_tagin.I3 := (others => '0'); tlbcam_tagin.CTX := (others => '0'); tlbcam_tagin.M := '0'; tlbcam_tagwrite.ET := (others => '0'); tlbcam_tagwrite.ACC := (others => '0'); tlbcam_tagwrite.M := '0'; tlbcam_tagwrite.R := '0'; tlbcam_tagwrite.SU := '0'; tlbcam_tagwrite.VALID := '0'; tlbcam_tagwrite.LVL := (others => '0'); tlbcam_tagwrite.I1 := (others => '0'); tlbcam_tagwrite.I2 := (others => '0'); tlbcam_tagwrite.I3 := (others => '0'); tlbcam_tagwrite.CTX := (others => '0'); tlbcam_tagwrite.PPN := (others => '0'); tlbcam_tagwrite.C := '0'; store := '0'; reppos := (others => '0'); fault_pro := '0'; fault_pri := '0'; fault_mexc := '0'; fault_trans := '0'; fault_inv := '0'; fault_access := '0'; transdata.finish := '0'; transdata.data := (others => '0'); transdata.cache := '0'; transdata.accexc := '0'; fault.fault_pro := '0'; fault.fault_pri := '0'; fault.fault_access := '0'; fault.fault_mexc := '0'; fault.fault_trans := '0'; fault.fault_inv := '0'; fault.fault_lvl := (others => '0'); fault.fault_su := '0'; fault.fault_read := '0'; fault.fault_isid := id_dcache; fault.fault_addr := (others => '0'); savewalk := '0'; tlbo_s1finished := '0'; tlbcam_trans_op := '0'; tlbcam_write_op := (others => '0'); tlbcam_flush_op := '0'; lrui_touch := '0'; lrui_touchmin := '0'; lrui_pos := (others => '0'); dr1write := '0';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -