Ignore:
Timestamp:
Dec 10, 2008, 7:31:39 PM (16 years ago)
Author:
rosiere
Message:

Almost complete design
with Test and test platform

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_genMoore.cpp

    r82 r88  
    2222  void Update_Prediction_Table::genMoore (void)
    2323  {
    24     log_printf(FUNC,Update_Prediction_Table,FUNCTION,"Begin");
     24    log_begin(Update_Prediction_Table,FUNCTION);
     25    log_function(Update_Prediction_Table,FUNCTION,_name.c_str());
     26    log_printf(NONE,Update_Prediction_Table,FUNCTION,FUNCTION);
     27
     28    if (PORT_READ(in_NRESET) == 1)
     29      {
    2530
    2631    // ===================================================================
     
    3035    for (uint32_t i=0; i<_param->_nb_context; i++)
    3136      {
    32         if (_param->_have_port_depth [i])
    33           {
    34             PORT_WRITE(out_DEPTH_TAIL      [i], reg_BOTTOM [i]);
    35           }
    36         PORT_WRITE(out_DEPTH_NB_BRANCH [i], reg_NB_ELT [i]);
    37       }
     37        if (_param->_have_port_depth)
     38          {
     39        PORT_WRITE(out_DEPTH_CURRENT [i], reg_UPT_TOP    [i]);
     40        PORT_WRITE(out_DEPTH_MIN     [i], reg_UPT_BOTTOM [i]);
     41          }
     42        PORT_WRITE(out_DEPTH_MAX     [i], reg_UPT_TOP    [i]);
     43      }
     44
    3845    // ===================================================================
    3946    // =====[ UPDATE ]====================================================
    4047    // ===================================================================
    4148
    42     Tdepth_t tab_depth [_param->_nb_context];
     49    bool     retire_ras_from_ufpt [_param->_nb_context]; // event ufpt -> restore RAS, else update upt
     50    bool     retire_ras_from_upt  [_param->_nb_context]; // event upt  -> restore RAS, else restore others structure
     51    bool     ufpt_update          [_param->_nb_context];
     52    bool     upt_update           [_param->_nb_context];
     53    Tdepth_t tab_ufpt_depth       [_param->_nb_context];
     54    Tdepth_t tab_upt_depth        [_param->_nb_context];
     55
    4356    for (uint32_t i=0; i<_param->_nb_context; i++)
    44       tab_depth [i] = reg_BOTTOM [i];
     57      {
     58        event_state_t event_state = reg_EVENT_STATE [i];
     59
     60        retire_ras_from_ufpt [i] = ((event_state == EVENT_STATE_FLUSH_UFPT        ) or
     61                                    (event_state == EVENT_STATE_FLUSH_UFPT_AND_UPT));
     62        retire_ras_from_upt  [i] = (event_state == EVENT_STATE_FLUSH_UPT_RAS);
     63
     64        ufpt_update          [i] = true;
     65        upt_update           [i] = true;
     66        tab_ufpt_depth       [i] = reg_UFPT_UPDATE [i];
     67        tab_upt_depth        [i] = reg_UPT_UPDATE  [i];
     68      }
    4569
    4670    for (uint32_t i=0; i<_param->_nb_inst_update; i++)
    4771      {
    48         uint32_t   context = (reg_UPDATE_PRIORITY+i)%_param->_nb_context;
    49         Tdepth_t   depth   = tab_depth[context];
    50         state_t    state   = reg_UPDATE_PREDICTION_TABLE [context][depth]._state;
     72        Tcontext_t          context     = (reg_UPDATE_PRIORITY+i)%_param->_nb_context;
     73
     74        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * UPDATE [%d] (genMoore)",i);
     75        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * context         : %d",context);
     76        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * event_state     : %s",toString(reg_EVENT_STATE [context]).c_str());
     77
     78        Tcontrol_t          val                  = false;
     79        Tcontrol_t          val_without_ack      = false;
     80        Tcontrol_t          miss_prediction      ;
     81        Tcontrol_t          direction_good       ;
     82        Tcontrol_t          btb_val              ;
     83        Taddress_t          btb_address_src      ;
     84        Taddress_t          btb_address_dest     ;
     85        Tbranch_condition_t btb_condition        ;
     86        Tcontrol_t          dir_val              ;
     87        Thistory_t          dir_history          ;
     88        Tcontrol_t          ras_val              ;
     89        Tcontrol_t          ras_push             ;
     90        Taddress_t          ras_address          ;
     91        Tptr_t              ras_index            ;
     92        Tcontrol_t          ras_prediction_ifetch;
     93
     94        // Test if update fetch prediction table need update port
     95        if (retire_ras_from_ufpt [context])
     96          {
     97            if (ufpt_update [context])
     98              {
     99                // Update Fetch Prediction Table
     100                // An update of ufpt is to previous miss. Just restore Return Address Stack
     101               
     102                Tdepth_t            depth     = tab_ufpt_depth[context];
     103                ufpt_state_t        state     = reg_UPDATE_FETCH_PREDICTION_TABLE [context][depth]._state;
     104                Tbranch_condition_t condition = reg_UPDATE_FETCH_PREDICTION_TABLE [context][depth]._condition;
     105               
     106                log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * Update Fetch Prediction Table");
     107                log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * depth           : %d",depth    );
     108                log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * state           : %s",toString(state    ).c_str());
     109                log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * condition       : %s",toString(condition).c_str());
     110               
     111                val                   = (state == UPDATE_FETCH_PREDICTION_STATE_EVENT);
     112                miss_prediction       = 1;
     113//              direction_good        = ;
     114                btb_val               = 0; // don't update btb (is update by the event branch)
     115//              btb_address_src       = ;
     116//              btb_address_dest      = ;
     117//              btb_condition         = ;
     118                dir_val               = 0; // don't update btb (is update by the event branch (if conditionnal branch))
     119//              dir_history           = ;
     120                ras_val               = update_ras(condition); // repop/ repush data -> don't corrupt ras
     121                ras_push              = push_ras(condition);
     122                ras_address           = reg_UPDATE_FETCH_PREDICTION_TABLE [context][depth]._address_ras;
     123                ras_index             = reg_UPDATE_FETCH_PREDICTION_TABLE [context][depth]._index_ras;
     124                ras_prediction_ifetch = 1;
     125               
     126                internal_UPDATE_FROM_UFPT [i] = true;
     127                internal_UPDATE_DEPTH     [i] = depth;
     128                internal_UPDATE_RAS       [i] = false;
     129
     130                // Warning : don't update same entry
     131                if (depth == reg_UFPT_BOTTOM[context])
     132                  ufpt_update [context] = false;
     133               
     134                tab_ufpt_depth[context] = (depth==0)?(_param->_size_ufpt_queue[context]-1):(depth-1);
     135              }
     136          }
     137        else
     138          {
     139            if (upt_update [context])
     140              {
     141                // Update Prediction Table
     142               
     143                Tdepth_t            depth     = tab_upt_depth[context];
     144                upt_state_t         state     = reg_UPDATE_PREDICTION_TABLE [context][depth]._state;
     145                Tbranch_condition_t condition = reg_UPDATE_PREDICTION_TABLE [context][depth]._condition;
     146                Tcontrol_t          ifetch    = reg_UPDATE_PREDICTION_TABLE [context][depth]._ifetch_prediction;
     147               
     148                log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * Update Prediction Table");
     149                log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * depth           : %d",depth    );
     150                log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * state           : %s",toString(state    ).c_str());
     151                log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * condition       : %s",toString(condition).c_str());
     152             
     153                Tcontrol_t          state_is_ok_ko           = ((state == UPDATE_PREDICTION_STATE_OK) or
     154                                                                (state == UPDATE_PREDICTION_STATE_KO));
     155                Tcontrol_t          state_is_event           = (state == UPDATE_PREDICTION_STATE_EVENT);
     156                Tcontrol_t          state_is_event_update    = state_is_event and     need_update(condition);
     157                Tcontrol_t          state_is_event_no_update = state_is_event and not need_update(condition);
     158
     159                if (retire_ras_from_upt [context])
     160                  {
     161                val                   = state_is_event_update;
     162                val_without_ack       = state_is_event_no_update;
     163                  }
     164                else
     165                  {
     166                val                   = state_is_ok_ko;
     167                val_without_ack       = false;
     168                  }                 
     169
     170                miss_prediction       = (state != UPDATE_PREDICTION_STATE_OK);
     171                direction_good        = reg_UPDATE_PREDICTION_TABLE [context][depth]._good_take   ;
     172                btb_val               = update_btb(condition);
     173                btb_address_src       = reg_UPDATE_PREDICTION_TABLE [context][depth]._address_src ;
     174                btb_address_dest      = reg_UPDATE_PREDICTION_TABLE [context][depth]._address_dest;
     175                btb_condition         = condition;
     176                dir_val               = update_dir(condition) and ifetch; // if not ifetch, then static prediction
     177                dir_history           = reg_UPDATE_PREDICTION_TABLE [context][depth]._history     ;
     178                ras_val               = update_ras(condition); // repop/ repush data -> don't corrupt ras
     179                ras_push              = push_ras(condition);
     180                ras_address           = reg_UPDATE_PREDICTION_TABLE [context][depth]._address_ras;
     181                ras_index             = reg_UPDATE_PREDICTION_TABLE [context][depth]._index_ras;
     182                ras_prediction_ifetch = ifetch;
     183
     184                internal_UPDATE_FROM_UFPT [i] = false;
     185                internal_UPDATE_DEPTH     [i] = depth;
     186                internal_UPDATE_RAS       [i] = retire_ras_from_upt [context];
     187
     188                // Warning : don't update same entry
     189                if (retire_ras_from_upt [context])
     190                  {
     191                    // Restore RAS.
     192                    if ((depth == reg_UPT_BOTTOM[context]) or not (val or val_without_ack))
     193                      upt_update [context] = false;
     194                   
     195                    tab_upt_depth[context] = (depth==0)?(_param->_size_upt_queue[context]-1):(depth-1);
     196                  }
     197                else
     198                  {
     199                    if ((depth == reg_UPT_TOP [context]) or not (val or val_without_ack))
     200                      upt_update [context] = false;
     201                   
     202                    tab_upt_depth[context] = (depth+1)%_param->_size_upt_queue[context];
     203                  }
     204              }
     205          }
     206
     207        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * val             : %d",val    );
     208        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * val_without_ack : %d",val_without_ack);
     209        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * btb_val         : %d",btb_val);
     210        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * dir_val         : %d",dir_val);
     211        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * ras_val         : %d",ras_val);
     212
     213        internal_UPDATE_VAL             [i] = val;
     214        internal_UPDATE_VAL_WITHOUT_ACK [i] = val_without_ack;
     215        internal_UPDATE_CONTEXT_ID      [i] = context;
     216
     217        PORT_WRITE(out_UPDATE_VAL                   [i],internal_UPDATE_VAL [i]);
     218        if (val)
     219          {
     220        if (_param->_have_port_context_id)
     221        PORT_WRITE(out_UPDATE_CONTEXT_ID            [i],context              );
     222        PORT_WRITE(out_UPDATE_MISS_PREDICTION       [i],miss_prediction      );
     223        PORT_WRITE(out_UPDATE_DIRECTION_GOOD        [i],direction_good       );
     224        PORT_WRITE(out_UPDATE_BTB_VAL               [i],btb_val              );
     225        PORT_WRITE(out_UPDATE_BTB_ADDRESS_SRC       [i],btb_address_src      );
     226
     227        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * address_src     : %.8x",btb_address_src);
     228
     229        PORT_WRITE(out_UPDATE_BTB_ADDRESS_DEST      [i],btb_address_dest     );
     230        PORT_WRITE(out_UPDATE_BTB_CONDITION         [i],btb_condition        );
     231        PORT_WRITE(out_UPDATE_DIR_VAL               [i],dir_val              );
     232        if (_param->_have_port_history)
     233        PORT_WRITE(out_UPDATE_DIR_HISTORY           [i],dir_history          );
     234        PORT_WRITE(out_UPDATE_RAS_VAL               [i],ras_val              );
     235        PORT_WRITE(out_UPDATE_RAS_PUSH              [i],ras_push             );
     236        PORT_WRITE(out_UPDATE_RAS_ADDRESS           [i],ras_address          );
     237        PORT_WRITE(out_UPDATE_RAS_INDEX             [i],ras_index            );
     238        PORT_WRITE(out_UPDATE_RAS_PREDICTION_IFETCH [i],ras_prediction_ifetch);
     239          }
     240      }
     241
     242//     // ===================================================================
     243//     // =====[ BRANCH_EVENT ]==============================================
     244//     // ===================================================================
     245//     for (uint32_t i=0; i<_param->_nb_context; i++)
     246//       {
     247//      Tdepth_t   depth   = (reg_BOTTOM [i] + reg_NB_ELT_UPDATE [i])%_param->_size_queue [i];
     248//      state_t    state   = reg_UPDATE_PREDICTION_TABLE [i][depth]._state;
    51249       
    52         Tcontrol_t val     = ((state == UPDATE_PREDICTION_STATE_OK) or
    53                               (state == UPDATE_PREDICTION_STATE_KO));
    54 
    55 //      log_printf(TRACE,Update_Prediction_Table,FUNCTION,"UPDATE [%d] (genMoore)",i);
    56 //      log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * context     : %d",context);
    57 //      log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * depth       : %d",depth);
    58 //      log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * state       : %s",toString(state).c_str());
    59 //      log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * val         : %d",val);
    60 //      log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * addr_src    : %x",reg_UPDATE_PREDICTION_TABLE [context][depth]._address_src );
    61 //      log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * addr_dest   : %x",reg_UPDATE_PREDICTION_TABLE [context][depth]._address_dest);
    62 
    63         if (val)
    64           {
    65             Tbranch_condition_t cond    = reg_UPDATE_PREDICTION_TABLE [context][depth]._condition;
    66                      
    67             Tcontrol_t          ifetch  = reg_UPDATE_PREDICTION_TABLE [context][depth]._ifetch_prediction;
    68             Tcontrol_t          btb_val = true;
    69             Tcontrol_t          dir_val = (ifetch and // not ifetch == static prediction
    70                                            ((cond == BRANCH_CONDITION_FLAG_UNSET) or
    71                                             (cond == BRANCH_CONDITION_FLAG_SET)));
    72             Tcontrol_t          ras_val = ((cond == BRANCH_CONDITION_NONE_WITH_WRITE_STACK) or
    73                                            (cond == BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK) or
    74                                            (cond == BRANCH_CONDITION_READ_STACK));
    75            
    76             Tcontrol_t          push = ((cond == BRANCH_CONDITION_NONE_WITH_WRITE_STACK) or
    77                                         (cond == BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK));
    78 
    79             if (_param->_have_port_context_id)
    80             PORT_WRITE(out_UPDATE_CONTEXT_ID            [i],context);
    81             PORT_WRITE(out_UPDATE_MISS_PREDICTION       [i],(state == UPDATE_PREDICTION_STATE_KO));
    82             PORT_WRITE(out_UPDATE_DIRECTION_GOOD        [i],reg_UPDATE_PREDICTION_TABLE [context][depth]._good_take   );
    83             PORT_WRITE(out_UPDATE_BTB_VAL               [i],btb_val);
    84             PORT_WRITE(out_UPDATE_BTB_ADDRESS_SRC       [i],reg_UPDATE_PREDICTION_TABLE [context][depth]._address_src );
    85             PORT_WRITE(out_UPDATE_BTB_ADDRESS_DEST      [i],reg_UPDATE_PREDICTION_TABLE [context][depth]._address_dest);
    86             PORT_WRITE(out_UPDATE_BTB_CONDITION         [i],cond);
    87             PORT_WRITE(out_UPDATE_DIR_VAL               [i],dir_val);
    88             if (_param->_have_port_history)
    89             PORT_WRITE(out_UPDATE_DIR_HISTORY           [i],reg_UPDATE_PREDICTION_TABLE [context][depth]._history     );
    90             PORT_WRITE(out_UPDATE_RAS_VAL               [i],ras_val);
    91             PORT_WRITE(out_UPDATE_RAS_PUSH              [i],push);
    92             PORT_WRITE(out_UPDATE_RAS_ADDRESS           [i],reg_UPDATE_PREDICTION_TABLE [context][depth]._address_ras );
    93             PORT_WRITE(out_UPDATE_RAS_INDEX             [i],reg_UPDATE_PREDICTION_TABLE [context][depth]._index_ras   );
    94             PORT_WRITE(out_UPDATE_RAS_PREDICTION_IFETCH [i],ifetch);
    95 
    96             internal_UPDATE_CONTEXT_ID [i] = context;
    97             internal_UPDATE_DEPTH      [i] = depth;
    98 
    99             tab_depth[context] = (depth+1)%_param->_size_queue[context];
    100           }
    101 
    102         internal_UPDATE_VAL [i] = val;
    103         PORT_WRITE(out_UPDATE_VAL [i], internal_UPDATE_VAL [i]);
    104       }
    105 
    106     // ===================================================================
    107     // =====[ BRANCH_EVENT ]==============================================
    108     // ===================================================================
    109     for (uint32_t i=0; i<_param->_nb_context; i++)
    110       {
    111         Tdepth_t   depth   = (reg_BOTTOM [i] + reg_NB_ELT_UPDATE [i])%_param->_size_queue [i];
    112         state_t    state   = reg_UPDATE_PREDICTION_TABLE [i][depth]._state;
    113        
    114         Tcontrol_t val     = (state == UPDATE_PREDICTION_STATE_EVENT);
    115 
    116         if (val)
    117           {
    118             PORT_WRITE(out_BRANCH_EVENT_ADDRESS_SRC  [i], reg_UPDATE_PREDICTION_TABLE [i][depth]._address_src );
    119             PORT_WRITE(out_BRANCH_EVENT_ADDRESS_DEST [i], reg_UPDATE_PREDICTION_TABLE [i][depth]._address_dest);
    120             internal_BRANCH_EVENT_DEPTH [i] = depth;
    121           }
    122 
    123         internal_BRANCH_EVENT_VAL   [i] = val;
    124         PORT_WRITE(out_BRANCH_EVENT_VAL [i], internal_BRANCH_EVENT_VAL [i]);
    125       }
    126     log_printf(FUNC,Update_Prediction_Table,FUNCTION,"End");
     250//      Tcontrol_t val     = ((state == UPDATE_PREDICTION_STATE_EVENT) or
     251//                               (state == UPDATE_PREDICTION_STATE_WAITEND_AND_EVENT));
     252
     253//      if (val)
     254//        {
     255// //          breakpoint ("UPT : have an branch_event (depth %d)",depth);
     256//          PORT_WRITE(out_BRANCH_EVENT_ADDRESS_SRC  [i], reg_UPDATE_PREDICTION_TABLE [i][depth]._address_src );
     257//          PORT_WRITE(out_BRANCH_EVENT_ADDRESS_DEST [i], reg_UPDATE_PREDICTION_TABLE [i][depth]._address_dest);
     258//          internal_BRANCH_EVENT_DEPTH [i] = depth;
     259//        }
     260
     261//      internal_BRANCH_EVENT_VAL   [i] = val;
     262//      PORT_WRITE(out_BRANCH_EVENT_VAL [i], internal_BRANCH_EVENT_VAL [i]);
     263//       }
     264
     265      }
     266    log_end(Update_Prediction_Table,FUNCTION);
    127267  };
    128268
Note: See TracChangeset for help on using the changeset viewer.