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/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table
Files:
3 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

    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()
Note: See TracChangeset for help on using the changeset viewer.