OpenCores
URL https://opencores.org/ocsvn/core_arm/core_arm/trunk

Subversion Repositories core_arm

[/] [core_arm/] [trunk/] [vhdl/] [mem/] [cache/] [gencmem.vhd] - Rev 6

Go to most recent revision | Compare with Previous | Blame | View Log

-- $(lic)
-- $(help_generic)
-- $(help_local)
 
library ieee;
use ieee.std_logic_1164.all;
use work.config.all;
use work.cache_config.all;
use work.tech_map.all;
use work.gencmem_lib.all;
use work.gendc_lib.all;
use work.genic_lib.all;
use work.cache_comp.all;
 
entity gencmem is
  port ( 
    rst    : in  std_logic; 
    clk    : in  std_logic;
    i  : in  gencmem_type_in;
    o  : out gencmem_type_out
    );
end gencmem;
 
architecture rtl of gencmem is
 
  type it_data_type_a is array (natural range <>) of std_logic_vector(GCML_IC_TL_BSZ -1 downto 0);
  type id_data_type_a is array (natural range <>) of std_logic_vector(GCML_IC_DL_BSZ -1 downto 0);
  type dt_data_type_a is array (natural range <>) of std_logic_vector(GCML_DC_TL_BSZ -1 downto 0);
  type dd_data_type_a is array (natural range <>) of std_logic_vector(GCML_DC_DL_BSZ -1 downto 0);
  type gencmem_tmp_type is record
    dummy : std_logic;
    o  : gencmem_type_out;
 
    -- icache tag
    it_addr : std_logic_vector(GCML_IC_TADDR_BSZ -1 downto 0);
    it_datain  : it_data_type_a(CFG_IC_SETS-1 downto 0);
    it_enable : std_logic;
    it_write : std_logic_vector(CFG_IC_SETS-1 downto 0);
    -- icache data
    id_addr : std_logic_vector(GCML_IC_DADDR_BSZ -1 downto 0);
    id_datain  : id_data_type_a(CFG_IC_SETS-1 downto 0);
    id_enable : std_logic;
    id_write : std_logic_vector(CFG_IC_SETS-1 downto 0);
 
    -- dcache tag
    dt_addr : std_logic_vector(GCML_DC_TADDR_BSZ -1 downto 0);
    dt_datain  : dt_data_type_a(CFG_DC_SETS-1 downto 0);
    dt_enable : std_logic;
    dt_write : std_logic_vector(CFG_DC_SETS-1 downto 0);
    -- icache data
    dd_addr : std_logic_vector(GCML_DC_DADDR_BSZ -1 downto 0);
    dd_datain  : dd_data_type_a(CFG_DC_SETS-1 downto 0);
    dd_enable : std_logic;
    dd_write : std_logic_vector(CFG_DC_SETS-1 downto 0);
 
  end record;
  type gencmem_reg_type is record
    dummy : std_logic;
  end record;
  type gencmem_dbg_type is record
     dummy : std_logic;
     -- pragma translate_off
     dbg : gencmem_tmp_type;
     -- pragma translate_on
  end record;
  signal r, c       : gencmem_reg_type;
  signal rdbg, cdbg : gencmem_dbg_type;
 
  -- icache tag
  signal it_addr : std_logic_vector(GCML_IC_TADDR_BSZ -1 downto 0);
  signal it_datain  : it_data_type_a(CFG_IC_SETS-1 downto 0);
  signal it_dataout : it_data_type_a(CFG_IC_SETS-1 downto 0);
  signal it_enable : std_logic;
  signal it_write : std_logic_vector(CFG_IC_SETS-1 downto 0);
  -- icache data
  signal id_addr : std_logic_vector(GCML_IC_DADDR_BSZ -1 downto 0);
  signal id_datain  : id_data_type_a(CFG_IC_SETS-1 downto 0);
  signal id_dataout : id_data_type_a(CFG_IC_SETS-1 downto 0);
  signal id_enable : std_logic;
  signal id_write : std_logic_vector(CFG_IC_SETS-1 downto 0);
 
  -- dcache tag
  signal dt_addr : std_logic_vector(GCML_DC_TADDR_BSZ -1 downto 0);
  signal dt_datain  : dt_data_type_a(CFG_DC_SETS-1 downto 0);
  signal dt_dataout : dt_data_type_a(CFG_DC_SETS-1 downto 0);
  signal dt_enable : std_logic;
  signal dt_write : std_logic_vector(CFG_DC_SETS-1 downto 0);
  -- dcache data
  signal dd_addr : std_logic_vector(GCML_DC_DADDR_BSZ -1 downto 0);
  signal dd_datain  : dd_data_type_a(CFG_DC_SETS-1 downto 0);
  signal dd_dataout : dd_data_type_a(CFG_DC_SETS-1 downto 0);
  signal dd_enable : std_logic;
  signal dd_write : std_logic_vector(CFG_DC_SETS-1 downto 0);
 
