Ignore:
Timestamp:
Dec 19, 2008, 4:34:00 PM (16 years ago)
Author:
rosiere
Message:

1) Update Prediction Table : statistics
2) Size instruction address on 30 bits
3) Change Log File
4) Add debug_level in simulation configuration file

File:
1 edited

Legend:

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

    r95 r97  
    472472//                    bool have_event = ((reg_UPDATE_PREDICTION_TABLE [context][depth]._state == UPDATE_PREDICTION_STATE_KO) or
    473473//                                       (reg_UPDATE_PREDICTION_TABLE [context][depth]._state == UPDATE_PREDICTION_STATE_EVENT));
     474#ifdef STATISTICS
     475                      Tbranch_condition_t condition = reg_UPDATE_PREDICTION_TABLE [context][depth]._condition;
     476                      bool ok     = (reg_UPDATE_PREDICTION_TABLE [context][depth]._state == UPDATE_PREDICTION_STATE_OK);
     477#endif
    474478                      bool ko     = (reg_UPDATE_PREDICTION_TABLE [context][depth]._state == UPDATE_PREDICTION_STATE_KO);
    475479
     
    480484                         
    481485                          reg_UPDATE_PREDICTION_TABLE [context][depth]._state = UPDATE_PREDICTION_STATE_END_KO;
     486
     487#ifdef STATISTICS
     488                          if (usage_is_set(_usage,USE_STATISTICS))
     489                            (*_stat_nb_branch_miss [context][condition])++;
     490#endif
    482491                        }
    483492                      else
     
    486495                         
    487496                          reg_UPDATE_PREDICTION_TABLE [context][depth]._state = UPDATE_PREDICTION_STATE_END_OK;
     497
     498
     499#ifdef STATISTICS
     500                          if (usage_is_set(_usage,USE_STATISTICS))
     501                            {
     502                              if (ok)
     503                                (*_stat_nb_branch_hit    [context][condition]) ++;
     504                              else
     505                                (*_stat_nb_branch_unused [context]) ++;
     506                            }
     507#endif
    488508                        }
    489509                     
     
    548568        // ===================================================================
    549569        for (uint32_t i=0; i<_param->_nb_context; ++i)
    550           {
    551             //----------------------------------------------------------------
    552             // Cases
    553             //----------------------------------------------------------------
    554             //   * EVENT_TYPE_NONE               - nothing
    555             //   * EVENT_TYPE_MISS_SPECULATION   
    556             //     * EVENT_STATE_END             - Change state, reset pointer
    557             //   * EVENT_TYPE_EXCEPTION          -
    558             //     * EVENT_STATE_EVENT           - Flush upft and upt
    559             //     * EVENT_STATE_END             - Change state, reset pointer
    560             //   * EVENT_TYPE_BRANCH_NO_ACCURATE - nothing : manage in decod and update
    561             //   * EVENT_TYPE_SPR_ACCESS         - nothing
    562             //   * EVENT_TYPE_MSYNC              - nothing
    563             //   * EVENT_TYPE_PSYNC              - nothing
    564             //   * EVENT_TYPE_CSYNC              - nothing
    565 
    566             Tevent_state_t event_state = PORT_READ(in_EVENT_STATE [i]);
    567             Tevent_type_t  event_type  = PORT_READ(in_EVENT_TYPE  [i]);
    568 //             Tdepth_t       depth       = PORT_READ(in_EVENT_DEPTH [i]);
     570          if (PORT_READ(in_EVENT_VAL [i]) and internal_EVENT_ACK [i])
     571            {
     572              //----------------------------------------------------------------
     573              // Cases
     574              //----------------------------------------------------------------
     575              //   * EVENT_TYPE_NONE               - nothing
     576              //   * EVENT_TYPE_MISS_SPECULATION   - Change state, reset pointer
     577              //   * EVENT_TYPE_EXCEPTION          - Flush upft and upt, Change state, reset pointer
     578              //   * EVENT_TYPE_BRANCH_NO_ACCURATE - nothing : manage in decod and update
     579              //   * EVENT_TYPE_SPR_ACCESS         - nothing
     580              //   * EVENT_TYPE_MSYNC              - nothing
     581              //   * EVENT_TYPE_PSYNC              - nothing
     582              //   * EVENT_TYPE_CSYNC              - nothing
     583             
     584              Tevent_type_t  event_type  = PORT_READ(in_EVENT_TYPE  [i]);
     585//            Tdepth_t       depth       = PORT_READ(in_EVENT_DEPTH [i]);
    569586           
    570             // Test if end of miss
    571             if ((event_state == EVENT_STATE_END) and
    572                 (event_type  == EVENT_TYPE_MISS_SPECULATION))
    573               {
    574                 log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * EVENT");
    575                 log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * state : EVENT_STATE_END");
    576                 log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * type  : EVENT_TYPE_MISS_SPECULATION");
    577 
    578 #ifdef DEBUG_TEST
    579                 if (reg_EVENT_STATE [i] != EVENT_STATE_WAIT_END_EVENT)
    580                   throw ERRORMORPHEO(FUNCTION,_("Event : invalid event state."));
    581 #endif
    582                
    583                 // Change state
    584                 log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * EVENT [%d] <- EVENT_STATE_OK (event)",i);
    585                
    586                 reg_EVENT_STATE [i] = EVENT_STATE_OK;
    587 
    588 //                 uint32_t bottom = reg_UPT_BOTTOM [i];
    589 
    590 //                 reg_UPT_TOP    [i] = bottom;
    591 //                 reg_UPT_UPDATE [i] = bottom;
    592               }
    593           }
     587              // Test if end of miss
     588              if (event_type  == EVENT_TYPE_MISS_SPECULATION)
     589                {
     590                  log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * EVENT");
     591                  log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * type  : EVENT_TYPE_MISS_SPECULATION");
     592                 
     593#ifdef DEBUG_TEST
     594                  if (reg_EVENT_STATE [i] != EVENT_STATE_WAIT_END_EVENT)
     595                    throw ERRORMORPHEO(FUNCTION,_("Event : invalid event state."));
     596#endif
     597                 
     598                  // Change state
     599                  log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * EVENT [%d] <- EVENT_STATE_OK (event)",i);
     600                 
     601                  reg_EVENT_STATE [i] = EVENT_STATE_OK;
     602                }
     603            }
    594604
    595605        // ===================================================================
     
    634644          }
    635645
     646#ifdef STATISTICS
     647        if (usage_is_set(_usage,USE_STATISTICS))
     648          for (uint32_t i=0; i<_param->_nb_context; i++)
     649            {
     650              for (uint32_t j=0; j<_param->_size_ufpt_queue[i]; j++)
     651                if (reg_UPDATE_FETCH_PREDICTION_TABLE [i][j]._state != UPDATE_FETCH_PREDICTION_STATE_EMPTY)
     652                  (*_stat_ufpt_queue_nb_elt [i]) ++;
     653              for (uint32_t j=0; j<_param->_size_upt_queue[i]; j++)
     654                if (reg_UPDATE_PREDICTION_TABLE [i][j]._state != UPDATE_PREDICTION_STATE_EMPTY)
     655                  (*_stat_upt_queue_nb_elt [i]) ++;
     656            }
     657#endif
     658       
    636659        // ===================================================================
    637660        // =====[ PRINT ]=====================================================
Note: See TracChangeset for help on using the changeset viewer.