Ignore:
Timestamp:
Feb 5, 2009, 12:18:31 PM (15 years ago)
Author:
rosiere
Message:

1) Bug fix : Load Miss Speculation (in Commit_unit, Update Prediction Table and Context State)
2) Change address, in rob write address_next.
3) Move Meta_Predictor in save directory

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Context_State/src/Context_State_transition.cpp

    r101 r105  
    6565                  break;
    6666                }
    67               case CONTEXT_STATE_KO_MISS_WAITEND :
     67              case CONTEXT_STATE_KO_MISS_BRANCH_WAITEND :
    6868                {
    6969                  // Wait end of all instruction
     
    7171                   
    7272//                  state = CONTEXT_STATE_OK; // @@@ TODO : make MISS fast (miss decod)
    73                     state = CONTEXT_STATE_KO_MISS_ADDR;
     73                    state = CONTEXT_STATE_KO_MISS_BRANCH_ADDR;
     74                  break;
     75                }
     76              case CONTEXT_STATE_KO_MISS_LOAD_WAITEND :
     77                {
     78                  // Wait end of all instruction
     79                  if (inst_all == 0)
     80                    state = CONTEXT_STATE_KO_MISS_LOAD_ADDR;
     81
    7482                  break;
    7583                }
     
    7987                  break;
    8088                }
    81               case CONTEXT_STATE_KO_MISS_ADDR    :
     89              case CONTEXT_STATE_KO_MISS_BRANCH_ADDR    :
     90                {
     91                  // nothing, wait the update of internal register (pc)
     92                  break;
     93                }
     94              case CONTEXT_STATE_KO_MISS_LOAD_ADDR    :
    8295                {
    8396                  // nothing, wait the update of internal register (pc)
     
    198211
    199212              // priority : miss > excep > spr/sync
    200               uint8_t    priority0  = ((state == CONTEXT_STATE_KO_MISS_ADDR) or (state == CONTEXT_STATE_KO_MISS_WAITEND))?2:((state == EVENT_TYPE_EXCEPTION)?1:0);
     213              uint8_t    priority0  = ((state == CONTEXT_STATE_KO_MISS_BRANCH_ADDR) or (state == CONTEXT_STATE_KO_MISS_LOAD_ADDR) or (state == CONTEXT_STATE_KO_MISS_BRANCH_WAITEND) or (state == CONTEXT_STATE_KO_MISS_LOAD_WAITEND))?2:((state == EVENT_TYPE_EXCEPTION)?1:0);
    201214              uint8_t    priority1  = 2; // miss
    202215
     
    212225                {
    213226                  Tcontrol_t dest_val = PORT_READ(in_BRANCH_EVENT_ADDRESS_DEST_VAL[i]);
    214 //                reg_STATE                  [i] =  CONTEXT_STATE_KO_MISS_ADDR;
    215                   reg_STATE                  [i] =  CONTEXT_STATE_KO_MISS_WAITEND; //@@@ TODO : make MISS fast (miss decod)
     227//                reg_STATE                  [i] =  CONTEXT_STATE_KO_MISS_BRANCH_ADDR;
     228                  reg_STATE                  [i] =  CONTEXT_STATE_KO_MISS_BRANCH_WAITEND; //@@@ TODO : make MISS fast (miss decod)
    216229                  reg_EVENT_ADDRESS          [i] =  PORT_READ(in_BRANCH_EVENT_ADDRESS_SRC  [i])+1; // address delay slot
    217230                  reg_EVENT_ADDRESS_EPCR     [i] =  PORT_READ(in_BRANCH_EVENT_ADDRESS_DEST [i]);   // address_next
     
    249262             
    250263              // miss > excep > spr/sync
    251               uint8_t    priority0  = ((state == CONTEXT_STATE_KO_MISS_ADDR) or (state == CONTEXT_STATE_KO_MISS_WAITEND))?2:((state == CONTEXT_STATE_KO_EXCEP)?1:0);
     264              uint8_t    priority0  = ((state == CONTEXT_STATE_KO_MISS_BRANCH_ADDR) or (state == CONTEXT_STATE_KO_MISS_LOAD_ADDR) or (state == CONTEXT_STATE_KO_MISS_BRANCH_WAITEND) or (state == CONTEXT_STATE_KO_MISS_LOAD_WAITEND))?2:((state == CONTEXT_STATE_KO_EXCEP)?1:0);
    252265              uint8_t    priority1  = (state == EVENT_TYPE_EXCEPTION)?1:0;
    253266
     
    258271              bool       is_valid   = ((state == CONTEXT_STATE_OK) or
    259272                                       (depth1< depth0) or
    260                                        ((depth1==depth0) and (priority1>priority0)));
     273                                       ((depth1==depth0) and (priority1>=priority0)));
    261274
    262275              if (is_valid)
     
    325338                      }               
    326339                    case EVENT_TYPE_NONE               :
    327                     case EVENT_TYPE_MISS_SPECULATION   :
    328                     case EVENT_TYPE_BRANCH_NO_ACCURATE :
     340                    case EVENT_TYPE_BRANCH_MISS_SPECULATION   :
     341                    case EVENT_TYPE_LOAD_MISS_SPECULATION   :
     342//                     case EVENT_TYPE_BRANCH_NO_ACCURATE :
    329343                    default :
    330344                      {
     
    359373            Tdepth_t   depth_max  = _param->_array_size_depth [context];
    360374           
    361 //             Tdepth_t   depth0     = (depth_cur>=depth_min)?(depth_cur-depth_min):((depth_cur+depth_max-depth_min));
    362 //             Tdepth_t   depth1     = (depth    >=depth_min)?(depth    -depth_min):((depth    +depth_max-depth_min));
     375//          Tdepth_t   depth0     = (depth_cur>=depth_min)?(depth_cur-depth_min):((depth_cur+depth_max-depth_min));
     376//          Tdepth_t   depth1     = (depth    >=depth_min)?(depth    -depth_min):((depth    +depth_max-depth_min));
    363377            Tdepth_t   depth0     = (depth_cur>=depth_min)?(depth_cur):((depth_cur+depth_max));
    364378            Tdepth_t   depth1     = (depth    >=depth_min)?(depth    ):((depth    +depth_max));
     
    368382           
    369383            // miss > excep > spr/sync
    370             uint8_t    priority0  = ((state == CONTEXT_STATE_KO_MISS_ADDR) or (state == CONTEXT_STATE_KO_MISS_WAITEND))?2:((state == CONTEXT_STATE_KO_EXCEP)?1:0);
    371             uint8_t    priority1  = 1; // exception
     384            uint8_t    priority0  = ((state == CONTEXT_STATE_KO_MISS_BRANCH_ADDR) or (state == CONTEXT_STATE_KO_MISS_LOAD_ADDR) or (state == CONTEXT_STATE_KO_MISS_BRANCH_WAITEND) or (state == CONTEXT_STATE_KO_MISS_LOAD_WAITEND))?2:((state == CONTEXT_STATE_KO_EXCEP)?1:0);
     385            uint8_t    priority1  = (state == EVENT_TYPE_EXCEPTION)?1:2; // else load_miss_speculation (EVENT_TYPE_MISS_SPECULATION)
    372386
    373387            // is_valid = can modify local information
     
    377391            bool       is_valid   = ((state == CONTEXT_STATE_OK) or
    378392                                     (depth1< depth0) or
    379                                      ((depth1==depth0) and (priority1>priority0)));
     393                                     ((depth1==depth0) and (priority1>=priority0)));
    380394
    381395            if (is_valid)
     
    386400                switch (type)
    387401                  {
    388                   case EVENT_TYPE_EXCEPTION          : {state_next = CONTEXT_STATE_KO_EXCEP; break;}
    389                   case EVENT_TYPE_SPR_ACCESS         :
    390                   case EVENT_TYPE_MSYNC              :
    391                   case EVENT_TYPE_PSYNC              :
    392                   case EVENT_TYPE_CSYNC              :
    393                   case EVENT_TYPE_NONE               :
    394                   case EVENT_TYPE_MISS_SPECULATION   :
    395                   case EVENT_TYPE_BRANCH_NO_ACCURATE :
     402                  case EVENT_TYPE_EXCEPTION               : {state_next = CONTEXT_STATE_KO_EXCEP;             break;}
     403                  case EVENT_TYPE_LOAD_MISS_SPECULATION   : {state_next = CONTEXT_STATE_KO_MISS_LOAD_WAITEND; break;}
     404                  case EVENT_TYPE_BRANCH_MISS_SPECULATION :
     405                  case EVENT_TYPE_SPR_ACCESS              :
     406                  case EVENT_TYPE_MSYNC                   :
     407                  case EVENT_TYPE_PSYNC                   :
     408                  case EVENT_TYPE_CSYNC                   :
     409                  case EVENT_TYPE_NONE                    :
     410//                case EVENT_TYPE_BRANCH_NO_ACCURATE      :
    396411                  default :
    397412                    {
     
    402417                reg_EVENT_ADDRESS          [context] = PORT_READ(in_COMMIT_EVENT_ADDRESS          );
    403418                reg_EVENT_ADDRESS_EPCR     [context] = PORT_READ(in_COMMIT_EVENT_ADDRESS_EPCR     );
    404                 reg_EVENT_ADDRESS_EPCR_VAL [context] = 1;
     419                reg_EVENT_ADDRESS_EPCR_VAL [context] = PORT_READ(in_COMMIT_EVENT_ADDRESS_EPCR_VAL );
    405420                reg_EVENT_ADDRESS_EEAR     [context] = PORT_READ(in_COMMIT_EVENT_ADDRESS_EEAR     );
    406421                reg_EVENT_ADDRESS_EEAR_VAL [context] = PORT_READ(in_COMMIT_EVENT_ADDRESS_EEAR_VAL );
    407422                reg_EVENT_IS_DELAY_SLOT    [context] = PORT_READ(in_COMMIT_EVENT_IS_DELAY_SLOT    );
    408               //reg_EVENT_IS_DS_TAKE       [context] = 0;
     423                reg_EVENT_IS_DS_TAKE       [context] = 0;
    409424                reg_EVENT_DEPTH            [context] = depth;
    410425              }
     
    435450                 
    436451//                   // miss > excep > spr/sync
    437 //                   uint8_t    priority0  = ((state == CONTEXT_STATE_KO_MISS_ADDR) or (state == CONTEXT_STATE_KO_MISS_WAITEND))?2:((state == CONTEXT_STATE_KO_EXCEP)?1:0);
     452//                   uint8_t    priority0  = ((state == CONTEXT_STATE_KO_MISS_BRANCH_ADDR) or (state == CONTEXT_STATE_KO_MISS_LOAD_ADDR) or (state == CONTEXT_STATE_KO_MISS_BRANCH_WAITEND) or (state == CONTEXT_STATE_KO_MISS_LOAD_WAITEND))?2:((state == CONTEXT_STATE_KO_EXCEP)?1:0);
    438453//                   uint8_t    priority1  = 2; // miss
    439454                 
     
    444459//                   bool       is_valid   = ((state == CONTEXT_STATE_OK) or
    445460//                                            (depth1< depth0) or
    446 //                                            ((depth1==depth0) and (priority1>priority0)));
     461//                                            ((depth1==depth0) and (priority1>=priority0)));
    447462                 
    448463//                   if (is_valid)
     
    480495                    break;
    481496                  }
    482                 case CONTEXT_STATE_KO_MISS_ADDR  :
     497                case CONTEXT_STATE_KO_MISS_BRANCH_ADDR:
    483498//                   {
    484499//                     reg_STATE [i] = CONTEXT_STATE_KO_MISS_WAITEND; //@@@ TODO : make MISS fast (miss decod)
    485500//                     break;
    486501//                   }
     502                case CONTEXT_STATE_KO_MISS_LOAD_ADDR  :
    487503                case CONTEXT_STATE_KO_PSYNC_ADDR :
    488504                case CONTEXT_STATE_KO_CSYNC_ADDR :
Note: See TracChangeset for help on using the changeset viewer.