Ignore:
Timestamp:
Jan 15, 2009, 6:19:08 PM (15 years ago)
Author:
rosiere
Message:

1) Add soc test
2) fix bug (Pc management, Decod and execute, Update prediction ...)

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

    r98 r101  
    4646            reg_UPT_TOP_EVENT        [i] = 0;
    4747            reg_UPT_UPDATE           [i] = 0;
     48            reg_UPT_EMPTY            [i] = true;
    4849                                                                                   
    4950            reg_IS_ACCURATE          [i] = true;
     
    8788            // UPDATE_PREDICTION_TABLE
    8889            {
    89               uint32_t bottom = reg_UPT_BOTTOM [i];
    90               bool     end_ok = (reg_UPDATE_PREDICTION_TABLE [i][bottom]._state == UPDATE_PREDICTION_STATE_END_OK);
    91               bool     end_ko = (reg_UPDATE_PREDICTION_TABLE [i][bottom]._state == UPDATE_PREDICTION_STATE_END_KO);
     90              uint32_t      bottom      = reg_UPT_BOTTOM [i];
     91              bool          end_ok      = (reg_UPDATE_PREDICTION_TABLE [i][bottom]._state == UPDATE_PREDICTION_STATE_END_OK);
     92              bool          end_ko      = (reg_UPDATE_PREDICTION_TABLE [i][bottom]._state == UPDATE_PREDICTION_STATE_END_KO);
     93//               event_state_t event_state = reg_EVENT_STATE [i];
    9294
    9395              // Test if state is end
     96//               if ((end_ok or end_ko) and
     97//                   ((event_state != EVENT_STATE_UPDATE_CONTEXT) and
     98//                    (event_state != EVENT_STATE_WAIT_END_EVENT)))
    9499              if (end_ok or end_ko)
    95100                {
     
    102107                  // Update pointer
    103108                  reg_UPT_BOTTOM [i] = (bottom+1)%_param->_size_upt_queue[i];
     109
     110                  if (reg_UPT_BOTTOM [i] == reg_UPT_TOP [i])
     111                    reg_UPT_EMPTY [i] = true; // free a slot
     112
    104113//                   if (bottom = reg_UPT_UPDATE [i])
    105114//                     reg_UPT_UPDATE [i] = reg_UPT_BOTTOM [i];
     
    108117                      reg_UPT_TOP    [i] = reg_UPT_TOP_EVENT [i];
    109118                      reg_UPT_UPDATE [i] = reg_UPT_TOP_EVENT [i];
     119
     120                      if (reg_UPT_BOTTOM [i] != reg_UPT_TOP [i])
     121                        reg_UPT_EMPTY [i] = false;
    110122                    }
    111123                }
     
    290302              // Update pointer
    291303              reg_UPT_TOP     [context] = (upt_ptr_write+1)%_param->_size_upt_queue [context];
     304              reg_UPT_EMPTY   [context] = false;
    292305//            reg_UPT_UPDATE  [context] = reg_UPT_TOP [context];
    293306            }
     
    338351                  reg_UPT_TOP_EVENT [context] = top;
    339352
     353                  if (reg_UPT_BOTTOM [context] == reg_UPT_TOP [context])
     354                    reg_UPT_EMPTY [i] = true;
     355
    340356#ifdef DEBUG_TEST
    341357                  if (reg_UPDATE_PREDICTION_TABLE [context][depth]._state != UPDATE_PREDICTION_STATE_WAIT_END)
     
    483499                      if (ko)
    484500                        {
     501                          // Ko : wait end of all instruction
     502//                           log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * UPT  [%d][%d].state <- UPDATE_PREDICTION_STATE_END_KO_WAIT_END (update)",context,depth);
     503                         
     504//                           reg_UPDATE_PREDICTION_TABLE [context][depth]._state = UPDATE_PREDICTION_STATE_END_KO_WAIT_END;
     505
    485506                          log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * UPT  [%d][%d].state <- UPDATE_PREDICTION_STATE_END_KO (update)",context,depth);
    486507                         
     
    535556                     
    536557                      // Free the branch with no accurate ?
    537                       if (reg_UPDATE_PREDICTION_TABLE [context][depth]._is_accurate == false)
     558                      if ( (reg_UPDATE_PREDICTION_TABLE [context][depth]._is_accurate == false) and not ko)
    538559                        reg_IS_ACCURATE [context] = true;
    539560                    }
     
    587608//            Tdepth_t       depth       = PORT_READ(in_EVENT_DEPTH [i]);
    588609           
    589               // Test if end of miss
     610              // Test if end of miss -> all previous branch is complete
     611              //                     -> all next     branch is finish
    590612              if (event_type  == EVENT_TYPE_MISS_SPECULATION)
    591613                {
     
    602624                 
    603625                  reg_EVENT_STATE [i] = EVENT_STATE_OK;
     626                  reg_IS_ACCURATE [i] = true;
     627
     628//                   Tdepth_t depth = reg_UPT_TOP [i];
     629
     630#ifdef DEBUG_TEST
     631//                   if (reg_UPDATE_PREDICTION_TABLE [i][depth]._state != UPDATE_PREDICTION_STATE_END_KO_WAIT_END)
     632//                     throw ERRORMORPHEO(FUNCTION,_("Event : invalid upt event state."));
     633//                   if (reg_UPDATE_PREDICTION_TABLE [i][depth]._state != UPDATE_PREDICTION_STATE_END_KO)
     634//                     throw ERRORMORPHEO(FUNCTION,_("Event : invalid upt event state."));
     635#endif
     636                 
     637//                   log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * UPT  [%d][%d].state <- UPDATE_PREDICTION_STATE_END_KO (update)",i,depth);
     638                         
     639//                   reg_UPDATE_PREDICTION_TABLE [i][depth]._state = UPDATE_PREDICTION_STATE_END_KO;
     640
    604641                }
    605642            }
     
    699736        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * reg_UPT_TOP_EVENT       : %d",reg_UPT_TOP_EVENT      [i]);
    700737        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * reg_UPT_UPDATE          : %d",reg_UPT_UPDATE         [i]);
     738        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * reg_UPT_EMPTY           : %d",reg_UPT_EMPTY          [i]);
    701739        for (uint32_t j=0; j<_param->_size_upt_queue[i]; j++)
    702740          log_printf(TRACE,Update_Prediction_Table,FUNCTION,"        [%d] %.4d, %.8x %.8x, %.1d %.1d %.1d, %.8d %.8x %.4d - %s",
Note: See TracChangeset for help on using the changeset viewer.