1 --------------------------------------------------------------------------
2 --
3 -- Copyright (C) 1993, Peter J. Ashenden
4 -- Mail: Dept. Computer Science
5 -- University of Adelaide, SA 5005, Australia
6 -- e-mail: petera@cs.adelaide.edu.au
7 --
8 -- This program is free software; you can redistribute it and/or modify
9 -- it under the terms of the GNU General Public License as published by
10 -- the Free Software Foundation; either version 1, or (at your option)
11 -- any later version.
12 --
13 -- This program is distributed in the hope that it will be useful,
14 -- but WITHOUT ANY WARRANTY; without even the implied warranty of
15 -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 -- GNU General Public License for more details.
17 --
18 -- You should have received a copy of the GNU General Public License
19 -- along with this program; if not, write to the Free Software
20 -- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 --
22 --------------------------------------------------------------------------
23 --
24 -- $RCSfile: dlx_instr.vhdl,v $ $Revision: 1.1 $ $Date: 2000/05/08 14:36:48 $
25 --
26 --------------------------------------------------------------------------
27 --
28 -- Package specification for DLX instructions
29 --
30
31
32 use std.textio.line,
33 work.dlx_types.all;
34
35 package dlx_instr is
36
37 -- A dlx instruction is 32 bits wide. There are three instruction formats:
38 --
39 -- I-type:
40 -- 0 5 6 10 11 15 16 31
41 -- +----------------------------------------------------------------+
42 -- | opcode | rs1 | rd | immed16 |
43 -- +----------------------------------------------------------------+
44 --
45 -- R-type:
46 -- 0 5 6 10 11 15 16 20 21 25 26 31
47 -- +----------------------------------------------------------------+
48 -- | opcode | rs1 | rs2 | rd | | func |
49 -- +----------------------------------------------------------------+
50 --
51 -- J-type:
52 -- 0 5 6 31
53 -- +----------------------------------------------------------------+
54 -- | opcode | immed26 |
55 -- +----------------------------------------------------------------+
56 --
57
58 subtype dlx_opcode is bit_vector(0 to 5);
59 subtype dlx_sp_func is bit_vector(0 to 5);
60 subtype dlx_fp_func is bit_vector(0 to 4);
61 subtype dlx_reg_addr is bit_vector(0 to 4);
62 subtype dlx_immed16 is bit_vector(0 to 15);
63 subtype dlx_immed26 is bit_vector(0 to 25);
64
65
66 constant op_special : dlx_opcode := B"000000";
67 constant op_fparith : dlx_opcode := B"000001";
68 constant op_j : dlx_opcode := B"000010";
69 constant op_jal : dlx_opcode := B"000011";
70 constant op_beqz : dlx_opcode := B"000100";
71 constant op_bnez : dlx_opcode := B"000101";
72 constant op_bfpt : dlx_opcode := B"000110";
73 constant op_bfpf : dlx_opcode := B"000111";
74 constant op_addi : dlx_opcode := B"001000";
75 constant op_addui : dlx_opcode := B"001001";
76 constant op_subi : dlx_opcode := B"001010";
77 constant op_subui : dlx_opcode := B"001011";
78 constant op_andi : dlx_opcode := B"001100";
79 constant op_ori : dlx_opcode := B"001101";
80 constant op_xori : dlx_opcode := B"001110";
81 constant op_lhi : dlx_opcode := B"001111";
82
83 constant op_rfe : dlx_opcode := B"010000";
84 constant op_trap : dlx_opcode := B"010001";
85 constant op_jr : dlx_opcode := B"010010";
86 constant op_jalr : dlx_opcode := B"010011";
87 constant op_slli : dlx_opcode := B"010100";
88 constant op_undef_15 : dlx_opcode := B"010101";
89 constant op_srli : dlx_opcode := B"010110";
90 constant op_srai : dlx_opcode := B"010111";
91 constant op_seqi : dlx_opcode := B"011000";
92 constant op_snei : dlx_opcode := B"011001";
93 constant op_slti : dlx_opcode := B"011010";
94 constant op_sgti : dlx_opcode := B"011011";
95 constant op_slei : dlx_opcode := B"011100";
96 constant op_sgei : dlx_opcode := B"011101";
97 constant op_undef_1E : dlx_opcode := B"011110";
98 constant op_undef_1F : dlx_opcode := B"011111";
99
100 constant op_lb : dlx_opcode := B"100000";
101 constant op_lh : dlx_opcode := B"100001";
102 constant op_undef_22 : dlx_opcode := B"100010";
103 constant op_lw : dlx_opcode := B"100011";
104 constant op_lbu : dlx_opcode := B"100100";
105 constant op_lhu : dlx_opcode := B"100101";
106 constant op_lf : dlx_opcode := B"100110";
107 constant op_ld : dlx_opcode := B"100111";
108 constant op_sb : dlx_opcode := B"101000";
109 constant op_sh : dlx_opcode := B"101001";
110 constant op_undef_2A : dlx_opcode := B"101010";
111 constant op_sw : dlx_opcode := B"101011";
112 constant op_undef_2C : dlx_opcode := B"101100";
113 constant op_undef_2D : dlx_opcode := B"101101";
114 constant op_sf : dlx_opcode := B"101110";
115 constant op_sd : dlx_opcode := B"101111";
116
117 constant op_sequi : dlx_opcode := B"110000";
118 constant op_sneui : dlx_opcode := B"110001";
119 constant op_sltui : dlx_opcode := B"110010";
120 constant op_sgtui : dlx_opcode := B"110011";
121 constant op_sleui : dlx_opcode := B"110100";
122 constant op_sgeui : dlx_opcode := B"110101";
123 constant op_undef_36 : dlx_opcode := B"110110";
124 constant op_undef_37 : dlx_opcode := B"110111";
125 constant op_undef_38 : dlx_opcode := B"111000";
126 constant op_undef_39 : dlx_opcode := B"111001";
127 constant op_undef_3A : dlx_opcode := B"111010";
128 constant op_undef_3B : dlx_opcode := B"111011";
129 constant op_undef_3C : dlx_opcode := B"111100";
130 constant op_undef_3D : dlx_opcode := B"111101";
131 constant op_undef_3E : dlx_opcode := B"111110";
132 constant op_undef_3F : dlx_opcode := B"111111";
133
134 constant sp_func_nop : dlx_sp_func := B"000000";
135 constant sp_func_undef_01 : dlx_sp_func := B"000001";
136 constant sp_func_undef_02 : dlx_sp_func := B"000010";
137 constant sp_func_undef_03 : dlx_sp_func := B"000011";
138 constant sp_func_sll : dlx_sp_func := B"000100";
139 constant sp_func_undef_05 : dlx_sp_func := B"000101";
140 constant sp_func_srl : dlx_sp_func := B"000110";
141 constant sp_func_sra : dlx_sp_func := B"000111";
142 constant sp_func_undef_08 : dlx_sp_func := B"001000";
143 constant sp_func_undef_09 : dlx_sp_func := B"001001";
144 constant sp_func_undef_0A : dlx_sp_func := B"001010";
145 constant sp_func_undef_0B : dlx_sp_func := B"001011";
146 constant sp_func_undef_0C : dlx_sp_func := B"001100";
147 constant sp_func_undef_0D : dlx_sp_func := B"001101";
148 constant sp_func_undef_0E : dlx_sp_func := B"001110";
149 constant sp_func_undef_0F : dlx_sp_func := B"001111";
150
151 constant sp_func_sequ : dlx_sp_func := B"010000";
152 constant sp_func_sneu : dlx_sp_func := B"010001";
153 constant sp_func_sltu : dlx_sp_func := B"010010";
154 constant sp_func_sgtu : dlx_sp_func := B"010011";
155 constant sp_func_sleu : dlx_sp_func := B"010100";
156 constant sp_func_sgeu : dlx_sp_func := B"010101";
157 constant sp_func_undef_16 : dlx_sp_func := B"010110";
158 constant sp_func_undef_17 : dlx_sp_func := B"010111";
159 constant sp_func_undef_18 : dlx_sp_func := B"011000";
160 constant sp_func_undef_19 : dlx_sp_func := B"011001";
161 constant sp_func_undef_1A : dlx_sp_func := B"011010";
162 constant sp_func_undef_1B : dlx_sp_func := B"011011";
163 constant sp_func_undef_1C : dlx_sp_func := B"011100";
164 constant sp_func_undef_1D : dlx_sp_func := B"011101";
165 constant sp_func_undef_1E : dlx_sp_func := B"011110";
166 constant sp_func_undef_1F : dlx_sp_func := B"011111";
167
168 constant sp_func_add : dlx_sp_func := B"100000";
169 constant sp_func_addu : dlx_sp_func := B"100001";
170 constant sp_func_sub : dlx_sp_func := B"100010";
171 constant sp_func_subu : dlx_sp_func := B"100011";
172 constant sp_func_and : dlx_sp_func := B"100100";
173 constant sp_func_or : dlx_sp_func := B"100101";
174 constant sp_func_xor : dlx_sp_func := B"100110";
175 constant sp_func_undef_27 : dlx_sp_func := B"100111";
176 constant sp_func_seq : dlx_sp_func := B"101000";
177 constant sp_func_sne : dlx_sp_func := B"101001";
178 constant sp_func_slt : dlx_sp_func := B"101010";
179 constant sp_func_sgt : dlx_sp_func := B"101011";
180 constant sp_func_sle : dlx_sp_func := B"101100";
181 constant sp_func_sge : dlx_sp_func := B"101101";
182 constant sp_func_undef_2E : dlx_sp_func := B"101110";
183 constant sp_func_undef_2F : dlx_sp_func := B"101111";
184
185 constant sp_func_movi2s : dlx_sp_func := B"110000";
186 constant sp_func_movs2i : dlx_sp_func := B"110001";
187 constant sp_func_movf : dlx_sp_func := B"110010";
188 constant sp_func_movd : dlx_sp_func := B"110011";
189 constant sp_func_movfp2i : dlx_sp_func := B"110100";
190 constant sp_func_movi2fp : dlx_sp_func := B"110101";
191 constant sp_func_undef_36 : dlx_sp_func := B"110110";
192 constant sp_func_undef_37 : dlx_sp_func := B"110111";
193 constant sp_func_undef_38 : dlx_sp_func := B"111000";
194 constant sp_func_undef_39 : dlx_sp_func := B"111001";
195 constant sp_func_undef_3A : dlx_sp_func := B"111010";
196 constant sp_func_undef_3B : dlx_sp_func := B"111011";
197 constant sp_func_undef_3C : dlx_sp_func := B"111100";
198 constant sp_func_undef_3D : dlx_sp_func := B"111101";
199 constant sp_func_undef_3E : dlx_sp_func := B"111110";
200 constant sp_func_undef_3F : dlx_sp_func := B"111111";
201
202 constant fp_func_addf : dlx_fp_func := B"00000";
203 constant fp_func_subf : dlx_fp_func := B"00001";
204 constant fp_func_multf : dlx_fp_func := B"00010";
205 constant fp_func_divf : dlx_fp_func := B"00011";
206 constant fp_func_addd : dlx_fp_func := B"00100";
207 constant fp_func_subd : dlx_fp_func := B"00101";
208 constant fp_func_multd : dlx_fp_func := B"00110";
209 constant fp_func_divd : dlx_fp_func := B"00111";
210 constant fp_func_cvtf2d : dlx_fp_func := B"01000";
211 constant fp_func_cvtf2i : dlx_fp_func := B"01001";
212 constant fp_func_cvtd2f : dlx_fp_func := B"01010";
213 constant fp_func_cvtd2i : dlx_fp_func := B"01011";
214 constant fp_func_cvti2f : dlx_fp_func := B"01100";
215 constant fp_func_cvti2d : dlx_fp_func := B"01101";
216 constant fp_func_mult : dlx_fp_func := B"01110";
217 constant fp_func_div : dlx_fp_func := B"01111";
218
219 constant fp_func_eqf : dlx_fp_func := B"10000";
220 constant fp_func_nef : dlx_fp_func := B"10001";
221 constant fp_func_ltf : dlx_fp_func := B"10010";
222 constant fp_func_gtf : dlx_fp_func := B"10011";
223 constant fp_func_lef : dlx_fp_func := B"10100";
224 constant fp_func_gef : dlx_fp_func := B"10101";
225 constant fp_func_multu : dlx_fp_func := B"10110";
226 constant fp_func_divu : dlx_fp_func := B"10111";
227 constant fp_func_eqd : dlx_fp_func := B"11000";
228 constant fp_func_ned : dlx_fp_func := B"11001";
229 constant fp_func_ltd : dlx_fp_func := B"11010";
230 constant fp_func_gtd : dlx_fp_func := B"11011";
231 constant fp_func_led : dlx_fp_func := B"11100";
232 constant fp_func_ged : dlx_fp_func := B"11101";
233 constant fp_func_undef_1E : dlx_fp_func := B"11110";
234 constant fp_func_undef_1F : dlx_fp_func := B"11111";
235
236 subtype dlx_opcode_num is natural range 0 to 63;
237 subtype dlx_sp_func_num is natural range 0 to 63;
238 subtype dlx_fp_func_num is natural range 0 to 31;
239
240 subtype instr_name is string(1 to 8);
241 type opcode_name_array is array (dlx_opcode_num) of instr_name;
242 type sp_func_name_array is array (dlx_sp_func_num) of instr_name;
243 type fp_func_name_array is array (dlx_fp_func_num) of instr_name;
244
245 constant opcode_names : opcode_name_array;
246 constant sp_func_names : sp_func_name_array;
247 constant fp_func_names : fp_func_name_array;
248
249 type immed_size is (immed_size_16, immed_size_26);
250
251 subtype reg_index is natural range 0 to 31;
252
253 constant link_reg : reg_index := 31;
254
255 procedure write_instr (L : inout line; instr : in dlx_word);
256
257 end dlx_instr;
258
This page was generated using GHDL 0.14 (20040829) [Sokcho edition], a program written by Tristan Gingold