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_OOO_Engine/OOO_Engine/Commit_unit/src/Commit_unit_transition.cpp

    r104 r105  
    5151              reg_PC_CURRENT_IS_DS      [i][j] = 0;
    5252              reg_PC_CURRENT_IS_DS_TAKE [i][j] = 0;
    53 //            reg_PC_NEXT               [i][j] = (0x100+4)>>2;
     53              reg_PC_NEXT               [i][j] = (0x100+4)>>2;
    5454            }
    5555
     
    138138                  entry->operation               = operation;
    139139                  entry->is_delay_slot           = PORT_READ(in_INSERT_IS_DELAY_SLOT         [x][y]);
    140                   entry->address                 = PORT_READ(in_INSERT_ADDRESS               [x][y]);
     140//                entry->address                 = PORT_READ(in_INSERT_ADDRESS               [x][y]);
    141141                  entry->exception               = exception;
    142142                  entry->exception_use           = PORT_READ(in_INSERT_EXCEPTION_USE         [x][y]);
     
    162162                  entry->num_reg_re_phy_old      = PORT_READ(in_INSERT_NUM_REG_RE_PHY_OLD    [x][y]);
    163163                  entry->num_reg_re_phy_new      = PORT_READ(in_INSERT_NUM_REG_RE_PHY_NEW    [x][y]);
     164                  entry->no_sequence             = type == TYPE_BRANCH;
     165                  entry->address_next            = PORT_READ(in_INSERT_ADDRESS_NEXT          [x][y]);
    164166
    165167                  // Test if exception :
     
    295297                      case ROB_MISS_WAIT_END   : {state = ROB_END_KO_SPECULATIVE; break;}
    296298                        // Store OK, Load and other instruction
    297                       case ROB_OTHER_WAIT_END  : {state = (have_exception)?ROB_END_EXCEPTION_WAIT_HEAD:((have_miss_speculation)?ROB_END_MISS:ROB_END_OK_SPECULATIVE); break;}
     299                      case ROB_OTHER_WAIT_END  : {state = (have_exception)?ROB_END_EXCEPTION_WAIT_HEAD:((have_miss_speculation)?ROB_END_LOAD_MISS_SPECULATIVE:ROB_END_OK_SPECULATIVE); break;}
    298300                      default :
    299301                        {
     
    304306
    305307                    // update Re Order Buffer
    306                     entry->state       = state;
    307                     entry->exception   = exception;
    308                     entry->flags       = PORT_READ(in_COMMIT_FLAGS       [x]);
    309                     entry->no_sequence = PORT_READ(in_COMMIT_NO_SEQUENCE [x]);
    310                     entry->data_commit = PORT_READ(in_COMMIT_ADDRESS     [x]);
     308                    entry->state        = state;
     309                    entry->exception    = exception;
     310                    entry->flags        = PORT_READ(in_COMMIT_FLAGS       [x]);
     311                    entry->no_sequence  = PORT_READ(in_COMMIT_NO_SEQUENCE [x]);
     312                    // jalr, jr : address_dest is in register
     313                    if ((entry->type      == TYPE_BRANCH) and
     314                        (entry->operation == OPERATION_BRANCH_L_JALR) and
     315                        (entry->read_rb))
     316                    entry->address_next = PORT_READ(in_COMMIT_ADDRESS     [x]);
    311317                  }
    312318              }
     
    345351              Ttype_t    type         = entry->type        ;
    346352
    347               if (state == ROB_END_BRANCH_MISS)
     353              if ((state == ROB_END_OK         ) or // LOAD_MISS
     354//                (state == ROB_END_KO         ) or
     355                  (state == ROB_END_BRANCH_MISS)//  or
     356//                (state == ROB_END_LOAD_MISS  ) or
     357//                (state == ROB_END_MISS       ) or
     358//                (state == ROB_END_EXCEPTION  )
     359                  )
     360                {
     361//                reg_PC_PREVIOUS           [front_end_id][context_id] = reg_PC_CURRENT [front_end_id][context_id];
     362                  reg_PC_CURRENT            [front_end_id][context_id] = reg_PC_NEXT    [front_end_id][context_id];
     363                  reg_PC_CURRENT_IS_DS      [front_end_id][context_id] = entry->type == TYPE_BRANCH;
     364                  reg_PC_CURRENT_IS_DS_TAKE [front_end_id][context_id] = entry->no_sequence;
     365                  reg_PC_NEXT               [front_end_id][context_id] = (entry->no_sequence)?(entry->address_next):(reg_PC_CURRENT [front_end_id][context_id]+1);
     366                }
     367
     368              if ((state == ROB_END_BRANCH_MISS) or
     369                  (state == ROB_END_LOAD_MISS))
    348370                {
    349371                  reg_EVENT_STATE [front_end_id][context_id] = EVENT_STATE_EVENT;
    350372                  reg_EVENT_FLUSH [front_end_id][context_id] = true;
    351 
    352                   // TODO Compute address !!!!!!!!!!!
    353373                }
    354374             
     
    412432        // =====[ UPDATE ]====================================================
    413433        // ===================================================================
    414         {
    415           // Not yet implemented
    416         }
     434        if (internal_UPDATE_VAL and PORT_READ(in_UPDATE_ACK))
     435          {
     436            log_printf(TRACE,Commit_unit,FUNCTION,"  * UPDATE");
     437
     438            entry_t * entry = _rob [internal_UPDATE_NUM_BANK].front();
     439
     440            switch (entry->state)
     441              {
     442//               case ROB_END_EXCEPTION_UPDATE :
     443//                 {
     444//                   entry->state = ROB_END_KO;
     445//                   throw ERRORMORPHEO(FUNCTION,_("Moore : exception is not yet supported (Coming Soon).\n"));
     446//                   break;
     447//                 }
     448              case ROB_END_LOAD_MISS_UPDATE :
     449                {
     450                  log_printf(TRACE,Commit_unit,FUNCTION,"    * ROB_END_LOAD_MISS_UPDATE");
     451
     452                  entry->state = ROB_END_LOAD_MISS;
     453                  break;
     454                }
     455              default :
     456                {
     457                  throw ERRORMORPHEO(FUNCTION,_("Update : invalid state.\n"));
     458                  break;
     459                }
     460              }
     461
     462          }
    417463
    418464        // ===================================================================
     
    438484
    439485              Tdepth_t     depth_min    = (_param->_have_port_depth)?PORT_READ(in_DEPTH_MIN[front_end_id][context_id]):0;
    440 //               Tdepth_t     depth_max    = (_param->_have_port_depth)?PORT_READ(in_DEPTH_MAX[front_end_id][context_id]):0;
    441 //               Tcontrol_t   depth_full   = PORT_READ(in_DEPTH_FULL [front_end_id][context_id]);
     486              Tdepth_t     depth_max    = (_param->_have_port_depth)?PORT_READ(in_DEPTH_MAX[front_end_id][context_id]):0;
     487              Tcontrol_t   depth_full   = PORT_READ(in_DEPTH_FULL [front_end_id][context_id]);
    442488             
    443489              // is a valid instruction ?
     
    455501              // ....... max ...X... min ....... KO
    456502             
    457 //               Tcontrol_t   is_valid      = ((depth == depth_min) or
    458 //                                             depth_full or
    459 //                                             ((depth_min <= depth_max)?
    460 //                                              ((depth >= depth_min) and (depth <=depth_max)):
    461 //                                              ((depth >= depth_min) or  (depth <=depth_max))));
    462 
    463503              bool         flush         = reg_EVENT_FLUSH [front_end_id][context_id];
    464               Tcontrol_t   is_valid      = ((depth == depth_min) and not flush);
     504
     505              Tcontrol_t   is_valid      = (((depth == depth_min) or
     506                                             depth_full or
     507                                             ((depth_min <= depth_max)?
     508                                              ((depth >= depth_min) and (depth <=depth_max)):
     509                                              ((depth >= depth_min) or  (depth <=depth_max))))
     510                                             and not flush);
     511
     512//            Tcontrol_t   is_valid      = ((depth == depth_min) and not flush);
    465513
    466514              log_printf(TRACE,Commit_unit,FUNCTION,"  * HEAD              [%d]",i);
    467               log_printf(TRACE,Commit_unit,FUNCTION,"    * is_valid        : %d",is_valid);
     515              log_printf(TRACE,Commit_unit,FUNCTION,"    * is_valid        : %d ((depth == depth_min) and not flush)",is_valid);
    468516              log_printf(TRACE,Commit_unit,FUNCTION,"    * depth           : %d",depth    );
    469517              log_printf(TRACE,Commit_unit,FUNCTION,"    * depth_min       : %d",depth_min);
    470 //               log_printf(TRACE,Commit_unit,FUNCTION,"    * depth_max       : %d",depth_max);
     518              log_printf(TRACE,Commit_unit,FUNCTION,"    * depth_max       : %d",depth_max);
     519              log_printf(TRACE,Commit_unit,FUNCTION,"    * depth_full      : %d",depth_full);
    471520              log_printf(TRACE,Commit_unit,FUNCTION,"    * flush           : %d",flush);
    472521
     
    481530                    case ROB_BRANCH_COMPLETE             : {state = ROB_END_MISS     ; break;}
    482531                    case ROB_END_BRANCH_MISS_SPECULATIVE : {state = ROB_END_MISS     ; break;}
     532                    case ROB_END_LOAD_MISS_SPECULATIVE   : {state = ROB_END_MISS     ; break;}
    483533                    case ROB_STORE_WAIT_HEAD_OK          : {state = ROB_STORE_HEAD_KO; break;}
    484534                  //case ROB_STORE_WAIT_HEAD_KO          : {state = ; break;}
     
    498548                    case ROB_END_KO                      :
    499549                    case ROB_END_BRANCH_MISS             :
     550                    case ROB_END_LOAD_MISS_UPDATE        :
     551                    case ROB_END_LOAD_MISS               :
     552                    case ROB_END_EXCEPTION_UPDATE        :
    500553                    case ROB_END_EXCEPTION               :
    501554                    default                              :
     
    517570                    case ROB_END_KO_SPECULATIVE          : {state = ROB_END_KO                 ; break;}
    518571                    case ROB_END_BRANCH_MISS_SPECULATIVE : {state = ROB_END_BRANCH_MISS        ; break;}
     572                    case ROB_END_LOAD_MISS_SPECULATIVE   : {state = ROB_END_LOAD_MISS_UPDATE   ; break;}
    519573                    default : {break;}
    520574                  }
     
    528582                  switch (state)
    529583                    {
    530                     case ROB_STORE_WAIT_HEAD_OK      : {state = ROB_STORE_HEAD_OK; break;}
    531                     case ROB_END_EXCEPTION_WAIT_HEAD : {state = ROB_END_EXCEPTION; break;}
     584                    case ROB_STORE_WAIT_HEAD_OK      : {state = ROB_STORE_HEAD_OK;        break;}
     585                    case ROB_END_EXCEPTION_WAIT_HEAD : {state = ROB_END_EXCEPTION_UPDATE; break;}
    532586                    default : {break;}
    533587                    }
     
    549603      for (uint32_t j=0; j<_param->_nb_context [i]; j++)
    550604        {
    551           log_printf(TRACE,Commit_unit,FUNCTION,"    * [%d][%d] num_inst_all : %d, num_inst_mem : %d",i,j,reg_NB_INST_COMMIT_ALL[i][j],reg_NB_INST_COMMIT_MEM[i][j]);
    552605          log_printf(TRACE,Commit_unit,FUNCTION,"    * [%d][%d] state        : %s",i,j,toString(reg_EVENT_STATE [i][j]).c_str());
     606          log_printf(TRACE,Commit_unit,FUNCTION,"    * num_inst_all : %d",reg_NB_INST_COMMIT_ALL[i][j]);
     607          log_printf(TRACE,Commit_unit,FUNCTION,"    * num_inst_mem : %d",reg_NB_INST_COMMIT_MEM[i][j]);
     608          log_printf(TRACE,Commit_unit,FUNCTION,"    * PC_CURRENT   : %.8x - %d %d",reg_PC_CURRENT [i][j], reg_PC_CURRENT_IS_DS [i][j], reg_PC_CURRENT_IS_DS_TAKE [i][j]);
     609          log_printf(TRACE,Commit_unit,FUNCTION,"    * PC_NEXT      : %.8x",reg_PC_NEXT [i][j]);
    553610        }
    554611       
     
    567624             it++)
    568625          {
    569             log_printf(TRACE,Commit_unit,FUNCTION,"      [%.4d] %.4d %.4d %.4d %.4d, %.3d %.3d, %.8x (%.8x) %.1d, %.1d %.4d, %.1d %.4d, %s - %d",
     626            log_printf(TRACE,Commit_unit,FUNCTION,"      [%.4d] %.4d %.4d %.4d %.4d, %.3d %.3d, %.1d, %.1d %.4d, %.1d %.4d, %s - %d",
    570627                       x,
    571628                       (*it)->front_end_id            ,
     
    575632                       (*it)->type                    ,
    576633                       (*it)->operation               ,
    577                        (*it)->address                 ,
    578                        (*it)->address << 2            ,
     634//                     (*it)->address                 ,
     635//                     (*it)->address << 2            ,
    579636                       (*it)->is_delay_slot           ,
    580637                       (*it)->use_store_queue         ,
     
    603660                       (*it)->num_reg_re_phy_new      );
    604661           
    605             log_printf(TRACE,Commit_unit,FUNCTION,"             %.2d %.2d %.1d %.1d %.8x",
     662            log_printf(TRACE,Commit_unit,FUNCTION,"             %.2d %.2d %.1d %.1d %.8x (%.8x)",
    606663                       (*it)->exception_use ,
    607664                       (*it)->exception     ,
    608665                       (*it)->flags         ,
    609666                       (*it)->no_sequence   ,
    610                        (*it)->data_commit   
     667                       (*it)->address_next  ,
     668                       (*it)->address_next<<2
    611669                       );
    612670
Note: See TracChangeset for help on using the changeset viewer.