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