]> rtime.felk.cvut.cz Git - fpga/lx-cpu1/tumbl.git/blobdiff - hw/mbl_Pkg.vhd
Customized instruction set (with compatibility mode)
[fpga/lx-cpu1/tumbl.git] / hw / mbl_Pkg.vhd
index 48e1162d2ae0c2a781aae3670d6bbec815e3344e..2b535858c1387fc6b2c3a5c645a1b2e6e96c1654 100644 (file)
@@ -9,7 +9,8 @@
 --                Faculty EEMCS, Department ME&CE, Circuits and Systems
 --  Date:         September, 2010
 --
---  Modified:          June, 2011: ALU_ACTION_Type extended to incorporate
+--  Modified:     September, 2013: Removed FSL
+--                     June, 2011: ALU_ACTION_Type extended to incorporate
 --                                 MUL and BS instructions (Huib)
 --                                 Adapted to work with separate fsl_M-
 --                                 and fsl_S selectors and automatic
@@ -44,14 +45,13 @@ PACKAGE mbl_Pkg IS
 
     TYPE ALU_ACTION_Type    IS (A_NOP, A_ADD, A_CMP, A_CMPU, A_OR, A_AND, A_XOR,
                                         A_SHIFT, A_SEXT8, A_SEXT16, A_MFS, A_MTS,
-                                                    A_MUL, A_BSLL, A_BSRL, A_BSRA,
-                                                             A_FSL_GET, A_FSL_PUT);
+                                        A_MUL, A_BSLL, A_BSRL, A_BSRA, A_HALT);
     TYPE ALU_IN1_Type       IS (ALU_IN_REGA, ALU_IN_NOT_REGA, ALU_IN_PC, ALU_IN_ZERO);
     TYPE ALU_IN2_Type       IS (ALU_IN_REGB, ALU_IN_NOT_REGB, ALU_IN_IMM, ALU_IN_NOT_IMM);
     TYPE ALU_CIN_Type       IS (CIN_ZERO, CIN_ONE, FROM_MSR, FROM_IN1);
     TYPE MSR_ACTION_Type    IS (UPDATE_CARRY, KEEP_CARRY);
     TYPE BRANCH_ACTION_Type IS (NO_BR, BR, BRL, BEQ, BNE, BLT, BLE, BGT, BGE);
-    TYPE WRB_ACTION_Type    IS (NO_WRB, WRB_EX, WRB_MEM, WRB_FSL);
+    TYPE WRB_ACTION_Type    IS (NO_WRB, WRB_EX, WRB_MEM);
     TYPE MEM_ACTION_Type    IS (NO_MEM, WR_MEM, RD_MEM);
     TYPE TRANSFER_SIZE_Type IS (WORD, HALFWORD, BYTE);
     TYPE SAVE_REG_Type      IS (NO_SAVE, SAVE_RA, SAVE_RB);
@@ -76,10 +76,6 @@ PACKAGE mbl_Pkg IS
         mem_Action       : MEM_ACTION_Type;         -- rd_mem implies writeback
         transfer_Size    : TRANSFER_SIZE_Type;
         wrb_Action       : WRB_ACTION_Type;
-        FSL_Non_blocking : STD_LOGIC;               -- ncta
-        FSL_Control      : STD_LOGIC;
-        FSL_Test         : STD_LOGIC;
-        FSL_Atomic       : STD_LOGIC;
     END RECORD;
 
     TYPE ID2GPRF_Type IS RECORD
@@ -113,7 +109,6 @@ PACKAGE mbl_Pkg IS
     TYPE MSR_Type IS RECORD
         IE  : STD_LOGIC;        -- MSR[VHDL b1] = [MicroBlaze b30]
         C   : STD_LOGIC;        -- MSR[VHDL b2 and b31] = [MicroBlaze b29 and b0]
-        FSL : STD_LOGIC;        -- MSR[VHDL b4] = [MicroBlaze b27]
     END RECORD;
 
     TYPE EX2IF_Type IS RECORD
@@ -121,6 +116,11 @@ PACKAGE mbl_Pkg IS
         branch_target : STD_LOGIC_VECTOR (31 DOWNTO 0);
     END RECORD;
 
+    TYPE HALT_Type IS RECORD
+        halt          : STD_LOGIC;
+        halt_code     : STD_LOGIC_VECTOR ( 4 DOWNTO 0);
+    END RECORD;
+
     TYPE EX2MEM_Type IS RECORD
         mem_Action      : MEM_ACTION_Type;                  -- RD_MEM implies writeback
         wrb_Action      : WRB_ACTION_Type;
