]> rtime.felk.cvut.cz Git - fpga/lx-cpu1/tumbl.git/blobdiff - hw/exeq.vhd
Core updates
[fpga/lx-cpu1/tumbl.git] / hw / exeq.vhd
index 03477128f2c0390bfa9720906e908b417c462468..ec5a6b12bbdb284f414a03b2f60eb0b798a79108 100644 (file)
@@ -23,8 +23,7 @@ LIBRARY IEEE;
 
 USE IEEE.std_logic_1164.all;
 USE IEEE.numeric_std.all;
-USE WORK.mbl_Pkg.all;
-
+USE WORK.mbl_pkg.all;
 
 ----------------------------------------------------------
 ENTITY exeq IS
@@ -37,7 +36,10 @@ 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;
@@ -68,7 +70,7 @@ BEGIN
 
 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) )
@@ -173,11 +175,11 @@ p_exeq:
                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
@@ -271,7 +273,11 @@ p_exeq:
                                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);
@@ -315,6 +321,10 @@ p_exeq:
                                        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;
 
@@ -382,8 +392,13 @@ p_exeq:
                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