OpenCores
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 12 to Rev 13
    Reverse comparison

Rev 12 → Rev 13

/storm_core/trunk/rtl/WB_UNIT.vhd
112,32 → 112,32
 
-- BYTE TRANSFER --
when "01000" => -- byte transfer, no offset, no sign extension
RD_DATA_TMP := x"000000" & ENDIAN_TMP(07 downto 00);
RD_DATA_TMP := x"000000" & ENDIAN_TMP(31 downto 24);
when "01001" => -- byte transfer, no offset, sign extension
RD_DATA_TMP(7 downto 0) := ENDIAN_TMP(07 downto 00);
RD_DATA_TMP(7 downto 0) := ENDIAN_TMP(31 downto 24);
for i in 8 to 31 loop
RD_DATA_TMP(i) := ENDIAN_TMP(07);
RD_DATA_TMP(i) := ENDIAN_TMP(31);
end loop;
when "01010" => -- byte transfer, one byte offset, no sign extension
RD_DATA_TMP := x"000000" & ENDIAN_TMP(15 downto 08);
RD_DATA_TMP := x"000000" & ENDIAN_TMP(23 downto 16);
when "01011" => -- byte transfer, one byte offset, sign extension
RD_DATA_TMP(7 downto 0) := ENDIAN_TMP(15 downto 08);
RD_DATA_TMP(7 downto 0) := ENDIAN_TMP(23 downto 16);
for i in 8 to 31 loop
RD_DATA_TMP(i) := ENDIAN_TMP(15);
RD_DATA_TMP(i) := ENDIAN_TMP(23);
end loop;
when "01100" => -- byte transfer, two bytes offset, no sign extension
RD_DATA_TMP := x"000000" & ENDIAN_TMP(23 downto 16);
RD_DATA_TMP := x"000000" & ENDIAN_TMP(15 downto 08);
when "01101" => -- byte transfer, two bytes offset, sign extension
RD_DATA_TMP(7 downto 0) := ENDIAN_TMP(23 downto 16);
RD_DATA_TMP(7 downto 0) := ENDIAN_TMP(15 downto 08);
for i in 8 to 31 loop
RD_DATA_TMP(i) := ENDIAN_TMP(23);
RD_DATA_TMP(i) := ENDIAN_TMP(15);
end loop;
when "01110" => -- byte transfer, three bytes offset, no sign extension
RD_DATA_TMP := x"000000" & ENDIAN_TMP(31 downto 24);
RD_DATA_TMP := x"000000" & ENDIAN_TMP(07 downto 00);
when "01111" => -- byte transfer, three bytes offset, sign extension
RD_DATA_TMP(7 downto 0) := ENDIAN_TMP(31 downto 24);
RD_DATA_TMP(7 downto 0) := ENDIAN_TMP(07 downto 00);
for i in 8 to 31 loop
RD_DATA_TMP(i) := ENDIAN_TMP(31);
RD_DATA_TMP(i) := ENDIAN_TMP(07);
end loop;
 
-- HALFWORD TRANSFER --
/storm_core/trunk/rtl/ACCESS_ARBITER.vhd
11,7 → 11,7
-- # If you want to disable resource 1, set the #
-- # switch address to 0x00000000. #
-- # ************************************************** #
-- # Version 1.1.0, 30.08.2011 #
-- # Version 1.1.1, 06.09.2011 #
-- ######################################################
 
