Changeset 107


Ignore:
Timestamp:
Feb 11, 2009, 12:03:25 AM (15 years ago)
Author:
rosiere
Message:

1) Fix test in Direction_Glue for Conditionnal Branch
2) Fix Instruction Address Compute

Location:
trunk/IPs/systemC/processor/Morpheo
Files:
19 edited

Legend:

Unmodified
Added
Removed
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Decod_unit/Decod/src/Decod_genMealy.cpp

    r105 r107  
    6767               (context_event_val == false)) // Have not a context_event (spr_access, exception, ...)
    6868          {
    69             predict_val [i] = false;
     69//          predict_val [i] = false;
    7070
    7171            Tcontext_t x = it->grp;
     
    106106                   
    107107                    instruction_decod (_decod_instruction, _decod_param[x]);
     108
     109                    log_printf(TRACE,Decod,FUNCTION,"    * address_next  : %.8x (%.8x)",_decod_instruction->_address_next,(_decod_instruction->_address_next<<2));
    108110                  }
    109111                else
     
    167169                  {
    168170                    log_printf(TRACE,Decod,FUNCTION,"    * type is branch");
     171                    log_printf(TRACE,Decod,FUNCTION,"      * predict_val  : %d",ifetch_ack [x][y]);
    169172                    log_printf(TRACE,Decod,FUNCTION,"      * predict_ack  : %d",PORT_READ(in_PREDICT_ACK [i]));
    170173
    171174                    log_printf(TRACE,Decod,FUNCTION,"      * address src  : %.8x (%.8x)",_decod_instruction->_address     ,_decod_instruction->_address     <<2);
    172175                    log_printf(TRACE,Decod,FUNCTION,"      * address dest : %.8x (%.8x)",_decod_instruction->_address_next,_decod_instruction->_address_next<<2);
    173 
     176                   
    174177                    predict_val [i]     = ifetch_ack  [x][y] // and decod_val [i]
    175178                      ;
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Decod_unit/Decod/src/Parameters_print.cpp

    r88 r107  
    2929    xml.singleton_begin("nb_context                   "); xml.attribut("value",toString(_nb_context                   )); xml.singleton_end();
    3030    xml.singleton_begin("nb_inst_decod                "); xml.attribut("value",toString(_nb_inst_decod                )); xml.singleton_end();
    31     xml.singleton_begin("nb_branch_speculated         "); xml.attribut("value",toString(_nb_branch_speculated         )); xml.singleton_end();
    3231//  xml.singleton_begin("size_branch_update_prediction"); xml.attribut("value",toString(_size_branch_update_prediction)); xml.singleton_end();
    3332    xml.singleton_begin("nb_context_select            "); xml.attribut("value",toString(_nb_context_select            )); xml.singleton_end();
     
    4342        xml. balise_open_end();
    4443        xml.  singleton_begin("nb_inst_fetch                "); xml.attribut("value",toString(_nb_inst_fetch                [i])); xml.singleton_end();
     44        xml.  singleton_begin("nb_branch_speculated         "); xml.attribut("value",toString(_nb_branch_speculated         [i])); xml.singleton_end();
    4545        xml. balise_close();
    4646      }
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Ifetch_unit/Address_management/SelfTest/src/test.cpp

    r101 r107  
    267267          LABEL("  * address wait     : %.8x",a_addr);
    268268
    269           TEST(Tgeneral_address_t,out_ADDRESS_INSTRUCTION_ADDRESS        ->read(),a_addr);
     269          TEST(Tgeneral_address_t,out_ADDRESS_INSTRUCTION_ADDRESS        ->read(),a_addr-a_addr%_param->_nb_instruction);
    270270          for (uint32_t i=0; i<_param->_nb_instruction; i++)
    271271          TEST(Tcontrol_t        ,out_ADDRESS_INSTRUCTION_ENABLE     [i] ->read(),a_enable[i]);
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Ifetch_unit/Address_management/src/Address_management_genMoore.cpp

    r101 r107  
    3030    internal_ADDRESS_VAL = reg_PC_ACCESS_VAL;
    3131
    32     PORT_WRITE(out_ADDRESS_VAL                        ,internal_ADDRESS_VAL                      );
    33     PORT_WRITE(out_ADDRESS_INSTRUCTION_ADDRESS        ,reg_PC_ACCESS                            );
     32    PORT_WRITE(out_ADDRESS_VAL                        ,internal_ADDRESS_VAL                     );
     33    // Align pc on instruction packet address.
     34    PORT_WRITE(out_ADDRESS_INSTRUCTION_ADDRESS        ,reg_PC_ACCESS - (reg_PC_ACCESS%_param->_nb_instruction));
    3435    if (_param->_have_port_inst_ifetch_ptr)
    3536    PORT_WRITE(out_ADDRESS_INST_IFETCH_PTR            ,reg_PC_ACCESS_INST_IFETCH_PTR            );
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Ifetch_unit/Address_management/src/Address_management_transition.cpp

    r101 r107  
    3535        reg_PC_NEXT          = 0x100>>2;
    3636        reg_PC_NEXT_IS_DS_TAKE                  = 0;
    37         reg_PC_NEXT_INSTRUCTION_ENABLE [0]      = 1;
    38         for (uint32_t i=1; i<_param->_nb_instruction; i++)
     37        uint32_t index = reg_PC_NEXT % _param->_nb_instruction;
     38        for (uint32_t i=0; i<_param->_nb_instruction; i++)
    3939        reg_PC_NEXT_INSTRUCTION_ENABLE [i]      = 0;
     40        reg_PC_NEXT_INSTRUCTION_ENABLE [index]  = 1;
    4041        reg_PC_NEXT_INST_IFETCH_PTR             = 0;
    4142        reg_PC_NEXT_BRANCH_STATE                = 0;
     
    182183//          reg_PC_NEXT_BRANCH_UPDATE_PREDICTION_ID = 0;
    183184           
    184             reg_PC_NEXT_INSTRUCTION_ENABLE [0]      = 1; // only the instruction at the event address is valid, because we have no information on the branch presence in the instruction bundle.
    185             for (uint32_t i=1; i<_param->_nb_instruction; i++)
    186               reg_PC_NEXT_INSTRUCTION_ENABLE [i] = 0;
     185            // only the instruction at the event address is valid, because we have no information on the branch presence in the instruction bundle.
     186            uint32_t index = reg_PC_NEXT % _param->_nb_instruction;
     187            for (uint32_t i=0; i<_param->_nb_instruction; i++)
     188            reg_PC_NEXT_INSTRUCTION_ENABLE [i]      = 0;
     189            reg_PC_NEXT_INSTRUCTION_ENABLE [index]  = 1;
    187190
    188191            reg_PC_NEXT_NEXT_VAL                    = PORT_READ(in_EVENT_ADDRESS_NEXT_VAL);
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Register/src/Branch_Target_Buffer_Register_transition.cpp

    r88 r107  
    9292
    9393              // detect new branch !!! insert in branch target buffer
    94               log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"    * hit       : %d",hit);
    95               log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"    * num_bank  : %d",num_bank );
    96               log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"    * num_entry : %d",num_entry);
     94              log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"    * hit          : %d",hit);
     95              log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"    * miss_pred    : %d",miss_pred);
     96              log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"    * num_bank     : %d",num_bank );
     97              log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"    * num_entry    : %d",num_entry);
    9798
    9899              Tcounter_t accurate_new = 0;
     
    106107                  //    * in all case : is valid in this step
    107108                  Tcounter_t accurate_old = reg_BTB[num_bank][num_entry]._accurate;
     109
     110                  log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"    * accurate_old : %d",accurate_old);
     111
    108112                  // hit  : increase accurate
    109113                  // miss : decrease accurate
    110                   Tcounter_t accurate_new = (miss_pred)?((accurate_old>0)?(accurate_old-1):accurate_old):((accurate_old<_param->_accurate_max)?(accurate_old+1):accurate_old);
     114                  accurate_new = (miss_pred)?((accurate_old>0)?(accurate_old-1):accurate_old):((accurate_old<_param->_accurate_max)?(accurate_old+1):accurate_old);
    111115
    112116                  // test if accurate go to the threshold
    113117                  if ((accurate_old >= _param->_accurate_limit) and
    114118                      (accurate_new <  _param->_accurate_limit))
    115                     accurate_new = 0;
     119                    {
     120                      log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"    * decrease downto the accurate_limid (%d)",_param->_accurate_limit);
     121                      accurate_new = 0;
     122                    }
    116123                   
    117124                //reg_BTB[num_bank][num_entry]._val              : no update because hit
     
    135142//                reg_BTB[num_bank][num_entry]._condition        = PORT_READ(in_UPDATE_CONDITION    [i]);
    136143//                reg_BTB[num_bank][num_entry]._last_take        = PORT_READ(in_UPDATE_LAST_TAKE    [i]);
    137                   reg_BTB[num_bank][num_entry]._address_dest_val = 0;
     144//                reg_BTB[num_bank][num_entry]._address_dest_val = 0;
    138145                }
    139146
     
    144151//                reg_BTB[num_bank][num_entry]._address_dest     = PORT_READ(in_UPDATE_ADDRESS_DEST [i]);
    145152//              }
     153
     154              log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"    * accurate_new : %d",accurate_new);
     155
    146156              reg_BTB[num_bank][num_entry]._val              = 1;
    147157              reg_BTB[num_bank][num_entry]._context          = (_param->_have_port_context_id)?PORT_READ(in_UPDATE_CONTEXT_ID [i]):0;
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Direction/Direction_Glue/src/Direction_Glue.cpp

    r88 r107  
    9292                PORT_WRITE(out_PREDICT_ACK [i], 1);
    9393               
    94                 // constant direction : never / always
     94                // constant direction : never / always
    9595                switch (_param->_predictor_scheme)
    9696                  {
     
    166166
    167167#  ifdef SYSTEMCASS_SPECIFIC
    168             // List dependency information
    169             for (uint32_t i=0; i<_param->_nb_inst_predict; i++)
    170               {
    171 
    172                 switch (_param->_predictor_scheme)
    173                   {
    174                   case PREDICTOR_STATIC      :
    175                     {
    176                       (*(out_PREDICT_DIRECTION             [i])) (*(in_PREDICT_STATIC               [i]));
    177 
    178                       break;
    179                     }
    180                   case PREDICTOR_LAST_TAKE   :
    181                     {
    182                       (*(out_PREDICT_DIRECTION             [i])) (*(in_PREDICT_LAST_TAKE            [i]));
    183 
    184                       break;
    185                     }
    186                   case PREDICTOR_COUNTER     :
    187                   case PREDICTOR_LOCAL       :
    188                   case PREDICTOR_GLOBAL      :
    189                   case PREDICTOR_META        :
    190                   case PREDICTOR_CUSTOM      :
    191                     {
    192                       (*(out_PREDICT_ACK                   [i])) (*(in_PREDICT_PREDICTOR_ACK        [i]));
    193                       (*(out_PREDICT_HISTORY               [i])) (*(in_PREDICT_PREDICTOR_HISTORY    [i]));
    194                       (*(out_PREDICT_DIRECTION             [i])) (*(in_PREDICT_PREDICTOR_DIRECTION  [i]));
    195                       (*(out_PREDICT_PREDICTOR_VAL         [i])) (*(in_PREDICT_VAL                  [i]));
    196                       (*(out_PREDICT_PREDICTOR_ADDRESS_SRC [i])) (*(in_PREDICT_ADDRESS_SRC          [i]));
    197 
    198                       break;
    199                     }
    200                   default :
    201                     {
    202                       break;
    203                     }
    204                   }
    205               }
     168//          // List dependency information
     169//          for (uint32_t i=0; i<_param->_nb_inst_predict; i++)
     170//            {
     171
     172//              switch (_param->_predictor_scheme)
     173//                {
     174//                case PREDICTOR_STATIC      :
     175//                  {
     176//                    (*(out_PREDICT_DIRECTION             [i])) (*(in_PREDICT_STATIC               [i]));
     177
     178//                    break;
     179//                  }
     180//                case PREDICTOR_LAST_TAKE   :
     181//                  {
     182//                    (*(out_PREDICT_DIRECTION             [i])) (*(in_PREDICT_LAST_TAKE            [i]));
     183
     184//                    break;
     185//                  }
     186//                case PREDICTOR_COUNTER     :
     187//                case PREDICTOR_LOCAL       :
     188//                case PREDICTOR_GLOBAL      :
     189//                case PREDICTOR_META        :
     190//                case PREDICTOR_CUSTOM      :
     191//                  {
     192//                    (*(out_PREDICT_ACK                   [i])) (*(in_PREDICT_PREDICTOR_ACK        [i]));
     193//                    (*(out_PREDICT_HISTORY               [i])) (*(in_PREDICT_PREDICTOR_HISTORY    [i]));
     194//                    (*(out_PREDICT_DIRECTION             [i])) (*(in_PREDICT_PREDICTOR_DIRECTION  [i]));
     195//                    (*(out_PREDICT_PREDICTOR_VAL         [i])) (*(in_PREDICT_VAL                  [i]));
     196//                    (*(out_PREDICT_PREDICTOR_ADDRESS_SRC [i])) (*(in_PREDICT_ADDRESS_SRC          [i]));
     197
     198//                    break;
     199//                  }
     200//                default :
     201//                  {
     202//                    break;
     203//                  }
     204//                }
     205//            }
    206206#  endif   
    207207          }
     
    222222
    223223#  ifdef SYSTEMCASS_SPECIFIC
    224             // List dependency information
    225             for (uint32_t i=0; i<_param->_nb_inst_update; i++)
    226               {
    227                 (*(out_UPDATE_PREDICTOR_VAL       [i])) (*(in_UPDATE_VAL           [i]));
    228                 (*(out_UPDATE_ACK                 [i])) (*(in_UPDATE_PREDICTOR_ACK [i]));
    229                 (*(out_UPDATE_PREDICTOR_ADDRESS   [i])) (*(in_UPDATE_ADDRESS       [i]));
    230                 (*(out_UPDATE_PREDICTOR_HISTORY   [i])) (*(in_UPDATE_HISTORY       [i]));
    231                 (*(out_UPDATE_PREDICTOR_DIRECTION [i])) (*(in_UPDATE_DIRECTION     [i]));
    232               }
     224//          // List dependency information
     225//          for (uint32_t i=0; i<_param->_nb_inst_update; i++)
     226//            {
     227//              (*(out_UPDATE_PREDICTOR_VAL       [i])) (*(in_UPDATE_VAL           [i]));
     228//              (*(out_UPDATE_ACK                 [i])) (*(in_UPDATE_PREDICTOR_ACK [i]));
     229//              (*(out_UPDATE_PREDICTOR_ADDRESS   [i])) (*(in_UPDATE_ADDRESS       [i]));
     230//              (*(out_UPDATE_PREDICTOR_HISTORY   [i])) (*(in_UPDATE_HISTORY       [i]));
     231//              (*(out_UPDATE_PREDICTOR_DIRECTION [i])) (*(in_UPDATE_DIRECTION     [i]));
     232//            }
    233233#  endif   
    234234          }
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Direction/Direction_Glue/src/Direction_Glue_genMealy_predict.cpp

    r81 r107  
    2323  void Direction_Glue::genMealy_predict (void)
    2424  {
    25     log_printf(FUNC,Direction_Glue,FUNCTION,"Begin");
     25    log_begin(Direction_Glue,FUNCTION);
     26    log_function(Direction_Glue,FUNCTION,_name.c_str());
    2627
    2728    // constant direction : never / always
    28     switch (_param->_predictor_scheme)
     29    for (uint32_t i=0; i<_param->_nb_inst_predict; i++)
    2930      {
    30       case PREDICTOR_STATIC    :
    31         {
    32           for (uint32_t i=0; i<_param->_nb_inst_predict; i++)
    33             PORT_WRITE(out_PREDICT_DIRECTION   [i], PORT_READ(in_PREDICT_STATIC    [i]));
    34          
    35           break;
    36         }
    37       case PREDICTOR_LAST_TAKE :
    38         {
    39           for (uint32_t i=0; i<_param->_nb_inst_predict; i++)
    40             PORT_WRITE(out_PREDICT_DIRECTION   [i], PORT_READ(in_PREDICT_LAST_TAKE [i]));
     31        log_printf(TRACE,Direction_Glue,FUNCTION,"  * PREDICT [%d]",i);
    4132
    42           break;
    43         }
    44       case PREDICTOR_COUNTER   :
    45       case PREDICTOR_LOCAL     :
    46       case PREDICTOR_GLOBAL    :
    47       case PREDICTOR_META      :
    48       case PREDICTOR_CUSTOM    :
    49         {
    50           for (uint32_t i=0; i<_param->_nb_inst_predict; i++)
    51             {
    52               // not use :
    53               // in_PREDICT_LAST_TAKE       
    54               // in_PREDICT_STATIC
     33        Tcontrol_t direction;
     34
     35        switch (_param->_predictor_scheme)
     36          {
     37            // defined as constant in Direction_Glue.cpp
     38//           case PREDICTOR_NEVER_TAKE  :
     39//             {
     40//               direction = 0;
     41//               break;
     42//             }
     43//           case PREDICTOR_ALWAYS_TAKE :
     44//             {
     45//               direction = 1;
     46//               break;
     47//             }
     48          case PREDICTOR_STATIC    :
     49            {
     50              direction = PORT_READ(in_PREDICT_STATIC [i]);
     51              break;
     52            }
     53          case PREDICTOR_LAST_TAKE :
     54            {
     55              direction = PORT_READ(in_PREDICT_LAST_TAKE [i]);
     56              break;
     57            }
     58          case PREDICTOR_COUNTER   :
     59          case PREDICTOR_LOCAL     :
     60          case PREDICTOR_GLOBAL    :
     61          case PREDICTOR_META      :
     62          case PREDICTOR_CUSTOM    :
     63            {
     64              // not use :
     65              // in_PREDICT_LAST_TAKE       
     66              // in_PREDICT_STATIC
     67             
     68              direction = PORT_READ(in_PREDICT_PREDICTOR_DIRECTION [i]);
    5569
    5670              PORT_WRITE(out_PREDICT_PREDICTOR_VAL         [i], PORT_READ(in_PREDICT_VAL                 [i]));
     
    5872              PORT_WRITE(out_PREDICT_PREDICTOR_ADDRESS_SRC [i], PORT_READ(in_PREDICT_ADDRESS_SRC         [i]));
    5973              PORT_WRITE(out_PREDICT_HISTORY               [i], PORT_READ(in_PREDICT_PREDICTOR_HISTORY   [i]));
    60               PORT_WRITE(out_PREDICT_DIRECTION             [i], PORT_READ(in_PREDICT_PREDICTOR_DIRECTION [i]));
    61             }
     74             
     75              break;
     76            }
     77          default :
     78            {
     79              ERRORMORPHEO(FUNCTION,"No valid predictor scheme");
     80              break;
     81            }
     82          }
     83     
     84        log_printf(TRACE,Direction_Glue,FUNCTION,"    * direction     : %d",direction);
    6285
    63           break;
    64         }
    65       default :
    66         {
    67           ERRORMORPHEO(FUNCTION,"No valid predictor scheme");
    68           break;
    69         }
     86        PORT_WRITE(out_PREDICT_DIRECTION   [i], direction);
    7087      }
    7188
    72 
    73    
    74     log_printf(FUNC,Direction_Glue,FUNCTION,"End");
     89    log_end(Direction_Glue,FUNCTION);
    7590  };
    7691
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Direction/Direction_Glue/src/Direction_Glue_genMealy_update.cpp

    r81 r107  
    2323  void Direction_Glue::genMealy_update (void)
    2424  {
    25     log_printf(FUNC,Direction_Glue,FUNCTION,"Begin");
     25    log_begin(Direction_Glue,FUNCTION);
     26    log_function(Direction_Glue,FUNCTION,_name.c_str());
    2627
    2728    for (uint32_t i=0; i<_param->_nb_inst_update; i++)
     
    3435      }
    3536   
    36     log_printf(FUNC,Direction_Glue,FUNCTION,"End");
     37    log_end(Direction_Glue,FUNCTION);
    3738  };
    3839
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Prediction_unit_Glue/src/Prediction_unit_Glue_genMealy_decod.cpp

    r98 r107  
    5050    uint32_t port = 0;
    5151    for (uint32_t i=0; i<_param->_nb_inst_decod[decod_unit]; i++)
     52      {
     53        log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"  * DECOD [%d][%d]",decod_unit,i);
     54        log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"    * val  : %d",PORT_READ(in_DECOD_VAL [decod_unit][i]));
     55        log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"    * port : %d",port);
     56
    5257      // Test if decod_unit have detected a branch
    5358      if ((port>=_param->_nb_inst_branch_decod) or
    5459          (PORT_READ(in_DECOD_VAL [decod_unit][i]) == 0))
    5560        {
    56           log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"  * DECOD[%d][%d] : not valid",decod_unit,i);
     61          log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"  * DECOD [%d][%d]          : not valid",decod_unit,i);
    5762          ack [i] = false;
    5863        }
     
    7479          Tcontrol_t        miss_decod            = (branch_state == BRANCH_STATE_NONE);
    7580
    76           log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"  * DECOD[%d][%d] :    valid",decod_unit,i);
     81          log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"  * DECOD [%d][%d]          : valid",decod_unit,i);
    7782          log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"    * branch_state          : %d",branch_state);
    7883          log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"    * match_inst_ifetch_ptr : %d",match_inst_ifetch_ptr);
     
    246251          PORT_WRITE(out_DECOD_UPT_UPDATE_PREDICTION_ID [port],depth);
    247252         
    248           port ++;
     253          port ++; // have find port
    249254        }
     255      }
    250256   
    251257    // Write output
    252 
    253258    for (uint32_t i=0; i<_param->_nb_inst_branch_decod; i++)
    254259      {
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Prediction_unit_Glue/src/Prediction_unit_Glue_genMealy_predict.cpp

    r106 r107  
    117117            //  if pc_current is a delay slot, then pc_previous is a branchement instruction, also hit must be set.
    118118            //  else : an another branch instruction have eject this branch : can't accurate
    119             Tcontrol_t          hit         = PORT_READ(in_PREDICT_BTB_HIT[i]);
    120             Tcontrol_t          is_accurate = PORT_READ(in_PREDICT_BTB_IS_ACCURATE  [i]) and not (pc_current_is_ds_take and not hit);
     119            Tcontrol_t          hit             = PORT_READ(in_PREDICT_BTB_HIT[i]);
     120            Tcontrol_t          is_accurate     = not (pc_current_is_ds_take and not hit);
     121            Tcontrol_t          btb_is_accurate = PORT_READ(in_PREDICT_BTB_IS_ACCURATE  [i]);
    121122
    122123            log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"    * hit                   : %d"    ,hit);
    123124            log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"    * is_accurate           : %d"    ,is_accurate);
     125            log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"    * btb_is_accurate       : %d"    ,btb_is_accurate);
    124126
    125127            // STEP (3) : Test if BTB find a branch instruction in the packet
     
    158160                else
    159161                  {
     162                    log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"      * branch is not in the last slot of the packet");
     163
    160164                    Tbranch_condition_t condition    = PORT_READ(in_PREDICT_BTB_CONDITION    [i]);
    161165                    Taddress_t          address_dest = PORT_READ(in_PREDICT_BTB_ADDRESS_DEST [i]);
     
    166170                    log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"    * address_src           : 0x%.8x (0x%.8x)",address_src ,address_src <<2);
    167171                    log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"    * address_dest          : 0x%.8x (0x%.8x)",address_dest,address_dest<<2);
    168                    
     172
    169173                    switch (condition)
    170174                      {
     
    178182                          pc_next      = address_dest;
    179183                          branch_state = BRANCH_STATE_NSPEC_TAKE;
     184//                        is_accurate &= btb_is_accurate;
     185
    180186                          break;
    181187                        }
     
    190196                          pc_next      = address_dest;
    191197                          branch_state = BRANCH_STATE_NSPEC_TAKE;
     198//                        is_accurate &= btb_is_accurate;
     199
    192200                          break;
    193201                        }
     
    201209                          // Test direction
    202210                          direction = PORT_READ(in_PREDICT_DIR_DIRECTION [i]); // Direction is not the "flag predict" ... also flag_unset and flag_set is the same
    203                           if (direction = 1)
     211                          if (direction == 1)
    204212                            {
    205213                              branch_state = BRANCH_STATE_SPEC_TAKE;
     
    211219                              pc_next      = address_src+2; // +1 = delay slot
    212220                            }
     221
     222//                        is_accurate &= btb_is_accurate;
    213223                          break;
    214224                        }
     
    223233                          pc_next      = address_dest;
    224234                          branch_state = BRANCH_STATE_SPEC_TAKE;
     235                          is_accurate &= btb_is_accurate;
     236
    225237                          break;
    226238                        }
     
    235247                          pc_next      = address_dest;
    236248                          branch_state = BRANCH_STATE_NSPEC_TAKE;
     249                          is_accurate &= btb_is_accurate;
     250
    237251                          break;
    238252                        }
     
    244258                          push         = false;
    245259                          direction    = true;
    246                           pc_next      = PORT_READ(in_PREDICT_RAS_ADDRESS_POP  [i]);
     260                          pc_next      = PORT_READ(in_PREDICT_RAS_HIT [i])?PORT_READ(in_PREDICT_RAS_ADDRESS_POP [i]):address_dest;
    247261                          branch_state = BRANCH_STATE_SPEC_TAKE;
     262                          is_accurate  &= (PORT_READ(in_PREDICT_RAS_HIT [i]) or btb_is_accurate); // if miss - prediction is not accurate
     263
    248264                          break;
    249265                        }
     
    255271                      }
    256272                   
     273                    log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"    * direction             : %d",direction);
     274                    log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"    * branch_state          : %d",branch_state);
     275                    log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"    * pc_next               : %.8x",pc_next);
     276
    257277                    if (use_dir)
    258278                      {
     
    270290                        PORT_WRITE(out_PREDICT_RAS_PUSH         [i], push);
    271291                        PORT_WRITE(out_PREDICT_RAS_ADDRESS_PUSH [i], address_src+2);
    272                        
    273                         is_accurate &= PORT_READ(in_PREDICT_RAS_HIT [i]); // if miss - prediction is not accurate
    274292                      }
    275293                   
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Return_Address_Stack/SelfTest/src/test.cpp

    r100 r107  
    363363          in_UPDATE_VAL  [port3]->write(1);
    364364          in_UPDATE_FLUSH[port3]->write(1);
     365          in_UPDATE_PUSH [port3]->write(0);
    365366          for (uint32_t i=0; i<_param->_nb_context; i++)
    366367            for (uint32_t j=0; j<_param->_size_queue[i]/2; j++)
     
    582583          LABEL("Update FLUSH");
    583584          in_UPDATE_VAL  [port3]->write(1);
     585          in_UPDATE_PUSH [port3]->write(0);
    584586          in_UPDATE_FLUSH[port3]->write(1);
    585587          for (uint32_t i=0; i<_param->_nb_context; i++)
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Return_Address_Stack/src/Return_Address_Stack_transition.cpp

    r100 r107  
    237237              if (flush)
    238238                {
     239                  Tcontrol_t push  = PORT_READ(in_UPDATE_PUSH [i]);
     240                  Tptr_t     value = (push)?1:0;
     241
    239242                  // All pointer is set at 0
    240                   reg_TOP    [context_id] = 0;
     243                  reg_TOP    [context_id] = value;
    241244//                reg_BOTTOM [context_id] = 0;
    242                   reg_NB_ELT [context_id] = 0;
    243                  
    244                   reg_PREDICT_TOP    [context_id] = 0;
     245                  reg_NB_ELT [context_id] = value;
     246                 
     247                  reg_PREDICT_TOP    [context_id] = value;
    245248//                reg_PREDICT_BOTTOM [context_id] = 0;
    246                   reg_PREDICT_NB_ELT [context_id] = 0;
     249                  reg_PREDICT_NB_ELT [context_id] = value;
     250
     251                  if (push)
     252                    {
     253                      // reinsert push value
     254                      reg_stack [context_id][0]._address = PORT_READ(in_UPDATE_ADDRESS [i]);
     255                    }
    247256                }
    248257              else
     
    313322                          // previous is push, now must be pop
    314323
    315                           // Test if the stack is empty
    316                           if (nb_elt_old>0) // ??
     324                          // Test if the stack is empty (if previous flush)
     325                          if (nb_elt_old>0)
    317326                            {
    318327                              top_new = (top_old==0)?(_param->_size_queue[context_id]-1):(top_old-1);
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/SelfTest/src/test.cpp

    r106 r107  
    10051005              request.address_dest     = 0x21071981+i;                                   
    10061006              request.address_good     = request.address_dest;
    1007               request.condition        = (rand()%2)?BRANCH_CONDITION_NONE_WITH_WRITE_STACK:BRANCH_CONDITION_FLAG_SET;
     1007              request.condition        = // (rand()%2)?BRANCH_CONDITION_NONE_WITH_WRITE_STACK:
     1008                BRANCH_CONDITION_FLAG_SET;
    10081009
    10091010              have_ras |= (update_ras(request.condition));
     
    14511452                request.address_dest     = rand();                                   
    14521453               
    1453                 request.condition        = (rand()%2)?BRANCH_CONDITION_READ_STACK:BRANCH_CONDITION_FLAG_SET;
     1454                request.condition        = // (rand()%2)?BRANCH_CONDITION_NONE_WITHOUT_WRITE_STACK:
     1455                  BRANCH_CONDITION_FLAG_SET;
    14541456
    14551457                request.take             = 1;                                             
     
    15971599                request.address_dest     = rand();                                   
    15981600                request.address_good     = request.address_dest;
    1599                 request.condition        = (rand()%2)?BRANCH_CONDITION_NONE_WITH_WRITE_STACK:BRANCH_CONDITION_FLAG_SET;
     1601                request.condition        = // (rand()%2)?BRANCH_CONDITION_NONE_WITH_WRITE_STACK:
     1602                  BRANCH_CONDITION_FLAG_SET;
    16001603               
    16011604                have_ufpt_ras |= (update_ras(request.condition));
     
    21572160                request.address_dest     = rand();                                   
    21582161               
    2159                 request.condition        = (rand()%2)?BRANCH_CONDITION_READ_STACK:BRANCH_CONDITION_FLAG_SET;
     2162                request.condition        = // (rand()%2)?BRANCH_CONDITION_NONE_WITHOUT_WRITE_STACK:
     2163                  BRANCH_CONDITION_FLAG_SET;
    21602164
    21612165                request.take             = 1;                                             
     
    23032307                request.address_dest     = rand();                                   
    23042308                request.address_good     = request.address_dest;
    2305                 request.condition        = (rand()%2)?BRANCH_CONDITION_NONE_WITH_WRITE_STACK:BRANCH_CONDITION_FLAG_SET;
     2309                request.condition        = // (rand()%2)?BRANCH_CONDITION_NONE_WITH_WRITE_STACK:
     2310                  BRANCH_CONDITION_FLAG_SET;
    23062311               
    23072312                have_ufpt_ras |= (update_ras(request.condition));
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_genMoore.cpp

    r106 r107  
    175175                Tcontrol_t          state_is_ok_ko           = ((state == UPDATE_PREDICTION_STATE_OK   ) or
    176176                                                                (state == UPDATE_PREDICTION_STATE_KO   ));
    177                 Tcontrol_t          state_is_event           = ((state == UPDATE_PREDICTION_STATE_KO   ) or
    178                                                                 (state == UPDATE_PREDICTION_STATE_EVENT)//  or
     177//                 Tcontrol_t          state_is_event           = ((state == UPDATE_PREDICTION_STATE_KO   ) or
     178//                                                                 (state == UPDATE_PREDICTION_STATE_EVENT)//  or
    179179//                                                                 ((have_event[context])?(state == UPDATE_PREDICTION_STATE_OK):false)
    180                                                                 );
    181                
    182                 Tcontrol_t          state_is_event_update    = state_is_event and     need_update(condition);
    183                 Tcontrol_t          state_is_event_no_update = state_is_event and not need_update(condition);
     180//                                                                 );
     181               
     182//                 Tcontrol_t          state_is_event_update    = state_is_event and     need_update(condition);
     183//                 Tcontrol_t          state_is_event_no_update = state_is_event and not need_update(condition);
    184184
    185185                if (retire_ras_from_upt [context])
    186186                  {
    187                 val                   = state_is_event_update;
    188                 val_without_ack       = state_is_event_no_update;
     187//                 val                   = state_is_event_update;
     188//                 val_without_ack       = state_is_event_no_update;
     189                val                   = ((state == UPDATE_PREDICTION_STATE_KO   ) or
     190                                         ((state == UPDATE_PREDICTION_STATE_EVENT) and need_update(condition)));
     191                val_without_ack       = ((state == UPDATE_PREDICTION_STATE_EVENT) and not need_update(condition));
    189192                  }
    190193                else
     
    205208                ras_flush             = (state == UPDATE_PREDICTION_STATE_KO); // miss prediction, RAS is corrupted
    206209                ras_push              = push_ras(condition);
    207                 ras_address           = reg_UPDATE_PREDICTION_TABLE [context][depth]._address_ras;
     210                // If corrupt, RAS must be flushed.
     211                // Also, if instruction l.jal, l.jalr, push addr+2 (delay slot), else (no flush) restore RAS
     212                ras_address           = (ras_flush)?(reg_UPDATE_PREDICTION_TABLE [context][depth]._address_src+2):reg_UPDATE_PREDICTION_TABLE [context][depth]._address_ras;
    208213                ras_index             = reg_UPDATE_PREDICTION_TABLE [context][depth]._index_ras;
    209214                ras_prediction_ifetch = ifetch;
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_transition.cpp

    r106 r107  
    422422
    423423              // In all case : update good_take
    424               reg_UPDATE_PREDICTION_TABLE [context][depth]._good_take = good_take;
     424              reg_UPDATE_PREDICTION_TABLE [context][depth]._good_take    = good_take;
     425
     426              // Write address_dest if need read register
     427              Tbranch_condition_t condition = reg_UPDATE_PREDICTION_TABLE [context][depth]._condition;
     428             
     429              if ((condition == BRANCH_CONDITION_READ_REGISTER_WITHOUT_WRITE_STACK) or
     430                  (condition == BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK   ) or
     431                  (condition == BRANCH_CONDITION_READ_STACK                       ) )
     432                reg_UPDATE_PREDICTION_TABLE [context][depth]._address_dest = good_addr;
    425433            }
    426434
     
    599607              log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * BRANCH_EVENT [%d] - Accepted",i);
    600608
    601 #ifdef DEBUG_TEST
    602               if (reg_EVENT_STATE [i] != EVENT_STATE_UPDATE_CONTEXT)
    603                 throw ERRORMORPHEO(FUNCTION,_("Decod : invalid event state."));
    604 #endif
    605              
    606               // Change state
    607               log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * EVENT [%d] <- EVENT_STATE_WAIT_END_EVENT (branch_event)",i);
    608              
    609               reg_EVENT_STATE [i] = EVENT_STATE_WAIT_END_EVENT;
     609              // if different : an other branch is occured
     610              if (reg_EVENT_STATE [i] == EVENT_STATE_UPDATE_CONTEXT)
     611                {
     612                  // Change state
     613                  log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * EVENT [%d] <- EVENT_STATE_WAIT_END_EVENT (branch_event)",i);
     614                 
     615                  reg_EVENT_STATE [i] = EVENT_STATE_WAIT_END_EVENT;
     616                }
    610617            }
    611618
     
    866873        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * reg_UFPT_NB_UPDATE      : %d",reg_UFPT_NB_UPDATE      [i]);
    867874        for (uint32_t j=0; j<_param->_size_ufpt_queue[i]; j++)
    868           log_printf(TRACE,Update_Prediction_Table,FUNCTION,"        [%d] %.4d, %.8x %.8x, %.1d   %.1d, %.8d %.8x %.4d - %s",
     875          log_printf(TRACE,Update_Prediction_Table,FUNCTION,"        [%d] %.4d, %.8x (%.8x) %.8x (%.8x), %.1d   %.1d, %.8d %.8x (%.8x) %.4d - %s",
    869876                     j,
    870877                     reg_UPDATE_FETCH_PREDICTION_TABLE [i][j]._condition,
    871878                     reg_UPDATE_FETCH_PREDICTION_TABLE [i][j]._address_src,
     879                     reg_UPDATE_FETCH_PREDICTION_TABLE [i][j]._address_src<<2,
    872880                     reg_UPDATE_FETCH_PREDICTION_TABLE [i][j]._address_dest,
     881                     reg_UPDATE_FETCH_PREDICTION_TABLE [i][j]._address_dest<<2,
    873882                     reg_UPDATE_FETCH_PREDICTION_TABLE [i][j]._last_take,
    874883                     reg_UPDATE_FETCH_PREDICTION_TABLE [i][j]._is_accurate,
    875884                     reg_UPDATE_FETCH_PREDICTION_TABLE [i][j]._history,
    876885                     reg_UPDATE_FETCH_PREDICTION_TABLE [i][j]._address_ras,
     886                     reg_UPDATE_FETCH_PREDICTION_TABLE [i][j]._address_ras<<2,
    877887                     reg_UPDATE_FETCH_PREDICTION_TABLE [i][j]._index_ras,
    878888                     toString(reg_UPDATE_FETCH_PREDICTION_TABLE [i][j]._state).c_str()
     
    886896        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * reg_UPT_EMPTY           : %d",reg_UPT_EMPTY          [i]);
    887897        for (uint32_t j=0; j<_param->_size_upt_queue[i]; j++)
    888           log_printf(TRACE,Update_Prediction_Table,FUNCTION,"        [%d] %.4d, %.8x %.8x, %.1d %.1d %.1d, %.8d %.8x %.4d - %s",
     898          log_printf(TRACE,Update_Prediction_Table,FUNCTION,"        [%d] %.4d, %.8x (%.8x) %.8x (%.8x), %.1d %.1d %.1d, %.8d %.8x (%.8x) %.4d - %s",
    889899                     j,
    890900                     reg_UPDATE_PREDICTION_TABLE [i][j]._condition,
    891901                     reg_UPDATE_PREDICTION_TABLE [i][j]._address_src,
     902                     reg_UPDATE_PREDICTION_TABLE [i][j]._address_src<<2,
    892903                     reg_UPDATE_PREDICTION_TABLE [i][j]._address_dest,
     904                     reg_UPDATE_PREDICTION_TABLE [i][j]._address_dest<<2,
    893905                     reg_UPDATE_PREDICTION_TABLE [i][j]._last_take,
    894906                     reg_UPDATE_PREDICTION_TABLE [i][j]._good_take,
     
    896908                     reg_UPDATE_PREDICTION_TABLE [i][j]._history,
    897909                     reg_UPDATE_PREDICTION_TABLE [i][j]._address_ras,
     910                     reg_UPDATE_PREDICTION_TABLE [i][j]._address_ras<<2,
    898911                     reg_UPDATE_PREDICTION_TABLE [i][j]._index_ras,
    899912                     toString(reg_UPDATE_PREDICTION_TABLE [i][j]._state).c_str()
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/include/Version.h

    r106 r107  
    1010#define MORPHEO_MAJOR_VERSION 0
    1111#define MORPHEO_MINOR_VERSION 2
    12 #define MORPHEO_REVISION      "106"
     12#define MORPHEO_REVISION      "107"
    1313#define MORPHEO_CODENAME      "Castor"
    1414
    15 #define MORPHEO_DATE_DAY      "09
     15#define MORPHEO_DATE_DAY      "11
    1616#define MORPHEO_DATE_MONTH    "02"
    1717#define MORPHEO_DATE_YEAR     "2009"
  • trunk/IPs/systemC/processor/Morpheo/Files/Instance_debug.cfg

    r106 r107  
    55  <thread id="0">             
    66    <parameter name="size_ifetch_queue"                     value="4" />
    7     <parameter name="nb_inst_fetch"                         value="1" />
     7    <parameter name="nb_inst_fetch"                         value="2" />
    88    <parameter name="ras_size_queue"                        value="4" />
    99    <parameter name="upt_size_queue"                        value="4" />
     
    8080    <parameter name="btb_size_counter"                      value="2" />
    8181    <parameter name="btb_victim_scheme"                     value="3" />
    82     <parameter name="dir_predictor_scheme"                  value="1" />
     82    <parameter name="dir_predictor_scheme"                  value="3" />
    8383                                                           
    8484    <predictor id="0">                                     
  • trunk/IPs/systemC/processor/Morpheo/Files/Morpheo.sim

    r106 r107  
    2424
    2525  <parameter name="debug_level"                value="0" />
    26   <parameter name="debug_cycle_start"          value="800" />
    27   <parameter name="debug_cycle_stop"           value="1000" />
     26  <parameter name="debug_cycle_start"          value="310" />
     27  <parameter name="debug_cycle_stop"           value="350" />
    2828  <parameter name="debug_have_log_file"        value="0" />
    2929
Note: See TracChangeset for help on using the changeset viewer.