USE IEEE.std_logic_1164.all;
USE IEEE.numeric_std.all;
-USE WORK.mbl_Pkg.all;
-
+USE WORK.mbl_pkg.all;
----------------------------------------------------------
ENTITY exeq IS
);
PORT
(
+ IF2ID_i : IN IF2ID_Type;
+ --
ID2EX_i : IN ID2EX_Type;
+ delayBit_i : IN STD_LOGIC;
GPRF2EX_i : IN GPRF2EX_Type;
EX2IF_o : OUT EX2IF_Type;
EX2CTRL_o : OUT EX2CTRL_Type;
p_exeq:
PROCESS (ID2EX_i, GPRF2EX_i, EX_WRB_i, MEM_WRB_i,
- IMM_LOCK_i, MSR_i, HAZARD_WRB_i)
+ IF2ID_i, delayBit_i, IMM_LOCK_i, MSR_i, HAZARD_WRB_i)
-- function needed by BSLL (only if USE_BARREL_g = TRUE)
FUNCTION reverse_bits ( word32 : STD_LOGIC_VECTOR (31 DOWNTO 0) )
IMM32_v := hi16_v & ID2EX_i.IMM16;
CASE ID2EX_i.alu_Op1 IS
- WHEN ALU_IN_REGA => in1_v := data_rA_v;
- WHEN ALU_IN_NOT_REGA => in1_v := NOT data_rA_v;
- WHEN ALU_IN_PC => in1_v := ID2EX_i.program_counter;
- WHEN ALU_IN_ZERO => in1_v := C_32_ZEROS;
- WHEN OTHERS => NULL;
+ WHEN ALU_IN_REGA => in1_v := data_rA_v;
+ WHEN ALU_IN_NOT_REGA => in1_v := NOT data_rA_v;
+ WHEN ALU_IN_PC => in1_v := ID2EX_i.program_counter;
+ WHEN ALU_IN_ZERO => in1_v := C_32_ZEROS;
+ WHEN OTHERS => NULL;
END CASE;
CASE ID2EX_i.alu_Op2 IS
END IF;
WHEN A_MFS =>
- result_v := MSR_i.C & C_24_ZEROS & "0000" & MSR_i.C & MSR_i.IE & '0';
+ if (COMPATIBILITY_MODE_g = FALSE) THEN
+ result_v := C_24_ZEROS & "00000" & MSR_i.C & MSR_i.IE & '0';
+ ELSE
+ result_v := MSR_i.C & C_24_ZEROS & "0000" & MSR_i.C & MSR_i.IE & '0';
+ END IF;
WHEN A_MTS =>
MSR_o.IE <= data_Ra_v(1);
END IF;
END IF; -- (USE_BARREL_g = TRUE)
+ WHEN A_CLZ =>
+ tmp64_v := (OTHERS => '0');
+ leading_zeroes32 ( in1_v, UNSIGNED(tmp64_v(31 DOWNTO 0)), result_v );
+
WHEN OTHERS =>
NULL;
EX2MEM_o.wrix_rD <= ID2EX_i.curr_rD;
IF (ID2EX_i.branch_Action = BRL) THEN
EX2MEM_o.wrb_Action <= WRB_EX;
- EX2MEM_o.exeq_result <= ID2EX_i.program_counter;
- EX2MEM_o.data_rD <= ID2EX_i.program_counter;
+ IF (COMPATIBILITY_MODE_g = TRUE) OR (delayBit_i = '0') THEN
+ EX2MEM_o.exeq_result <= ID2EX_i.program_counter;
+ EX2MEM_o.data_rD <= ID2EX_i.program_counter;
+ ELSE
+ EX2MEM_o.exeq_result <= IF2ID_i.program_counter;
+ EX2MEM_o.data_rD <= IF2ID_i.program_counter;
+ END IF;
-- set data_rD_v, although unused, to prevent an inferred latch
data_rD_v := GPRF2EX_i.data_rD;
ELSE