📄 gencmem_lib.vhd
字号:
-- $(lic)-- $(help_generic)-- $(help_local)library ieee;use ieee.std_logic_1164.all;use work.int.all;use work.config.all;use work.cache_config.all;-- PREFIX: gcml_xxxpackage gencmem_lib is-- ICACHE:---- +---------------------+---------------+-------+----+-- addr as data-access: | xxx | DADDR | DLINE | 00 |-- +---------------------+---------------+-------+----+-- -- +---------------------+-----------+-----------+----+-- addr as tag-access : | TTAG | TADDR | TLINE | 00 | |-- +---------------------+-----------+-----------+----+---- ICACHE TAG ICACHE DATA-- . . . . . . -- TADDR | | | DADDR | | | -- | +--------------------+--------+ | +--------------------+--------------------+..-- +-->| CTAG | CVALID | +-->| data | data |-- +--------------------+--------+ +--------------------+--------------------+..-- | | | | | |-- . . . . . .-- addr as icache tag-access (sizes only)constant GCML_IC_TTAG_BSZ : integer := CFG_IC_ADDR_SZ - (2 + (8 +lin_log2(CFG_IC_SET_SZ)));constant GCML_IC_TADDR_BSZ : integer := ((8 +lin_log2(CFG_IC_SET_SZ))-lin_log2(CFG_IC_TLINE_SZ)); -- (lin_log(1k)-2) + lin_log2(cachesize) - lin_log2(cacheline)constant GCML_IC_TLINE_BSZ : integer := lin_log2(CFG_IC_TLINE_SZ);-- addr to icache data-access (sizes only)constant GCML_IC_DADDR_BSZ : integer := ((8 +lin_log2(CFG_IC_SET_SZ))-lin_log2(CFG_IC_DLINE_SZ)); -- (lin_log(1k)-2) + lin_log2(cachesize) - lin_log2(cacheline)constant GCML_IC_DLINE_BSZ : integer := lin_log2(CFG_IC_DLINE_SZ);-- icache cmem-data layoutconstant GCML_IC_DL_BSZ : integer := CFG_IC_DLINE_SZ*32;-- icache cmem-tag layoutconstant GCML_IC_CLOCK_C : integer := (CFG_IC_TLINE_SZ+(CFG_IC_ADDR_SZ-(2+(8+lin_log2(CFG_IC_SET_SZ)))));constant GCML_IC_CTAG_D : integer := CFG_IC_TLINE_SZ; -- tag to compare addr toconstant GCML_IC_CTAG_U : integer := (CFG_IC_TLINE_SZ+(CFG_IC_ADDR_SZ-(2+(8+lin_log2(CFG_IC_SET_SZ)))))-1;constant GCML_IC_CVALID_D : integer := 0; -- valid bit of line entryconstant GCML_IC_CVALID_U : integer := (CFG_IC_TLINE_SZ)-1;constant GCML_IC_TL_BSZ : integer := (CFG_IC_TLINE_SZ+(CFG_IC_ADDR_SZ-(2+(8+lin_log2(CFG_IC_SET_SZ)))))+1; -- complete tag line size-- icache tag line type gcml_ic_tline is record tag : std_logic_vector(GCML_IC_TTAG_BSZ-1 downto 0); valid : std_logic_vector(CFG_IC_TLINE_SZ-1 downto 0); lock : std_logic;end record;type gcml_ic_tline_a is array (natural range <>) of gcml_ic_tline;-- icache data line type std_logic_vector_a is array (natural range <>) of std_logic_vector(31 downto 0);type gcml_ic_dline is record data : std_logic_vector_a(CFG_IC_DLINE_SZ-1 downto 0);end record;type gcml_ic_dline_a is array (natural range <>) of gcml_ic_dline;function gcml_icttostd ( line : gcml_ic_tline) return std_logic_vector; procedure gcml_stdtoict ( data : in std_logic_vector(GCML_IC_TL_BSZ-1 downto 0); line : inout gcml_ic_tline);function gcml_icdtostd ( line : gcml_ic_dline) return std_logic_vector; procedure gcml_stdtoicd ( data : in std_logic_vector(GCML_IC_DL_BSZ-1 downto 0); line : inout gcml_ic_dline);-- DCACHE:---- +---------------------+---------------+-------+----+-- addr as data-access: | xxx | DADDR | DLINE | 00 |-- +---------------------+---------------+-------+----+-- -- +---------------------+-----------+-----------+----+-- addr as tag-access : | TTAG | TADDR | TLINE | 00 | |-- +---------------------+-----------+-----------+----+---- ICACHE TAG ICACHE DATA-- . . . . . . -- TADDR | | | DADDR | | | -- | +--------------------+--------+ | +--------------------+--------------------+..-- +-->| CTAG | CVALID | +-->| data | data |-- +--------------------+--------+ +--------------------+--------------------+..-- | | | | | |-- . . . . . .-- addr as dcache tag-access (sizes only)constant GCML_DC_TDIRTY_BSZ : integer := lin_log2(CFG_DC_TLINE_SZ); constant GCML_DC_TTAG_BSZ : integer := CFG_DC_ADDR_SZ - (2 + (8 +lin_log2(CFG_DC_SET_SZ)));constant GCML_DC_TADDR_BSZ : integer := ((8 +lin_log2(CFG_DC_SET_SZ))-lin_log2(CFG_DC_TLINE_SZ)); -- (lin_log(1k)-2) + lin_log2(cachesize) - lin_log2(cacheline)constant GCML_DC_TLINE_BSZ : integer := lin_log2(CFG_DC_TLINE_SZ); -- addr as dcache data-access (sizes only)constant GCML_DC_DADDR_BSZ : integer := ((8 +lin_log2(CFG_DC_SET_SZ))-lin_log2(CFG_DC_DLINE_SZ)); -- (lin_log(1k)-2) + lin_log2(cachesize) - lin_log2(cacheline)constant GCML_DC_DLINE_BSZ : integer := lin_log2(CFG_DC_DLINE_SZ); -- writeback to writebufferconstant GCML_DC_DLINEperTLINE_SZ : integer := CFG_DC_TLINE_SZ/CFG_DC_DLINE_SZ; -- dcache cmem-data layoutconstant GCML_DC_DL_BSZ : integer := CFG_DC_DLINE_SZ*32;-- dcache cmem-tag layoutconstant GCML_DC_CLOCK_C : integer := ((CFG_DC_TLINE_SZ*2)+(CFG_DC_ADDR_SZ-(2+(8+lin_log2(CFG_DC_SET_SZ)))));constant GCML_DC_CDIRTY_D : integer := (CFG_DC_TLINE_SZ +(CFG_DC_ADDR_SZ-(2+(8+lin_log2(CFG_DC_SET_SZ)))));constant GCML_DC_CDIRTY_U : integer := ((CFG_DC_TLINE_SZ*2)+(CFG_DC_ADDR_SZ-(2+(8+lin_log2(CFG_DC_SET_SZ)))))-1;constant GCML_DC_CTAG_D : integer := CFG_DC_TLINE_SZ;constant GCML_DC_CTAG_U : integer := (CFG_DC_TLINE_SZ +(CFG_DC_ADDR_SZ-(2+(8+lin_log2(CFG_DC_SET_SZ)))))-1;constant GCML_DC_CVALID_D : integer := 0;constant GCML_DC_CVALID_U : integer := (CFG_DC_TLINE_SZ)-1;constant GCML_DC_TL_BSZ : integer := ((CFG_DC_TLINE_SZ*2)+(CFG_DC_ADDR_SZ-(2+(8+lin_log2(CFG_DC_SET_SZ)))))+1;-- dcache tag line type gcml_dc_tline is record tag : std_logic_vector(GCML_DC_TTAG_BSZ-1 downto 0); valid : std_logic_vector(CFG_DC_TLINE_SZ-1 downto 0); dirty : std_logic_vector(CFG_DC_TLINE_SZ-1 downto 0); lock : std_logic;end record;type gcml_dc_tline_a is array (natural range <>) of gcml_dc_tline;-- dcache data line type gcml_dc_dline is record data : std_logic_vector_a(CFG_DC_DLINE_SZ-1 downto 0);end record;type gcml_dc_dline_a is array (natural range <>) of gcml_dc_dline;function gcml_dcttostd ( line : gcml_dc_tline) return std_logic_vector; procedure gcml_stdtodct ( data : in std_logic_vector(GCML_DC_TL_BSZ-1 downto 0); line : inout gcml_dc_tline);function gcml_dcdtostd ( line : gcml_dc_dline) return std_logic_vector; procedure gcml_stdtodcd ( data : in std_logic_vector(GCML_DC_DL_BSZ-1 downto 0); line : inout gcml_dc_dline);end gencmem_lib;package body gencmem_lib is-- icache conversionsfunction gcml_icttostd ( line : gcml_ic_tline) return std_logic_vector is variable tmp : std_logic_vector(GCML_IC_TL_BSZ-1 downto 0);begin tmp(GCML_IC_CTAG_U downto GCML_IC_CTAG_D) := line.tag; tmp(GCML_IC_CVALID_U downto GCML_IC_CVALID_D) := line.valid; tmp(GCML_IC_CLOCK_C) := line.lock; return tmp;end;procedure gcml_stdtoict ( data : in std_logic_vector(GCML_IC_TL_BSZ-1 downto 0); line : inout gcml_ic_tline) isbegin line.tag := data(GCML_IC_CTAG_U downto GCML_IC_CTAG_D); line.valid := data(GCML_IC_CVALID_U downto GCML_IC_CVALID_D); line.lock := data(GCML_IC_CLOCK_C);end;function gcml_icdtostd ( line : gcml_ic_dline) return std_logic_vector is variable tmp : std_logic_vector(GCML_IC_DL_BSZ-1 downto 0);begin for i in CFG_IC_DLINE_SZ-1 downto 0 loop tmp((i*32)+31 downto (i*32)) := line.data(i); end loop; return tmp;end;procedure gcml_stdtoicd ( data : in std_logic_vector(GCML_IC_DL_BSZ-1 downto 0); line : inout gcml_ic_dline) isbegin for i in CFG_IC_DLINE_SZ-1 downto 0 loop line.data(i) := data((i*32)+31 downto (i*32)); end loop;end;-- dcache conversionsfunction gcml_dcttostd ( line : gcml_dc_tline) return std_logic_vector is variable tmp : std_logic_vector(GCML_DC_TL_BSZ-1 downto 0);begin tmp(GCML_DC_CTAG_U downto GCML_DC_CTAG_D) := line.tag; tmp(GCML_DC_CVALID_U downto GCML_DC_CVALID_D) := line.valid; tmp(GCML_DC_CDIRTY_U downto GCML_DC_CDIRTY_D) := line.dirty; tmp(GCML_DC_CLOCK_C) := line.lock; return tmp;end; procedure gcml_stdtodct ( data : in std_logic_vector(GCML_DC_TL_BSZ-1 downto 0); line : inout gcml_dc_tline) isbegin line.tag := data(GCML_DC_CTAG_U downto GCML_DC_CTAG_D); line.valid := data(GCML_DC_CVALID_U downto GCML_DC_CVALID_D); line.dirty := data(GCML_DC_CDIRTY_U downto GCML_DC_CDIRTY_D); line.lock := data(GCML_DC_CLOCK_C);end; function gcml_dcdtostd ( line : gcml_dc_dline) return std_logic_vector is variable tmp : std_logic_vector(GCML_DC_DL_BSZ-1 downto 0);begin for i in CFG_DC_DLINE_SZ-1 downto 0 loop tmp((i*32)+31 downto (i*32)) := line.data(i); end loop; return tmp;end; procedure gcml_stdtodcd ( data : in std_logic_vector(GCML_DC_DL_BSZ-1 downto 0); line : inout gcml_dc_dline) isbegin for i in CFG_DC_DLINE_SZ-1 downto 0 loop line.data(i) := data((i*32)+31 downto (i*32)); end loop;end; end gencmem_lib;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -