Ignore:
Timestamp:
Dec 10, 2008, 7:31:39 PM (15 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_genMealy_branch_complete.cpp

    r82 r88  
    2222  void Update_Prediction_Table::genMealy_branch_complete (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());
    2526   
    2627    for (uint32_t i=0; i<_param->_nb_inst_branch_complete; i++)
     28#ifdef DEBUG_TEST
     29      // just to don't have exception in not transaction
     30      if (PORT_READ(in_BRANCH_COMPLETE_VAL [i]))
     31#endif
    2732      {
     33        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * BRANCH_COMPLETE [%d]",i);
     34
    2835        Tcontext_t          context   = (_param->_have_port_context_id)?PORT_READ(in_BRANCH_COMPLETE_CONTEXT_ID [i]):0;
    29         Tdepth_t            depth     = (_param->_have_port_max_depth )?PORT_READ(in_BRANCH_COMPLETE_DEPTH      [i]):0;
     36        Tdepth_t            depth     = (_param->_have_port_depth    )?PORT_READ(in_BRANCH_COMPLETE_DEPTH      [i]):0;
    3037        Tcontrol_t          miss      = false;
    3138        Tcontrol_t          take      = reg_UPDATE_PREDICTION_TABLE [context][depth]._last_take   ;
    3239        Taddress_t          addr_dest = reg_UPDATE_PREDICTION_TABLE [context][depth]._address_dest;
    3340        Tbranch_condition_t condition = reg_UPDATE_PREDICTION_TABLE [context][depth]._condition   ;
     41
     42        Tcontrol_t          flag      = PORT_READ(in_BRANCH_COMPLETE_FLAG [i]);
     43        Taddress_t          addr_good = PORT_READ(in_BRANCH_COMPLETE_ADDRESS [i]);
     44
     45        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * context        : %d",context);
     46        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * depth          : %d",depth  );
     47        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * condition      : %s",toString(condition).c_str());
     48        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * flag           : %d",flag);
     49        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * address_good   : %.8x",addr_good);
     50
     51        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * (before)");
     52        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * miss         : %d",miss);
     53        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * take         : %d",take);
     54        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * address_dest : %.8x",addr_dest);
    3455
    3556        switch (condition)
     
    3960            {
    4061              //miss      : always hit
    41               //addr_dest : know in decod stage
     62              //addr_dest : compute in decod stage
     63
     64#ifdef DEBUG_TEST
     65              if (take != 1)
     66                throw ERRORMORPHEO(FUNCTION,toString("Branch_complete[%d] (condition %s) : bad direction.",i,toString(condition).c_str()));
     67              if (addr_dest != addr_good)
     68                throw ERRORMORPHEO(FUNCTION,toString("Branch_complete[%d] (condition %s) : bad destination address.",i,toString(condition).c_str()));
     69#endif
     70
    4271              break;
    4372            }
    4473          case BRANCH_CONDITION_FLAG_UNSET                        : // l.bnf
    4574            {
    46               Tcontrol_t take_good = PORT_READ(in_BRANCH_COMPLETE_FLAG [i]) == 0;
     75              //addr_dest : compute in decod stage
     76              //miss if the direction is bad
     77              Tcontrol_t take_good = not flag; // flag set = not take
     78
    4779              miss = (take != take_good);
    4880              take = take_good;
    49               //addr_dest : know in decod stage
     81
     82#ifdef DEBUG_TEST
     83              if (addr_dest != addr_good)
     84                throw ERRORMORPHEO(FUNCTION,toString("Branch_complete[%d] (condition %s) : bad destination address.",i,toString(condition).c_str()));
     85#endif
     86
    5087              break;
    5188            }
    5289          case BRANCH_CONDITION_FLAG_SET                          : // l.bf
    5390            {
    54 //            log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * BRANCH_CONDITION_FLAG_SET");
    55              
    56               Tcontrol_t take_good = PORT_READ(in_BRANCH_COMPLETE_FLAG [i]) == 1;
     91              //addr_dest : compute in decod stage
     92              //miss if the direction is bad
     93              Tcontrol_t take_good = flag; // flag set = take
     94
    5795              miss = (take != take_good);
    5896              take = take_good;
    5997
    60 //            log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * flag      : %d",PORT_READ(in_BRANCH_COMPLETE_FLAG [i]));
    61 //            log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * take_good : %d",take_good);
    62 //            log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * miss      : %d",miss);
    63              
    64               //addr_dest : know in decod stage
     98#ifdef DEBUG_TEST
     99              if (addr_dest != addr_good)
     100                throw ERRORMORPHEO(FUNCTION,toString("Branch_complete[%d] (condition %s) : bad destination address.",i,toString(condition).c_str()));
     101#endif
     102
    65103              break;
    66104            }
     
    69107          case BRANCH_CONDITION_READ_STACK                        : // l.jr (rb==r9)
    70108            {
    71               Taddress_t addr_good = PORT_READ(in_BRANCH_COMPLETE_ADDRESS [i]);
    72               miss = ((take == 1) and
    73                       (addr_dest = addr_good));
    74               take = 1;
     109              // miss if destination address is bad
     110              miss      = (addr_dest != addr_good);
    75111              addr_dest = addr_good;
     112
     113#ifdef DEBUG_TEST
     114              if (take != 1)
     115                throw ERRORMORPHEO(FUNCTION,toString("Branch_complete[%d] (condition %s) : bad direction.",i,toString(condition).c_str()));
     116#endif
     117             
    76118              break;
    77119            }
    78120          }
    79121
    80 //      log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * miss      : %d",miss);
    81 //      log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * take      : %d",take);
    82 //      log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * address   : %x",addr_dest);
    83 
     122        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * (after)");
     123        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * miss         : %d",miss);
     124        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * take         : %d",take);
     125        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      * address_dest : %.8x",addr_dest);
     126       
    84127        internal_BRANCH_COMPLETE_MISS_PREDICTION [i] = miss     ;
    85128        internal_BRANCH_COMPLETE_TAKE            [i] = take     ;
    86129        internal_BRANCH_COMPLETE_ADDRESS_DEST    [i] = addr_dest;
    87 
     130       
    88131        PORT_WRITE(out_BRANCH_COMPLETE_MISS_PREDICTION [i], internal_BRANCH_COMPLETE_MISS_PREDICTION [i]);
    89132        PORT_WRITE(out_BRANCH_COMPLETE_TAKE            [i], internal_BRANCH_COMPLETE_TAKE            [i]);
     
    92135      }
    93136
    94     log_printf(FUNC,Update_Prediction_Table,FUNCTION,"End");
     137    log_end(Update_Prediction_Table,FUNCTION);
    95138  };
    96139
Note: See TracChangeset for help on using the changeset viewer.