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/Prediction_unit_Glue/src/Prediction_unit_Glue_genMealy_decod.cpp

    r82 r88  
    2222  void Prediction_unit_Glue::genMealy_decod (void)
    2323  {
    24     log_printf(FUNC,Prediction_unit_Glue,FUNCTION,"Begin");
    25 
     24    log_begin(Prediction_unit_Glue,FUNCTION);
     25    log_function(Prediction_unit_Glue,FUNCTION,_name.c_str());
     26
     27    // Init
    2628    uint32_t   decod_unit = reg_DECOD_PRIORITY;
    27 
     29   
    2830    log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"  * decod_unit : %d",decod_unit);
    2931
     
    4951      if ((port>=_param->_nb_inst_branch_decod) or
    5052          (PORT_READ(in_DECOD_VAL [decod_unit][i]) == 0))
    51         {
     53        {
    5254          log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"  * DECOD[%d][%d] : not valid",decod_unit,i);
    5355          ack [i] = false;
     
    5557      else
    5658        {
    57           Tcontext_t          context               = (_param->_have_port_context_id)?PORT_READ(in_DECOD_CONTEXT_ID [decod_unit][i]):0;
    58           Tbranch_state_t     branch_state          = PORT_READ(in_DECOD_BRANCH_STATE          [decod_unit][i]);
    59           Tcontrol_t          match_inst_ifetch_ptr = PORT_READ(in_DECOD_MATCH_INST_IFETCH_PTR [decod_unit][i]);
    60           Tprediction_ptr_t   depth   = (_param->_have_port_max_depth)?PORT_READ(in_DECOD_BRANCH_UPDATE_PREDICTION_ID [decod_unit][i]):0;
    61           Tcontrol_t          use_btb = false;
    62           Tcontrol_t          use_ras = false;
    63           Tcontrol_t          use_upt = true ;
    64           Tcontrol_t          miss_ifetch    = ( (branch_state == BRANCH_STATE_NONE) or // branch not detected
    65                                                  ((branch_state != BRANCH_STATE_NONE) and (match_inst_ifetch_ptr == 0))); // branch detected, but it's not the good
    66           Tcontrol_t          miss_decod;
     59          Tcontext_t        context               = (_param->_have_port_context_id)?PORT_READ(in_DECOD_CONTEXT_ID [decod_unit][i]):0;
     60          Tbranch_state_t   branch_state          = PORT_READ(in_DECOD_BRANCH_STATE          [decod_unit][i]);
     61          Tcontrol_t        match_inst_ifetch_ptr = PORT_READ(in_DECOD_MATCH_INST_IFETCH_PTR [decod_unit][i]);
     62          Tprediction_ptr_t depth                 = (_param->_have_port_depth)?PORT_READ(in_DECOD_BRANCH_UPDATE_PREDICTION_ID [decod_unit][i]):0;
     63          Tcontrol_t        use_btb               = false;
     64          Tcontrol_t        use_ras               = false;
     65          Tcontrol_t        use_upt               = true ; // always update upt.
     66
     67          // Ifetch stage made an miss if :
     68          //   * branch is previously predict, but it's not the good
     69          Tcontrol_t        miss_ifetch           = ((branch_state != BRANCH_STATE_NONE) and (match_inst_ifetch_ptr == 0));
     70          // Decod stage made an miss if :
     71          //   * branch was not detected
     72          Tcontrol_t        miss_decod            = (branch_state == BRANCH_STATE_NONE);
    6773
    6874          log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"  * DECOD[%d][%d] :     valid",decod_unit,i);
    69           log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"    * depth   [%d] : %d",i   ,depth);
     75          log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"    * branch_state          : %d",branch_state);
     76          log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"    * match_inst_ifetch_ptr : %d",match_inst_ifetch_ptr);
     77          log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"    * depth                 : [%d] %d",i,depth);
     78          log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"    * miss_ifetch           : %d",miss_ifetch);
     79          log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"    * miss_decod            : %d",miss_decod);
    7080
    7181          // Test if ifetch have detecte a branch is the packet
    72           if (miss_ifetch)
     82          if (miss_ifetch or miss_decod)
    7383            {
    74               log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"    * miss_ifetch");
    75               log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"      * state : %d",branch_state);
    76               log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"      * match : %d",match_inst_ifetch_ptr);
    77               Tbranch_condition_t condition             = PORT_READ(in_DECOD_BRANCH_CONDITION            [decod_unit][i]);
    78               Tcontrol_t          direction             = PORT_READ(in_DECOD_BRANCH_DIRECTION            [decod_unit][i]);
    79               Taddress_t          address_src           = PORT_READ(in_DECOD_ADDRESS_SRC                 [decod_unit][i]);
    80               Taddress_t          address_dest          = PORT_READ(in_DECOD_ADDRESS_DEST                [decod_unit][i]);
     84              Tbranch_condition_t condition    = PORT_READ(in_DECOD_BRANCH_CONDITION            [decod_unit][i]);
     85              Tcontrol_t          direction    = PORT_READ(in_DECOD_BRANCH_DIRECTION            [decod_unit][i]);
     86              Taddress_t          address_src  = PORT_READ(in_DECOD_ADDRESS_SRC                 [decod_unit][i]);
     87              Taddress_t          address_dest = PORT_READ(in_DECOD_ADDRESS_DEST                [decod_unit][i]);
    8188              Tcontrol_t          is_accurate;
    8289
     
    8895                case BRANCH_CONDITION_NONE_WITH_WRITE_STACK             :
    8996                  {
    90                     // Write stack
     97                    // l.jal
     98                    log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"      * BRANCH_CONDITION_NONE_WITH_WRITE_STACK");
     99
     100                    is_accurate = true ;//PORT_READ(in_DECOD_RAS_HIT [port]);
     101                    use_ras     = true ;
     102
     103                    PORT_WRITE(out_DECOD_RAS_PUSH         [port],1);
     104                    PORT_WRITE(out_DECOD_RAS_ADDRESS_PUSH [port],address_src+2);
     105                   
     106                    break;
     107                  }
     108
     109                case BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK    :
     110                  {
     111                    // l.jalr
     112                    log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"      * BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK");
     113
     114                    is_accurate = false; // address unknow : in a register
     115                    use_ras     = true;
     116
     117                    PORT_WRITE(out_DECOD_RAS_PUSH         [port],1);
     118                    PORT_WRITE(out_DECOD_RAS_ADDRESS_PUSH [port],address_src+2);
     119                   
     120                    break;
     121                  }
     122                case BRANCH_CONDITION_READ_STACK                        :
     123                  {
     124                    // l.jr with rb=r9
     125                    log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"      * BRANCH_CONDITION_READ_STACK");
     126
    91127                    is_accurate = PORT_READ(in_DECOD_RAS_HIT [port]);
    92                     miss_decod  = false;
    93128                    use_ras     = true;
    94129
    95                     PORT_WRITE(out_DECOD_RAS_PUSH         [port],1);
    96                     PORT_WRITE(out_DECOD_RAS_ADDRESS_PUSH [port],address_dest);
    97                    
    98                     break;
    99                   }
    100 
    101                 case BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK    :
    102                   {
    103                     // Write stack
    104                     is_accurate = false;
    105                     miss_decod  = false;
    106                     use_ras     = true;
    107 
    108                     PORT_WRITE(out_DECOD_RAS_PUSH         [port],1);
    109                     PORT_WRITE(out_DECOD_RAS_ADDRESS_PUSH [port],address_dest);
    110                    
    111                     break;
    112                   }
    113                 case BRANCH_CONDITION_READ_STACK                        :
    114                   {
    115                     // Read stack
    116                     is_accurate = PORT_READ(in_DECOD_RAS_HIT [port]);
    117                     miss_decod  = false;
    118                     use_ras     = true;
    119 
    120                     PORT_WRITE(out_DECOD_RAS_PUSH         [port],0);
     130                    PORT_WRITE(out_DECOD_RAS_PUSH         [port],0); // POP
    121131                    address_dest = PORT_READ(in_DECOD_RAS_ADDRESS_POP [port]);
    122132                   
     
    125135                case BRANCH_CONDITION_READ_REGISTER_WITHOUT_WRITE_STACK :
    126136                  {
     137                    // l.jr with rb!=r9
     138                    log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"      * BRANCH_CONDITION_READ_REGISTER_WITHOUT_WRITE_STACK");
     139
    127140                    //   * READ_REGISTER_WITHOUT_WRITE_STACK : Take but destination is unknow - don't continue
    128                     is_accurate = PORT_READ(in_DECOD_RAS_HIT [port]);
    129                     miss_decod  = true;
     141                    is_accurate = false; // address unknow : in a register
    130142
    131143                    break;
     
    135147                case BRANCH_CONDITION_FLAG_SET                          :
    136148                  {
    137                     // No access at the flag
     149                    // l.bf, l.bnf
    138150                    //   * FLAG                              : static direction and destination is know
    139                     is_accurate = PORT_READ(in_DECOD_RAS_HIT [port]);
    140                     miss_decod  = false;
     151                    log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"      * BRANCH_CONDITION_FLAG");
     152
     153                    is_accurate = true; // address dest is know
    141154
    142155                    break;
     
    145158                case BRANCH_CONDITION_NONE_WITHOUT_WRITE_STACK          :
    146159                  {
    147                     // No access at the flag
    148                     //   * NONE_WITHOUT_WRITE_STACK          : take and destination is know
    149                     is_accurate = false;
    150                     miss_decod  = false;
    151                     use_ras     = true;
    152 
    153                     PORT_WRITE(out_DECOD_RAS_PUSH         [port],1);
    154                     PORT_WRITE(out_DECOD_RAS_ADDRESS_PUSH [port],address_dest);
    155 
    156                     break;
    157                   }
    158 
     160                    // l.j
     161                    log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"      * BRANCH_CONDITION_NONE_WITHOUT_WRITE_STACK");
     162
     163                    is_accurate = true;
     164
     165                    break;
     166                  }
    159167                }
    160168
     
    180188              if (use_upt)
    181189                {
    182                   PORT_WRITE(out_DECOD_UPT_BTB_ADDRESS_SRC      [port],address_src);
    183                   PORT_WRITE(out_DECOD_UPT_BTB_ADDRESS_DEST     [port],address_dest);
    184                   PORT_WRITE(out_DECOD_UPT_BTB_CONDITION        [port],condition);
    185                   PORT_WRITE(out_DECOD_UPT_BTB_LAST_TAKE        [port],direction);
    186                   PORT_WRITE(out_DECOD_UPT_RAS_ADDRESS          [port],PORT_READ(in_DECOD_RAS_ADDRESS_POP [port]));
     190                  PORT_WRITE(out_DECOD_UPT_BTB_ADDRESS_SRC [port],address_src);
     191                  PORT_WRITE(out_DECOD_UPT_BTB_ADDRESS_DEST[port],address_dest);
     192                  PORT_WRITE(out_DECOD_UPT_BTB_CONDITION   [port],condition);
     193                  PORT_WRITE(out_DECOD_UPT_BTB_LAST_TAKE   [port],direction);
     194                  PORT_WRITE(out_DECOD_UPT_RAS_ADDRESS     [port],PORT_READ(in_DECOD_RAS_ADDRESS_POP [port]));
     195                  PORT_WRITE(out_DECOD_UPT_IS_ACCURATE     [port],is_accurate);
    187196                }
    188197            }
    189           else
    190             {
    191               log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"    * hit");
    192 
    193               miss_decod = false;
    194               // Hit speculation
    195             }
    196          
     198//        else
     199//          {
     200//               log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"    * hit");
     201
     202//            miss_decod = false;
     203//            // Hit speculation
     204//          }
     205         
     206
    197207          // in all case
    198208          log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"    * use_btb : %d",use_btb);
     
    231241          PORT_WRITE(out_DECOD_UPT_MISS_IFETCH          [port],miss_ifetch);
    232242          PORT_WRITE(out_DECOD_UPT_MISS_DECOD           [port],miss_decod );
    233           if (_param->_have_port_max_depth)
     243          if (_param->_have_port_depth)
    234244          PORT_WRITE(out_DECOD_UPT_UPDATE_PREDICTION_ID [port],depth);
    235245         
     
    237247        }
    238248   
     249    // Write output
     250
    239251    for (uint32_t i=0; i<_param->_nb_inst_branch_decod; i++)
    240252      {
     
    251263          PORT_WRITE(out_DECOD_ACK [i][j], ack[j]);
    252264
    253     log_printf(FUNC,Prediction_unit_Glue,FUNCTION,"End");
     265    log_end(Prediction_unit_Glue,FUNCTION);
    254266  };
    255267
Note: See TracChangeset for help on using the changeset viewer.