URL
https://opencores.org/ocsvn/storm_core/storm_core/trunk
Subversion Repositories storm_core
Compare Revisions
- This comparison shows the changes necessary to convert path
/
- from Rev 27 to Rev 28
- ↔ Reverse comparison
Rev 27 → Rev 28
/storm_core/trunk/rtl/CACHE.vhd
9,7 → 9,7
-- # A cache line contains a complete word (32-bit). # |
-- # The cache is fully associative. # |
-- # *************************************************** # |
-- # Last modified: 24.02.2012 # |
-- # Last modified: 08.03.2012 # |
-- ####################################################### |
|
library IEEE; |
54,11 → 54,13
-- ################################################################################################################ |
|
B_CS_I : in STD_LOGIC; -- bus unit request |
B_P_SEL_I : in STD_LOGIC_VECTOR(LOG2_CACHE_PAGES-1 downto 0); -- bus unit page select |
B_D_SEL_O : out STD_LOGIC; -- selected dirty bit |
B_A_SEL_O : out STD_LOGIC_VECTOR(31 downto 0); -- selected base adr |
B_ADR_I : in STD_LOGIC_VECTOR(31 downto 0); -- address input |
B_DATA_I : in STD_LOGIC_VECTOR(31 downto 0); -- data input |
B_DATA_O : out STD_LOGIC_VECTOR(31 downto 0); -- data output |
B_WE_I : in STD_LOGIC; -- write enable |
B_BSA_O : out STD_LOGIC_VECTOR(31 downto 0); -- base adr of selected page |
B_DRT_ACK_I : in STD_LOGIC; -- dirty acknowledged |
B_MSS_ACK_I : in STD_LOGIC; -- miss acknowledged |
B_IO_ACC_I : in STD_LOGIC; -- IO access |
73,7 → 75,8
C_MISS_O : out STD_LOGIC; -- cache miss access |
C_HIT_O : out STD_LOGIC; -- cache hit access |
C_DIRTY_O : out STD_LOGIC; -- cache modified |
C_WTHRU_I : in STD_LOGIC -- write through |
C_WTHRU_I : in STD_LOGIC; -- write through |
C_SYNC_O : out STD_LOGIC -- cache is sync to mem/io |
); |
end CACHE; |
|
80,7 → 83,7
architecture Behavioral of CACHE is |
|
-- Is Simulation? -- |
constant IS_SIM : boolean := FALSE; |
constant IS_SIM : boolean := TRUE; |
|
-- Cache Arbiter -- |
type ARB_STATE_TYPE is (STORM_ACCESS, MISS_STATE, IO_REQUEST, IO_PIPE_RESYNC, IO_PIPE_RESYNC_END, DIRTY_STATE, PIPE_RESYNC); |
154,14 → 157,16
for i in 0 to CACHE_PAGES-1 loop |
PAGE_BASE_ADR(i) <= (others => '0'); |
end loop; |
elsif (SET_NEW_BAS = '1') then |
PAGE_BASE_ADR(to_integer(unsigned(NEW_ENTRY_PAGE))) <= ADR_INT(31 downto LOG2_PAGE_SIZE+2); |
else |
if (SET_NEW_BAS = '1') then |
PAGE_BASE_ADR(to_integer(unsigned(NEW_ENTRY_PAGE))) <= ADR_INT(31 downto LOG2_PAGE_SIZE+2); |
end if; |
end if; |
end if; |
|
-- Base ADR output for bus unit -- |
B_BSA_O <= (others => '0'); |
B_BSA_O(31 downto LOG2_PAGE_SIZE+2) <= PAGE_BASE_ADR(to_integer(unsigned(B_BASE_O_SEL))); |
B_A_SEL_O <= (others => '0'); |
B_A_SEL_O(31 downto LOG2_PAGE_SIZE+2) <= PAGE_BASE_ADR(to_integer(unsigned(B_P_SEL_I))); |
end process PAGE_ADR_SYS; |
|
|
201,16 → 206,18
for i in 0 to CACHE_PAGES-1 loop |
HIST_MEM(i) <= std_logic_vector(to_unsigned(i, LOG2_CACHE_PAGES)); |
end loop; |
elsif (UPDATE_HIST_FF = '1') then |
for i in 0 to CACHE_PAGES-1 loop |
if (hist_mem_ce_v(CACHE_PAGES-1-i) = '1') then |
if (i = CACHE_PAGES-1) then |
HIST_MEM(CACHE_PAGES-1-i) <= PAGE_SELECT_FF; |
else |
HIST_MEM(CACHE_PAGES-1-i) <= HIST_MEM(CACHE_PAGES-1-i-1); |
else |
if (UPDATE_HIST_FF = '1') then |
for i in 0 to CACHE_PAGES-1 loop |
if (hist_mem_ce_v(CACHE_PAGES-1-i) = '1') then |
if (i = CACHE_PAGES-1) then |
HIST_MEM(CACHE_PAGES-1-i) <= PAGE_SELECT_FF; |
else |
HIST_MEM(CACHE_PAGES-1-i) <= HIST_MEM(CACHE_PAGES-1-i-1); |
end if; |
end if; |
end if; |
end loop; |
end loop; |
end if; |
end if; |
end if; |
end process CACHE_ACCESS_HISTORY; |
227,10 → 234,12
for i in 0 to CACHE_PAGES-1 loop |
VALID_FLAG(i) <= '0'; |
end loop; |
elsif (CLR_CUR_VAL = '1') then |
VALID_FLAG(to_integer(unsigned(PAGE_SELECT))) <= '0'; |
elsif (SET_CUR_VAL = '1') then |
VALID_FLAG(to_integer(unsigned(PAGE_SELECT))) <= '1'; |
else |
if (CLR_CUR_VAL = '1') then |
VALID_FLAG(to_integer(unsigned(PAGE_SELECT))) <= '0'; |
elsif (SET_CUR_VAL = '1') then |
VALID_FLAG(to_integer(unsigned(PAGE_SELECT))) <= '1'; |
end if; |
end if; |
end if; |
end process PAGE_VALID_SYS; |
240,7 → 249,8
-- Page Modification Flag ------------------------------------------------------------------------------ |
-- -------------------------------------------------------------------------------------------------------- |
DIRTY_REG: process(CORE_CLK_I, DIRTY_FLAG, VALID_FLAG) |
variable temp_v : std_logic; |
variable temp1_v : std_logic; |
variable temp2_v : std_logic; |
begin |
-- Sync update -- |
if rising_edge(CORE_CLK_I) then |
248,29 → 258,41
for i in 0 to CACHE_PAGES-1 loop |
DIRTY_FLAG(i) <= '0'; |
end loop; |
elsif (SET_ALL_DRT = '1') then |
for i in 0 to CACHE_PAGES-1 loop |
DIRTY_FLAG(i) <= '1'; |
end loop; |
else |
if (CLR_CUR_DRT = '1') then |
DIRTY_FLAG(to_integer(unsigned(PAGE_SELECT))) <= '0'; |
elsif (SET_CUR_DRT = '1') then |
DIRTY_FLAG(to_integer(unsigned(PAGE_SELECT))) <= '1'; |
if (SET_ALL_DRT = '1') then |
for i in 0 to CACHE_PAGES-1 loop |
DIRTY_FLAG(i) <= '1'; |
end loop; |
else |
if (CLR_CUR_DRT = '1') then |
DIRTY_FLAG(to_integer(unsigned(PAGE_SELECT))) <= '0'; |
elsif (SET_CUR_DRT = '1') then |
DIRTY_FLAG(to_integer(unsigned(PAGE_SELECT))) <= '1'; |
end if; |
end if; |
end if; |
end if; |
|
-- Any dirty bits? -- |
temp_v := '0'; |
temp1_v := '0'; |
for i in 0 to CACHE_PAGES-1 loop |
temp_v := temp_v or (DIRTY_FLAG(i) and VALID_FLAG(i)); |
temp1_v := temp1_v or (DIRTY_FLAG(i) and VALID_FLAG(i)); |
end loop; |
CACHE_DIRTY <= temp_v; |
CACHE_DIRTY <= temp1_v; |
|
-- Cache sync? -- |
temp2_v := '1'; |
for i in 0 to CACHE_PAGES-1 loop |
temp2_v := temp2_v and (DIRTY_FLAG(i) nand VALID_FLAG(i)); |
end loop; |
C_SYNC_O <= temp2_v; |
end process DIRTY_REG; |
|
--- Bus Unit Single Dirty Flag Output --- |
B_D_SEL_O <= DIRTY_FLAG(to_integer(unsigned(B_P_SEL_I))) and VALID_FLAG(to_integer(unsigned(B_P_SEL_I))); |
|
|
|
-- HIT / MISS Detector --------------------------------------------------------------------------------- |
-- -------------------------------------------------------------------------------------------------------- |
CONTENT_DETECTOR: process(ADR_INT, PAGE_BASE_ADR, VALID_FLAG, P_CS_I) |
314,7 → 336,7
|
|
|
CACHE_ARBITER: process(ARB_STATE, HIST_MEM, PAGE_TRANSLATE, ADR_BUF, DAT_BUF, HST_BUF, BIT_BUF, CACHE_R_DATA, DIRTY_FLAG, |
CACHE_ARBITER: process(ARB_STATE, HIST_MEM, PAGE_TRANSLATE, ADR_BUF, DAT_BUF, HST_BUF, BIT_BUF, CACHE_R_DATA, DIRTY_FLAG, VALID_FLAG, |
CACHE_MISS, CACHE_DIRTY, C_FRESH_I, C_CLEAR_I, C_FLUSH_I, CACHE_HIT, C_WTHRU_I, |
P_ADR_I, P_DATA_I, P_CS_I, P_WE_I, P_DQ_I, |
B_ADR_I, B_DATA_I, B_CS_I, B_WE_I, B_IO_ACC_I, B_MSS_ACK_I, B_DRT_ACK_I) |
375,7 → 397,8
ADR_BUF_NXT <= P_ADR_I; |
HST_BUF_NXT <= HIST_MEM(CACHE_PAGES-1); -- next page for writing |
BIT_BUF_NXT <= P_CS_I and P_WE_I; |
if (C_WTHRU_I = '0') and (DIRTY_FLAG(to_integer(unsigned(HIST_MEM(CACHE_PAGES-1)))) = '1') then |
if (C_WTHRU_I = '0') and (DIRTY_FLAG(to_integer(unsigned(HIST_MEM(CACHE_PAGES-1)))) = '1') and |
(VALID_FLAG(to_integer(unsigned(HIST_MEM(CACHE_PAGES-1)))) = '1') then |
ARB_STATE_NXT <= DIRTY_STATE; |
elsif (B_IO_ACC_I = '1') and (P_CS_I = '1') then |
ARB_STATE_NXT <= IO_REQUEST; |
539,20 → 562,14
|
-- Read-Access Synchronizer ---------------------------------------------------------------------------- |
-- -------------------------------------------------------------------------------------------------------- |
R_ACC_SYNC: process(CORE_CLK_I, HALT_I, ARB_STATE) |
variable sel_v : std_logic; |
R_ACC_SYNC: process(CORE_CLK_I) |
begin |
sel_v := '0'; |
if (HALT_I = '1') and (ARB_STATE = STORM_ACCESS) then |
sel_v := '1'; |
end if; |
|
if rising_edge(CORE_CLK_I) then |
if (RST_I = '1') then |
P_DATA_O_SEL <= '0'; |
P_DATA_O_BUF <= (others => '0'); |
else |
P_DATA_O_SEL <= sel_v; |
elsif (ARB_STATE = STORM_ACCESS) then |
P_DATA_O_SEL <= HALT_I; |
if (P_DATA_O_SEL = '0') then |
P_DATA_O_BUF <= P_DATA_O_INT; |
end if; |
/storm_core/trunk/rtl/ALU.vhd
3,7 → 3,7
-- # *************************************************** # |
-- # Arithmetical/Logical/MCR_Access Unit # |
-- # *************************************************** # |
-- # Last modified: 02.03.2012 # |
-- # Last modified: 08.03.2012 # |
-- ####################################################### |
|
library IEEE; |
62,6 → 62,7
|
-- Local Signals -- |
signal ALU_OUT : STD_LOGIC_VECTOR(DATA_WIDTH-1 downto 0); |
signal RESULT_TMP : STD_LOGIC_VECTOR(DATA_WIDTH-1 downto 0); |
signal ADDER_RES : STD_LOGIC_VECTOR(DATA_WIDTH downto 0); |
signal ADD_MODE : STD_LOGIC_VECTOR(02 downto 0); |
signal CARRY_OUT : STD_LOGIC; |
185,7 → 186,7
|
-- Flag Logic ------------------------------------------------------------------------------------------ |
-- -------------------------------------------------------------------------------------------------------- |
ALU_FLAG_LOGIC: process(ADDER_RES, OP_A(31), OP_B(31), ALU_OUT, FLAG_I, |
ALU_FLAG_LOGIC: process(ADDER_RES, OP_A, OP_B, ALU_OUT, FLAG_I, |
CARRY_OUT, OVFL_OUT, MS_CARRY_REG, MS_OVFL_REG, CTRL_I) |
variable is_add_zero_v : std_logic; |
variable is_xor_zero_v : std_logic; |
244,7 → 245,7
-- Forwarding Paths ------------------------------------------------------------------------------------ |
-- -------------------------------------------------------------------------------------------------------- |
-- Operation Data Result -- |
ALU_FW_O(FWD_DATA_MSB downto FWD_DATA_LSB) <= ALU_OUT(DATA_WIDTH-1 downto 0); |
ALU_FW_O(FWD_DATA_MSB downto FWD_DATA_LSB) <= RESULT_TMP; |
-- Destination Register Address -- |
ALU_FW_O(FWD_RD_MSB downto FWD_RD_LSB) <= CTRL_I(CTRL_RD_3 downto CTRL_RD_0); |
-- Data Write Back Enabled -- |
266,8 → 267,10
-- -------------------------------------------------------------------------------------------------------- |
|
--- MCR / CP Read Access --- |
RESULT_O <= MCR_DTA_I when ((CTRL_I(CTRL_MREG_ACC) = '1') and (CTRL_I(CTRL_MREG_RW) = '0')) or |
((CTRL_I(CTRL_CP_ACC) = '1') and (CTRL_I(CTRL_CP_RW) = '0')) else ALU_OUT; |
RESULT_TMP <= MCR_DTA_I when ((CTRL_I(CTRL_MREG_ACC) = '1') and (CTRL_I(CTRL_MREG_RW) = '0')) or |
((CTRL_I(CTRL_CP_ACC) = '1') and (CTRL_I(CTRL_CP_RW) = '0')) else ALU_OUT; |
RESULT_O <= RESULT_TMP; |
|
--- MCR Connection --- |
MCR_DTA_O <= ALU_OUT; |
|
/storm_core/trunk/rtl/STORM_TOP.vhd
21,7 → 21,7
-- # - LOAD_STORE_UNIT.vhd | Download at http://opencores.org/project,storm_core # |
-- # - OPCODE_DECODER.vhd | # |
-- # ***************************************************************************************************** # |
-- # Last modified: 15.02.2012 =/\= # |
-- # Last modified: 08.03.2012 =/\= # |
-- ######################################################################################################### |
|
library IEEE; |
100,6 → 100,7
signal ST_MODE : STD_LOGIC_VECTOR(04 downto 0); |
signal C_WTHRU : STD_LOGIC; |
signal C_BUS_CYCC : STD_LOGIC_VECTOR(15 downto 0); |
signal ADR_FEEDBACK : STD_LOGIC_VECTOR(31 downto 0); |
|
-- STORM D-Cache Interface -- |
signal ST_DC_REQ : STD_LOGIC; |
113,9 → 114,13
signal ST_DC_HIT : STD_LOGIC; |
signal ST_DC_FRESH : STD_LOGIC; |
signal ST_DC_CIO : STD_LOGIC; |
signal ST_DC_SYNC : STD_LOGIC; |
|
-- Bus Unit D-Cache Interface -- |
signal BS_DC_CS : STD_LOGIC; |
signal BS_DC_P_SEL : STD_LOGIC_VECTOR(log2(D_CACHE_PAGES)-1 downto 0); |
signal BS_DC_D_SEL : STD_LOGIC; |
signal BS_DC_A_SEL : STD_LOGIC_VECTOR(31 downto 0); |
signal BS_DC_ADR : STD_LOGIC_VECTOR(31 downto 0); |
signal BS_DC_DATA_I : STD_LOGIC_VECTOR(31 downto 0); |
signal BS_DC_DATA_O : STD_LOGIC_VECTOR(31 downto 0); |
122,7 → 127,6
signal BS_DC_WE : STD_LOGIC; |
signal BS_DC_DIRTY : STD_LOGIC; |
signal BS_DC_MISS : STD_LOGIC; |
signal BS_DC_BSA_SEL : STD_LOGIC_VECTOR(31 downto 0); |
signal BS_DC_DRT_ACK : STD_LOGIC; |
signal BS_DC_MSS_ACK : STD_LOGIC; |
signal BS_DC_IO_ACC : STD_LOGIC; |
137,6 → 141,7
|
-- Bus Unit I-Cache Interface -- |
signal BS_IC_CS : STD_LOGIC; |
signal BS_IC_P_SEL : STD_LOGIC_VECTOR(log2(I_CACHE_PAGES)-1 downto 0); |
signal BS_IC_ADR : STD_LOGIC_VECTOR(31 downto 0); |
signal BS_IC_DATA_I : STD_LOGIC_VECTOR(31 downto 0); |
signal BS_IC_WE : STD_LOGIC; |
178,6 → 183,7
D_CACHE_HIT => ST_DC_HIT, -- d-cache hit |
D_CACHE_FRESH => ST_DC_FRESH, -- refresh d-cache |
D_CACHE_CIO => ST_DC_CIO, -- en cached IO |
D_CACHE_SYNC => ST_DC_SYNC, -- d-cache is sync |
|
-- Instruction Cache Interface -- |
I_CACHE_REQ => ST_IC_REQ, -- memory access in next cycle |
194,6 → 200,7
C_WTHRU_O => C_WTHRU, -- cache write through |
IO_PORT_OUT => IO_PORT_O, -- direct output |
IO_PORT_IN => IO_PORT_I, -- direct input |
ADR_FEEDBACK_I => ADR_FEEDBACK, -- address feedback for exceptions |
|
-- Interrupt Request Lines -- |
IRQ => IRQ_I, -- interrupt request |
215,10 → 222,13
-- Global Control -- |
CORE_CLK_I => CORE_CLK_I, -- core clock, all triggering on rising edge |
RST_I => RST_I, -- global reset, high active, sync |
HALT_I => ST_HALT, -- global storm halt signal |
HALT_I => ST_HALT, -- halt cache |
|
-- Processor Access -- |
P_CS_I => ST_IC_REQ, -- processor request |
B_P_SEL_I => BS_IC_P_SEL, -- bus unit page select |
B_D_SEL_O => open, -- selected dirty bit |
B_A_SEL_O => open, -- selected base adr |
P_ADR_I => ST_IC_ADR, -- address input |
P_DATA_I => x"00000000", -- data input |
P_DATA_O => ST_IC_RD_DTA, -- data output |
231,7 → 241,6
B_DATA_I => BS_IC_DATA_I, -- data input |
B_DATA_O => open, -- data output |
B_WE_I => BS_IC_WE, -- write enable |
B_BSA_O => open, -- base adr of selected page |
B_DRT_ACK_I => '1', -- dirty acknowledged |
B_MSS_ACK_I => BS_IC_MSS_ACK, -- miss acknowledged |
B_IO_ACC_I => '0', -- IO access |
243,11 → 252,15
C_MISS_O => BS_IC_MISS, -- cache miss access |
C_HIT_O => ST_IC_HIT, -- cache hit access |
C_DIRTY_O => open, -- cache modified |
C_WTHRU_I => '0' -- write through |
C_WTHRU_I => '0', -- write through |
C_SYNC_O => open -- cache is sync |
); |
|
-- selector dummy -- |
BS_IC_P_SEL <= (others => '0'); |
|
|
|
-- STORM Data Cache ----------------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
D_CACHE_INST: CACHE |
261,7 → 274,7
-- Global Control -- |
CORE_CLK_I => CORE_CLK_I, -- core clock, all triggering on rising edge |
RST_I => RST_I, -- global reset, high active, sync |
HALT_I => ST_HALT, -- global storm halt signal |
HALT_I => ST_HALT, -- halt cache |
|
-- Processor Access -- |
P_CS_I => ST_DC_REQ, -- processor request |
273,11 → 286,13
|
-- Bus Unit Access -- |
B_CS_I => BS_DC_CS, -- bus unit request |
B_P_SEL_I => BS_DC_P_SEL, -- bus unit page select |
B_D_SEL_O => BS_DC_D_SEL, -- selected dirty bit |
B_A_SEL_O => BS_DC_A_SEL, -- selected base adr |
B_ADR_I => BS_DC_ADR, -- address input |
B_DATA_I => BS_DC_DATA_I, -- data input |
B_DATA_O => BS_DC_DATA_O, -- data output |
B_WE_I => BS_DC_WE, -- write enable |
B_BSA_O => BS_DC_BSA_SEL, -- base adr of selected page |
B_DRT_ACK_I => BS_DC_DRT_ACK, -- dirty acknowledged |
B_MSS_ACK_I => BS_DC_MSS_ACK, -- miss acknowledged |
B_IO_ACC_I => BS_DC_IO_ACC, -- IO access |
289,7 → 304,8
C_MISS_O => BS_DC_MISS, -- cache miss access |
C_HIT_O => ST_DC_HIT, -- cache hit access |
C_DIRTY_O => BS_DC_DIRTY, -- cache modified |
C_WTHRU_I => C_WTHRU -- write through |
C_WTHRU_I => C_WTHRU, -- write through |
C_SYNC_O => ST_DC_SYNC -- cache is sync |
); |
|
|
320,10 → 336,14
I_ABORT_O => I_ABORT, -- bus error during instruction transfer |
C_BUS_CYCC_I => C_BUS_CYCC, -- max bus cycle length |
CACHED_IO_I => ST_DC_CIO, -- enable cached IO |
ADR_FEEDBACK_O => ADR_FEEDBACK, -- address feedback for exception handling |
|
-- Data Cache Interface -- |
DC_CS_O => BS_DC_CS, -- chip select |
DC_P_ADR_I => ST_DC_ADR, -- processor address |
DC_P_SEL_O => BS_DC_P_SEL, -- page select |
DC_D_SEL_I => BS_DC_D_SEL, -- dirty bit of selected page |
DC_A_SEL_I => BS_DC_A_SEL, -- base adr of sel page |
DC_P_CS_I => ST_DC_REQ, -- processor cache request |
DC_P_WE_I => ST_DC_RW, -- processor write enable |
DC_ADR_O => BS_DC_ADR, -- cache address |
332,7 → 352,6
DC_WE_O => BS_DC_WE, -- write enable |
DC_MISS_I => BS_DC_MISS, -- cache miss access |
DC_DIRTY_I => BS_DC_DIRTY, -- cache modified |
DC_BSA_I => BS_DC_BSA_SEL, -- base address of selected page |
DC_DRT_ACK_O => BS_DC_DRT_ACK, -- dirty acknowledged |
DC_MSS_ACK_O => BS_DC_MSS_ACK, -- miss acknowledged |
DC_IO_ACC_O => BS_DC_IO_ACC, -- IO access |
/storm_core/trunk/rtl/BUS_UNIT.vhd
9,7 → 9,7
-- # Note: I-Cache is read-only for the processor and # |
-- # write-only for the bus unit. # |
-- # ************************************************** # |
-- # Last modified: 01.03.2012 # |
-- # Last modified: 08.03.2012 # |
-- ###################################################### |
|
library IEEE; |
49,6 → 49,7
I_ABORT_O : out STD_LOGIC; -- bus error during instruction transfer |
C_BUS_CYCC_I : in STD_LOGIC_VECTOR(15 downto 0); -- max bus cycle length |
CACHED_IO_I : in STD_LOGIC; -- enable cached IO |
ADR_FEEDBACK_O : out STD_LOGIC_VECTOR(31 downto 0); -- address feedback for exception handling |
|
-- ################################################################################################################ |
-- ## STORM Data Cache Interface ## |
56,6 → 57,9
|
DC_CS_O : out STD_LOGIC; -- chip select |
DC_P_ADR_I : in STD_LOGIC_VECTOR(31 downto 0); -- processor address |
DC_P_SEL_O : out STD_LOGIC_VECTOR(LOG2_D_CACHE_PAGES-1 downto 0); -- page select |
DC_D_SEL_I : in STD_LOGIC; -- dirty bit of selected page |
DC_A_SEL_I : in STD_LOGIC_VECTOR(31 downto 0); -- base adr of sel page |
DC_P_CS_I : in STD_LOGIC; -- processor cache request |
DC_P_WE_I : in STD_LOGIC; -- processor write enable |
DC_ADR_O : out STD_LOGIC_VECTOR(31 downto 0); -- cache address |
64,7 → 68,6
DC_WE_O : out STD_LOGIC; -- write enable |
DC_MISS_I : in STD_LOGIC; -- cache miss access |
DC_DIRTY_I : in STD_LOGIC; -- cache modified |
DC_BSA_I : in STD_LOGIC_VECTOR(31 downto 0); -- base address of selected page |
DC_DRT_ACK_O : out STD_LOGIC; -- dirty acknowledged |
DC_MSS_ACK_O : out STD_LOGIC; -- miss acknowledged |
DC_IO_ACC_O : out STD_LOGIC; -- IO access |
113,7 → 116,7
constant WB_BST_END_CYC : STD_LOGIC_VECTOR(2 downto 0) := "111"; -- burst end |
|
-- Arbiter FSM -- |
type ARB_STATE_TYPE is (IDLE, UPLOAD_D_PAGE, IO_REQUEST, DOWNLOAD_I_PAGE, DOWNLOAD_D_PAGE, END_TRANSFER); |
type ARB_STATE_TYPE is (IDLE, ASSIGN_D_PAGE, UPLOAD_D_PAGE, IO_REQUEST, DOWNLOAD_I_PAGE, DOWNLOAD_D_PAGE, END_TRANSFER); |
signal ARB_STATE, ARB_STATE_NXT : ARB_STATE_TYPE; |
|
-- Address Buffer -- |
122,6 → 125,7
signal WB_ADR_BUF, WB_ADR_BUF_NXT : STD_LOGIC_VECTOR(31 downto 0); |
signal DC_P_ADR_BUF, IC_P_ADR_BUF : STD_LOGIC_VECTOR(31 downto 0); |
signal BASE_BUF, BASE_BUF_NXT : STD_LOGIC_VECTOR(31 downto 0); |
signal PAGE_BUF, PAGE_BUF_NXT : STD_LOGIC_VECTOR(LOG2_D_CACHE_PAGES-1 downto 0); |
|
-- Wishbone Syncs -- |
signal WB_DATA_BUF : STD_LOGIC_VECTOR(31 downto 0); |
139,6 → 143,7
|
-- Timeout System -- |
signal TIMEOUT_CNT, TIMEOUT_CNT_NXT : STD_LOGIC_VECTOR(15 downto 0); |
signal WB_ACK_CNT, WB_ACK_CNT_NXT : STD_LOGIC_VECTOR(15 downto 0); |
|
begin |
|
167,6 → 172,7
--- D-Cache --- |
DC_DATA_O <= WB_DATA_BUF; |
DC_ADR_O <= DC_ADR_BUF; |
DC_P_SEL_O <= PAGE_BUF; |
|
--- I-Cache --- |
IC_DATA_O <= WB_DATA_BUF; |
183,8 → 189,11
IO_ACCESS <= '1' when (DC_P_ADR_I >= IO_UC_BEGIN) and (DC_P_ADR_I <= IO_UC_END) and (CACHED_IO_I = '0') else '0'; |
DC_IO_ACC_O <= IO_ACCESS; |
|
--- Core Feedback --- |
ADR_FEEDBACK_O <= WB_ADR_BUF; |
|
|
|
-- Arbiter State Machine (Sync) --------------------------------------------------------------------------- |
-- ----------------------------------------------------------------------------------------------------------- |
ARBITER_SYNC: process(CORE_CLK_I) |
195,11 → 204,13
TIMEOUT_CNT <= (others => '0'); |
WB_DATA_BUF <= (others => '0'); |
WB_ACK_BUF <= '0'; |
WB_ACK_CNT <= (others => '0'); |
WB_ERR_BUF <= '0'; |
WE_FLAG <= '0'; |
VA_CYC_BUF <= '0'; |
IC_ADR_BUF <= (others => '0'); |
DC_ADR_BUF <= (others => '0'); |
PAGE_BUF <= (others => '0'); |
WB_ADR_BUF <= (others => '0'); |
BASE_BUF <= (others => '0'); |
DC_P_ADR_BUF <= (others => '0'); |
215,11 → 226,13
-- Wishbone Sync -- |
WB_DATA_BUF <= WB_DATA_I; |
WB_ACK_BUF <= WB_ACK_I; |
WB_ACK_CNT <= WB_ACK_CNT_NXT; |
WB_ERR_BUF <= WB_ERR_I; |
VA_CYC_BUF <= VA_CYC_BUF_NXT; |
-- Address Buffer -- |
IC_ADR_BUF <= IC_ADR_BUF_NXT; |
DC_ADR_BUF <= DC_ADR_BUF_NXT; |
PAGE_BUF <= PAGE_BUF_NXT; |
WB_ADR_BUF <= WB_ADR_BUF_NXT; |
BASE_BUF <= BASE_BUF_NXT; |
end if; |
231,10 → 244,10
|
-- Arbiter State Machine (Async) -------------------------------------------------------------------------- |
-- ----------------------------------------------------------------------------------------------------------- |
ARBITER_ASYNC: process(ARB_STATE, STORM_MODE_I, FREEZE_FLAG, BASE_BUF, TIMEOUT_CNT, IO_ACCESS, WE_FLAG, |
DC_ADR_BUF, DC_P_ADR_BUF, DC_P_ADR_I, DC_DIRTY_I, DC_MISS_I, DC_BSA_I, DC_P_WE_I, DC_P_CS_I, |
ARBITER_ASYNC: process(ARB_STATE, STORM_MODE_I, FREEZE_FLAG, BASE_BUF, TIMEOUT_CNT, IO_ACCESS, WE_FLAG, |
DC_ADR_BUF, DC_P_ADR_BUF, DC_P_ADR_I, PAGE_BUF, DC_D_SEL_I, DC_A_SEL_I, DC_DIRTY_I, DC_MISS_I, DC_P_WE_I, DC_P_CS_I, |
IC_ADR_BUF, IC_P_ADR_BUF, IC_MISS_I, |
WB_ADR_BUF, WB_ACK_BUF, WB_ERR_BUF, VA_CYC_BUF, C_BUS_CYCC_I) |
WB_ADR_BUF, WB_ACK_BUF, WB_ACK_I, WB_ACK_CNT, WB_ERR_BUF, VA_CYC_BUF, C_BUS_CYCC_I) |
variable IF_BASE_ADR_V, DF_BASE_ADR_V : STD_LOGIC_VECTOR(31 downto 0); |
begin |
--- Base Address Word Alignment --- |
248,6 → 261,8
TIMEOUT_CNT_NXT <= TIMEOUT_CNT; |
DC_ADR_BUF_NXT <= DC_ADR_BUF; |
IC_ADR_BUF_NXT <= IC_ADR_BUF; |
PAGE_BUF_NXT <= PAGE_BUF; |
WB_ACK_CNT_NXT <= WB_ACK_CNT; |
WB_ADR_BUF_NXT <= WB_ADR_BUF; |
FREEZE_FLAG_NXT <= FREEZE_FLAG; |
FREEZE_DIS_NXT <= '0'; |
262,6 → 277,11
WB_CYC_O <= '0'; |
WB_STB_O <= '0'; |
|
--- Wishbone ACK Counter --- |
if (WB_ACK_I = '1') then |
WB_ACK_CNT_NXT <= Std_Logic_Vector(unsigned(WB_ACK_CNT) + 1); |
end if; |
|
--- D-Cache Interface Defaults --- |
DC_CS_O <= '0'; |
DC_WE_O <= '0'; |
279,8 → 299,9
|
when IDLE => -- waiting for requests |
------------------------------------------------------------------------------- |
IC_ADR_BUF_NXT <= IF_BASE_ADR_V; |
DC_ADR_BUF_NXT <= DF_BASE_ADR_V; |
IC_ADR_BUF_NXT <= IF_BASE_ADR_V; |
DC_ADR_BUF_NXT <= DF_BASE_ADR_V; |
WB_ACK_CNT_NXT <= (others => '0'); |
if (IC_MISS_I = '1') then -- i-cache miss -> reload cache page |
ARB_STATE_NXT <= DOWNLOAD_I_PAGE; |
FREEZE_FLAG_NXT <= '1'; |
297,12 → 318,10
ARB_STATE_NXT <= IO_REQUEST; |
FREEZE_FLAG_NXT <= '1'; |
WB_ADR_BUF_NXT <= DC_P_ADR_I; |
WE_FLAG_NXT <= DC_P_WE_I; |
WE_FLAG_NXT <= DC_P_WE_I; -- bus read/write |
elsif (DC_DIRTY_I = '1') then -- d-cache modification -> copy page to main memory |
DC_ADR_BUF_NXT <= DC_BSA_I; |
WB_ADR_BUF_NXT <= DC_BSA_I; |
BASE_BUF_NXT <= DC_BSA_I; |
ARB_STATE_NXT <= UPLOAD_D_PAGE; |
ARB_STATE_NXT <= ASSIGN_D_PAGE; |
PAGE_BUF_NXT <= (others => '1'); -- last entry |
WE_FLAG_NXT <= '1'; -- bus write |
FREEZE_FLAG_NXT <= '1'; |
end if; |
316,7 → 335,7
WB_STB_O <= '1'; -- valid transfer |
TIMEOUT_CNT_NXT <= Std_Logic_Vector(unsigned(TIMEOUT_CNT) + 1); |
if (IC_ADR_BUF >= Std_Logic_Vector(unsigned(BASE_BUF) + I_CACHE_PAGE_SIZE*4)) and |
(WB_ACK_BUF = '1') then -- cycle complete? |
(to_integer(unsigned(WB_ACK_CNT)) >= I_CACHE_PAGE_SIZE) then --((WB_ACK_BUF = '1') then -- cycle complete? |
WB_CTI_O <= WB_BST_END_CYC; |
ARB_STATE_NXT <= END_TRANSFER; |
IC_MSS_ACK_O <= '1'; -- ack miss! |
347,7 → 366,7
DC_WE_O <= '1'; -- cache write access |
TIMEOUT_CNT_NXT <= Std_Logic_Vector(unsigned(TIMEOUT_CNT) + 1); |
if (DC_ADR_BUF >= Std_Logic_Vector(unsigned(BASE_BUF) + D_CACHE_PAGE_SIZE*4)) and |
(WB_ACK_BUF = '1') then -- cycle complete? |
(to_integer(unsigned(WB_ACK_CNT)) >= D_CACHE_PAGE_SIZE) then --(WB_ACK_BUF = '1') then -- cycle complete? |
WB_CTI_O <= WB_BST_END_CYC; |
ARB_STATE_NXT <= END_TRANSFER; |
DC_MSS_ACK_O <= '1'; -- ack miss! |
371,13 → 390,13
------------------------------------------------------------------------------- |
WB_TGC_O(5) <= '0'; -- indicate data transfer |
WB_TGC_O(6) <= '1'; -- io access |
WB_CTI_O <= WB_CON_BST_CYC; |
WB_CTI_O <= WB_CLASSIC_CYC; |
WB_CYC_O <= '1'; -- valid cycle |
WB_STB_O <= '1'; -- valid transfer |
DC_WE_O <= '1'; -- dummy cache write access |
DC_ADR_BUF_NXT <= WB_ADR_BUF; |
TIMEOUT_CNT_NXT <= Std_Logic_Vector(unsigned(TIMEOUT_CNT) + 1); |
if (WB_ACK_BUF = '1') then -- cycle complete? |
if (to_integer(unsigned(WB_ACK_CNT)) >= 1) then --(WB_ACK_BUF = '1') then -- cycle complete? |
WB_CTI_O <= WB_BST_END_CYC; |
ARB_STATE_NXT <= END_TRANSFER; |
DC_DRT_ACK_O <= '1'; -- ack of pseudo dirty signal |
393,6 → 412,19
FREEZE_DIS_NXT <= '1'; |
end if; |
|
when ASSIGN_D_PAGE => -- find dirty pages in cache |
------------------------------------------------------------------------------- |
if (DC_D_SEL_I = '1') then -- entry is dirty |
DC_ADR_BUF_NXT <= DC_A_SEL_I; |
WB_ADR_BUF_NXT <= DC_A_SEL_I; |
BASE_BUF_NXT <= DC_A_SEL_I; |
ARB_STATE_NXT <= UPLOAD_D_PAGE; |
elsif (to_integer(unsigned(PAGE_BUF)) = 0) then -- all pages analyzed |
ARB_STATE_NXT <= END_TRANSFER; |
else |
PAGE_BUF_NXT <= Std_Logic_Vector(unsigned(PAGE_BUF)-1); |
end if; |
|
when UPLOAD_D_PAGE => -- copy d-cache page to main memory |
------------------------------------------------------------------------------- |
WB_TGC_O(5) <= '0'; -- indicate data transfer |
406,10 → 438,11
WB_ADR_BUF_NXT <= DC_ADR_BUF; |
VA_CYC_BUF_NXT <= '1'; |
if (WB_ADR_BUF = Std_Logic_Vector(unsigned(BASE_BUF) + (D_CACHE_PAGE_SIZE-1)*4)) then |
if (WB_ACK_BUF = '1') then -- cycle complete? |
if (to_integer(unsigned(WB_ACK_CNT)) >= D_CACHE_PAGE_SIZE) then --(WB_ACK_BUF = '1') then -- cycle complete? |
DC_DRT_ACK_O <= '1'; -- ack of dirty signal |
------- if still dirty |
WB_CTI_O <= WB_BST_END_CYC; |
ARB_STATE_NXT <= END_TRANSFER; |
DC_DRT_ACK_O <= '1'; -- ack of dirty signal |
VA_CYC_BUF_NXT <= '0'; |
end if; |
end if; |
419,7 → 452,7
-- Timeout or abnormal cycle termination -- |
if (TIMEOUT_CNT >= C_BUS_CYCC_I) or (WB_ERR_BUF = '1') then |
WB_CTI_O <= WB_BST_END_CYC; |
ARB_STATE_NXT <= END_TRANSFER; |
ARB_STATE_NXT <= ASSIGN_D_PAGE; |
DC_DRT_ACK_O <= '1'; -- ack dirty signal |
D_ABORT_O <= '1'; |
FREEZE_DIS_NXT <= '1'; |
/storm_core/trunk/rtl/CORE.vhd
21,7 → 21,7
-- # | -> stnolting@googlemail.com # |
-- # | -> stnolting@web.de # |
-- # *************************************************************************************************** # |
-- # Last modified: 02.03.2012 # |
-- # Last modified: 08.03.2012 # |
-- ####################################################################################################### |
|
library IEEE; |
70,6 → 70,7
D_CACHE_HIT : in STD_LOGIC; -- d-cache hit |
D_CACHE_FRESH : out STD_LOGIC; -- refresh d-cache |
D_CACHE_CIO : out STD_LOGIC; -- enable cached IO |
D_CACHE_SYNC : in STD_LOGIC; -- cache is sync |
|
-- ############################################################################################### |
-- ## Instruction Cache Interface ## |
92,6 → 93,7
C_WTHRU_O : out STD_LOGIC; -- write through |
IO_PORT_OUT : out STD_LOGIC_VECTOR(15 downto 0); -- direct output |
IO_PORT_IN : in STD_LOGIC_VECTOR(15 downto 0); -- direct input |
ADR_FEEDBACK_I : in STD_LOGIC_VECTOR(31 downto 0); -- address feedback for exceptions |
|
-- ############################################################################################### |
-- ## Interrupt Interface ## |
253,8 → 255,10
IC_MISS_I => I_CACHE_MISS, -- i-cache miss accessear i-cache |
C_WTHRU_O => C_WTHRU_O, -- write through |
CACHED_IO_O => D_CACHE_CIO, -- en cached IO |
DC_SYNC_I => D_CACHE_SYNC, -- d-cache is sync |
IO_PORT_O => IO_PORT_OUT, -- direct output |
IO_PORT_I => IO_PORT_IN -- direct input |
IO_PORT_I => IO_PORT_IN, -- direct input |
ADR_FEEDBACK_I => ADR_FEEDBACK_I -- adr feedback for exception handling |
); |
|
|
/storm_core/trunk/rtl/CORE_PKG.vhd
5,7 → 5,7
-- # This file contains all needed components and # |
-- # system parameters for the STORM Core processor. # |
-- # +-------------------------------------------------+ # |
-- # Last modified: 02.03.2012 # |
-- # Last modified: 08.03.2012 # |
-- ####################################################### |
|
library IEEE; |
160,12 → 160,11
constant CP_ID_REG_0 : natural := 0; -- ID register 0 |
constant CP_ID_REG_1 : natural := 1; -- ID register 1 |
constant CP_ID_REG_2 : natural := 2; -- ID register 2 |
constant CP_ID_REG_3 : natural := 3; -- ID register 3 |
constant CP_ID_REG_4 : natural := 4; -- ID register 4 |
constant CP_ID_REG_5 : natural := 5; -- ID register 5 |
|
constant CP_SYS_CTRL_0 : natural := 6; -- system control register 0 |
constant CP_SYS_CTRL_1 : natural := 7; -- system control register 1 |
|
constant CP_CSTAT : natural := 8; -- cache statistics register |
constant CP_BUS_AFB : natural := 9; -- bus unit adr feedback |
|
constant CP_LFSR_POLY : natural := 11; -- Internal lfsr, polynomial |
constant CP_LFSR_DATA : natural := 12; -- Internal lfsr, shift register |
178,15 → 177,16
constant CP_IO_I_LSB : natural := 16; -- input LSB |
constant CP_IO_I_MSB : natural := 31; -- input MSB |
|
-- INTERNAL COPROCESSOR, SYSTEM CONTROL REGISTER 0 ---------------------------------------- |
-- SYSTEM CONTROL REGISTER 0 -------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
constant CSCR0_FDC : natural := 0; -- flush d-cache |
constant CSCR0_CDC : natural := 1; -- clear d-cache |
constant CSCR0_CIC : natural := 2; -- flush i-cache |
constant CSCR0_CWT : natural := 3; -- d-cache write-thru enable |
constant CSCR0_DAR : natural := 4; -- auto pre-refresh d-cache for new access |
constant CSCR0_IAR : natural := 5; -- auto pre-refresh i-cache for new access |
constant CSCR0_DAR : natural := 4; -- d-cache "read through" |
constant CSCR0_IAR : natural := 5; -- i-cache "read through" |
constant CSCR0_CIO : natural := 6; -- enable cached IO |
constant CSCR0_DCS : natural := 7; -- d-cache is sync |
|
constant CSCR0_LFSRE : natural := 13; -- internal LFSR enable |
constant CSCR0_LFSRM : natural := 14; -- internal LFSR update mode (0:auto/1:access) |
332,8 → 332,10
IC_MISS_I : in STD_LOGIC; |
C_WTHRU_O : out STD_LOGIC; |
CACHED_IO_O : out STD_LOGIC; |
DC_SYNC_I : in STD_LOGIC; |
IO_PORT_O : out STD_LOGIC_VECTOR(15 downto 0); |
IO_PORT_I : in STD_LOGIC_VECTOR(15 downto 0) |
IO_PORT_I : in STD_LOGIC_VECTOR(15 downto 0); |
ADR_FEEDBACK_I : in STD_LOGIC_VECTOR(31 downto 0) |
); |
end component; |
|
553,11 → 555,13
P_DQ_I : in STD_LOGIC_VECTOR(01 downto 0); |
P_WE_I : in STD_LOGIC; |
B_CS_I : in STD_LOGIC; |
B_P_SEL_I : in STD_LOGIC_VECTOR(LOG2_CACHE_PAGES-1 downto 0); |
B_D_SEL_O : out STD_LOGIC; |
B_A_SEL_O : out STD_LOGIC_VECTOR(31 downto 0); |
B_ADR_I : in STD_LOGIC_VECTOR(31 downto 0); |
B_DATA_I : in STD_LOGIC_VECTOR(31 downto 0); |
B_DATA_O : out STD_LOGIC_VECTOR(31 downto 0); |
B_WE_I : in STD_LOGIC; |
B_BSA_O : out STD_LOGIC_VECTOR(31 downto 0); |
B_DRT_ACK_I : in STD_LOGIC; |
B_MSS_ACK_I : in STD_LOGIC; |
B_IO_ACC_I : in STD_LOGIC; |
567,7 → 571,8
C_MISS_O : out STD_LOGIC; |
C_HIT_O : out STD_LOGIC; |
C_DIRTY_O : out STD_LOGIC; |
C_WTHRU_I : in STD_LOGIC |
C_WTHRU_I : in STD_LOGIC; |
C_SYNC_O : out STD_LOGIC |
); |
end component; |
|
595,8 → 600,12
I_ABORT_O : out STD_LOGIC; |
C_BUS_CYCC_I : in STD_LOGIC_VECTOR(15 downto 0); |
CACHED_IO_I : in STD_LOGIC; |
ADR_FEEDBACK_O : out STD_LOGIC_VECTOR(31 downto 0); |
DC_CS_O : out STD_LOGIC; |
DC_P_ADR_I : in STD_LOGIC_VECTOR(31 downto 0); |
DC_P_SEL_O : out STD_LOGIC_VECTOR(LOG2_D_CACHE_PAGES-1 downto 0); |
DC_D_SEL_I : in STD_LOGIC; |
DC_A_SEL_I : in STD_LOGIC_VECTOR(31 downto 0); |
DC_P_CS_I : in STD_LOGIC; |
DC_P_WE_I : in STD_LOGIC; |
DC_ADR_O : out STD_LOGIC_VECTOR(31 downto 0); |
605,7 → 614,6
DC_WE_O : out STD_LOGIC; |
DC_MISS_I : in STD_LOGIC; |
DC_DIRTY_I : in STD_LOGIC; |
DC_BSA_I : in STD_LOGIC_VECTOR(31 downto 0); |
DC_DRT_ACK_O : out STD_LOGIC; |
DC_MSS_ACK_O : out STD_LOGIC; |
DC_IO_ACC_O : out STD_LOGIC; |
656,6 → 664,7
D_CACHE_HIT : in STD_LOGIC; |
D_CACHE_FRESH : out STD_LOGIC; |
D_CACHE_CIO : out STD_LOGIC; |
D_CACHE_SYNC : in STD_LOGIC; |
I_CACHE_REQ : out STD_LOGIC; |
I_CACHE_ADR : out STD_LOGIC_VECTOR(31 downto 0); |
I_CACHE_RD_DTA : in STD_LOGIC_VECTOR(31 downto 0); |
668,6 → 677,7
C_WTHRU_O : out STD_LOGIC; |
IO_PORT_OUT : out STD_LOGIC_VECTOR(15 downto 0); |
IO_PORT_IN : in STD_LOGIC_VECTOR(15 downto 0); |
ADR_FEEDBACK_I : in STD_LOGIC_VECTOR(31 downto 0); |
IRQ : in STD_LOGIC; |
FIQ : in STD_LOGIC |
); |
/storm_core/trunk/rtl/MC_SYS.vhd
3,7 → 3,7
-- # *************************************************** # |
-- # Machine Control System # |
-- # *************************************************** # |
-- # Last modified: 15.02.2012 # |
-- # Last modified: 08.03.2012 # |
-- ####################################################### |
|
library IEEE; |
81,6 → 81,7
IC_MISS_I : in STD_LOGIC; -- i-cache miss access |
C_WTHRU_O : out STD_LOGIC; -- write through |
CACHED_IO_O : out STD_LOGIC; -- en cached IO |
DC_SYNC_I : in STD_LOGIC; -- d-cache is sync |
|
-- ############################################################################################### |
-- ## System Control ## |
87,7 → 88,8
-- ############################################################################################### |
|
IO_PORT_O : out STD_LOGIC_VECTOR(15 downto 0); -- direct output |
IO_PORT_I : in STD_LOGIC_VECTOR(15 downto 0) -- direct input |
IO_PORT_I : in STD_LOGIC_VECTOR(15 downto 0); -- direct input |
ADR_FEEDBACK_I : in STD_LOGIC_VECTOR(31 downto 0) -- adr feedback for exception handling |
|
); |
end MC_SYS; |
210,7 → 212,7
-- --------------------------------------------------------------------------------------------------- |
|
-- Pending external interrupt request to stop instruction fetch until pipeline is empty -- |
PEND_XI_REQ_O <= (EXT_INT_REQ_SYNC(0) or EXT_INT_REQ_SYNC(1) or EXT_INT_REQ_SYNC(2) or EXT_INT_REQ_SYNC(3)); |
PEND_XI_REQ_O <= EXT_INT_REQ_SYNC(0) or EXT_INT_REQ_SYNC(1) or EXT_INT_REQ_SYNC(2) or EXT_INT_REQ_SYNC(3); |
|
-- FIQ Trap taken -- |
FIQ_TAKEN_NXT <= EXT_INT_REQ_SYNC(0) and EMPTY_PIPE_I and NO_BR_PIPE; |
482,7 → 484,7
if rising_edge(CLK_I) then |
if (RST_I = '1') then |
CP_REG_FILE <= (others => (others => '0')); -- clear all |
CP_REG_FILE(CP_ID_REG_0) <= x"07DC0301"; -- core update date |
CP_REG_FILE(CP_ID_REG_0) <= x"07DC0308"; -- core update date |
CP_REG_FILE(CP_ID_REG_1) <= x"53744E6F"; -- My ID |
CP_REG_FILE(CP_ID_REG_2) <= x"34373838"; -- My ID ;) |
CP_REG_FILE(CP_SYS_CTRL_0)(CSCR0_MBC_15 downto CSCR0_MBC_0) <= x"0100"; -- max cycle length |
495,6 → 497,7
CP_REG_FILE(CP_SYS_CTRL_0)(CSCR0_FDC) <= '0'; -- auto-reset flush d-cache |
CP_REG_FILE(CP_SYS_CTRL_0)(CSCR0_CDC) <= '0'; -- auto-reset clear d-cache |
CP_REG_FILE(CP_SYS_CTRL_0)(CSCR0_CIC) <= '0'; -- auto-reset clear i-cache |
CP_REG_FILE(CP_SYS_CTRL_0)(CSCR0_DCS) <= DC_SYNC_I; -- d-cache sync |
end if; |
|
-- Cache Statistic Register --------------------------------------------------- |
509,6 → 512,9
CP_REG_FILE(CP_CSTAT)(31 downto 16) <= Std_Logic_Vector(unsigned(CP_REG_FILE(CP_CSTAT)(31 downto 16)) + 1); |
end if; |
|
-- Bus Unit Address Feedback -------------------------------------------------- |
CP_REG_FILE(CP_BUS_AFB) <= ADR_FEEDBACK_I; |
|
-- Internal LFSR:: Polynomial Register ---------------------------------------- |
if (G_HALT_I = '0') and (cr_w_acc_v = '1') and (cp_adr_v = CP_LFSR_POLY) then |
CP_REG_FILE(CP_LFSR_POLY) <= MCR_DATA_I; |
/storm_core/trunk/doc/STORM CORE datasheet.pdf
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/storm_core/trunk/software/C/storm_core.h
6,7 → 6,7
// |
// Created by Stephan Nolting (stnolting@googlemail.com) |
// http://www.opencores.com/project,storm_core |
// Last modified 15. Feb. 2012 |
// Last modified 08. Mar. 2012 |
//////////////////////////////////////////////////////////////////////////////// |
|
/* Internal System Coprocessor Register Set */ |
14,14 → 14,9
#define ID_REG_0 0 // ID register 0 |
#define ID_REG_1 1 // ID register 1 |
#define ID_REG_2 2 // ID register 2 |
#define ID_REG_3 3 // ID register 3 |
#define ID_REG_4 4 // ID register 4 |
#define ID_REG_5 5 // ID register 5 |
#define SYS_CTRL_0 6 // system control register 0 |
#define SYS_CTRL_1 7 // system control register 1 |
#define CSTAT 8 // cache statistics register |
#define TIME_THRES 9 // Internal timer, threshold value |
#define TIME_COUNT 10 // Internal timer, counter |
#define ADR_FB 9 // adr feedback from bus unit -> for exception handling |
#define LFSR_POLY 11 // Internal LFSR, polynomial |
#define LFSR_DATA 12 // Internal LFSR, shift register |
#define SYS_IO 13 // System IO ports |
33,9 → 28,6
#define DC_WTHRU 3 // cache write-thru enable |
#define DC_AUTOPR 4 // auto pre-reload d-cache page |
#define IC_AUTOPR 5 // auto pre-reload i-cache page |
#define TIME_EN 10 // enable internal timer |
#define TIME_INT 11 // int timer interrupt enable |
#define TIME_M 12 // int timer interrupt mode |
#define LFSR_EN 13 // enable lfsr |
#define LFSR_M 14 // lfsr update mode |
#define LFSR_D 15 // lfsr shift direction |