library IEEE;
120,26 → 120,49
variable TEMP : STD_LOGIC_VECTOR(03 downto 00);
begin
TEMP := CL1_DQ_I & CL1_ADR_I(1 downto 0);
case (TEMP) is
when "0000" | "0001" | "0010" | "0011" => -- WORD with any offset
CL1_BYTE_SEL <= "1111";
when "0100" => -- BYTE with no offset
CL1_BYTE_SEL <= "0001";
when "0101" => -- BYTE with one byte offset
CL1_BYTE_SEL <= "0010";
when "0110" => -- BYTE with two bytes offset
CL1_BYTE_SEL <= "0100";
when "0111" => -- BYTE with three bytes offset
CL1_BYTE_SEL <= "1000";
when "1000" | "1100" => -- HALFWORD with no offset
CL1_BYTE_SEL <= "0011";
when "1001" | "1101" => -- HALFWORD with one byte offset
CL1_BYTE_SEL <= "0110";
when "1010" | "1110" => -- HALFWORD with two bytes offset
CL1_BYTE_SEL <= "1100";
when others => -- HALFWORD with three bytes offset
CL1_BYTE_SEL <= "1001";
end case;
if (USE_BIG_ENDIAN = TRUE) then
case (TEMP) is
when "0000" | "0001" | "0010" | "0011" => -- WORD with any offset
CL1_BYTE_SEL <= "1111";
when "0100" => -- BYTE with no offset
CL1_BYTE_SEL <= "1000";
when "0101" => -- BYTE with one byte offset
CL1_BYTE_SEL <= "0100";
when "0110" => -- BYTE with two bytes offset
CL1_BYTE_SEL <= "0010";
when "0111" => -- BYTE with three bytes offset
CL1_BYTE_SEL <= "0001";
when "1000" | "1100" => -- HALFWORD with no offset
CL1_BYTE_SEL <= "1100";
when "1001" | "1101" => -- HALFWORD with one byte offset
CL1_BYTE_SEL <= "0110";
when "1010" | "1110" => -- HALFWORD with two bytes offset
CL1_BYTE_SEL <= "0011";
when others => -- HALFWORD with three bytes offset
CL1_BYTE_SEL <= "1001";
end case;
else
case (TEMP) is
when "0000" | "0001" | "0010" | "0011" => -- WORD with any offset
CL1_BYTE_SEL <= "1111";
when "0100" => -- BYTE with no offset
CL1_BYTE_SEL <= "0001";
when "0101" => -- BYTE with one byte offset
CL1_BYTE_SEL <= "0010";
when "0110" => -- BYTE with two bytes offset
CL1_BYTE_SEL <= "0100";
when "0111" => -- BYTE with three bytes offset
CL1_BYTE_SEL <= "1000";
when "1000" | "1100" => -- HALFWORD with no offset
CL1_BYTE_SEL <= "0011";
when "1001" | "1101" => -- HALFWORD with one byte offset
CL1_BYTE_SEL <= "0110";
when "1010" | "1110" => -- HALFWORD with two bytes offset
CL1_BYTE_SEL <= "1100";
when others => -- HALFWORD with three bytes offset
CL1_BYTE_SEL <= "1001";
end case;
end if;
end process CLIENT1_DQ_DECODER;
 
 
147,26 → 170,49
variable TEMP : STD_LOGIC_VECTOR(03 downto 00);
begin
TEMP := CL2_DQ_I & CL2_ADR_I(1 downto 0);
case (TEMP) is
when "0000" | "0001" | "0010" | "0011" => -- WORD with any offset
CL2_BYTE_SEL <= "1111";
when "0100" => -- BYTE with no offset
CL2_BYTE_SEL <= "0001";
when "0101" => -- BYTE with one byte offset
CL2_BYTE_SEL <= "0010";
when "0110" => -- BYTE with two bytes offset
CL2_BYTE_SEL <= "0100";
when "0111" => -- BYTE with three bytes offset
CL2_BYTE_SEL <= "1000";
when "1000" | "1100" => -- HALFWORD with no offset
CL2_BYTE_SEL <= "0011";
when "1001" | "1101" => -- HALFWORD with one byte offset
CL2_BYTE_SEL <= "0110";
when "1010" | "1110" => -- HALFWORD with two bytes offset
CL2_BYTE_SEL <= "1100";
when others => -- HALFWORD with three bytes offset
CL2_BYTE_SEL <= "1001";
end case;
if (USE_BIG_ENDIAN = TRUE) then
case (TEMP) is
when "0000" | "0001" | "0010" | "0011" => -- WORD with any offset
CL2_BYTE_SEL <= "1111";
when "0100" => -- BYTE with no offset
CL2_BYTE_SEL <= "1000";
when "0101" => -- BYTE with one byte offset
CL2_BYTE_SEL <= "0100";
when "0110" => -- BYTE with two bytes offset
CL2_BYTE_SEL <= "0010";
when "0111" => -- BYTE with three bytes offset
CL2_BYTE_SEL <= "0001";
when "1000" | "1100" => -- HALFWORD with no offset
CL2_BYTE_SEL <= "1100";
when "1001" | "1101" => -- HALFWORD with one byte offset
CL2_BYTE_SEL <= "0110";
when "1010" | "1110" => -- HALFWORD with two bytes offset
CL2_BYTE_SEL <= "0011";
when others => -- HALFWORD with three bytes offset
CL2_BYTE_SEL <= "1001";
end case;
else
case (TEMP) is
when "0000" | "0001" | "0010" | "0011" => -- WORD with any offset
CL2_BYTE_SEL <= "1111";
when "0100" => -- BYTE with no offset
CL2_BYTE_SEL <= "0001";
when "0101" => -- BYTE with one byte offset
CL2_BYTE_SEL <= "0010";
when "0110" => -- BYTE with two bytes offset
CL2_BYTE_SEL <= "0100";
when "0111" => -- BYTE with three bytes offset
CL2_BYTE_SEL <= "1000";
when "1000" | "1100" => -- HALFWORD with no offset
CL2_BYTE_SEL <= "0011";
when "1001" | "1101" => -- HALFWORD with one byte offset
CL2_BYTE_SEL <= "0110";
when "1010" | "1110" => -- HALFWORD with two bytes offset
CL2_BYTE_SEL <= "1100";
when others => -- HALFWORD with three bytes offset
CL2_BYTE_SEL <= "1001";
end case;
end if;
end process CLIENT2_DQ_DECODER;
 
 
269,12 → 315,12
CL1_DELAY_EN <= CL1_DELAY_EN_NXT;
CL2_DELAY_EN <= CL2_DELAY_EN_NXT;
SAH_EN <= SAH_EN_NXT;
if ((COLLISION and (not COLL_FLAG)) = '0') then
--if ((COLLISION and (not COLL_FLAG)) = '0') then
CL1_RE1_REQ_FF <= CL1_RE1_REQ;
CL1_RE2_REQ_FF <= CL1_RE2_REQ;
CL2_RE1_REQ_FF <= CL2_RE1_REQ;
CL2_RE2_REQ_FF <= CL2_RE2_REQ;
end if;
--end if;
end if;
end if;
end process CTRL_UNIT;
/storm_core/trunk/rtl/STORM_TOP_TB.vhd
84,7 → 84,7
 
