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

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

    r106 r107  
    117117            //  if pc_current is a delay slot, then pc_previous is a branchement instruction, also hit must be set.
    118118            //  else : an another branch instruction have eject this branch : can't accurate
    119             Tcontrol_t          hit         = PORT_READ(in_PREDICT_BTB_HIT[i]);
    120             Tcontrol_t          is_accurate = PORT_READ(in_PREDICT_BTB_IS_ACCURATE  [i]) and not (pc_current_is_ds_take and not hit);
     119            Tcontrol_t          hit             = PORT_READ(in_PREDICT_BTB_HIT[i]);
     120            Tcontrol_t          is_accurate     = not (pc_current_is_ds_take and not hit);
     121            Tcontrol_t          btb_is_accurate = PORT_READ(in_PREDICT_BTB_IS_ACCURATE  [i]);
    121122
    122123            log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"    * hit                   : %d"    ,hit);
    123124            log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"    * is_accurate           : %d"    ,is_accurate);
     125            log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"    * btb_is_accurate       : %d"    ,btb_is_accurate);
    124126
    125127            // STEP (3) : Test if BTB find a branch instruction in the packet
     
    158160                else
    159161                  {
     162                    log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"      * branch is not in the last slot of the packet");
     163
    160164                    Tbranch_condition_t condition    = PORT_READ(in_PREDICT_BTB_CONDITION    [i]);
    161165                    Taddress_t          address_dest = PORT_READ(in_PREDICT_BTB_ADDRESS_DEST [i]);
     
    166170                    log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"    * address_src           : 0x%.8x (0x%.8x)",address_src ,address_src <<2);
    167171                    log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"    * address_dest          : 0x%.8x (0x%.8x)",address_dest,address_dest<<2);
    168                    
     172
    169173                    switch (condition)
    170174                      {
     
    178182                          pc_next      = address_dest;
    179183                          branch_state = BRANCH_STATE_NSPEC_TAKE;
     184//                        is_accurate &= btb_is_accurate;
     185
    180186                          break;
    181187                        }
     
    190196                          pc_next      = address_dest;
    191197                          branch_state = BRANCH_STATE_NSPEC_TAKE;
     198//                        is_accurate &= btb_is_accurate;
     199
    192200                          break;
    193201                        }
     
    201209                          // Test direction
    202210                          direction = PORT_READ(in_PREDICT_DIR_DIRECTION [i]); // Direction is not the "flag predict" ... also flag_unset and flag_set is the same
    203                           if (direction = 1)
     211                          if (direction == 1)
    204212                            {
    205213                              branch_state = BRANCH_STATE_SPEC_TAKE;
     
    211219                              pc_next      = address_src+2; // +1 = delay slot
    212220                            }
     221
     222//                        is_accurate &= btb_is_accurate;
    213223                          break;
    214224                        }
     
    223233                          pc_next      = address_dest;
    224234                          branch_state = BRANCH_STATE_SPEC_TAKE;
     235                          is_accurate &= btb_is_accurate;
     236
    225237                          break;
    226238                        }
     
    235247                          pc_next      = address_dest;
    236248                          branch_state = BRANCH_STATE_NSPEC_TAKE;
     249                          is_accurate &= btb_is_accurate;
     250
    237251                          break;
    238252                        }
     
    244258                          push         = false;
    245259                          direction    = true;
    246                           pc_next      = PORT_READ(in_PREDICT_RAS_ADDRESS_POP  [i]);
     260                          pc_next      = PORT_READ(in_PREDICT_RAS_HIT [i])?PORT_READ(in_PREDICT_RAS_ADDRESS_POP [i]):address_dest;
    247261                          branch_state = BRANCH_STATE_SPEC_TAKE;
     262                          is_accurate  &= (PORT_READ(in_PREDICT_RAS_HIT [i]) or btb_is_accurate); // if miss - prediction is not accurate
     263
    248264                          break;
    249265                        }
     
    255271                      }
    256272                   
     273                    log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"    * direction             : %d",direction);
     274                    log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"    * branch_state          : %d",branch_state);
     275                    log_printf(TRACE,Prediction_unit_Glue,FUNCTION,"    * pc_next               : %.8x",pc_next);
     276
    257277                    if (use_dir)
    258278                      {
     
    270290                        PORT_WRITE(out_PREDICT_RAS_PUSH         [i], push);
    271291                        PORT_WRITE(out_PREDICT_RAS_ADDRESS_PUSH [i], address_src+2);
    272                        
    273                         is_accurate &= PORT_READ(in_PREDICT_RAS_HIT [i]); // if miss - prediction is not accurate
    274292                      }
    275293                   
Note: See TracChangeset for help on using the changeset viewer.