Ignore:
Timestamp:
Feb 9, 2009, 11:55:26 PM (15 years ago)
Author:
rosiere
Message:

1) RAT : Fix bug when update and event in same cycle
2) Context State : Compute depth
3) Load Store Unit : In check logic, translate all access in little endian. More easy to check
4) UFPT : End Event

Location:
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/SelfTest/src/test.cpp

    r105 r106  
    14241424                 (upt_top    [context] != out_DEPTH_MAX [context]->read()))
    14251425            SC_START(1);
    1426 
    14271426        }
    14281427      }
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/include/Types.h

    r105 r106  
    4747      UPDATE_PREDICTION_STATE_KO                , // this branch is a miss prediction
    4848      UPDATE_PREDICTION_STATE_EVENT             , // previous branch is a miss prediction
    49       UPDATE_PREDICTION_STATE_END_OK            , // branch is updated,       update pointer
    50       UPDATE_PREDICTION_STATE_END_KO_WAIT_END   , // branch is updated, don't update pointer
     49      UPDATE_PREDICTION_STATE_END               , // update pointer
     50//    UPDATE_PREDICTION_STATE_END_OK            , // branch is updated,       update pointer
     51//    UPDATE_PREDICTION_STATE_END_KO_WAIT_END   , // branch is updated, don't update pointer
    5152      UPDATE_PREDICTION_STATE_END_KO              // branch is updated, don't update pointer
    5253    } upt_state_t;
     
    153154      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_KO         : return "ko"        ; break;
    154155      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_EVENT      : return "event"     ; break;
    155       case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_END_OK     : return "end_ok"    ; break;
    156       case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_END_KO_WAIT_END: return "end_ko_wait_end"    ; break;
     156      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_END        : return "end"       ; break;
     157//    case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_END_OK     : return "end_ok"    ; break;
     158//    case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_END_KO_WAIT_END: return "end_ko_wait_end"    ; break;
    157159      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_END_KO     : return "end_ko"    ; break;
    158160      default    : return ""      ; break;
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/include/Update_Prediction_Table.h

    r105 r106  
    168168  private   : uint32_t                      * reg_UFPT_UPDATE                    ; //[nb_context]
    169169  private   : uint32_t                      * reg_UFPT_NB_NEED_UPDATE            ; //[nb_context]
     170  private   : uint32_t                      * reg_UFPT_NB_UPDATE                 ; //[nb_context]
    170171                                                                                             
    171172  private   : upt_entry_t                  ** reg_UPDATE_PREDICTION_TABLE        ; //[nb_context][size_upt_queue]
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_allocation.cpp

    r105 r106  
    197197    ALLOC1(reg_UFPT_UPDATE                  ,uint32_t     ,_param->_nb_context);
    198198    ALLOC1(reg_UFPT_NB_NEED_UPDATE          ,uint32_t     ,_param->_nb_context);
     199    ALLOC1(reg_UFPT_NB_UPDATE               ,uint32_t     ,_param->_nb_context);
    199200                                                         
    200201    ALLOC2(reg_UPDATE_PREDICTION_TABLE      ,upt_entry_t  ,_param->_nb_context,_param->_size_upt_queue[it1]);
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_deallocation.cpp

    r105 r106  
    150150        DELETE1(reg_UFPT_UPDATE                  ,_param->_nb_context);
    151151        DELETE1(reg_UFPT_NB_NEED_UPDATE          ,_param->_nb_context);
     152        DELETE1(reg_UFPT_NB_UPDATE               ,_param->_nb_context);
    152153       
    153154        DELETE2(reg_UPDATE_PREDICTION_TABLE      ,_param->_nb_context,_param->_size_upt_queue[it1]);
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_genMoore.cpp

    r105 r106  
    6161    bool     retire_ras_from_ufpt [_param->_nb_context]; // event ufpt -> restore RAS, else update upt
    6262    bool     retire_ras_from_upt  [_param->_nb_context]; // event upt  -> restore RAS, else restore others structure
    63 //     bool     have_event           [_param->_nb_context];
     63//  bool     have_event           [_param->_nb_context];
    6464    bool     ufpt_update          [_param->_nb_context];
    6565    bool     upt_update           [_param->_nb_context];
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_transition.cpp

    r105 r106  
    3939            reg_UFPT_UPDATE          [i] = 0;
    4040            reg_UFPT_NB_NEED_UPDATE  [i] = 0;
     41            reg_UFPT_NB_UPDATE       [i] = 0;
    4142                                                               
    4243            for (uint32_t j=0; j<_param->_size_upt_queue[i]; ++j)
     
    9293            {
    9394              uint32_t      bottom      = reg_UPT_BOTTOM [i];
    94               bool          end_ok      = (reg_UPDATE_PREDICTION_TABLE [i][bottom]._state == UPDATE_PREDICTION_STATE_END_OK);
    95               bool          end_ko      = (reg_UPDATE_PREDICTION_TABLE [i][bottom]._state == UPDATE_PREDICTION_STATE_END_KO);
     95              bool          end         = (reg_UPDATE_PREDICTION_TABLE [i][bottom]._state == UPDATE_PREDICTION_STATE_END);
     96//               bool          end_ok      = (reg_UPDATE_PREDICTION_TABLE [i][bottom]._state == UPDATE_PREDICTION_STATE_END_OK);
     97//               bool          end_ko      = (reg_UPDATE_PREDICTION_TABLE [i][bottom]._state == UPDATE_PREDICTION_STATE_END_KO);
    9698//               event_state_t event_state = reg_EVENT_STATE [i];
    9799
    98100              // Test if state is end
    99 //               if ((end_ok or end_ko) and
    100 //                   ((event_state != EVENT_STATE_UPDATE_CONTEXT) and
    101 //                    (event_state != EVENT_STATE_WAIT_END_EVENT)))
    102               if (end_ok or end_ko)
     101//               if (end_ok or end_ko)
     102              if (end)
    103103                {
    104104                  log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * UPT [%d][%d]",i,bottom);
    105105                  log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * UPT [%d][%d]._state =  UPDATE_PREDICTION_STATE_EMPTY",i,bottom);
    106 
    107106                  // Free slot
    108107                  reg_UPDATE_PREDICTION_TABLE [i][bottom]._state = UPDATE_PREDICTION_STATE_EMPTY;
     
    110109                  // Update pointer
    111110                  reg_UPT_BOTTOM [i] = (bottom+1)%_param->_size_upt_queue[i];
    112 
     111                 
    113112                  if (reg_UPT_BOTTOM [i] == reg_UPT_TOP [i])
    114113                    reg_UPT_EMPTY [i] = true; // free a slot
     
    118117
    119118                  if (reg_EVENT_VAL [i] and (reg_EVENT_UPT_PTR [i] == bottom))
    120 //                   if (end_ko) // free
    121119                    {
    122120                      log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * END EVENT");
     
    129127                        reg_UPT_EMPTY [i] = false;
    130128                    }
     129
    131130                }
    132131            }
    133132          }
     133
    134134        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * GARBAGE COLLECTOR (END)");
    135135
     
    450450                      // if free a slot, also all queue is updated
    451451                      // Last slot ?
    452                       if (reg_UFPT_UPDATE [context] == reg_UFPT_BOTTOM [context])
     452//                       if (reg_UFPT_UPDATE [context] == reg_UFPT_BOTTOM [context])
     453                      if ((--reg_UFPT_NB_UPDATE [context])==0)
    453454                        switch (reg_EVENT_STATE [context])
    454455                          {
     
    472473                     
    473474                      reg_UPDATE_FETCH_PREDICTION_TABLE [context][depth]._state = UPDATE_FETCH_PREDICTION_STATE_END;
    474                      
    475                      
     475                                           
    476476                      // Update pointer
    477477                      log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * reg_UFPT_UPDATE (before) : %d",reg_UFPT_UPDATE [context]);
     
    531531                      else
    532532                        {
    533                           log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * UPT  [%d][%d].state <- UPDATE_PREDICTION_STATE_END_OK (update)",context,depth);
    534                          
    535                           reg_UPDATE_PREDICTION_TABLE [context][depth]._state = UPDATE_PREDICTION_STATE_END_OK;
    536 
     533//                           log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * UPT  [%d][%d].state <- UPDATE_PREDICTION_STATE_END_OK (update)",context,depth);
     534//                           reg_UPDATE_PREDICTION_TABLE [context][depth]._state = UPDATE_PREDICTION_STATE_END_OK;
     535
     536                          log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * UPT  [%d][%d].state <- UPDATE_PREDICTION_STATE_END (update)",context,depth);
     537                          reg_UPDATE_PREDICTION_TABLE [context][depth]._state = UPDATE_PREDICTION_STATE_END;
    537538
    538539#ifdef STATISTICS
     
    650651                    reg_EVENT_STATE [i] = EVENT_STATE_OK;
    651652                    reg_IS_ACCURATE [i] = true;
    652                    
    653 //                  Tdepth_t depth = reg_UPT_TOP [i];
    654 
    655 #ifdef DEBUG_TEST
    656 //                  if (reg_UPDATE_PREDICTION_TABLE [i][depth]._state != UPDATE_PREDICTION_STATE_END_KO_WAIT_END)
    657 //                    throw ERRORMORPHEO(FUNCTION,_("Event : invalid upt event state."));
     653
     654                    Tdepth_t depth = reg_EVENT_UPT_PTR [i];
     655
     656                    if (reg_UPDATE_PREDICTION_TABLE [i][depth]._state == UPDATE_PREDICTION_STATE_END_KO)
     657                      {
     658                        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * UPT  [%d][%d].state <- UPDATE_PREDICTION_STATE_END (event)",i,depth);
     659                       
     660                        reg_UPDATE_PREDICTION_TABLE [i][depth]._state = UPDATE_PREDICTION_STATE_END;
     661                      }
     662
     663#ifdef DEBUG_TEST
     664//                     if (reg_UPDATE_PREDICTION_TABLE [i][depth]._state != UPDATE_PREDICTION_STATE_END_KO_WAIT_END)
     665//                       throw ERRORMORPHEO(FUNCTION,_("Event : invalid upt event state."));
    658666//                  if (reg_UPDATE_PREDICTION_TABLE [i][depth]._state != UPDATE_PREDICTION_STATE_END_KO)
    659667//                    throw ERRORMORPHEO(FUNCTION,_("Event : invalid upt event state."));
    660668#endif
    661                  
    662 //                  log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * UPT  [%d][%d].state <- UPDATE_PREDICTION_STATE_END_KO (update)",i,depth);
    663                          
    664 //                  reg_UPDATE_PREDICTION_TABLE [i][depth]._state = UPDATE_PREDICTION_STATE_END_KO;
    665 
     669
     670//                     log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * UPT  [%d][%d].state <- UPDATE_PREDICTION_STATE_END_KO (update)",i,depth);
     671                   
     672//                     reg_UPDATE_PREDICTION_TABLE [i][depth]._state = UPDATE_PREDICTION_STATE_END_KO;
     673                   
    666674                    break;
    667675                  }
     
    685693                    log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * new_update : %d",new_update);
    686694
    687                    
    688 #ifdef DEBUG_TEST
    689                     if (reg_UPDATE_PREDICTION_TABLE [i][depth]._state != UPDATE_PREDICTION_STATE_WAIT_END)
    690                       throw ERRORMORPHEO(FUNCTION,_("Branch complete : invalid upt state."));
    691 #endif
    692 
    693                     // flush all slot after the event
    694                     for (uint32_t j=depth;
    695                          j!=top;
    696                          j=(j+1)%_param->_size_upt_queue[i])
    697                       reg_UPDATE_PREDICTION_TABLE [i][j]._state = UPDATE_PREDICTION_STATE_EVENT;
    698                      
    699                     // test full :
    700                     if (full)
    701                       reg_UPDATE_PREDICTION_TABLE [i][depth]._state = UPDATE_PREDICTION_STATE_EVENT;
     695                    // Test empty
     696                    if (not reg_UPT_EMPTY [i])
     697                      {
     698#ifdef DEBUG_TEST
     699                        if (reg_UPDATE_PREDICTION_TABLE [i][depth]._state != UPDATE_PREDICTION_STATE_WAIT_END)
     700                          throw ERRORMORPHEO(FUNCTION,_("Branch complete : invalid upt state."));
     701#endif
     702                        reg_UPDATE_PREDICTION_TABLE [i][depth]._state = UPDATE_PREDICTION_STATE_EVENT;
     703
     704                        // flush all slot after the event
     705                        for (uint32_t j=(depth+1)%_param->_size_upt_queue[i];
     706                             j!=top;
     707                             j=(j+1)%_param->_size_upt_queue[i])
     708                          reg_UPDATE_PREDICTION_TABLE [i][j]._state = UPDATE_PREDICTION_STATE_EVENT;
     709                      }
    702710             
    703711//                  reg_UPT_BOTTOM    [i];
     
    802810                {
    803811                  for (uint32_t j=0; j<_param->_size_ufpt_queue[i]; ++j)
    804                     reg_UPDATE_FETCH_PREDICTION_TABLE [i][j]._state = UPDATE_FETCH_PREDICTION_STATE_EVENT;
    805                  
     812                    {
     813                      reg_UFPT_NB_UPDATE [i] ++;
     814                      reg_UPDATE_FETCH_PREDICTION_TABLE [i][j]._state = UPDATE_FETCH_PREDICTION_STATE_EVENT;
     815                    }
     816
    806817                  // TOP is next write slot : last slot is TOP-1
    807818                  uint32_t top = reg_UFPT_TOP [i];
    808                   reg_UFPT_UPDATE [i] = ((top==0)?_param->_size_ufpt_queue[i]:top)-1;
    809                  
    810 //                reg_UFPT_BOTTOM [i];
    811 //                reg_UFPT_TOP    [i];
     819                  reg_UFPT_UPDATE    [i] = ((top==0)?_param->_size_ufpt_queue[i]:top)-1;
     820
     821//                reg_UFPT_BOTTOM    [i];
     822//                reg_UFPT_TOP       [i];
    812823                }
    813824
     
    853864        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * reg_UFPT_UPDATE         : %d",reg_UFPT_UPDATE         [i]);
    854865        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * reg_UFPT_NB_NEED_UPDATE : %d",reg_UFPT_NB_NEED_UPDATE [i]);
     866        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * reg_UFPT_NB_UPDATE      : %d",reg_UFPT_NB_UPDATE      [i]);
    855867        for (uint32_t j=0; j<_param->_size_ufpt_queue[i]; j++)
    856868          log_printf(TRACE,Update_Prediction_Table,FUNCTION,"        [%d] %.4d, %.8x %.8x, %.1d   %.1d, %.8d %.8x %.4d - %s",
Note: See TracChangeset for help on using the changeset viewer.