@@ -143,31 +143,6 @@ PACKAGE mbl_Pkg IS
         data_rD : STD_LOGIC_VECTOR (31 DOWNTO 0);
     END RECORD;
 
-    TYPE EX2FSL_M_Type IS RECORD
-        FSLx_M    : STD_LOGIC_VECTOR ( 3 DOWNTO 0);
-        M_Write   : STD_LOGIC;
-        M_Data    : STD_LOGIC_VECTOR (31 DOWNTO 0);
-        M_Control : STD_LOGIC;
-    END RECORD;
-
-    TYPE FSL_M2EX_Type IS RECORD
-        M_Full    : STD_LOGIC;
-    END RECORD;
-
-    TYPE EX2FSL_S_Type IS RECORD
-        FSLx_S    : STD_LOGIC_VECTOR ( 3 DOWNTO 0);
-        S_Read    : STD_LOGIC;
-    END RECORD;
-
-    TYPE FSL_S2EX_Type IS RECORD
-        S_Control : STD_LOGIC;
-        S_Exists  : STD_LOGIC;
-    END RECORD;
-
-    TYPE FSL_S2MEM_Type IS RECORD
-        S_Data    : STD_LOGIC_VECTOR (31 DOWNTO 0);
-    END RECORD;
-
     TYPE MEM_REG_Type IS RECORD
         wrb_Action  : WRB_ACTION_Type;
         exeq_result : STD_LOGIC_VECTOR (31 DOWNTO 0);
@@ -198,34 +173,6 @@ PACKAGE mbl_Pkg IS
     -- NOTE: Use the named association format  xxxx := ( 0 => X"A0010000" );
     --       in case the array has to contain only one element !!
 
-    TYPE CORE2FSL_M_Type IS RECORD
-        -- connect M_Clk directly to highest level clock
-        M_Write   : STD_LOGIC;
-        M_Data    : STD_LOGIC_VECTOR (31 DOWNTO 0);
-        M_Control : STD_LOGIC;
-    END RECORD;
-
-    TYPE FSL_M2CORE_Type IS RECORD
-        M_Full    : STD_LOGIC;
-    END RECORD;
-
-    TYPE CORE2FSL_S_Type IS RECORD
-        -- connect S_Clk directly to highest level clock
-        S_Read    : STD_LOGIC;
-    END RECORD;
-
-    TYPE FSL_S2CORE_Type IS RECORD
-        S_Exists  : STD_LOGIC;
-        S_Data    : STD_LOGIC_VECTOR (31 DOWNTO 0);
-        S_Control : STD_LOGIC;
-    END RECORD;
-
-    TYPE CORE2FSL_M_ARRAY_Type IS ARRAY(NATURAL RANGE <>) OF CORE2FSL_M_Type;
-    TYPE FSL_M2CORE_ARRAY_Type IS ARRAY(NATURAL RANGE <>) OF FSL_M2CORE_Type;
-    TYPE CORE2FSL_S_ARRAY_Type IS ARRAY(NATURAL RANGE <>) OF CORE2FSL_S_Type;
-    TYPE FSL_S2CORE_ARRAY_Type IS ARRAY(NATURAL RANGE <>) OF FSL_S2CORE_Type;
-
-
 ----------------------------------------------------------------------------------------------
 -- COMPONENTS
 ----------------------------------------------------------------------------------------------
@@ -241,8 +188,9 @@ PACKAGE mbl_Pkg IS
 
     COMPONENT decode IS
         GENERIC (
-            USE_HW_MUL_g : BOOLEAN := FALSE;
-            USE_BARREL_g : BOOLEAN := FALSE
+            USE_HW_MUL_g : BOOLEAN := TRUE;
+            USE_BARREL_g : BOOLEAN := TRUE;
+            COMPATIBILITY_MODE_g : BOOLEAN := FALSE
             );
         PORT (
             IF2ID_i     :  IN IF2ID_Type;
@@ -252,7 +200,9 @@ PACKAGE mbl_Pkg IS
             ID2EX_o     : OUT ID2EX_Type;
             --
             INT_CTRL_i  :  IN INT_CTRL_Type;
-            ID2CTRL_o   : OUT ID2CTRL_Type
+            ID2CTRL_o   : OUT ID2CTRL_Type;
+            --
+            noLiteOpc_o : OUT STD_LOGIC
             );
     END COMPONENT;
 
@@ -279,6 +229,7 @@ PACKAGE mbl_Pkg IS
             ID2EX_i      :  IN ID2EX_Type;
             GPRF2EX_i    :  IN GPRF2EX_Type;
             EX2IF_o      : OUT EX2IF_Type;