begin  
 
  p0: process ( clk, rst, r, i,
                it_dataout, id_dataout,
                dt_dataout, dd_dataout )
    variable v    : gencmem_reg_type;
    variable t    : gencmem_tmp_type;
    variable vdbg : gencmem_dbg_type;
  begin 
 
    -- $(init(t:gencmem_tmp_type))
 
    v := r;
 
    -- icache address
    t.it_addr := i.ic.addr(GICL_TADDR_U downto GICL_TADDR_D);
    t.id_addr := i.ic.addr(GICL_DADDR_U downto GICL_DADDR_D);
 
    -- icache inputs
    t.it_enable := '1';
    for j in 0 to CFG_IC_SETS-1 loop 
      t.it_datain(j) := gcml_icttostd(i.ic.tag_line);
      t.id_datain(j) := gcml_icdtostd(i.ic.dat_line);
      t.it_write(j) := i.ic.tag_write(j);
      t.id_write(j) := i.ic.dat_write(j);
    end loop;
    -- icache outputs
    for j in 0 to CFG_IC_SETS-1 loop 
      gcml_stdtoict(it_dataout(j),t.o.ic.tag_line(j));
      gcml_stdtoicd(id_dataout(j),t.o.ic.dat_line(j));
    end loop;
 
    -- dcache address
    t.dt_addr := i.dc.addr(GDCL_TADDR_U downto GDCL_TADDR_D);
    t.dd_addr := i.dc.addr(GDCL_DADDR_U downto GDCL_DADDR_D);
 
    -- dcache inputs
    t.dt_enable := '1';
    for j in 0 to CFG_DC_SETS-1 loop 
      t.dt_datain(j) := gcml_dcttostd(i.dc.tag_line);
      t.dd_datain(j) := gcml_dcdtostd(i.dc.dat_line);
      t.dt_write(j) := i.dc.tag_write(j);
      t.dd_write(j) := i.dc.dat_write(j);
    end loop;
    -- dcache outputs
    for j in 0 to CFG_DC_SETS-1 loop 
      gcml_stdtodct(dt_dataout(j),t.o.dc.tag_line(j));
      gcml_stdtodcd(dd_dataout(j),t.o.dc.dat_line(j));
    end loop;
 
    -- reset
    if ( rst = '0' ) then
    end if;
 
    c <= v;
 
    o <= t.o;
 
    it_addr <= t.it_addr;
    id_addr <= t.id_addr;
    it_enable <= t.it_enable;
    for j in 0 to CFG_IC_SETS-1 loop 
      it_datain(j) <= t.it_datain(j);
      id_datain(j) <= t.id_datain(j);
      it_write(j) <= t.it_write(j);
      id_write(j) <= t.id_write(j);
    end loop;
 
    dt_addr <= t.dt_addr;
    dd_addr <= t.dd_addr;
    dt_enable <= t.dt_enable;
    for j in 0 to CFG_DC_SETS-1 loop 
      dt_datain(j) <= t.dt_datain(j);
      dd_datain(j) <= t.dd_datain(j);
      dt_write(j) <= t.dt_write(j);
      dd_write(j) <= t.dd_write(j);
    end loop;
 
    -- pragma translate_off
    vdbg := rdbg;
    vdbg.dbg := t;
    cdbg <= vdbg;
    -- pragma translate_on  end process p0;
 
  end process p0;
 
  pregs : process (clk, c)
  begin
    if rising_edge(clk) then
      r <= c;
      -- pragma translate_off
      rdbg <= cdbg;
      -- pragma translate_on
    end if;
  end process;
 
  -- icache <tag and data>
  icm0 : for i in 0 to CFG_IC_SETS-1 generate
    -- <icache tag>
    itags0 : syncram
      generic map (
        dbits => GCML_IC_TL_BSZ,
        abits => GCML_IC_TADDR_BSZ
      )
      port map (
        it_addr, clk,
        it_datain(i),
        it_dataout(i),
        it_enable,
        it_write(i)
      );
    -- <icache data>
    idata0 : syncram
      generic map (
        dbits => GCML_IC_DL_BSZ,
        abits => GCML_IC_DADDR_BSZ
      )
      port map (
        id_addr, clk,
        id_datain(i),
        id_dataout(i),
        id_enable,
        id_write(i)
      );
  end generate;
 
  -- dcache <tag and data>
  dcm0 : for i in 0 to CFG_DC_SETS-1 generate
    -- <dcache tag>
    dtags0 : syncram
      generic map (
        dbits => GCML_DC_TL_BSZ,
        abits => GCML_DC_TADDR_BSZ
      )
      port map (
        dt_addr, clk,
        dt_datain(i),
        dt_dataout(i),
        dt_enable,
        dt_write(i)
      );
    -- <dcache data>
    ddata0 : syncram
      generic map (
        dbits => GCML_DC_DL_BSZ,
        abits => GCML_DC_DADDR_BSZ
      )
      port map (
        dd_addr, clk,
        dd_datain(i),
        dd_dataout(i),
        dd_enable,
        dd_write(i)
      );
  end generate;
 
 
 
end rtl;
 
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.