-- $(lic)
-- $(help_generic)
-- $(help_local)
library ieee;
use ieee.std_logic_1164.all;
use IEEE.std_logic_unsigned.conv_integer;
use IEEE.std_logic_arith.conv_unsigned;
use work.config.all;
use work.int.all;
use work.memdef.all;
use work.corelib.all;
use work.cache_comp.all;
use work.cache_config.all;
use work.genic_lib.all;
use work.gencmem_lib.all;
use work.bus_comp.all;
entity genic is
port (
rst : in std_logic;
clk : in std_logic;
hold : in cli_hold;
i : in genic_type_in;
o : out genic_type_out;
ctrl : in gicl_ctrl;
icmo : in gencmem_type_ic_out;
icmi : out gencmem_type_ic_in;
mcio : in ahbmst_mp_out;
mcii : out ahbmst_mp_in
);
end genic;
architecture rtl of genic is
type genic_datasrc is (genic_mem,genic_cmem);
type genic_tmp_type is record
hit ,valid : std_logic;
set : integer;
pos : integer;
setrep : integer;
sethit : std_logic_vector(CFG_IC_SETS-1 downto 0);
setvalid : std_logic_vector(CFG_IC_SETS-1 downto 0);
icmi : gencmem_type_ic_in;
o : genic_type_out;
datasrc : genic_datasrc;
ehold, reqinsn, branch : std_logic;
twrite, dwrite : std_logic;
newvalid : std_logic_vector(CFG_IC_TLINE_SZ-1 downto 0);
mcii : ahbmst_mp_in;
end record;
type genic_state is (genic_hit,genic_pempty,genic_stream,genic_pfull,genic_waitwrite);
type genic_reg_type is record
setrep : std_logic_vector(lin_log2x(CFG_IC_SETS)-1 downto 0);
state : genic_state;
hold : std_logic;
hit : std_logic;
mcii : ahbmst_mp_in;
faddr : std_logic_vector(GCML_IC_TADDR_BSZ-1 downto 0);
ready_addr : std_logic_vector(31 downto 0);
--flush, fluship : std_logic;
end record;
type genic_dbg_type is record
dummy : std_logic;
-- pragma translate_off
dbg : genic_tmp_type;
-- pragma translate_on
end record;
signal r, c : genic_reg_type;
signal rdbg, cdbg : genic_dbg_type;
begin
p0: process (clk, rst, r, hold, i, icmo, mcio, ctrl )
variable v : genic_reg_type;
variable t : genic_tmp_type;
variable vdbg : genic_dbg_type;
begin
-- $(init(t:genic_tmp_type))
v := r;
-- todo: use part of with mcii.address
-- lin_incdec(t.ahbo.haddr(4 downto 2),t.ahbo.haddr(4 downto 2),'1','1');
t.icmi.addr := r.ready_addr;
t.datasrc := genic_mem;
t.ehold := hold.dhold;
t.reqinsn := not (t.ehold or i.annul);
t.branch := i.bra_v;
t.twrite := '0';
t.dwrite := '0';
t.o.mstrobe := '0';
-- cmp
t.hit := '0';
t.set := 0;
for j in CFG_IC_SETS-1 downto 0 loop
if gicl_is_taghit(i.pc_r,icmo.tag_line(j)) then
t.hit := '1';
t.sethit(j) := '1';
t.set := j;
end if;
end loop;
t.valid := '0';
if gicl_is_linevalid(i.pc_r,icmo.tag_line(t.set)) then
t.valid := '1';
end if;
-- next addr
if mcio.ready = '1' then
v.ready_addr := r.mcii.address;
end if;
-- state
case r.state is
when genic_hit =>
t.icmi.addr := i.pc_v;
t.datasrc := genic_cmem;
v.hold := '0';
-- remove:
v.mcii.burst := ctrl.burst;
if gicl_is_onetogo(i.pc_r) then
v.mcii.burst := '0';
end if;
v.hit := t.hit;
if t.reqinsn = '1' then
if (not (t.hit and t.valid)) = '1' then
v.hold := '1';
v.state := genic_pempty;
v.mcii.req := '1';
end if;
v.mcii.address := i.pc_r;
-- todo: use part of with mcii.address
v.ready_addr := i.pc_r;
end if;
v.setrep := std_logic_vector(conv_unsigned(t.set, lin_log2x(CFG_IC_SETS)));
when genic_pempty =>
if mcio.ready = '1' then
t.o.mstrobe := '1';
if i.bra_r = '1' then
v.state := genic_pfull;
else
v.state := genic_stream;
v.hold := '0';
end if;
end if;
t.branch := i.bra_r;
when genic_stream =>
if t.reqinsn = '1' then
if mcio.ready = '0' then
v.hold := '1';
v.state := genic_pempty;
else
if i.bra_v = '1' then
v.hold := '1';
v.state := genic_pfull;
end if;
end if;
else
if mcio.ready = '1' then
v.hold := '1';
v.state := genic_pfull;
end if;
end if;
when genic_pfull =>
when genic_waitwrite =>
v.state := genic_hit;
t.icmi.addr := i.pc_r;
v.hold := '0';
when others =>
end case;
-- next req
if mcio.grant = '1' then
v.mcii.burst := ctrl.burst;
v.mcii.req := r.mcii.burst;
lin_incdec(r.mcii.address(31 downto 2), v.mcii.address(31 downto 2),'1','1');
if gicl_is_onetogo(r.mcii.address) then
v.mcii.burst := '0';
if mcio.ready = '1' then
v.mcii.req := '0';
end if;
end if;
if (t.branch = '1') then
v.mcii.burst := '0';
v.mcii.req := '0';
end if;
end if;
-- finish
if (mcio.ready = '1') and (r.mcii.req = '0') then
--v.flush := r.fluship;
v.state := genic_waitwrite;
v.hold := '1';
end if;
-- memdata returned
if mcio.ready = '1' then
t.twrite := '1';
t.dwrite := '1';
end if;
-- retry
if mcio.retry = '1' then
v.mcii.req := '1';
v.mcii.address := r.ready_addr;
end if;
-- mexc
if (mcio.mexc or not mcio.cache) = '1' then
t.twrite := '0';
t.dwrite := '0';
else
t.dwrite := t.twrite;
end if;
-- return data
t.o.dat_line_v := icmo.dat_line(t.set);
if CFG_IC_DLINE_SZ = 1 then
t.pos := 0;
else
t.pos := lin_convint(r.ready_addr(GICL_TLINE_U downto GICL_TLINE_D));
end if;
case t.datasrc is
when genic_mem => t.o.dat_line_v.data(t.pos) := mcio.data;
when genic_cmem => t.o.dat_line_v := icmo.dat_line(t.set);
when others =>
end case;
-- assemble input tag line
t.setrep := lin_convint(r.setrep);
t.icmi.tag_line := icmo.tag_line(t.setrep);
t.newvalid := lin_decode(r.ready_addr(GICL_TLINE_U downto GICL_TLINE_D));
if r.hit = '1' then
t.icmi.tag_line.valid := t.icmi.tag_line.valid or t.newvalid;
else
t.icmi.tag_line.valid := t.newvalid;
end if;
t.icmi.tag_line.tag := r.ready_addr(GICL_TTAG_U downto GICL_TTAG_D);
t.icmi.tag_write(t.setrep) := t.twrite;
-- assemble input data line
t.icmi.dat_line := icmo.dat_line(t.setrep);
t.icmi.dat_line.data(t.pos) := mcio.data;
t.icmi.dat_write(t.setrep) := t.dwrite;
-- flush
--if r.fluship = '1' then
-- t.icmi.tag_write := (others => '1');
-- t.icmi.addr(GICL_TADDR_U downto GICL_TADDR_D) := r.faddr;
-- t.icmi.tag_line.tag := (others => '0');
-- t.icmi.tag_line.valid := (others => '0');
-- lin_incdec(r.faddr, v.faddr,'1','1');
-- if (r.faddr(GICL_TADDR_U) and not v.faddr(GICL_TADDR_U)) = '1' then
-- v.fluship := '0';
-- end if;
--end if;
-- reset
if ( rst = '0' ) then
v.state := genic_hit;
v.hold := '0';
v.mcii.req := '0';
--v.flush := '0';
--v.fluship := '0';
end if;
t.o.hold := r.hold;
t.mcii := r.mcii;
t.mcii.read := '1';
t.mcii.lock := '0';
v.mcii.size := lmd_word;
t.mcii.data := (others => '0');
c <= v;
icmi <= t.icmi;
o <= t.o;
mcii <= t.mcii;
-- 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;
end rtl;
Enum rdatatype defined in /tmp/build_html/vhdl/sparc/mmu_icache.vhd |
Constant words defined in /tmp/build_html/vhdl/tech/tech_axcel.vhd |
Enum cache_replace_type defined in /tmp/build_html/vhdl/sparc/leon_target.vhd |
Enum astates defined in /tmp/build_html/vhdl/sparc/mmu_acache.vhd |
Enum cpins_type defined in /tmp/build_html/vhdl/sparc/fp1eu.vhd |
Enum dsnoop_type defined in /tmp/build_html/vhdl/sparc/leon_target.vhd |
Enum txfsmtype defined in /tmp/build_html/vhdl/sparc/dcom_uart.vhd |
Enum areatype defined in /tmp/build_html/vhdl/peripherals/mem/mctrl.vhd |
Enum fpu_state defined in /tmp/build_html/vhdl/sparc/fpu_lth.vhd |
Type cache_config_type defined in /tmp/build_html/vhdl/sparc/leon_target.vhd |
Constant cache_config defined in /tmp/build_html/vhdl/sparc/leon_device.vhd |
Type cli_hold defined in /tmp/build_html/vhdl/core/libs/corelib.vhd |
Enum states defined in /tmp/build_html/vhdl/sparc/mmutw.vhd |
Type genic_type_in defined in /tmp/build_html/vhdl/mem/cache/cache_comp.vhd |
Constant CFG_IC_DLINE_SZ defined in /tmp/build_html/vhdl/mem/cache/cache_config.vhd |
Type gcml_ic_dline defined in /tmp/build_html/vhdl/mem/cache/libs/gencmem_lib.vhd |
Type genic_type_out defined in /tmp/build_html/vhdl/mem/cache/cache_comp.vhd |
Type gicl_ctrl defined in /tmp/build_html/vhdl/mem/cache/libs/genic_lib.vhd |
Constant CFG_IC_SETS defined in /tmp/build_html/vhdl/mem/cache/cache_config.vhd |
Type gencmem_type_ic_out defined in /tmp/build_html/vhdl/mem/cache/cache_comp.vhd |
Constant CFG_IC_ADDR_SZ defined in /tmp/build_html/vhdl/mem/cache/cache_config.vhd |
Constant lin_log2 defined in /tmp/build_html/vhdl/libs/int.vhd |
Constant CFG_IC_SET_SZ defined in /tmp/build_html/vhdl/mem/cache/cache_config.vhd |
Constant GCML_IC_TTAG_BSZ defined in /tmp/build_html/vhdl/mem/cache/libs/gencmem_lib.vhd |
Constant CFG_IC_TLINE_SZ defined in /tmp/build_html/vhdl/mem/cache/cache_config.vhd |
Type gcml_ic_tline defined in /tmp/build_html/vhdl/mem/cache/libs/gencmem_lib.vhd |
Type gencmem_type_ic_in defined in /tmp/build_html/vhdl/mem/cache/cache_comp.vhd |
Enum unit_status_type defined in /tmp/build_html/vhdl/sparc/fp1eu.vhd |
Enum slavestate defined in /tmp/build_html/vhdl/sparc/ahbtest.vhd |
Enum execstate defined in /tmp/build_html/vhdl/sparc/fp1eu.vhd |
Type ahbmst_mp_out defined in /tmp/build_html/vhdl/bus/bus_comp.vhd |
Enum ahbmst_state_type defined in /tmp/build_html/vhdl/sparc/pci_oc.vhd |
Enum lmd_memsize defined in /tmp/build_html/vhdl/libs/memdef.vhd |
Type ahbmst_mp_in defined in /tmp/build_html/vhdl/bus/bus_comp.vhd |
Enum genic_datasrc defined in /tmp/build_html/vhdl/mem/cache/genic.vhd |
Type genic_tmp_type defined in /tmp/build_html/vhdl/mem/cache/genic.vhd |
Enum genic_state defined in /tmp/build_html/vhdl/mem/cache/genic.vhd |
Constant lin_log2x defined in /tmp/build_html/vhdl/libs/int.vhd |
Constant GCML_IC_TADDR_BSZ defined in /tmp/build_html/vhdl/mem/cache/libs/gencmem_lib.vhd |
Type genic_reg_type defined in /tmp/build_html/vhdl/mem/cache/genic.vhd |
Type genic_dbg_type defined in /tmp/build_html/vhdl/mem/cache/genic.vhd |
Function lin_convint defined in /tmp/build_html/vhdl/libs/int.vhd |
Function lin_decode defined in /tmp/build_html/vhdl/libs/int.vhd |
Function lin_countzero defined in /tmp/build_html/vhdl/libs/int.vhd |
Procedure lin_adder defined in /tmp/build_html/vhdl/libs/int.vhd |
Constant log2 defined in /tmp/build_html/vhdl/sparc/leon_config.vhd |
Procedure lin_incdec defined in /tmp/build_html/vhdl/libs/int.vhd |
Constant GCML_IC_TLINE_BSZ defined in /tmp/build_html/vhdl/mem/cache/libs/gencmem_lib.vhd |
Constant GICL_TLINE_U defined in /tmp/build_html/vhdl/mem/cache/libs/genic_lib.vhd |
Constant GICL_TLINE_D defined in /tmp/build_html/vhdl/mem/cache/libs/genic_lib.vhd |
Function gicl_is_linevalid defined in /tmp/build_html/vhdl/mem/cache/libs/genic_lib.vhd |
Constant lastaddr defined in /tmp/build_html/vhdl/mem/cache/libs/kecs_libicache.vhd |
Function gicl_is_onetogo defined in /tmp/build_html/vhdl/mem/cache/libs/genic_lib.vhd |
Constant GICL_TTAG_U defined in /tmp/build_html/vhdl/mem/cache/libs/genic_lib.vhd |
Constant GICL_TTAG_D defined in /tmp/build_html/vhdl/mem/cache/libs/genic_lib.vhd |
Function gicl_is_taghit defined in /tmp/build_html/vhdl/mem/cache/libs/genic_lib.vhd |
Enum icycletype defined in /tmp/build_html/vhdl/peripherals/mem/sdmctrl.vhd |
If you have question mail to: Konrad Eisele<eiselekd@web.de>, created: Wed Apr 14 13:07:33 WEDT 2004
;
This is part of the Core distribution