Ignore:
Timestamp:
Apr 30, 2009, 3:51:41 PM (15 years ago)
Author:
moulu
Message:

1) added a generic multiplier (systemC isn't working with 8bits)
2) added a partial functionnal unit vhdl.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/include/Constants.h

    r109 r116  
    4040  {
    4141    TYPE_ALU                               = 0x0,       // 00000 - unit multiple
    42     TYPE_SHIFT                             = 0x1,       // 00000 - unit multiple
    43     TYPE_MOVE                              = 0x2,       // 00000 - unit multiple
    44     TYPE_TEST                              = 0x3,       // 00000 - unit multiple
    45     TYPE_MUL                               = 0x4,       // 00000 - unit multiple
    46     TYPE_DIV                               = 0x5,       // 00000 - unit multiple, type optionnal
    47     TYPE_EXTEND                            = 0x6,       // 00000 - unit multiple, type optionnal
    48     TYPE_FIND                              = 0x7,       // 00000 - unit multiple, type optionnal
    49     TYPE_SPECIAL                           = 0x8,       // 00000 - unit uniq
    50     TYPE_CUSTOM                            = 0x9,       // 00000 - unit uniq    , type optionnal
    51     TYPE_BRANCH                            = 0xa,       // 00000 - unit multiple
    52     TYPE_MEMORY                            = 0xb        // 00000 - unit uniq    , type exclusive
     42    TYPE_SHIFT                             = 0x1,       // 00001 - unit multiple
     43    TYPE_MOVE                              = 0x2,       // 00010 - unit multiple
     44    TYPE_TEST                              = 0x3,       // 00011 - unit multiple
     45    TYPE_MUL                               = 0x4,       // 00100 - unit multiple
     46    TYPE_DIV                               = 0x5,       // 00101 - unit multiple, type optionnal
     47    TYPE_EXTEND                            = 0x6,       // 00110 - unit multiple, type optionnal
     48    TYPE_FIND                              = 0x7,       // 00111 - unit multiple, type optionnal
     49    TYPE_SPECIAL                           = 0x8,       // 01000 - unit uniq
     50    TYPE_CUSTOM                            = 0x9,       // 01001 - unit uniq    , type optionnal
     51    TYPE_BRANCH                            = 0xa,       // 01010 - unit multiple
     52    TYPE_MEMORY                            = 0xb        // 01011 - unit uniq
    5353  } type_t;
    5454
     
    202202
    203203  //---------------------------------------------[ Functionnal Unit ]-----
    204 #  define OPERATION_ALU_L_ADD                      0x1        // 000_0000 l.add   , l.addi
    205 #  define OPERATION_ALU_L_ADDC                     0x2        // 000_0000 l.addc  , l.addic
    206 #  define OPERATION_ALU_L_SUB                      0x4        // 000_0000 l.sub
    207 #  define OPERATION_ALU_L_AND                      0x8        // 000_0000 l.and   , l.andi
    208 #  define OPERATION_ALU_L_OR                       0x10       // 000_0000 l.or    , l.ori
    209 #  define OPERATION_ALU_L_XOR                      0x20       // 000_0000 l.xor   , l.xori
    210 
    211 #  define OPERATION_SHIFT_L_SLL                    0x1        // 000_0000 l.sll   , l.slli
    212 #  define OPERATION_SHIFT_L_SRA                    0x2        // 000_0000 l.sra   , l.srai
    213 #  define OPERATION_SHIFT_L_SRL                    0x4        // 000_0000 l.srl   , l.srli
    214 #  define OPERATION_SHIFT_L_ROR                    0x8        // 000_0000 l.ror   , l.rori
    215 
    216 #  define OPERATION_MOVE_L_MOVHI                   0x1        // 000_0000 l.movhi
    217 #  define OPERATION_MOVE_L_CMOV                    0x2        // 000_0000 l.cmov
    218 
    219 #  define OPERATION_TEST_L_SFGES                   0x41       // 000_0000 l.sfges , l.sfges
    220 #  define OPERATION_TEST_L_SFGEU                   0x1        // 000_0000 l.sfgeu , l.sfgeu
    221 #  define OPERATION_TEST_L_SFGTS                   0x42       // 000_0000 L.sfgts , l.sfgts
    222 #  define OPERATION_TEST_L_SFGTU                   0x2        // 000_0000 l.sfgtu , l.sfgtu
    223 #  define OPERATION_TEST_L_SFLES                   0x44       // 000_0000 l.sfles , l.sfles
    224 #  define OPERATION_TEST_L_SFLEU                   0x4        // 000_0000 l.sfleu , l.sfleu
    225 #  define OPERATION_TEST_L_SFLTS                   0x48       // 000_0000 l.sflts , l.sflts
    226 #  define OPERATION_TEST_L_SFLTU                   0x8        // 000_0000 l.sfltu , l.sfltu
    227 #  define OPERATION_TEST_L_SFEQ                    0x10       // 000_0000 l.sfeq  , l.sfeqi
    228 #  define OPERATION_TEST_L_SFNE                    0x20       // 000_0000 l.sfne  , l.sfnei
    229 
    230 #  define OPERATION_MUL_L_MUL                      0x1        // 000_0000 l.mul   , l.muli
    231 #  define OPERATION_MUL_L_MULU                     0x2        // 000_0000 l.mulu
    232 
    233 #  define OPERATION_DIV_L_DIV                      0x1        // 000_0000 l.div
    234 #  define OPERATION_DIV_L_DIVU                     0x2        // 000_0000 l.divu
    235 
    236 #  define OPERATION_EXTEND_L_EXTEND_Z              0x1        // 000_0000 l.extbz , l.exthz, l.extwz
    237 #  define OPERATION_EXTEND_L_EXTEND_S              0x2        // 000_0000 l.extbs , l.exths, l.extws
    238 
    239 #  define OPERATION_FIND_L_FF1                     0x1        // 000_0000 l.ff1
    240 #  define OPERATION_FIND_L_FL1                     0x2        // 000_0000 l.fl1
    241 
    242 #  define OPERATION_SPECIAL_L_NOP                  0x7f       // 000_0000 l.nop   
     204
     205  // WARNING : Operations are coded in a one-hot implementation that is used in the functional unit's vhdl code.
     206  //           Do not change that (you can still change the values as long as it respects the one-hot encoding).
     207
     208#  define OPERATION_ALU_L_ADD                      0x1        // 000_0001 l.add   , l.addi
     209#  define OPERATION_ALU_L_ADDC                     0x2        // 000_0010 l.addc  , l.addic
     210#  define OPERATION_ALU_L_SUB                      0x4        // 000_0100 l.sub
     211#  define OPERATION_ALU_L_AND                      0x8        // 000_1000 l.and   , l.andi
     212#  define OPERATION_ALU_L_OR                       0x10       // 001_0000 l.or    , l.ori
     213#  define OPERATION_ALU_L_XOR                      0x20       // 010_0000 l.xor   , l.xori
     214
     215  // WARNING : Shift and rotate operation codes are hard-coded in the functional unit's vhdl code,
     216  //           with bit 0 corresponding to the direction (0 for right, and 1 for left),
     217  //           bit 1 to the type (0 for shift, 1 for rotate) and bit 2 is to be set to 0 for a logic
     218  //           operation and 1 for an arithmetic operation.
     219  //           Do not change that (unless you respect the one-hot encoding described above).
     220
     221#  define OPERATION_SHIFT_L_SLL                    0x1        // 000_0001 l.sll   , l.slli
     222#  define OPERATION_SHIFT_L_SRA                    0x4        // 000_0100 l.sra   , l.srai
     223#  define OPERATION_SHIFT_L_SRL                    0x0        // 000_0000 l.srl   , l.srli
     224#  define OPERATION_SHIFT_L_ROR                    0x2        // 000_0010 l.ror   , l.rori
     225
     226#  define OPERATION_MOVE_L_MOVHI                   0x1        // 000_0001 l.movhi
     227#  define OPERATION_MOVE_L_CMOV                    0x2        // 000_0010 l.cmov
     228
     229#  define OPERATION_TEST_L_SFGES                   0x45       // 100_0101 l.sfges , l.sfges
     230#  define OPERATION_TEST_L_SFGEU                   0x5        // 000_0101 l.sfgeu , l.sfgeu
     231#  define OPERATION_TEST_L_SFGTS                   0x46       // 100_0110 L.sfgts , l.sfgts
     232#  define OPERATION_TEST_L_SFGTU                   0x6        // 000_0110 l.sfgtu , l.sfgtu
     233#  define OPERATION_TEST_L_SFLES                   0x49       // 100_1001 l.sfles , l.sfles
     234#  define OPERATION_TEST_L_SFLEU                   0x9        // 000_1001 l.sfleu , l.sfleu
     235#  define OPERATION_TEST_L_SFLTS                   0x4A       // 100_1010 l.sflts , l.sflts
     236#  define OPERATION_TEST_L_SFLTU                   0xA        // 000_1010 l.sfltu , l.sfltu
     237#  define OPERATION_TEST_L_SFEQ                    0x10       // 001_0000 l.sfeq  , l.sfeqi
     238#  define OPERATION_TEST_L_SFNE                    0x20       // 010_0000 l.sfne  , l.sfnei
     239
     240#  define OPERATION_MUL_L_MUL                      0x1        // 000_0001 l.mul   , l.muli
     241#  define OPERATION_MUL_L_MULU                     0x2        // 000_0010 l.mulu
     242
     243#  define OPERATION_DIV_L_DIV                      0x1        // 000_0001 l.div
     244#  define OPERATION_DIV_L_DIVU                     0x2        // 000_0010 l.divu
     245
     246#  define OPERATION_EXTEND_L_EXTEND_Z              0x1        // 000_0001 l.extbz , l.exthz, l.extwz
     247#  define OPERATION_EXTEND_L_EXTEND_S              0x2        // 000_0010 l.extbs , l.exths, l.extws
     248
     249#  define OPERATION_FIND_L_FF1                     0x1        // 000_0001 l.ff1
     250#  define OPERATION_FIND_L_FL1                     0x2        // 000_0010 l.fl1
     251
     252#  define OPERATION_SPECIAL_L_NOP                  0x7f       // 111_1111 l.nop   
    243253#  define OPERATION_SPECIAL_L_MFSPR                0x1        // 000_0001 l.mfspr
    244254#  define OPERATION_SPECIAL_L_MTSPR                0x2        // 000_0010 l.mtspr
     
    253263#  define OPERATION_SPECIAL_L_TRAP                 0x42       // 100_0010 l.trap
    254264
    255 #  define OPERATION_BRANCH_NONE                    0x1        // 000_0000 l.j
    256 #  define OPERATION_BRANCH_L_TEST_NF               0x2        // 000_0000 l.bnf
    257 #  define OPERATION_BRANCH_L_TEST_F                0x4        // 000_0000 l.bf
    258 #  define OPERATION_BRANCH_L_JALR                  0x8        // 000_0000 l.jal   , l.jalr , l.jr
     265#  define OPERATION_BRANCH_NONE                    0x1        // 000_0001 l.j
     266#  define OPERATION_BRANCH_L_TEST_NF               0x2        // 000_0010 l.bnf
     267#  define OPERATION_BRANCH_L_TEST_F                0x4        // 000_0100 l.bf
     268#  define OPERATION_BRANCH_L_JALR                  0x8        // 000_1000 l.jal   , l.jalr , l.jr
    259269
    260270  //-------------------------------------------------------[ Custom ]-----
     
    342352#  define EXCEPTION_DECOD_BUS_ERROR                0x02       //   Access at a invalid physical address
    343353                                                                   
     354  // WARNING : Keep EXCEPTION_ALU_NONE value at 0x00 (kind of hard coded in functional unit's vhdl code).
    344355#  define EXCEPTION_ALU_NONE                       0x00       //   Functionnal unit generate none exception
    345356#  define EXCEPTION_ALU_RANGE                      0x0b       //   
Note: See TracChangeset for help on using the changeset viewer.