⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmutlb.vhd

📁 leon3 source code 虽然gaisler网站上有下载
💻 VHD
📖 第 1 页 / 共 2 页
字号:
--------------------------------------------------------------------------------  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 + -