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

Location:
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Context_State/src
Files:
4 edited

Legend:

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

    r98 r105  
    9595      ALLOC_SIGNAL_IN  ( in_COMMIT_EVENT_IS_DELAY_SLOT         ,"is_delay_slot"   ,Tcontrol_t         ,1);
    9696      ALLOC_SIGNAL_IN  ( in_COMMIT_EVENT_ADDRESS               ,"address"         ,Taddress_t         ,_param->_size_instruction_address);
     97      ALLOC_SIGNAL_IN  ( in_COMMIT_EVENT_ADDRESS_EPCR_VAL      ,"address_epcr_val",Tcontrol_t         ,1);
    9798      ALLOC_SIGNAL_IN  ( in_COMMIT_EVENT_ADDRESS_EPCR          ,"address_epcr"    ,Taddress_t         ,_param->_size_instruction_address);
    9899      ALLOC_SIGNAL_IN  ( in_COMMIT_EVENT_ADDRESS_EEAR_VAL      ,"address_eear_val",Tcontrol_t         ,1);
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Context_State/src/Context_State_deallocation.cpp

    r98 r105  
    5353        DELETE_SIGNAL ( in_COMMIT_EVENT_IS_DELAY_SLOT         ,1);
    5454        DELETE_SIGNAL ( in_COMMIT_EVENT_ADDRESS               ,_param->_size_instruction_address);
     55        DELETE_SIGNAL ( in_COMMIT_EVENT_ADDRESS_EPCR_VAL      ,_param->_size_instruction_address);
    5556        DELETE_SIGNAL ( in_COMMIT_EVENT_ADDRESS_EPCR          ,_param->_size_instruction_address);
    5657        DELETE_SIGNAL ( in_COMMIT_EVENT_ADDRESS_EEAR_VAL      ,_param->_size_instruction_address);
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Context_State/src/Context_State_genMoore.cpp

    r101 r105  
    3131        context_state_t state = reg_STATE [i];
    3232
    33         Tcontrol_t val              = ((state == CONTEXT_STATE_KO_EXCEP_ADDR) or
    34                                        (state == CONTEXT_STATE_KO_MISS_ADDR ) or
    35                                        (state == CONTEXT_STATE_KO_PSYNC_ADDR) or
     33        Tcontrol_t val              = ((state == CONTEXT_STATE_KO_EXCEP_ADDR      ) or
     34                                       (state == CONTEXT_STATE_KO_MISS_BRANCH_ADDR) or
     35                                       (state == CONTEXT_STATE_KO_MISS_LOAD_ADDR  ) or
     36                                       (state == CONTEXT_STATE_KO_PSYNC_ADDR      ) or
    3637                                       (state == CONTEXT_STATE_KO_CSYNC_ADDR));
    3738       
     
    4041        Taddress_t    address          = reg_EVENT_ADDRESS [i] | (((state == CONTEXT_STATE_KO_EXCEP_ADDR) and PORT_READ(in_SPR_SR_EPH [i]))?(0xF000000>>2):0);
    4142        Taddress_t    address_next     = reg_EVENT_ADDRESS_EPCR [i];
    42         Tcontrol_t    address_next_val = (state == CONTEXT_STATE_KO_MISS_ADDR) and (reg_EVENT_ADDRESS_EPCR_VAL [i]);
    43         Tcontrol_t    is_ds_take       = (state == CONTEXT_STATE_KO_MISS_ADDR) and (reg_EVENT_IS_DS_TAKE       [i]);
     43        Tcontrol_t    address_next_val = (state == CONTEXT_STATE_KO_MISS_BRANCH_ADDR) and (reg_EVENT_ADDRESS_EPCR_VAL [i]);
     44        Tcontrol_t    is_ds_take       = (state == CONTEXT_STATE_KO_MISS_BRANCH_ADDR) and (reg_EVENT_IS_DS_TAKE       [i]);
    4445        // excep : address exception
    4546        // miss  : address delay_slot, and address dest
     
    5152        switch (state)
    5253          {
    53           case CONTEXT_STATE_KO_EXCEP_ADDR : (type = EVENT_TYPE_EXCEPTION         ); break;
    54           case CONTEXT_STATE_KO_MISS_ADDR  : (type = EVENT_TYPE_MISS_SPECULATION  ); break;
    55           case CONTEXT_STATE_KO_PSYNC_ADDR : (type = EVENT_TYPE_PSYNC             ); break;
    56           case CONTEXT_STATE_KO_CSYNC_ADDR : (type = EVENT_TYPE_CSYNC             ); break;
    57           default                          : (type = EVENT_TYPE_NONE              ); break;
     54          case CONTEXT_STATE_KO_EXCEP_ADDR      : (type = EVENT_TYPE_EXCEPTION              ); break;
     55          case CONTEXT_STATE_KO_MISS_BRANCH_ADDR: (type = EVENT_TYPE_BRANCH_MISS_SPECULATION); break;
     56          case CONTEXT_STATE_KO_MISS_LOAD_ADDR  : (type = EVENT_TYPE_LOAD_MISS_SPECULATION  ); break;
     57          case CONTEXT_STATE_KO_PSYNC_ADDR      : (type = EVENT_TYPE_PSYNC                  ); break;
     58          case CONTEXT_STATE_KO_CSYNC_ADDR      : (type = EVENT_TYPE_CSYNC                  ); break;
     59          default                               : (type = EVENT_TYPE_NONE                   ); break;
    5860          }
    5961//      (type = EVENT_TYPE_SPR_ACCESS        );
  • 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.