+            HALT_o       : OUT HALT_Type;
             --
             EX_WRB_i     :  IN WRB_Type;
             EX_WRB_o     : OUT WRB_Type;
@@ -293,17 +244,7 @@ PACKAGE mbl_Pkg IS
             MSR_i        :  IN MSR_Type;
             MSR_o        : OUT MSR_Type;
             --
-            EX2MEM_o     : OUT EX2MEM_Type;
-            --
-            exq_branch_i :  IN STD_LOGIC;
-            --
-            FSL_M2EX_i   :  IN FSL_M2EX_Type;
-            EX2FSL_M_o   : OUT EX2FSL_M_Type;
-            --
-            FSL_S2EX_i   :  IN FSL_S2EX_Type;
-            EX2FSL_S_o   : OUT EX2FSL_S_Type;
-            --
-            FSL_nStall_o : OUT STD_LOGIC
+            EX2MEM_o     : OUT EX2MEM_Type
             );
     END COMPONENT;
 
@@ -314,8 +255,6 @@ PACKAGE mbl_Pkg IS
             DMEMB_i     :  IN DMEMB2CORE_Type;
             DMEMB_o     : OUT CORE2DMEMB_Type;
             --
-            FSL_S2MEM_i :  IN FSL_S2MEM_Type;
-            --
             MEM_REG_i   :  IN MEM_REG_Type;
             MEM_REG_o   : OUT MEM_REG_Type;
             --
@@ -325,11 +264,18 @@ PACKAGE mbl_Pkg IS
     END COMPONENT;
 
     COMPONENT core_ctrl IS
+        GENERIC (
+            COMPATIBILITY_MODE_g : BOOLEAN := FALSE
+            );
         PORT (
             clk_i           :  IN STD_LOGIC;
             rst_i           :  IN STD_LOGIC;
-    --      halt_i          :  IN STD_LOGIC;
+            halt_i          :  IN STD_LOGIC;
+            bad_op_i        :  IN STD_LOGIC;
             int_i           :  IN STD_LOGIC;
+            trace_i         :  IN STD_LOGIC;
+            trace_kick_i    :  IN STD_LOGIC;
+            core_clken_o    : OUT STD_LOGIC;
             -- specific fetch i/o
             imem_addr_o     : OUT STD_LOGIC_VECTOR (31 DOWNTO 0);
             imem_clken_o    : OUT STD_LOGIC;
@@ -345,6 +291,8 @@ PACKAGE mbl_Pkg IS
             -- exeq to fetch feedback registers
             EX2IF_REG_i     :  IN EX2IF_Type;
             EX2IF_REG_o     : OUT EX2IF_Type;
+            -- exeq to core (halting)
+            exeq_halt_i     :  IN STD_LOGIC;
             -- exeq to mem pipeline registers
             EX2MEM_REG_i    :  IN EX2MEM_Type;
             EX2MEM_REG_o    : OUT EX2MEM_Type;
@@ -354,9 +302,6 @@ PACKAGE mbl_Pkg IS
             -- decode control i/o
             ID2CTRL_i       :  IN ID2CTRL_Type;
             INT_CTRL_o      : OUT INT_CTRL_Type;
-            -- FSL to mem data delay register(s)
-            FSL_S2MEM_REG_i :  IN FSL_S2MEM_Type;
-            FSL_S2MEM_REG_o : OUT FSL_S2MEM_Type;
             -- exeq control i/o
             EX_WRB_i        :  IN WRB_Type;
             EX_WRB_o        : OUT WRB_Type;
@@ -370,36 +315,7 @@ PACKAGE mbl_Pkg IS
             MSR_i           :  IN MSR_Type;
             MSR_o           : OUT MSR_Type;
             -- miscellaneous
-            MEM2CTRL_i      :  IN MEM2CTRL_Type;
-            FSL_nStall_i    :  IN STD_LOGIC;
-            done_o          : OUT STD_LOGIC
-            );
-    END COMPONENT;
-
-    COMPONENT fsl_M_selector IS
-        GENERIC (
-            N_FSL_M_g : POSITIVE RANGE 1 TO 16 :=  1    -- 1 upto 16
-            );
-        PORT (
-            EX2FSL_M_i    :  IN EX2FSL_M_Type;
-            FSL_M2EX_o    : OUT FSL_M2EX_Type;
-            --
-            FSL_M_ARRAY_i :  IN FSL_M2CORE_ARRAY_Type (0 TO N_FSL_M_g -1);
-            FSL_M_ARRAY_o : OUT CORE2FSL_M_ARRAY_Type (0 TO N_FSL_M_g -1)
-            );
-    END COMPONENT;
-
-    COMPONENT fsl_S_selector IS
-        GENERIC (
-            N_FSL_S_g : POSITIVE RANGE 1 TO 16 :=  1    -- 1 upto 16
-            );
-        PORT (
-            EX2FSL_S_i    :  IN EX2FSL_S_Type;
-            FSL_S2EX_o    : OUT FSL_S2EX_Type;
-            FSL_S2MEM_o   : OUT FSL_S2MEM_Type;
-            --
-            FSL_S_ARRAY_i :  IN FSL_S2CORE_ARRAY_Type (0 TO N_FSL_S_g -1);
-            FSL_S_ARRAY_o : OUT CORE2FSL_S_ARRAY_Type (0 TO N_FSL_S_g -1)
+            MEM2CTRL_i      :  IN MEM2CTRL_Type
             );
     END COMPONENT;
 
