X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=cpu%2Fsrc%2Fcommon_pkg.vhd;h=76bb94d2314eeae1dcefcad8141768edd294c008;hb=0ba0c7effbaf554ad42db51334581859a0570bfa;hp=dd6350c8a020a5508e153033b99ed10aa185ed41;hpb=9b9e39f3672127dd87ea9dd022bddb3df3c2bef3;p=calu.git diff --git a/cpu/src/common_pkg.vhd b/cpu/src/common_pkg.vhd index dd6350c..76bb94d 100755 --- a/cpu/src/common_pkg.vhd +++ b/cpu/src/common_pkg.vhd @@ -18,22 +18,28 @@ 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'); constant INSTR_ADDR_WIDTH : INTEGER := 32; - constant PHYS_INSTR_ADDR_WIDTH : INTEGER := 11; + constant PHYS_INSTR_ADDR_WIDTH : INTEGER := 10; + constant ROM_INSTR_ADDR_WIDTH : INTEGER := 7; constant REG_ADDR_WIDTH : INTEGER := 4; - constant DATA_ADDR_WIDTH : INTEGER := 11; + constant DATA_ADDR_WIDTH : INTEGER := 10; constant PHYS_DATA_ADDR_WIDTH : INTEGER := 32; constant NUM_OP_OPT_WIDTH : INTEGER := 6; constant COND_WIDTH : INTEGER := 4; + constant DATA_END_ADDR : integer := ((2**DATA_ADDR_WIDTH)-1); + constant ROM_USE : std_logic := '1'; + constant RAM_USE : std_logic := '0'; 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,19 +56,34 @@ 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 DIRECT_JUMP_OPT : integer := 1; constant CARRY_OPT : integer := 2; - constant ST_OPT : integer := 2; + constant BYTE_OPT : integer := 2; + constant LDI_REPLACE_OPT : integer := 2; + constant PWREN_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, LDST_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); + + type interrupt_t is (IDLE, UART); - + constant UART_INT_EN_BIT : integer := 1; + constant GLOBAL_INT_EN_BIT : integer := 0; + + constant UART_INT_VECTOR : std_logic_vector(PHYS_INSTR_ADDR_WIDTH-1 downto 0) := (0 => '1', others => '0'); + type instruction_rec is record predicates : std_logic_vector(3 downto 0); @@ -79,7 +100,7 @@ package common_pkg is jmptype : std_logic_vector(1 downto 0); - high_low, fill, signext, bp: std_logic; + high_low, fill, signext, bp, int: std_logic; op_detail : op_opt_t; op_group : op_info_t; @@ -87,6 +108,7 @@ package common_pkg is end record; + type read_through_write_rec is record rtw_reg : gp_register_t; @@ -106,6 +128,7 @@ package common_pkg is brpr : std_logic; displacement : gp_register_t; + prog_cnt : instr_addr_t; src1 : gp_register_t; src2 : gp_register_t; @@ -128,8 +151,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;