version not running!
[calu.git] / cpu / src / common_pkg.vhd
1 library IEEE;
2
3 use IEEE.std_logic_1164.all;
4 use IEEE.numeric_std.all;
5
6 package common_pkg is
7
8
9         
10         constant WORD_WIDTH   : INTEGER := 32;
11         constant HWORD_WIDTH  : INTEGER := 16;
12         constant BYTE_WIDTH   : INTEGER :=  8;
13         constant OPCODE_WIDTH : INTEGER :=  5;
14         constant DISPL_WIDTH  : INTEGER := 15;
15
16         subtype byte_t is std_logic_vector(BYTE_WIDTH-1 downto 0);
17         subtype hword_t is std_logic_vector(HWORD_WIDTH-1 downto 0);
18         subtype word_t  is std_logic_vector(WORD_WIDTH-1 downto 0);
19
20         subtype gp_register_t is word_t;
21
22         
23         constant REG_ZERO : gp_register_t := (others => '0');
24
25         constant INSTR_ADDR_WIDTH       : INTEGER := 32;
26         constant PHYS_INSTR_ADDR_WIDTH  : INTEGER := 11;
27         constant REG_ADDR_WIDTH         : INTEGER := 4;
28         constant DATA_ADDR_WIDTH        : INTEGER := 11;
29         constant PHYS_DATA_ADDR_WIDTH   : INTEGER := 32;
30         
31         constant NUM_OP_OPT_WIDTH       : INTEGER := 6;
32         constant COND_WIDTH : INTEGER := 4;
33         constant DATA_END_ADDR          : integer := ((2**DATA_ADDR_WIDTH)-1);
34
35         
36         subtype instruction_word_t is std_logic_vector(WORD_WIDTH-1 downto 0);
37         subtype instruction_addr_t is std_logic_vector(INSTR_ADDR_WIDTH-1 downto 0);
38         subtype instr_addr_t is instruction_addr_t;
39         
40         subtype gp_addr_t       is std_logic_vector(REG_ADDR_WIDTH-1 downto 0);
41         subtype data_ram_word_t is std_logic_vector(WORD_WIDTH-1 downto 0);
42         subtype data_ram_addr_t is std_logic_vector(DATA_ADDR_WIDTH-1 downto 0);
43
44         subtype opcode_t is std_logic_vector(OPCODE_WIDTH-1 downto 0);
45         subtype condition_t is std_logic_vector(COND_WIDTH-1 downto 0);
46         
47         --Opcode consits of decoded group information type and option bits
48         --currently not complete, might need option increase too.
49         --IMMEDIATE always in right_operand (src2)
50         
51         constant IMM_OPT : integer := 0; -- no sharing
52         
53         constant SUB_OPT : integer := 1;
54         constant ARITH_OPT : integer := 1;
55         
56         constant CARRY_OPT : integer := 2;
57
58         constant RIGHT_OPT : integer := 3;
59         constant JMP_REG_OPT : integer := 3;
60         constant ST_OPT  : integer := 3; -- store opt
61         constant RET_OPT : integer := 3;
62         
63         constant NO_PSW_OPT : integer := 4;--no sharing
64         constant NO_DST_OPT : integer := 5; --no sharing
65         
66         type op_info_t is (ADDSUB_OP,AND_OP,OR_OP, XOR_OP,SHIFT_OP, LDST_OP, JMP_OP, JMP_ST_OP);
67         subtype op_opt_t is std_logic_vector(NUM_OP_OPT_WIDTH-1 downto 0);
68         
69         
70         type instruction_rec is record
71
72                 predicates : std_logic_vector(3 downto 0);
73
74                 opcode : opcode_t;
75
76                 reg_dest_addr : std_logic_vector(REG_ADDR_WIDTH-1 downto 0);
77                 reg_src1_addr : std_logic_vector(REG_ADDR_WIDTH-1 downto 0);
78                 reg_src2_addr : std_logic_vector(REG_ADDR_WIDTH-1 downto 0);
79
80                 immediate : std_logic_vector(WORD_WIDTH-1 downto 0);
81
82                 displacement : gp_register_t;
83
84                 jmptype : std_logic_vector(1 downto 0);
85
86                 high_low, fill, signext, bp: std_logic;
87
88                 op_detail : op_opt_t;
89                 op_group : op_info_t;
90
91         end record;
92
93
94         
95         type read_through_write_rec is record
96
97                 rtw_reg : gp_register_t;
98                 rtw_reg1 : std_logic;
99                 rtw_reg2 : std_logic;
100                 immediate : gp_register_t;
101                 imm_set : std_logic;
102                 reg1_addr : gp_addr_t;
103                 reg2_addr : gp_addr_t;
104
105         end record;
106
107         type dec_op is record
108                 condition : condition_t;
109                 op_group : op_info_t;
110                 op_detail : op_opt_t;
111                 brpr : std_logic;
112
113                 displacement : gp_register_t;
114                 prog_cnt     : instr_addr_t;
115                 
116                 src1 : gp_register_t;
117                 src2 : gp_register_t;
118                 
119                 saddr1 : gp_addr_t;
120                 saddr2 : gp_addr_t;
121                 
122                 daddr   : gp_addr_t;
123                 
124         end record;
125
126         type writeback_rec is record
127 --              result : in gp_register_t;      --reg  (alu result or jumpaddr)
128 --              result_addr : in gp_addr_t;     --reg
129                 address : word_t;               --ureg 
130 --              alu_jmp : in std_logic;         --reg
131 --              br_pred : in std_logic;         --reg
132 --              write_en : in std_logic;        --reg  (register file)
133                 dmem_en : std_logic;            --ureg (jump addr in mem or in address)
134                 dmem_write_en : std_logic;      --ureg
135                 hword : std_logic;              --ureg
136                 byte_s : std_logic;
137         end record;
138         
139         type exec2wb_rec is record
140                         result : gp_register_t; --reg  (alu result or jumpaddr)
141                         result_addr : gp_addr_t;        --reg
142                         address : word_t;               --ureg 
143                         ram_data : word_t;              --ureg
144                         alu_jmp : std_logic;            --reg
145                         br_pred : std_logic;            --reg
146                         write_en : std_logic;   --reg  (register file) bei jump 1 wenn addr in result
147                         dmem_en : std_logic;            --ureg (jump addr in mem or in address)
148                         dmem_write_en : std_logic;      --ureg
149                         hword : std_logic;              --ureg
150                         byte_s : std_logic;             --ureg  
151         end record;
152         
153         function inc(value : in std_logic_vector; constant by : in integer := 1) return std_logic_vector;
154         function log2c(constant value : in integer range 0 to integer'high) return integer;
155 end package common_pkg;
156
157 package body common_pkg is
158
159         function inc(value : in std_logic_vector; constant by : in integer := 1) return std_logic_vector is
160         begin
161                 return std_logic_vector(UNSIGNED(value)+by);
162         end function inc;
163         
164         function log2c(constant value : in integer range 0 to integer'high) return integer is
165                 variable ret_value : integer;
166                 variable cur_value : integer;
167         begin
168                 ret_value := 0;
169                 cur_value := 1;
170                 
171                 while cur_value < value loop
172                         ret_value := ret_value + 1;
173                         cur_value := cur_value * 2;
174                 end loop;
175                 return ret_value;
176         end function log2c;
177         
178 end package body common_pkg;