-- Wishbone simulation --------------------------------------------------------------------
-- -------------------------------------------------------------------------------------------
WB_DATA_I <= (others => '0');
WB_DATA_I <= x"00030000";
WB_ACK_I <= '1';
 
 
/storm_core/trunk/rtl/OPERAND_UNIT.vhd
235,7 → 235,7
HOLD_BUS_OUT(0) <= '1'; -- enable
end if;
elsif (MEM_MATCH = '1') and (ALU_FW_IN(FWD_MEM_R_ACC) = '1') then
elsif (MEM_MATCH = '1') and (MEM_FW_IN(FWD_MEM_R_ACC) = '1') then
-- MEM Register Match with MEM_R access
HOLD_BUS_OUT(2 downto 1) <= "01"; -- 1
HOLD_BUS_OUT(0) <= '1'; -- disable
/storm_core/trunk/rtl/CORE.vhd
137,6 → 137,7
signal EXC_PC : STD_LOGIC_VECTOR(31 downto 0); -- PC value for exceptions
signal WB_CTRL : STD_LOGIC_VECTOR(31 downto 0); -- WB stage control lines
signal WB_DATA_LINE : STD_LOGIC_VECTOR(31 downto 0); -- data write back line
signal MODE_INT : STD_LOGIC_VECTOR(04 downto 0); -- current processor mode
 
begin
-- #######################################################################################################
223,7 → 224,20
I_MEM_ADR <= INF_PC;
I_MEM_DQ <= DQ_WORD;
 
-- Delay 'MODE' for 1 cycle, so it is sync to memory interface signals
-- ------------------------------------------------------------------------------
MODE_SYNC: process(gCLK, gRES, G_HALT)
begin
if rising_edge(gCLK) then
if (gRES = '1') then
MODE <= (others => '0');
elsif (G_HALT = '0') then
MODE <= MODE_INT;
end if;
end if;
end process MODE_SYNC;
 
 
-- #######################################################################################################
-- ## PIPELINE STAGE 2: OPERAND FETCH & INSTRUCITON DECODE ##
-- #######################################################################################################
352,7 → 366,7
ADR_OUT => MEM_ADR_OUT, -- address bypass output
BP_OUT => MEM_BP_OUT, -- bypass(data) output
LDST_FW_OUT => MEM_FW_PATH, -- memory forwarding path
XMEM_MODE => MODE, -- processor mode for access
XMEM_MODE => MODE_INT, -- processor mode for access
XMEM_ADR => D_MEM_ADR, -- D memory address output
XMEM_WR_DTA => D_MEM_WR_DTA, -- memory write data output
XMEM_ACC_REQ => D_MEM_REQ, -- access request
/storm_core/trunk/rtl/LOAD_STORE_UNIT.vhd
114,6 → 114,7
LDST_FW_OUT(FWD_RD_MSB downto FWD_RD_LSB) <= CTRL_IN(CTRL_RD_3 downto CTRL_RD_0);
LDST_FW_OUT(FWD_WB) <= CTRL_IN(CTRL_EN) and CTRL_IN(CTRL_WB_EN);
LDST_FW_OUT(FWD_DATA_MSB downto FWD_DATA_LSB) <= BP_TEMP;
LDST_FW_OUT(FWD_MEM_R_ACC) <= CTRL_IN(CTRL_EN) and CTRL_IN(CTRL_MEM_ACC) and (not CTRL_IN(CTRL_MEM_RW));
 
 
 

powered by: WebSVN 2.1.0

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