ldih/l
[calu.git] / cpu / src / common_pkg.vhd
index 06e376956e20cad9acf52e656a572b3219fffddf..43603d29a9638626502ee2c9640678e2f3ed711c 100755 (executable)
@@ -18,7 +18,8 @@ package common_pkg is
        subtype word_t  is std_logic_vector(WORD_WIDTH-1 downto 0);
 
        subtype gp_register_t is word_t;
-
+       
+       subtype byte_en_t is std_logic_vector((gp_register_t'length/byte_t'length-1) downto 0); 
        
        constant REG_ZERO : gp_register_t := (others => '0');
 
@@ -30,10 +31,12 @@ package common_pkg is
        
        constant NUM_OP_OPT_WIDTH       : INTEGER := 6;
        constant COND_WIDTH : INTEGER := 4;
+       constant DATA_END_ADDR          : integer := ((2**DATA_ADDR_WIDTH)-1);
 
        
        subtype instruction_word_t is std_logic_vector(WORD_WIDTH-1 downto 0);
        subtype instruction_addr_t is std_logic_vector(INSTR_ADDR_WIDTH-1 downto 0);
+       subtype instr_addr_t is instruction_addr_t;
        
        subtype gp_addr_t       is std_logic_vector(REG_ADDR_WIDTH-1 downto 0);
        subtype data_ram_word_t is std_logic_vector(WORD_WIDTH-1 downto 0);
@@ -50,15 +53,23 @@ package common_pkg is
        
        constant SUB_OPT : integer := 1;
        constant ARITH_OPT : integer := 1;
+       constant HWORD_OPT : integer := 1;
+       constant PUSH_OPT : integer := 1;
+       constant LOW_HIGH_OPT : integer := 1;
        
        constant CARRY_OPT : integer := 2;
-       
+       constant BYTE_OPT : integer := 2;
+       constant LDI_REPLACE_OPT : integer := 2;
+
        constant RIGHT_OPT : integer := 3;
+       constant JMP_REG_OPT : integer := 3;
+       constant ST_OPT  : integer := 3; -- store opt
+       constant RET_OPT : integer := 3;
        
        constant NO_PSW_OPT : integer := 4;--no sharing
        constant NO_DST_OPT : integer := 5; --no sharing
        
-       type op_info_t is (ADDSUB_OP,AND_OP,OR_OP, XOR_OP,SHIFT_OP);
+       type op_info_t is (ADDSUB_OP,AND_OP,OR_OP, XOR_OP,SHIFT_OP, LDST_OP, JMP_OP, JMP_ST_OP, STACK_OP);
        subtype op_opt_t is std_logic_vector(NUM_OP_OPT_WIDTH-1 downto 0);
        
        
@@ -74,6 +85,8 @@ package common_pkg is
 
                immediate : std_logic_vector(WORD_WIDTH-1 downto 0);
 
+               displacement : gp_register_t;
+
                jmptype : std_logic_vector(1 downto 0);
 
                high_low, fill, signext, bp: std_logic;
@@ -84,6 +97,7 @@ package common_pkg is
        end record;
 
 
+       
        type read_through_write_rec is record
 
                rtw_reg : gp_register_t;
@@ -91,6 +105,8 @@ package common_pkg is
                rtw_reg2 : std_logic;
                immediate : gp_register_t;
                imm_set : std_logic;
+               reg1_addr : gp_addr_t;
+               reg2_addr : gp_addr_t;
 
        end record;
 
@@ -99,6 +115,9 @@ package common_pkg is
                op_group : op_info_t;
                op_detail : op_opt_t;
                brpr : std_logic;
+
+               displacement : gp_register_t;
+               prog_cnt     : instr_addr_t;
                
                src1 : gp_register_t;
                src2 : gp_register_t;
@@ -121,8 +140,23 @@ package common_pkg is
                dmem_write_en : std_logic;      --ureg
                hword : std_logic;              --ureg
                byte_s : std_logic;
+               byte_en : byte_en_t;
+               data : gp_register_t;
        end record;
        
+       type exec2wb_rec is record
+                       result : gp_register_t; --reg  (alu result or jumpaddr)
+                       result_addr : gp_addr_t;        --reg
+                       address : word_t;               --ureg 
+                       ram_data : word_t;              --ureg
+                       alu_jmp : std_logic;            --reg
+                       br_pred : std_logic;            --reg
+                       write_en : std_logic;   --reg  (register file) bei jump 1 wenn addr in result
+                       dmem_en : std_logic;            --ureg (jump addr in mem or in address)
+                       dmem_write_en : std_logic;      --ureg
+                       hword : std_logic;              --ureg
+                       byte_s : std_logic;             --ureg  
+       end record;
        
        function inc(value : in std_logic_vector; constant by : in integer := 1) return std_logic_vector;
        function log2c(constant value : in integer range 0 to integer'high) return integer;