dlx/dlx_instr.vhdl

    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