@@ -412,6 +328,10 @@ PACKAGE mbl_Pkg IS
                          VARIABLE s  : OUT STD_LOGIC_VECTOR (31 DOWNTO 0);
                          VARIABLE co : OUT STD_LOGIC );
 
+    PROCEDURE ep_add32nc ( a, b :  IN STD_LOGIC_VECTOR (31 DOWNTO 0);
+                         ci   :  IN STD_LOGIC;
+                         VARIABLE s  : OUT STD_LOGIC_VECTOR (31 DOWNTO 0));
+
 --  PROCEDURE ep_add32 ( a, b : IN STD_LOGIC_VECTOR; ci : IN STD_LOGIC;
 --                       VARIABLE s  : OUT STD_LOGIC_VECTOR;
 --                       VARIABLE co : OUT STD_LOGIC );
@@ -451,6 +371,29 @@ PACKAGE BODY mbl_Pkg IS
         END IF;
     END PROCEDURE;
 
+    PROCEDURE ep_add32nc (        a, b :  IN STD_LOGIC_VECTOR (31 DOWNTO 0);
+                                ci   :  IN STD_LOGIC;
+                         VARIABLE s  : OUT STD_LOGIC_VECTOR (31 DOWNTO 0) ) IS
+
+        CONSTANT NBITS_LO_c : POSITIVE := 17;
+        CONSTANT NBITS_HI_c : POSITIVE := 32 -NBITS_LO_c;
+        VARIABLE tmp_lo_v   : STD_LOGIC_VECTOR (NBITS_LO_c +1 DOWNTO 0);
+        VARIABLE tmp_hi0_v  : STD_LOGIC_VECTOR (NBITS_HI_c +1 DOWNTO 0);
+        VARIABLE tmp_hi1_v  : STD_LOGIC_VECTOR (NBITS_HI_c +1 DOWNTO 0);
+    BEGIN
+        tmp_lo_v  := STD_LOGIC_VECTOR( UNSIGNED( '0' & a(NBITS_LO_c -1 DOWNTO  0) & '1' ) +
+                                       UNSIGNED( '0' & b(NBITS_LO_c -1 DOWNTO  0) & ci  ));
+        tmp_hi0_v := STD_LOGIC_VECTOR( UNSIGNED( '0' & a(31 DOWNTO (32 - NBITS_HI_c)) & '1') +
+                                       UNSIGNED( '0' & b(31 DOWNTO (32 - NBITS_HI_c)) & '0'));
+        tmp_hi1_v := STD_LOGIC_VECTOR( UNSIGNED( '0' & a(31 DOWNTO (32 - NBITS_HI_c)) & '1') +
+                                       UNSIGNED( '0' & b(31 DOWNTO (32 - NBITS_HI_c)) & '1'));
+        IF (tmp_lo_v(NBITS_LO_c +1) = '0') THEN
+            s  := tmp_hi0_v(NBITS_HI_c DOWNTO 1) & tmp_lo_v(NBITS_LO_c DOWNTO 1);
+        ELSE
+            s  := tmp_hi1_v(NBITS_HI_c DOWNTO 1) & tmp_lo_v(NBITS_LO_c DOWNTO 1);
+        END IF;
+    END PROCEDURE;
+
 --  PROCEDURE ep_add32 ( a, b : IN STD_LOGIC_VECTOR; ci : IN STD_LOGIC;
 --                       VARIABLE s  : OUT STD_LOGIC_VECTOR;
 --                       VARIABLE co : OUT STD_LOGIC ) IS