pipe2
[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 := 32;
29         constant PHYS_DATA_ADDR_WIDTH   : INTEGER := 32;
30         
31         constant NUM_OP_OPT_WIDTH       : INTEGER := 6;
32         constant COND_WIDTH : INTEGER := 4;
33
34         
35         subtype instruction_word_t is std_logic_vector(WORD_WIDTH-1 downto 0);
36         subtype instruction_addr_t is std_logic_vector(INSTR_ADDR_WIDTH-1 downto 0);
37         
38         subtype gp_addr_t       is std_logic_vector(REG_ADDR_WIDTH-1 downto 0);
39         subtype data_ram_word_t is std_logic_vector(WORD_WIDTH-1 downto 0);
40         subtype data_ram_addr_t is std_logic_vector(DATA_ADDR_WIDTH-1 downto 0);
41
42         subtype opcode_t is std_logic_vector(OPCODE_WIDTH-1 downto 0);
43         subtype condition_t is std_logic_vector(COND_WIDTH-1 downto 0);
44         
45         --Opcode consits of decoded group information type and option bits
46         --currently not complete, might need option increase too.
47         --IMMEDIATE always in right_operand (src2)
48         
49         constant IMM_OPT : integer := 0; -- no sharing
50         
51         constant SUB_OPT : integer := 1;
52         constant LOG_OPT : integer := 1;
53         
54         constant CARRY_OPT : integer := 2;
55         
56         constant LEFT_OPT : integer := 3;
57         
58         constant NO_PSW_OPT : integer := 4;--no sharing
59         constant NO_DST_OPT : integer := 5; --no sharing
60         
61         type op_info_t is (ADDSUB_OP,AND_OP,OR_OP, XOR_OP,SHIFT_OP);
62         subtype op_opt_t is std_logic_vector(NUM_OP_OPT_WIDTH-1 downto 0);
63         
64         
65         type instruction_rec is record
66
67                 predicates : std_logic_vector(3 downto 0);
68
69                 opcode : opcode_t;
70
71                 reg_dest_addr : std_logic_vector(REG_ADDR_WIDTH-1 downto 0);
72                 reg_src1_addr : std_logic_vector(REG_ADDR_WIDTH-1 downto 0);
73                 reg_src2_addr : std_logic_vector(REG_ADDR_WIDTH-1 downto 0);
74
75                 immediate : std_logic_vector(WORD_WIDTH-1 downto 0);
76                 displacement : std_logic_vector(DISPL_WIDTH-1 downto 0);
77
78                 jmptype : std_logic_vector(1 downto 0);
79
80                 carry, sreg_update, high_low, fill, signext, bp, arith, left_right : std_logic;
81
82                 op_detail : op_pot_t;
83
84         end record;
85
86
87         type read_through_write_rec is record
88
89                 rtw_reg : gp_register_t;
90                 rtw_reg1 : std_logic;
91                 rtw_reg2 : std_logic;
92                 immediate : gp_register_t;
93
94         end record;
95
96         type dec_op is record
97                 condition : condition_t;
98                 op_group : op_info_t;
99                 op_detail : op_opt_t;
100                 brpr : std_logic;
101                 
102                 src1 : gp_register_t;
103                 src2 : gp_register_t;
104                 
105                 saddr1 : gp_addr_t;
106                 saddr2 : gp_addr_t;
107                 
108                 daddr   : gp_addr_t;
109                 
110         end record;
111
112         
113         
114         
115         function inc(value : in std_logic_vector; constant by : in integer := 1) return std_logic_vector;
116         function log2c(constant value : in integer range 0 to integer'high) return integer;
117 end package common_pkg;
118
119 package body common_pkg is
120
121         function inc(value : in std_logic_vector; constant by : in integer := 1) return std_logic_vector is
122         begin
123                 return std_logic_vector(UNSIGNED(value)+by);
124         end function inc;
125         
126         function log2c(constant value : in integer range 0 to integer'high) return integer is
127                 variable ret_value : integer;
128                 variable cur_value : integer;
129         begin
130                 ret_value := 0;
131                 cur_value := 1;
132                 
133                 while cur_value < value loop
134                         ret_value := ret_value + 1;
135                         cur_value := cur_value * 2;
136                 end loop;
137                 return ret_value;
138         end function log2c;
139         
140 end package body common_pkg;