Ignore:
Timestamp:
Dec 15, 2008, 12:04:03 PM (16 years ago)
Author:
rosiere
Message:

Update document on Vhdl generation.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/SelfTest/src/test.cpp

    r88 r94  
    116116//   ALLOC1_SC_SIGNAL(out_BRANCH_EVENT_MISS_PREDICTION,"out_BRANCH_EVENT_MISS_PREDICTION",Tcontrol_t         ,_param->_nb_context);
    117117  ALLOC1_SC_SIGNAL(out_BRANCH_EVENT_ADDRESS_SRC    ,"out_BRANCH_EVENT_ADDRESS_SRC    ",Taddress_t         ,_param->_nb_context);
     118  ALLOC1_SC_SIGNAL(out_BRANCH_EVENT_ADDRESS_DEST_VAL,"out_BRANCH_EVENT_ADDRESS_DEST_VAL",Tcontrol_t         ,_param->_nb_context);
    118119  ALLOC1_SC_SIGNAL(out_BRANCH_EVENT_ADDRESS_DEST   ,"out_BRANCH_EVENT_ADDRESS_DEST   ",Taddress_t         ,_param->_nb_context);
    119120
     
    130131  ALLOC1_SC_SIGNAL(out_UPDATE_DIR_HISTORY             ,"out_UPDATE_DIR_HISTORY             ",Thistory_t         ,_param->_nb_inst_update);
    131132  ALLOC1_SC_SIGNAL(out_UPDATE_RAS_VAL                 ,"out_UPDATE_RAS_VAL                 ",Tcontrol_t         ,_param->_nb_inst_update);
     133  ALLOC1_SC_SIGNAL(out_UPDATE_RAS_FLUSH               ,"out_UPDATE_RAS_FLUSH               ",Tcontrol_t         ,_param->_nb_inst_update);
    132134  ALLOC1_SC_SIGNAL(out_UPDATE_RAS_PUSH                ,"out_UPDATE_RAS_PUSH                ",Tcontrol_t         ,_param->_nb_inst_update);
    133135  ALLOC1_SC_SIGNAL(out_UPDATE_RAS_ADDRESS             ,"out_UPDATE_RAS_ADDRESS             ",Taddress_t         ,_param->_nb_inst_update);
     
    201203//   INSTANCE1_SC_SIGNAL(_Update_Prediction_Table,out_BRANCH_EVENT_MISS_PREDICTION,_param->_nb_context);
    202204  INSTANCE1_SC_SIGNAL(_Update_Prediction_Table,out_BRANCH_EVENT_ADDRESS_SRC    ,_param->_nb_context);
     205  INSTANCE1_SC_SIGNAL(_Update_Prediction_Table,out_BRANCH_EVENT_ADDRESS_DEST_VAL,_param->_nb_context);
    203206  INSTANCE1_SC_SIGNAL(_Update_Prediction_Table,out_BRANCH_EVENT_ADDRESS_DEST   ,_param->_nb_context);
    204207
     
    217220  INSTANCE1_SC_SIGNAL(_Update_Prediction_Table,out_UPDATE_DIR_HISTORY             ,_param->_nb_inst_update);
    218221  INSTANCE1_SC_SIGNAL(_Update_Prediction_Table,out_UPDATE_RAS_VAL                 ,_param->_nb_inst_update);
     222  INSTANCE1_SC_SIGNAL(_Update_Prediction_Table,out_UPDATE_RAS_FLUSH               ,_param->_nb_inst_update);
    219223  INSTANCE1_SC_SIGNAL(_Update_Prediction_Table,out_UPDATE_RAS_PUSH                ,_param->_nb_inst_update);
    220224  INSTANCE1_SC_SIGNAL(_Update_Prediction_Table,out_UPDATE_RAS_ADDRESS             ,_param->_nb_inst_update);
     
    247251  const  int32_t percent_transaction_branch_complete = 75;
    248252  const  int32_t percent_transaction_update          = 75;
    249 
    250 
     253  const  int32_t percent_transaction_branch_event    = 75;
     254
     255  const bool     test1 = false;
     256  const bool     test2 = false;
     257  const bool     test3 = false;
     258  const bool     test4 = true;
    251259
    252260  std::list<request_t> ufpt;
    253261  std::list<request_t> upt;
     262  request_t            event;
    254263
    255264  SC_START(0);
     
    302311      //---------------------------------------------------------------------
    303312      //---------------------------------------------------------------------
    304       if (1)
    305       {
     313      if (test1)
     314        {
    306315        uint32_t context = rand() % _param->_nb_context;
    307316
     
    508517          for (uint32_t i=0; i<upt.size(); i++)
    509518            {
    510               LABEL("Address_src (-1): %.8x (%d)",out_UPDATE_BTB_ADDRESS_SRC [i]->read(),upt.size());
    511 
    512519              bool have_transaction = false;
    513520
    514521              do
    515522                {
    516                   LABEL("Address_src (0) : %.8x",out_UPDATE_BTB_ADDRESS_SRC [i]->read());
    517 
    518523                  in_UPDATE_ACK [port]->write((rand()%100)<percent_transaction_update);
    519524
     
    522527//                   TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]);
    523528                 
    524                   LABEL("Address_src (1) : %.8x",out_UPDATE_BTB_ADDRESS_SRC [i]->read());
    525529                  SC_START(0);
    526                   LABEL("Address_src (2) : %.8x",out_UPDATE_BTB_ADDRESS_SRC [i]->read());
    527                  
     530
    528531                  LABEL("UPDATE [%d] %d - %d.",port,out_UPDATE_VAL [port]->read(),in_UPDATE_ACK [port]->read());
    529532                 
     
    534537                 
    535538                      if (_param->_have_port_context_id)
    536                       TEST(Tcontext_t         ,out_UPDATE_CONTEXT_ID            [i]->read(),it_upt->context);
    537                       TEST(Tcontrol_t         ,out_UPDATE_MISS_PREDICTION       [i]->read(),it_upt->miss_commit);
    538                       TEST(Tcontrol_t         ,out_UPDATE_DIRECTION_GOOD        [i]->read(),it_upt->flag);
    539                       TEST(Tcontrol_t         ,out_UPDATE_BTB_VAL               [i]->read(),update_btb(it_upt->condition));
     539                      TEST(Tcontext_t         ,out_UPDATE_CONTEXT_ID            [port]->read(),it_upt->context);
     540                      TEST(Tcontrol_t         ,out_UPDATE_MISS_PREDICTION       [port]->read(),it_upt->miss_commit);
     541                      TEST(Tcontrol_t         ,out_UPDATE_DIRECTION_GOOD        [port]->read(),it_upt->take_good);
     542                      TEST(Tcontrol_t         ,out_UPDATE_BTB_VAL               [port]->read(),update_btb(it_upt->condition));
    540543                      if (update_btb(it_upt->condition))
    541544                        {
    542                       TEST(Taddress_t         ,out_UPDATE_BTB_ADDRESS_SRC       [i]->read(),it_upt->address_src);
    543                       TEST(Taddress_t         ,out_UPDATE_BTB_ADDRESS_DEST      [i]->read(),it_upt->address_dest);
    544                       TEST(Tbranch_condition_t,out_UPDATE_BTB_CONDITION         [i]->read(),it_upt->condition);
     545                      TEST(Taddress_t         ,out_UPDATE_BTB_ADDRESS_SRC       [port]->read(),it_upt->address_src);
     546                      TEST(Taddress_t         ,out_UPDATE_BTB_ADDRESS_DEST      [port]->read(),it_upt->address_dest);
     547                      TEST(Tbranch_condition_t,out_UPDATE_BTB_CONDITION         [port]->read(),it_upt->condition);
    545548                        }
    546                       TEST(Tcontrol_t         ,out_UPDATE_DIR_VAL               [i]->read(),update_dir(it_upt->condition));
     549                      TEST(Tcontrol_t         ,out_UPDATE_DIR_VAL               [port]->read(),update_dir(it_upt->condition) and not (it_upt->miss_ifetch or it_upt->miss_decod));
    547550                      if (update_dir(it_upt->condition))
    548551                      if (_param->_have_port_history)
    549                       TEST(Thistory_t         ,out_UPDATE_DIR_HISTORY           [i]->read(),it_upt->history);
    550                       TEST(Tcontrol_t         ,out_UPDATE_RAS_VAL               [i]->read(),update_ras(it_upt->condition));
     552                      TEST(Thistory_t         ,out_UPDATE_DIR_HISTORY           [port]->read(),it_upt->history);
     553                      TEST(Tcontrol_t         ,out_UPDATE_RAS_VAL               [port]->read(),update_ras(it_upt->condition));
    551554                      if (update_ras(it_upt->condition))
    552555                        {
    553                       TEST(Tcontrol_t         ,out_UPDATE_RAS_PUSH              [i]->read(),push_ras  (it_upt->condition));
    554                       TEST(Taddress_t         ,out_UPDATE_RAS_ADDRESS           [i]->read(),it_upt->ras_address);
    555                       TEST(Tptr_t             ,out_UPDATE_RAS_INDEX             [i]->read(),it_upt->ras_index);
    556                       TEST(Tcontrol_t         ,out_UPDATE_RAS_PREDICTION_IFETCH [i]->read(),not it_upt->miss_ifetch);
     556//                    TEST(Tcontrol_t         ,out_UPDATE_RAS_FLUSH             [port]->read(),0);
     557                      TEST(Tcontrol_t         ,out_UPDATE_RAS_PUSH              [port]->read(),push_ras  (it_upt->condition));
     558                      TEST(Taddress_t         ,out_UPDATE_RAS_ADDRESS           [port]->read(),it_upt->ras_address);
     559                      TEST(Tptr_t             ,out_UPDATE_RAS_INDEX             [port]->read(),it_upt->ras_index);
     560                      TEST(Tcontrol_t         ,out_UPDATE_RAS_PREDICTION_IFETCH [port]->read(),not it_upt->miss_ifetch);
    557561                        }
    558562                      ++ it_upt;
     
    560564
    561565                  SC_START(1);
    562                   LABEL("Address_src (3) : %.8x",out_UPDATE_BTB_ADDRESS_SRC [i]->read());
    563                  
    564566                } while (not have_transaction);
    565567
    566               LABEL("Address_src (4) : %.8x",out_UPDATE_BTB_ADDRESS_SRC [i]->read());
    567568              in_UPDATE_ACK [port]->write(0);
    568               LABEL("Address_src (5) : %.8x",out_UPDATE_BTB_ADDRESS_SRC [i]->read());
    569569//               if (_param->_have_port_depth)
    570570//               TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]);
     
    586586      }
    587587
     588      //---------------------------------------------------------------------
     589      //---------------------------------------------------------------------
     590      // DECOD MISS : no RAS in ifetch
     591      //---------------------------------------------------------------------
     592      //---------------------------------------------------------------------
     593      if (test2)
     594        {
     595        uint32_t context = rand() % _param->_nb_context;
     596
     597        {
     598          LABEL("PREDICT - fill the queue");
     599          uint32_t port = rand() % _param->_nb_inst_predict;
     600
     601          LABEL("  * context : %d",context);
     602          LABEL("  * port    : %d",port);
     603         
     604          for (uint32_t i=0; i<_param->_size_ufpt_queue[context]; i++)
     605            {
     606              request_t request;
     607              request.context          = context;
     608              request.address_src      = 0xdeadbeef+i;
     609              request.address_dest     = 0x21071981+i;                                   
     610              request.address_good     = request.address_dest;
     611              request.condition        = BRANCH_CONDITION_FLAG_SET;                     
     612              request.take             = 1;                                             
     613              request.take_good        = 1;                                             
     614              request.flag             = (request.condition == BRANCH_CONDITION_FLAG_SET)?request.take_good:(not request.take_good);
     615              request.is_accurate      = true;
     616              request.miss_ifetch      = false;
     617              request.miss_decod       = false;
     618              request.miss_commit      = false;
     619              request.history          = i;                                             
     620              request.ras_address      = 0xdeaddead+i;                                   
     621              request.ras_index        = (0x12345678+i)%_param->_size_ras_index[context];
     622              request.ufpt_ptr         = ufpt_top [context];
     623//            request.upt_ptr;
     624
     625              bool have_transaction = false;
     626              do
     627                {
     628                  in_PREDICT_VAL              [port]->write((rand()%100)<percent_transaction_predict);
     629                  in_PREDICT_CONTEXT_ID       [port]->write(request.context     );
     630                  in_PREDICT_BTB_ADDRESS_SRC  [port]->write(request.address_src );
     631                  in_PREDICT_BTB_ADDRESS_DEST [port]->write(request.address_dest);
     632                  in_PREDICT_BTB_CONDITION    [port]->write(request.condition   );
     633                  in_PREDICT_BTB_LAST_TAKE    [port]->write(request.take        );
     634                  in_PREDICT_BTB_IS_ACCURATE  [port]->write(request.is_accurate );
     635                  in_PREDICT_DIR_HISTORY      [port]->write(request.history     );
     636                  in_PREDICT_RAS_ADDRESS      [port]->write(request.ras_address );
     637                  in_PREDICT_RAS_INDEX        [port]->write(request.ras_index   );
     638                 
     639                  if (_param->_have_port_depth)
     640                  TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]);
     641                  TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]);
     642                     
     643                  SC_START(0); // fct melay
     644                 
     645                  LABEL("PREDICT         [%d] %d - %d (accurate : %d).",
     646                        port,
     647                         in_PREDICT_VAL [port]->read(),
     648                        out_PREDICT_ACK [port]->read(),
     649                         in_PREDICT_BTB_IS_ACCURATE [port]->read());
     650                 
     651                  if (in_PREDICT_VAL [port]->read() and out_PREDICT_ACK [port]->read())
     652                    {
     653                      LABEL("PREDICT         [%d] - Transaction accepted",port);
     654                      have_transaction = true;
     655
     656                      if (_param->_have_port_depth)
     657                      TEST(Tprediction_ptr_t,out_PREDICT_UPDATE_PREDICTION_ID [port]->read(),ufpt_top [context]);
     658                     
     659                      ufpt_top [context] = (ufpt_top [context]+1)%_param->_size_ufpt_queue[context];
     660                    }
     661                 
     662                  SC_START(1); // transition
     663                 
     664                } while (not have_transaction);
     665
     666//            ufpt.push_back(request);
     667
     668              in_PREDICT_VAL [port]->write(0);
     669           
     670              if (_param->_have_port_depth)
     671              TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]);
     672              TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]);
     673            }
     674        }
     675       
     676        {
     677          LABEL("DECOD - Miss");
     678          uint32_t port = rand() % _param->_nb_inst_decod;
     679
     680          LABEL("  * context : %d",context);
     681          LABEL("  * port    : %d",port);
     682         
     683          request_t request;
     684          request.context          = context;
     685          request.address_src      = 0x14011959;
     686          request.address_dest     = 0x25071959; // after = not take               
     687          request.address_good     = request.address_dest;
     688          request.condition        = BRANCH_CONDITION_FLAG_SET;
     689          request.take             = 0;                                             
     690          request.take_good        = 0;                                             
     691          request.flag             = (request.condition == BRANCH_CONDITION_FLAG_SET)?request.take_good:(not request.take_good);
     692          request.is_accurate      = true;
     693          request.miss_ifetch      = false;
     694          request.miss_decod       = true ;
     695          request.miss_commit      = false;
     696          request.history          = 1;
     697          request.ras_address      = 0xbabababa;                                   
     698          request.ras_index        = (0x87654321)%_param->_size_ras_index[context];
     699          request.ufpt_ptr         = ufpt_top [context];
     700       
     701          event = request;
     702
     703//           for (uint32_t i=0; i<upt.size(); i++)
     704          // just one
     705            {
     706              bool have_transaction = false;
     707              do
     708                {
     709                  in_DECOD_VAL                  [port]->write((rand()%100)<percent_transaction_decod);
     710                  in_DECOD_CONTEXT_ID           [port]->write(request.context     );
     711                  in_DECOD_BTB_ADDRESS_SRC      [port]->write(request.address_src );
     712                  in_DECOD_BTB_ADDRESS_DEST     [port]->write(request.address_dest);
     713                  in_DECOD_BTB_CONDITION        [port]->write(request.condition   );
     714                  in_DECOD_BTB_LAST_TAKE        [port]->write(request.take        );
     715                  in_DECOD_RAS_ADDRESS          [port]->write(request.ras_address );
     716                  in_DECOD_RAS_INDEX            [port]->write(request.ras_index   );
     717                  in_DECOD_UPDATE_PREDICTION_ID [port]->write(request.ufpt_ptr    );
     718                  in_DECOD_MISS_IFETCH          [port]->write(request.miss_ifetch );
     719                  in_DECOD_MISS_DECOD           [port]->write(request.miss_decod  );
     720                  in_DECOD_IS_ACCURATE          [port]->write(request.is_accurate );
     721
     722                  SC_START(0); // fct melay
     723                 
     724                  LABEL("DECOD           [%d] %d - %d",
     725                        port,
     726                         in_PREDICT_VAL [port]->read(),
     727                        out_PREDICT_ACK [port]->read());
     728                 
     729                  if (in_DECOD_VAL [port]->read() and out_DECOD_ACK [port]->read())
     730                    {
     731                      LABEL("DECOD          [%d] - Transaction accepted",port);
     732                      have_transaction = true;
     733
     734                      request.upt_ptr = upt_top [context];
     735                      upt.push_back(request);
     736//                    ufpt.pop_front();
     737
     738                      upt_top [context] = (upt_top [context]+1)%_param->_size_upt_queue[context];
     739                    }
     740
     741                  SC_START(1); // transition
     742
     743                } while (not have_transaction);
     744
     745              in_DECOD_VAL              [port]->write(0);
     746             
     747              if (_param->_have_port_depth)
     748              TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]);
     749              TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]);
     750            }
     751        }
     752
     753        {
     754          LABEL("BRANCH_COMPLETE - hit ifetch");
     755       
     756          uint32_t port = rand() % _param->_nb_inst_branch_complete;
     757       
     758          LABEL("  * port    : %d",port);
     759 
     760          std::list<request_t>::iterator it_upt = upt.begin();
     761
     762//        for (uint32_t i=0; i<_param->_size_ufpt_queue[context]; i++)
     763//        for (uint32_t i=0; i<upt.size(); i++)
     764          // just one
     765          {
     766              bool have_transaction = false;
     767
     768              do
     769                {
     770                  in_BRANCH_COMPLETE_VAL        [port]->write((rand()%100)<percent_transaction_branch_complete);
     771                  in_BRANCH_COMPLETE_CONTEXT_ID [port]->write(it_upt->context     );
     772                  in_BRANCH_COMPLETE_DEPTH      [port]->write(it_upt->upt_ptr     );
     773                  in_BRANCH_COMPLETE_ADDRESS    [port]->write(it_upt->address_good);
     774                  in_BRANCH_COMPLETE_FLAG       [port]->write(it_upt->flag        );
     775
     776                  if (_param->_have_port_depth)
     777                  TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]);
     778                  TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]);
     779                 
     780                  SC_START(0);
     781                 
     782                  LABEL("BRANCH_COMPLETE [%d] %d - %d.",port,in_BRANCH_COMPLETE_VAL [port]->read(),out_BRANCH_COMPLETE_ACK [port]->read());
     783                 
     784                  if (in_BRANCH_COMPLETE_VAL [port]->read() and out_BRANCH_COMPLETE_ACK [port]->read())
     785                    {
     786                      LABEL("BRANCH_COMPLETE [%d] - Transaction accepted",port);
     787                      have_transaction = true;
     788                     
     789                      TEST(Tcontrol_t,out_BRANCH_COMPLETE_MISS_PREDICTION[port]->read(),it_upt->miss_commit );
     790                      TEST(Tcontrol_t,out_BRANCH_COMPLETE_TAKE           [port]->read(),it_upt->take_good   );
     791                      TEST(Taddress_t,out_BRANCH_COMPLETE_ADDRESS_SRC    [port]->read(),it_upt->address_src );
     792                      TEST(Taddress_t,out_BRANCH_COMPLETE_ADDRESS_DEST   [port]->read(),it_upt->address_good);
     793
     794                      it_upt ++;
     795                    }
     796                 
     797                  SC_START(1);
     798                } while (not have_transaction);
     799
     800              in_BRANCH_COMPLETE_VAL [port]->write(0);
     801             
     802              if (_param->_have_port_depth)
     803              TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]);
     804              TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]);
     805            }
     806        }
     807
     808        {
     809          LABEL("UPDATE - hit ifetch");
     810       
     811          uint32_t port = 0;
     812       
     813          LABEL("  * port    : %d",port);
     814          std::list<request_t>::iterator it_upt = upt.begin();
     815 
     816//        for (uint32_t i=0; i<_param->_size_ufpt_queue[context]; i++)
     817//        for (uint32_t i=0; i<upt.size(); i++)
     818          // just one
     819            {
     820              bool have_transaction = false;
     821
     822              do
     823                {
     824                  in_UPDATE_ACK [port]->write((rand()%100)<percent_transaction_update);
     825
     826//                   if (_param->_have_port_depth)
     827//                   TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]);
     828//                   TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]);
     829                 
     830                  SC_START(0);
     831
     832                  LABEL("UPDATE [%d] %d - %d.",port,out_UPDATE_VAL [port]->read(),in_UPDATE_ACK [port]->read());
     833                 
     834                  if (out_UPDATE_VAL [port]->read() and in_UPDATE_ACK [port]->read())
     835                    {
     836                      LABEL("UPDATE [%d] - Transaction accepted",port);
     837                      have_transaction = true;
     838                 
     839                      if (_param->_have_port_context_id)
     840                      TEST(Tcontext_t         ,out_UPDATE_CONTEXT_ID            [port]->read(),it_upt->context);
     841                      TEST(Tcontrol_t         ,out_UPDATE_MISS_PREDICTION       [port]->read(),it_upt->miss_commit);
     842                      TEST(Tcontrol_t         ,out_UPDATE_DIRECTION_GOOD        [port]->read(),it_upt->take_good);
     843                      TEST(Tcontrol_t         ,out_UPDATE_BTB_VAL               [port]->read(),update_btb(it_upt->condition));
     844                      if (update_btb(it_upt->condition))
     845                        {
     846                      TEST(Taddress_t         ,out_UPDATE_BTB_ADDRESS_SRC       [port]->read(),it_upt->address_src);
     847                      TEST(Taddress_t         ,out_UPDATE_BTB_ADDRESS_DEST      [port]->read(),it_upt->address_dest);
     848                      TEST(Tbranch_condition_t,out_UPDATE_BTB_CONDITION         [port]->read(),it_upt->condition);
     849                        }
     850                      TEST(Tcontrol_t         ,out_UPDATE_DIR_VAL               [port]->read(),update_dir(it_upt->condition) and not (it_upt->miss_ifetch or it_upt->miss_decod));
     851
     852                      if (update_dir(it_upt->condition))
     853                      if (_param->_have_port_history)
     854                      TEST(Thistory_t         ,out_UPDATE_DIR_HISTORY           [port]->read(),it_upt->history);
     855                      TEST(Tcontrol_t         ,out_UPDATE_RAS_VAL               [port]->read(),update_ras(it_upt->condition));
     856                      if (update_ras(it_upt->condition))
     857                        {
     858//                    TEST(Tcontrol_t         ,out_UPDATE_RAS_FLUSH             [port]->read(),0);
     859                      TEST(Tcontrol_t         ,out_UPDATE_RAS_PUSH              [port]->read(),push_ras  (it_upt->condition));
     860                      TEST(Taddress_t         ,out_UPDATE_RAS_ADDRESS           [port]->read(),it_upt->ras_address);
     861                      TEST(Tptr_t             ,out_UPDATE_RAS_INDEX             [port]->read(),it_upt->ras_index);
     862                      TEST(Tcontrol_t         ,out_UPDATE_RAS_PREDICTION_IFETCH [port]->read(),not it_upt->miss_ifetch);
     863                        }
     864                      ++ it_upt;
     865                    }
     866
     867                  SC_START(1);
     868                } while (not have_transaction);
     869
     870              in_UPDATE_ACK [port]->write(0);
     871//               if (_param->_have_port_depth)
     872//               TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]);
     873//               TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]);
     874            }
     875          upt.clear();
     876        }
     877
     878        {
     879          LABEL("BRANCH_EVENT - have miss decod");
     880         
     881          uint32_t port = context;
     882
     883          {
     884            bool have_transaction = false;
     885           
     886            do
     887              {
     888                in_BRANCH_EVENT_ACK [port]->write((rand()%100)<percent_transaction_branch_event);
     889               
     890                SC_START(0);
     891               
     892                LABEL("BRANCH_EVENT [%d] %d - %d.",port,out_BRANCH_EVENT_VAL [port]->read(),in_BRANCH_EVENT_ACK [port]->read());
     893               
     894                if (out_BRANCH_EVENT_VAL [port]->read() and in_BRANCH_EVENT_ACK [port]->read())
     895                  {
     896                    LABEL("BRANCH_EVENT [%d] - Transaction accepted",port);
     897                    have_transaction = true;
     898             
     899                    TEST(Taddress_t,out_BRANCH_EVENT_ADDRESS_SRC      [port]->read(),event.address_src);
     900                    TEST(Tcontrol_t,out_BRANCH_EVENT_ADDRESS_DEST_VAL [port]->read(),event.take);
     901                    if (event.take)
     902                    TEST(Taddress_t,out_BRANCH_EVENT_ADDRESS_DEST     [port]->read(),event.address_good);
     903
     904                    event.address_src  = 0;
     905                    event.take         = 0;
     906                    event.address_dest = 0;
     907                  }
     908               
     909                SC_START(1);
     910              } while (not have_transaction);
     911
     912              in_BRANCH_EVENT_ACK [port]->write(0);
     913          }
     914        }
     915
     916
     917        // Wait Garbage Collector
     918        {
     919          upt_bottom [context] = (upt_bottom [context]+1)%_param->_size_upt_queue[context];
     920//        upt_top    [context] = (upt_top    [context]);
     921
     922          while ((upt_bottom [context] != out_DEPTH_MIN [context]->read()) or
     923                 (upt_top    [context] != out_DEPTH_MAX [context]->read()))
     924            SC_START(1);
     925
     926        }
     927        }
     928
     929      //---------------------------------------------------------------------
     930      //---------------------------------------------------------------------
     931      // DECOD MISS : with RAS in ifetch
     932      //---------------------------------------------------------------------
     933      //---------------------------------------------------------------------
     934      if (test3)
     935        {
     936        uint32_t context = rand() % _param->_nb_context;
     937        uint32_t have_ras = false;
     938        {
     939          LABEL("PREDICT - fill the queue");
     940          uint32_t port = rand() % _param->_nb_inst_predict;
     941
     942          LABEL("  * context : %d",context);
     943          LABEL("  * port    : %d",port);
     944         
     945          for (uint32_t i=0; i<_param->_size_ufpt_queue[context]; i++)
     946            {
     947              request_t request;
     948              request.context          = context;
     949              request.address_src      = 0xdeadbeef+i;
     950              request.address_dest     = 0x21071981+i;                                   
     951              request.address_good     = request.address_dest;
     952              request.condition        = (rand()%2)?BRANCH_CONDITION_NONE_WITH_WRITE_STACK:BRANCH_CONDITION_FLAG_SET;
     953
     954              have_ras |= (update_ras(request.condition));
     955
     956              request.take             = 1;                                             
     957              request.take_good        = 1;                                             
     958              request.flag             = (request.condition == BRANCH_CONDITION_FLAG_SET)?request.take_good:(not request.take_good);
     959              request.is_accurate      = true;
     960              request.miss_ifetch      = false;
     961              request.miss_decod       = true ;
     962              request.miss_commit      = false;
     963              request.history          = i;                                             
     964              request.ras_address      = 0x12344321+i;                                   
     965              request.ras_index        = (043211234+i)%_param->_size_ras_index[context];
     966              request.ufpt_ptr         = ufpt_top [context];
     967//            request.upt_ptr;
     968             
     969              bool have_transaction = false;
     970              do
     971                {
     972                  in_PREDICT_VAL              [port]->write((rand()%100)<percent_transaction_predict);
     973                  in_PREDICT_CONTEXT_ID       [port]->write(request.context     );
     974                  in_PREDICT_BTB_ADDRESS_SRC  [port]->write(request.address_src );
     975                  in_PREDICT_BTB_ADDRESS_DEST [port]->write(request.address_dest);
     976                  in_PREDICT_BTB_CONDITION    [port]->write(request.condition   );
     977                  in_PREDICT_BTB_LAST_TAKE    [port]->write(request.take        );
     978                  in_PREDICT_BTB_IS_ACCURATE  [port]->write(request.is_accurate );
     979                  in_PREDICT_DIR_HISTORY      [port]->write(request.history     );
     980                  in_PREDICT_RAS_ADDRESS      [port]->write(request.ras_address );
     981                  in_PREDICT_RAS_INDEX        [port]->write(request.ras_index   );
     982                 
     983                  if (_param->_have_port_depth)
     984                  TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]);
     985                  TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]);
     986                     
     987                  SC_START(0); // fct melay
     988                 
     989                  LABEL("PREDICT         [%d] %d - %d (accurate : %d).",
     990                        port,
     991                         in_PREDICT_VAL [port]->read(),
     992                        out_PREDICT_ACK [port]->read(),
     993                         in_PREDICT_BTB_IS_ACCURATE [port]->read());
     994                 
     995                  if (in_PREDICT_VAL [port]->read() and out_PREDICT_ACK [port]->read())
     996                    {
     997                      LABEL("PREDICT         [%d] - Transaction accepted",port);
     998                      have_transaction = true;
     999
     1000                      if (_param->_have_port_depth)
     1001                      TEST(Tprediction_ptr_t,out_PREDICT_UPDATE_PREDICTION_ID [port]->read(),ufpt_top [context]);
     1002                     
     1003                      ufpt_top [context] = (ufpt_top [context]+1)%_param->_size_ufpt_queue[context];
     1004                    }
     1005                 
     1006                  SC_START(1); // transition
     1007                 
     1008                } while (not have_transaction);
     1009
     1010              ufpt.push_back(request); // to update
     1011
     1012              in_PREDICT_VAL [port]->write(0);
     1013           
     1014              if (_param->_have_port_depth)
     1015              TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]);
     1016              TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]);
     1017            }
     1018        }
     1019       
     1020        {
     1021          LABEL("DECOD - Miss");
     1022          uint32_t port = rand() % _param->_nb_inst_decod;
     1023
     1024          LABEL("  * context : %d",context);
     1025          LABEL("  * port    : %d",port);
     1026         
     1027          request_t request;
     1028          request.context          = context;
     1029          request.address_src      = 0x14011959;
     1030          request.address_dest     = 0x25071959; // after = not take               
     1031          request.address_good     = request.address_dest;
     1032          request.condition        = BRANCH_CONDITION_FLAG_SET;
     1033          request.take             = 0;                                             
     1034          request.take_good        = 0;                                             
     1035          request.flag             = (request.condition == BRANCH_CONDITION_FLAG_SET)?request.take_good:(not request.take_good);
     1036          request.is_accurate      = true;
     1037          request.miss_ifetch      = false;
     1038          request.miss_decod       = true ;
     1039          request.miss_commit      = false;
     1040          request.history          = 1;
     1041          request.ras_address      = 0xbabababa;                                   
     1042          request.ras_index        = (0x87654321)%_param->_size_ras_index[context];
     1043          request.ufpt_ptr         = ufpt_top [context];
     1044
     1045          event = request;
     1046         
     1047//           for (uint32_t i=0; i<upt.size(); i++)
     1048          // just one
     1049            {
     1050              bool have_transaction = false;
     1051              do
     1052                {
     1053                  in_DECOD_VAL                  [port]->write((rand()%100)<percent_transaction_decod);
     1054                  in_DECOD_CONTEXT_ID           [port]->write(request.context     );
     1055                  in_DECOD_BTB_ADDRESS_SRC      [port]->write(request.address_src );
     1056                  in_DECOD_BTB_ADDRESS_DEST     [port]->write(request.address_dest);
     1057                  in_DECOD_BTB_CONDITION        [port]->write(request.condition   );
     1058                  in_DECOD_BTB_LAST_TAKE        [port]->write(request.take        );
     1059                  in_DECOD_RAS_ADDRESS          [port]->write(request.ras_address );
     1060                  in_DECOD_RAS_INDEX            [port]->write(request.ras_index   );
     1061                  in_DECOD_UPDATE_PREDICTION_ID [port]->write(request.ufpt_ptr    );
     1062                  in_DECOD_MISS_IFETCH          [port]->write(request.miss_ifetch );
     1063                  in_DECOD_MISS_DECOD           [port]->write(request.miss_decod  );
     1064                  in_DECOD_IS_ACCURATE          [port]->write(request.is_accurate );
     1065
     1066                  SC_START(0); // fct melay
     1067                 
     1068                  LABEL("DECOD           [%d] %d - %d",
     1069                        port,
     1070                         in_PREDICT_VAL [port]->read(),
     1071                        out_PREDICT_ACK [port]->read());
     1072                 
     1073                  if (in_DECOD_VAL [port]->read() and out_DECOD_ACK [port]->read())
     1074                    {
     1075                      LABEL("DECOD          [%d] - Transaction accepted",port);
     1076                      have_transaction = true;
     1077
     1078                      request.upt_ptr = upt_top [context];
     1079                      upt.push_back(request);
     1080//                    ufpt.pop_front();
     1081
     1082                      upt_top [context] = (upt_top [context]+1)%_param->_size_upt_queue[context];
     1083                    }
     1084
     1085                  SC_START(1); // transition
     1086
     1087                } while (not have_transaction);
     1088
     1089              in_DECOD_VAL              [port]->write(0);
     1090             
     1091              if (_param->_have_port_depth)
     1092              TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]);
     1093              TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]);
     1094            }
     1095        }
     1096
     1097        {
     1098          LABEL("BRANCH_COMPLETE - hit ifetch");
     1099       
     1100          uint32_t port = rand() % _param->_nb_inst_branch_complete;
     1101       
     1102          LABEL("  * port    : %d",port);
     1103 
     1104          std::list<request_t>::iterator it_upt = upt.begin();
     1105
     1106//        for (uint32_t i=0; i<_param->_size_ufpt_queue[context]; i++)
     1107//        for (uint32_t i=0; i<upt.size(); i++)
     1108          // just one
     1109          {
     1110              bool have_transaction = false;
     1111
     1112              do
     1113                {
     1114                  in_BRANCH_COMPLETE_VAL        [port]->write((rand()%100)<percent_transaction_branch_complete);
     1115                  in_BRANCH_COMPLETE_CONTEXT_ID [port]->write(it_upt->context     );
     1116                  in_BRANCH_COMPLETE_DEPTH      [port]->write(it_upt->upt_ptr     );
     1117                  in_BRANCH_COMPLETE_ADDRESS    [port]->write(it_upt->address_good);
     1118                  in_BRANCH_COMPLETE_FLAG       [port]->write(it_upt->flag        );
     1119
     1120                  if (_param->_have_port_depth)
     1121                  TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]);
     1122                  TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]);
     1123                 
     1124                  SC_START(0);
     1125                 
     1126                  LABEL("BRANCH_COMPLETE [%d] %d - %d.",port,in_BRANCH_COMPLETE_VAL [port]->read(),out_BRANCH_COMPLETE_ACK [port]->read());
     1127                 
     1128                  if (in_BRANCH_COMPLETE_VAL [port]->read() and out_BRANCH_COMPLETE_ACK [port]->read())
     1129                    {
     1130                      LABEL("BRANCH_COMPLETE [%d] - Transaction accepted",port);
     1131                      have_transaction = true;
     1132                     
     1133                      TEST(Tcontrol_t,out_BRANCH_COMPLETE_MISS_PREDICTION[port]->read(),it_upt->miss_commit );
     1134                      TEST(Tcontrol_t,out_BRANCH_COMPLETE_TAKE           [port]->read(),it_upt->take_good   );
     1135                      TEST(Taddress_t,out_BRANCH_COMPLETE_ADDRESS_SRC    [port]->read(),it_upt->address_src );
     1136                      TEST(Taddress_t,out_BRANCH_COMPLETE_ADDRESS_DEST   [port]->read(),it_upt->address_good);
     1137
     1138                      it_upt ++;
     1139                    }
     1140                 
     1141                  SC_START(1);
     1142                } while (not have_transaction);
     1143
     1144              in_BRANCH_COMPLETE_VAL [port]->write(0);
     1145             
     1146              if (_param->_have_port_depth)
     1147              TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]);
     1148              TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]);
     1149            }
     1150        }
     1151
     1152        if (have_ras)
     1153        {
     1154          LABEL("UPDATE - Update UPFT");
     1155       
     1156          uint32_t port = 0;
     1157       
     1158          LABEL("  * port    : %d",port);
     1159          std::list<request_t>::iterator it_ufpt = ufpt.end();
     1160          -- it_ufpt;
     1161 
     1162          for (uint32_t i=0; i<_param->_size_ufpt_queue[context]; i++)
     1163            {
     1164              bool have_transaction = false;
     1165
     1166              do
     1167                {
     1168                  in_UPDATE_ACK [port]->write((rand()%100)<percent_transaction_update);
     1169
     1170//                   if (_param->_have_port_depth)
     1171//                   TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), ufpt_bottom [context]);
     1172//                   TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), ufpt_top [context]);
     1173                 
     1174                  SC_START(0);
     1175
     1176                  LABEL("UPDATE [%d] %d - %d.",port,out_UPDATE_VAL [port]->read(),in_UPDATE_ACK [port]->read());
     1177                 
     1178                  if (out_UPDATE_VAL [port]->read() and in_UPDATE_ACK [port]->read())
     1179                    {
     1180                      LABEL("UPDATE [%d] - Transaction accepted",port);
     1181                      have_transaction = true;
     1182                 
     1183                      if (_param->_have_port_context_id)
     1184                      TEST(Tcontext_t         ,out_UPDATE_CONTEXT_ID            [port]->read(),it_ufpt->context);
     1185                      TEST(Tcontrol_t         ,out_UPDATE_MISS_PREDICTION       [port]->read(),(it_ufpt->miss_ifetch or
     1186                                                                                                it_ufpt->miss_decod  or
     1187                                                                                                it_ufpt->miss_commit ));
     1188//                       if (update_btb(it_ufpt->condition) or
     1189//                           update_dir(it_ufpt->condition))
     1190//                       TEST(Tcontrol_t         ,out_UPDATE_DIRECTION_GOOD        [port]->read(),it_ufpt->take_good);
     1191                      TEST(Tcontrol_t         ,out_UPDATE_BTB_VAL               [port]->read(),0);
     1192//                       if (update_btb(it_ufpt->condition))
     1193//                         {
     1194//                       TEST(Taddress_t         ,out_UPDATE_BTB_ADDRESS_SRC       [port]->read(),it_ufpt->address_src);
     1195//                       TEST(Taddress_t         ,out_UPDATE_BTB_ADDRESS_DEST      [port]->read(),it_ufpt->address_dest);
     1196//                       TEST(Tbranch_condition_t,out_UPDATE_BTB_CONDITION         [port]->read(),it_ufpt->condition);
     1197//                         }
     1198                      TEST(Tcontrol_t         ,out_UPDATE_DIR_VAL               [port]->read(),0);
     1199
     1200//                       if (update_dir(it_ufpt->condition))
     1201//                       if (_param->_have_port_history)
     1202//                       TEST(Thistory_t         ,out_UPDATE_DIR_HISTORY           [port]->read(),it_ufpt->history);
     1203//                       TEST(Tcontrol_t         ,out_UPDATE_RAS_VAL               [port]->read(),update_ras(it_ufpt->condition));
     1204                      if (update_ras(it_ufpt->condition))
     1205                        {
     1206//                    TEST(Tcontrol_t         ,out_UPDATE_RAS_FLUSH             [port]->read(),0);
     1207                      TEST(Tcontrol_t         ,out_UPDATE_RAS_PUSH              [port]->read(),push_ras  (it_ufpt->condition));
     1208                      LABEL("KANE : out_UPDATE_RAS_ADDRESS [port]->read() : %.8x",out_UPDATE_RAS_ADDRESS [port]->read());
     1209                      LABEL("KANE : it_ufpt->ras_address                  : %.8x",it_ufpt->ras_address);
     1210
     1211                      TEST(Taddress_t         ,out_UPDATE_RAS_ADDRESS           [port]->read(),it_ufpt->ras_address);
     1212                      TEST(Tptr_t             ,out_UPDATE_RAS_INDEX             [port]->read(),it_ufpt->ras_index);
     1213                      TEST(Tcontrol_t         ,out_UPDATE_RAS_PREDICTION_IFETCH [port]->read(),not it_ufpt->miss_ifetch);
     1214                        }
     1215                    }
     1216
     1217                  SC_START(1);
     1218                } while (not have_transaction);
     1219
     1220              -- it_ufpt;
     1221               
     1222
     1223              in_UPDATE_ACK [port]->write(0);
     1224//               if (_param->_have_port_depth)
     1225//               TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), ufpt_bottom [context]);
     1226//               TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), ufpt_top [context]);
     1227            }
     1228        }
     1229        ufpt.clear();
     1230
     1231        {
     1232          LABEL("UPDATE - hit ifetch");
     1233       
     1234          uint32_t port = 0;
     1235       
     1236          LABEL("  * port    : %d",port);
     1237          std::list<request_t>::iterator it_upt = upt.begin();
     1238 
     1239//        for (uint32_t i=0; i<_param->_size_ufpt_queue[context]; i++)
     1240//        for (uint32_t i=0; i<upt.size(); i++)
     1241          // just one
     1242            {
     1243              bool have_transaction = false;
     1244
     1245              do
     1246                {
     1247                  in_UPDATE_ACK [port]->write((rand()%100)<percent_transaction_update);
     1248
     1249//                   if (_param->_have_port_depth)
     1250//                   TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]);
     1251//                   TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]);
     1252                 
     1253                  SC_START(0);
     1254
     1255                  LABEL("UPDATE [%d] %d - %d.",port,out_UPDATE_VAL [port]->read(),in_UPDATE_ACK [port]->read());
     1256                 
     1257                  if (out_UPDATE_VAL [port]->read() and in_UPDATE_ACK [port]->read())
     1258                    {
     1259                      LABEL("UPDATE [%d] - Transaction accepted",port);
     1260                      have_transaction = true;
     1261                 
     1262                      if (_param->_have_port_context_id)
     1263                      TEST(Tcontext_t         ,out_UPDATE_CONTEXT_ID            [port]->read(),it_upt->context);
     1264                      TEST(Tcontrol_t         ,out_UPDATE_MISS_PREDICTION       [port]->read(),it_upt->miss_commit);
     1265                      TEST(Tcontrol_t         ,out_UPDATE_DIRECTION_GOOD        [port]->read(),it_upt->take_good);
     1266                      TEST(Tcontrol_t         ,out_UPDATE_BTB_VAL               [port]->read(),update_btb(it_upt->condition));
     1267                      if (update_btb(it_upt->condition))
     1268                        {
     1269                      TEST(Taddress_t         ,out_UPDATE_BTB_ADDRESS_SRC       [port]->read(),it_upt->address_src);
     1270                      TEST(Taddress_t         ,out_UPDATE_BTB_ADDRESS_DEST      [port]->read(),it_upt->address_dest);
     1271                      TEST(Tbranch_condition_t,out_UPDATE_BTB_CONDITION         [port]->read(),it_upt->condition);
     1272                        }
     1273                      TEST(Tcontrol_t         ,out_UPDATE_DIR_VAL               [port]->read(),update_dir(it_upt->condition) and not (it_upt->miss_ifetch or it_upt->miss_decod));
     1274
     1275                      if (update_dir(it_upt->condition))
     1276                      if (_param->_have_port_history)
     1277                      TEST(Thistory_t         ,out_UPDATE_DIR_HISTORY           [port]->read(),it_upt->history);
     1278                      TEST(Tcontrol_t         ,out_UPDATE_RAS_VAL               [port]->read(),update_ras(it_upt->condition));
     1279                      if (update_ras(it_upt->condition))
     1280                        {
     1281//                    TEST(Tcontrol_t         ,out_UPDATE_RAS_FLUSH             [port]->read(),0);
     1282                      TEST(Tcontrol_t         ,out_UPDATE_RAS_PUSH              [port]->read(),push_ras  (it_upt->condition));
     1283                      TEST(Taddress_t         ,out_UPDATE_RAS_ADDRESS           [port]->read(),it_upt->ras_address);
     1284                      TEST(Tptr_t             ,out_UPDATE_RAS_INDEX             [port]->read(),it_upt->ras_index);
     1285                      TEST(Tcontrol_t         ,out_UPDATE_RAS_PREDICTION_IFETCH [port]->read(),not it_upt->miss_ifetch);
     1286                        }
     1287                      ++ it_upt;
     1288                    }
     1289
     1290                  SC_START(1);
     1291                } while (not have_transaction);
     1292
     1293              in_UPDATE_ACK [port]->write(0);
     1294//               if (_param->_have_port_depth)
     1295//               TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]);
     1296//               TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]);
     1297            }
     1298        }
     1299        upt.clear();
     1300
     1301        {
     1302          LABEL("BRANCH_EVENT - have miss decod");
     1303         
     1304          uint32_t port = context;
     1305
     1306          {
     1307            bool have_transaction = false;
     1308           
     1309            do
     1310              {
     1311                in_BRANCH_EVENT_ACK [port]->write((rand()%100)<percent_transaction_branch_event);
     1312               
     1313                SC_START(0);
     1314               
     1315                LABEL("BRANCH_EVENT [%d] %d - %d.",port,out_BRANCH_EVENT_VAL [port]->read(),in_BRANCH_EVENT_ACK [port]->read());
     1316               
     1317                if (out_BRANCH_EVENT_VAL [port]->read() and in_BRANCH_EVENT_ACK [port]->read())
     1318                  {
     1319                    LABEL("BRANCH_EVENT [%d] - Transaction accepted",port);
     1320                    have_transaction = true;
     1321             
     1322                    TEST(Taddress_t,out_BRANCH_EVENT_ADDRESS_SRC      [port]->read(),event.address_src);
     1323                    TEST(Tcontrol_t,out_BRANCH_EVENT_ADDRESS_DEST_VAL [port]->read(),event.take);
     1324                    if (event.take)
     1325                    TEST(Taddress_t,out_BRANCH_EVENT_ADDRESS_DEST     [port]->read(),event.address_good);
     1326
     1327                    event.address_src  = 0;
     1328                    event.take         = 0;
     1329                    event.address_dest = 0;
     1330                  }
     1331               
     1332                SC_START(1);
     1333              } while (not have_transaction);
     1334
     1335              in_BRANCH_EVENT_ACK [port]->write(0);
     1336          }
     1337        }
     1338
     1339        // Wait Garbage Collector
     1340        {
     1341          upt_bottom [context] = (upt_bottom [context]+1)%_param->_size_upt_queue[context];
     1342//        upt_top    [context] = (upt_top    [context]);
     1343
     1344          while ((upt_bottom [context] != out_DEPTH_MIN [context]->read()) or
     1345                 (upt_top    [context] != out_DEPTH_MAX [context]->read()))
     1346            SC_START(1);
     1347
     1348        }
     1349      }
     1350     
     1351      //---------------------------------------------------------------------
     1352      //---------------------------------------------------------------------
     1353      // COMMIT MISS : with RAS in UPFT and UPT
     1354      //---------------------------------------------------------------------
     1355      //---------------------------------------------------------------------
     1356      if (test4)
     1357        {
     1358          uint32_t context = rand() % _param->_nb_context;
     1359          uint32_t have_ufpt_ras = false;
     1360          uint32_t have_upt_ras  = false;
     1361          {
     1362            LABEL("PREDICT - fill the queue");
     1363            uint32_t port = rand() % _param->_nb_inst_predict;
     1364           
     1365            LABEL("  * context : %d",context);
     1366            LABEL("  * port    : %d",port);
     1367           
     1368            for (uint32_t i=0; i<_param->_size_ufpt_queue[context]; i++)
     1369              {
     1370                request_t request;
     1371                request.context          = context;
     1372                request.address_src      = rand();
     1373                request.address_dest     = rand();                                   
     1374               
     1375                request.condition        = (rand()%2)?BRANCH_CONDITION_READ_STACK:BRANCH_CONDITION_FLAG_SET;
     1376
     1377                request.take             = 1;                                             
     1378                request.take_good        = 1;                                             
     1379                request.flag             = (request.condition == BRANCH_CONDITION_FLAG_SET)?request.take_good:(not request.take_good);
     1380                request.is_accurate      = false;
     1381                request.miss_ifetch      = false;
     1382                request.miss_decod       = false;
     1383                request.miss_commit      = false;
     1384                request.history          = i;                                             
     1385                request.ras_address      = rand();                                   
     1386                request.ras_index        = rand()%_param->_size_ras_index[context];
     1387                request.ufpt_ptr         = ufpt_top [context];
     1388//              request.upt_ptr;
     1389               
     1390                bool have_transaction = false;
     1391                do
     1392                  {
     1393                    in_PREDICT_VAL              [port]->write((rand()%100)<percent_transaction_predict);
     1394                    in_PREDICT_CONTEXT_ID       [port]->write(request.context     );
     1395                    in_PREDICT_BTB_ADDRESS_SRC  [port]->write(request.address_src );
     1396                    in_PREDICT_BTB_ADDRESS_DEST [port]->write(request.address_dest);
     1397                    in_PREDICT_BTB_CONDITION    [port]->write(request.condition   );
     1398                    in_PREDICT_BTB_LAST_TAKE    [port]->write(request.take        );
     1399                    in_PREDICT_BTB_IS_ACCURATE  [port]->write(request.is_accurate );
     1400                    in_PREDICT_DIR_HISTORY      [port]->write(request.history     );
     1401                    in_PREDICT_RAS_ADDRESS      [port]->write(request.ras_address );
     1402                    in_PREDICT_RAS_INDEX        [port]->write(request.ras_index   );
     1403                   
     1404                    if (_param->_have_port_depth)
     1405                    TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]);
     1406                    TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]);
     1407                   
     1408                    SC_START(0); // fct melay
     1409                   
     1410                    LABEL("PREDICT         [%d] %d - %d (accurate : %d).",
     1411                          port,
     1412                          in_PREDICT_VAL [port]->read(),
     1413                          out_PREDICT_ACK [port]->read(),
     1414                          in_PREDICT_BTB_IS_ACCURATE [port]->read());
     1415                   
     1416                    if (in_PREDICT_VAL [port]->read() and out_PREDICT_ACK [port]->read())
     1417                      {
     1418                        LABEL("PREDICT         [%d] - Transaction accepted",port);
     1419                        have_transaction = true;
     1420                       
     1421                        if (_param->_have_port_depth)
     1422                          TEST(Tprediction_ptr_t,out_PREDICT_UPDATE_PREDICTION_ID [port]->read(),ufpt_top [context]);
     1423                       
     1424                        ufpt_top [context] = (ufpt_top [context]+1)%_param->_size_ufpt_queue[context];
     1425                      }
     1426                   
     1427                    SC_START(1); // transition
     1428                   
     1429                  } while (not have_transaction);
     1430               
     1431                ufpt.push_back(request); // to update
     1432               
     1433                in_PREDICT_VAL [port]->write(0);
     1434               
     1435                if (_param->_have_port_depth)
     1436                  TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]);
     1437                TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]);
     1438              }
     1439          }
     1440       
     1441          {
     1442            LABEL("DECOD");
     1443            uint32_t port = rand() % _param->_nb_inst_decod;
     1444           
     1445            LABEL("  * context : %d",context);
     1446            LABEL("  * port    : %d",port);
     1447           
     1448            for (uint32_t i=0; i<_param->_size_ufpt_queue[context]; i++)
     1449              {
     1450                request_t request = ufpt.front();
     1451               
     1452                bool have_transaction = false;
     1453                do
     1454                  {
     1455                    in_DECOD_VAL                  [port]->write((rand()%100)<percent_transaction_decod);
     1456                    in_DECOD_CONTEXT_ID           [port]->write(request.context     );
     1457                    in_DECOD_BTB_ADDRESS_SRC      [port]->write(request.address_src );
     1458                    in_DECOD_BTB_ADDRESS_DEST     [port]->write(request.address_dest);
     1459                    in_DECOD_BTB_CONDITION        [port]->write(request.condition   );
     1460                    in_DECOD_BTB_LAST_TAKE        [port]->write(request.take        );
     1461                    in_DECOD_RAS_ADDRESS          [port]->write(request.ras_address );
     1462                    in_DECOD_RAS_INDEX            [port]->write(request.ras_index   );
     1463                    in_DECOD_UPDATE_PREDICTION_ID [port]->write(request.ufpt_ptr    );
     1464                    in_DECOD_MISS_IFETCH          [port]->write(request.miss_ifetch );
     1465                    in_DECOD_MISS_DECOD           [port]->write(request.miss_decod  );
     1466                    in_DECOD_IS_ACCURATE          [port]->write(request.is_accurate );
     1467         
     1468                    have_upt_ras |= (update_ras(request.condition));
     1469         
     1470                    SC_START(0); // fct melay
     1471                   
     1472                    LABEL("DECOD           [%d] %d - %d",
     1473                          port,
     1474                          in_PREDICT_VAL [port]->read(),
     1475                          out_PREDICT_ACK [port]->read());
     1476                   
     1477                    if (in_DECOD_VAL [port]->read() and out_DECOD_ACK [port]->read())
     1478                      {
     1479                        LABEL("DECOD          [%d] - Transaction accepted",port);
     1480                        have_transaction = true;
     1481                       
     1482                        request.upt_ptr = upt_top [context];
     1483                        upt.push_back(request);
     1484                        ufpt.pop_front();
     1485                       
     1486                        upt_top [context] = (upt_top [context]+1)%_param->_size_upt_queue[context];
     1487                      }
     1488                   
     1489                    SC_START(1); // transition
     1490                   
     1491                  } while (not have_transaction);
     1492               
     1493                in_DECOD_VAL              [port]->write(0);
     1494               
     1495                if (_param->_have_port_depth)
     1496                  TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]);
     1497                TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]);
     1498              }
     1499          }
     1500
     1501          {
     1502            LABEL("PREDICT - fill the queue");
     1503            uint32_t port = rand() % _param->_nb_inst_predict;
     1504           
     1505            LABEL("  * context : %d",context);
     1506            LABEL("  * port    : %d",port);
     1507           
     1508            for (uint32_t i=0; i<_param->_size_ufpt_queue[context]; i++)
     1509              {
     1510                request_t request;
     1511                request.context          = context;
     1512                request.address_src      = rand();
     1513                request.address_dest     = rand();                                   
     1514                request.address_good     = request.address_dest;
     1515                request.condition        = (rand()%2)?BRANCH_CONDITION_NONE_WITH_WRITE_STACK:BRANCH_CONDITION_FLAG_SET;
     1516               
     1517                have_ufpt_ras |= (update_ras(request.condition));
     1518               
     1519                request.take             = 1;                                             
     1520                request.take_good        = 1;                                             
     1521                request.flag             = (request.condition == BRANCH_CONDITION_FLAG_SET)?request.take_good:(not request.take_good);
     1522                request.is_accurate      = false;
     1523                request.miss_ifetch      = false;
     1524                request.miss_decod       = false;
     1525                request.miss_commit      = true;
     1526                request.history          = i;                                             
     1527                request.ras_address      = rand();                                   
     1528                request.ras_index        = rand()%_param->_size_ras_index[context];
     1529                request.ufpt_ptr         = ufpt_top [context];
     1530//              request.upt_ptr;
     1531               
     1532                bool have_transaction = false;
     1533                do
     1534                  {
     1535                    in_PREDICT_VAL              [port]->write((rand()%100)<percent_transaction_predict);
     1536                    in_PREDICT_CONTEXT_ID       [port]->write(request.context     );
     1537                    in_PREDICT_BTB_ADDRESS_SRC  [port]->write(request.address_src );
     1538                    in_PREDICT_BTB_ADDRESS_DEST [port]->write(request.address_dest);
     1539                    in_PREDICT_BTB_CONDITION    [port]->write(request.condition   );
     1540                    in_PREDICT_BTB_LAST_TAKE    [port]->write(request.take        );
     1541                    in_PREDICT_BTB_IS_ACCURATE  [port]->write(request.is_accurate );
     1542                    in_PREDICT_DIR_HISTORY      [port]->write(request.history     );
     1543                    in_PREDICT_RAS_ADDRESS      [port]->write(request.ras_address );
     1544                    in_PREDICT_RAS_INDEX        [port]->write(request.ras_index   );
     1545                   
     1546                    if (_param->_have_port_depth)
     1547                    TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]);
     1548                    TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]);
     1549                   
     1550                    SC_START(0); // fct melay
     1551                   
     1552                    LABEL("PREDICT         [%d] %d - %d (accurate : %d).",
     1553                          port,
     1554                          in_PREDICT_VAL [port]->read(),
     1555                          out_PREDICT_ACK [port]->read(),
     1556                          in_PREDICT_BTB_IS_ACCURATE [port]->read());
     1557                   
     1558                    if (in_PREDICT_VAL [port]->read() and out_PREDICT_ACK [port]->read())
     1559                      {
     1560                        LABEL("PREDICT         [%d] - Transaction accepted",port);
     1561                        have_transaction = true;
     1562                       
     1563                        if (_param->_have_port_depth)
     1564                          TEST(Tprediction_ptr_t,out_PREDICT_UPDATE_PREDICTION_ID [port]->read(),ufpt_top [context]);
     1565                       
     1566                        ufpt_top [context] = (ufpt_top [context]+1)%_param->_size_ufpt_queue[context];
     1567                      }
     1568                   
     1569                    SC_START(1); // transition
     1570                   
     1571                  } while (not have_transaction);
     1572               
     1573                ufpt.push_back(request); // to update
     1574               
     1575                in_PREDICT_VAL [port]->write(0);
     1576               
     1577                if (_param->_have_port_depth)
     1578                  TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]);
     1579                TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]);
     1580              }
     1581          }
     1582
     1583          std::list<request_t>::iterator it_event;
     1584          {
     1585            LABEL("BRANCH_COMPLETE - hit ifetch");
     1586           
     1587            uint32_t port = rand() % _param->_nb_inst_branch_complete;
     1588           
     1589            LABEL("  * port    : %d",port);
     1590           
     1591            // middle
     1592            it_event = upt.begin();
     1593            for (uint32_t i=0; i < (upt.size()>>1); ++i)
     1594              it_event ++;
     1595
     1596            for (std::list<request_t>::iterator it_upt = it_event;
     1597                 it_upt != upt.end();
     1598                 ++it_upt)
     1599              it_upt->miss_commit = true;
     1600
     1601            if (update_ras(it_event->condition))
     1602              it_event->address_good = ~(it_event->address_dest);
     1603            else
     1604              {
     1605                it_event->address_good = it_event->address_dest;
     1606                it_event->flag         = not it_event->flag;
     1607                it_event->take_good    = not it_event->take_good;
     1608              }
     1609
     1610            event = *it_event;
     1611
     1612           
     1613//        for (uint32_t i=0; i<_param->_size_ufpt_queue[context]; i++)
     1614//        for (uint32_t i=0; i<upt.size(); i++)
     1615            // just one
     1616            {
     1617              bool have_transaction = false;
     1618             
     1619              do
     1620                {
     1621                  in_BRANCH_COMPLETE_VAL        [port]->write((rand()%100)<percent_transaction_branch_complete);
     1622                  in_BRANCH_COMPLETE_CONTEXT_ID [port]->write(it_event->context     );
     1623                  in_BRANCH_COMPLETE_DEPTH      [port]->write(it_event->upt_ptr     );
     1624                  in_BRANCH_COMPLETE_ADDRESS    [port]->write(it_event->address_good);
     1625                  in_BRANCH_COMPLETE_FLAG       [port]->write(it_event->flag        );
     1626
     1627                  if (_param->_have_port_depth)
     1628                  TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]);
     1629                  TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]);
     1630                 
     1631                  SC_START(0);
     1632                 
     1633                  LABEL("BRANCH_COMPLETE [%d] %d - %d.",port,in_BRANCH_COMPLETE_VAL [port]->read(),out_BRANCH_COMPLETE_ACK [port]->read());
     1634                 
     1635                  if (in_BRANCH_COMPLETE_VAL [port]->read() and out_BRANCH_COMPLETE_ACK [port]->read())
     1636                    {
     1637                      LABEL("BRANCH_COMPLETE [%d] - Transaction accepted",port);
     1638                      LABEL("  * CONTEXT_ID %d"  ,it_event->context     );
     1639                      LABEL("  * DEPTH      %d"  ,it_event->upt_ptr     );
     1640                      LABEL("  * CONDITION  %d"  ,it_event->condition   );
     1641                      LABEL("  * ADDRESS    %.8x",it_event->address_good);
     1642                      LABEL("  * FLAG       %d"  ,it_event->flag        );
     1643
     1644                      have_transaction = true;
     1645                     
     1646                      TEST(Tcontrol_t,out_BRANCH_COMPLETE_MISS_PREDICTION[port]->read(),it_event->miss_commit );
     1647                      TEST(Tcontrol_t,out_BRANCH_COMPLETE_TAKE           [port]->read(),it_event->take_good   );
     1648                      TEST(Taddress_t,out_BRANCH_COMPLETE_ADDRESS_SRC    [port]->read(),it_event->address_src );
     1649                      TEST(Taddress_t,out_BRANCH_COMPLETE_ADDRESS_DEST   [port]->read(),it_event->address_good);
     1650
     1651                      upt_top [it_event->context] = it_event->upt_ptr;
     1652                    }
     1653                 
     1654                  SC_START(1);
     1655                } while (not have_transaction);
     1656             
     1657              in_BRANCH_COMPLETE_VAL [port]->write(0);
     1658             
     1659              if (_param->_have_port_depth)
     1660              TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]);
     1661              TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]);
     1662            }
     1663          }
     1664         
     1665          if (have_ufpt_ras)
     1666            {
     1667              LABEL("UPDATE - Update UPFT");
     1668             
     1669              uint32_t port = 0;
     1670             
     1671              LABEL("  * port    : %d",port);
     1672              std::list<request_t>::iterator it_ufpt = ufpt.end();
     1673              -- it_ufpt;
     1674             
     1675              for (uint32_t i=0; i<_param->_size_ufpt_queue[context]; i++)
     1676                {
     1677                  bool have_transaction = false;
     1678                 
     1679                  do
     1680                    {
     1681                      in_UPDATE_ACK [port]->write((rand()%100)<percent_transaction_update);
     1682                     
     1683//                    if (_param->_have_port_depth)
     1684//                    TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), ufpt_bottom [context]);
     1685//                    TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), ufpt_top [context]);
     1686                 
     1687                      SC_START(0);
     1688                     
     1689                      LABEL("UPDATE [%d] %d - %d.",port,out_UPDATE_VAL [port]->read(),in_UPDATE_ACK [port]->read());
     1690                     
     1691                      if (out_UPDATE_VAL [port]->read() and in_UPDATE_ACK [port]->read())
     1692                        {
     1693                          LABEL("UPDATE [%d] - Transaction accepted",port);
     1694                          have_transaction = true;
     1695                         
     1696                          if (_param->_have_port_context_id)
     1697                          TEST(Tcontext_t         ,out_UPDATE_CONTEXT_ID            [port]->read(),it_ufpt->context);
     1698                          TEST(Tcontrol_t         ,out_UPDATE_MISS_PREDICTION       [port]->read(),(it_ufpt->miss_ifetch or
     1699                                                                                                    it_ufpt->miss_decod  or
     1700                                                                                                    it_ufpt->miss_commit ));
     1701//                        if (update_btb(it_ufpt->condition) or
     1702//                            update_dir(it_ufpt->condition))
     1703//                        TEST(Tcontrol_t         ,out_UPDATE_DIRECTION_GOOD        [port]->read(),it_ufpt->take_good);
     1704                          TEST(Tcontrol_t         ,out_UPDATE_BTB_VAL               [port]->read(),0);
     1705//                        if (update_btb(it_ufpt->condition))
     1706//                          {
     1707//                        TEST(Taddress_t         ,out_UPDATE_BTB_ADDRESS_SRC       [port]->read(),it_ufpt->address_src);
     1708//                        TEST(Taddress_t         ,out_UPDATE_BTB_ADDRESS_DEST      [port]->read(),it_ufpt->address_dest);
     1709//                        TEST(Tbranch_condition_t,out_UPDATE_BTB_CONDITION         [port]->read(),it_ufpt->condition);
     1710//                          }
     1711                          TEST(Tcontrol_t         ,out_UPDATE_DIR_VAL               [port]->read(),0);
     1712
     1713//                        if (update_dir(it_ufpt->condition))
     1714//                        if (_param->_have_port_history)
     1715//                        TEST(Thistory_t         ,out_UPDATE_DIR_HISTORY           [port]->read(),it_ufpt->history);
     1716//                        TEST(Tcontrol_t         ,out_UPDATE_RAS_VAL               [port]->read(),update_ras(it_ufpt->condition));
     1717                          if (update_ras(it_ufpt->condition))
     1718                            {
     1719//                            TEST(Tcontrol_t         ,out_UPDATE_RAS_FLUSH             [port]->read(),0);
     1720                              TEST(Tcontrol_t         ,out_UPDATE_RAS_PUSH              [port]->read(),push_ras  (it_ufpt->condition));
     1721                              TEST(Taddress_t         ,out_UPDATE_RAS_ADDRESS           [port]->read(),it_ufpt->ras_address);
     1722                              TEST(Tptr_t             ,out_UPDATE_RAS_INDEX             [port]->read(),it_ufpt->ras_index);
     1723                              TEST(Tcontrol_t         ,out_UPDATE_RAS_PREDICTION_IFETCH [port]->read(),not it_ufpt->miss_ifetch);
     1724                            }
     1725                        }
     1726                     
     1727                      SC_START(1);
     1728                    } while (not have_transaction);
     1729                 
     1730                  -- it_ufpt;
     1731                 
     1732                 
     1733                  in_UPDATE_ACK [port]->write(0);
     1734//                if (_param->_have_port_depth)
     1735//                TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), ufpt_bottom [context]);
     1736//                TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), ufpt_top [context]);
     1737                }
     1738            }
     1739          ufpt.clear();
     1740
     1741          {
     1742            LABEL("UPDATE - upt");
     1743           
     1744            uint32_t port = 0;
     1745           
     1746            LABEL("  * port    : %d",port);
     1747            std::list<request_t>::iterator it_upt = upt.end();
     1748            --it_upt;
     1749
     1750//             for (uint32_t i=0; i<upt.size(); i++)
     1751            while (it_upt != it_event)
     1752              {
     1753                bool have_transaction = false;
     1754               
     1755                do
     1756                  {
     1757                    in_UPDATE_ACK [port]->write((rand()%100)<percent_transaction_update);
     1758
     1759//                   if (_param->_have_port_depth)
     1760//                   TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]);
     1761//                   TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]);
     1762                 
     1763                    SC_START(0);
     1764                   
     1765                    LABEL("UPDATE [%d] %d - %d.",port,out_UPDATE_VAL [port]->read(),in_UPDATE_ACK [port]->read());
     1766                   
     1767                    if (out_UPDATE_VAL [port]->read() and in_UPDATE_ACK [port]->read())
     1768                      {
     1769                        LABEL("UPDATE [%d] - Transaction accepted",port);
     1770                        have_transaction = true;
     1771                       
     1772                        if (_param->_have_port_context_id)
     1773                        TEST(Tcontext_t         ,out_UPDATE_CONTEXT_ID            [port]->read(),it_upt->context);
     1774                        TEST(Tcontrol_t         ,out_UPDATE_MISS_PREDICTION       [port]->read(),it_upt->miss_commit);
     1775                        TEST(Tcontrol_t         ,out_UPDATE_DIRECTION_GOOD        [port]->read(),it_upt->take_good);
     1776                        TEST(Tcontrol_t         ,out_UPDATE_BTB_VAL               [port]->read(),update_btb(it_upt->condition));
     1777                        if (update_btb(it_upt->condition))
     1778                          {
     1779                        TEST(Taddress_t         ,out_UPDATE_BTB_ADDRESS_SRC       [port]->read(),it_upt->address_src);
     1780                        TEST(Taddress_t         ,out_UPDATE_BTB_ADDRESS_DEST      [port]->read(),it_upt->address_dest);
     1781                        TEST(Tbranch_condition_t,out_UPDATE_BTB_CONDITION         [port]->read(),it_upt->condition);
     1782                          }
     1783                        TEST(Tcontrol_t         ,out_UPDATE_DIR_VAL               [port]->read(),update_dir(it_upt->condition) and not (it_upt->miss_ifetch or it_upt->miss_decod));
     1784                       
     1785                        if (update_dir(it_upt->condition))
     1786                        if (_param->_have_port_history)
     1787                        TEST(Thistory_t         ,out_UPDATE_DIR_HISTORY           [port]->read(),it_upt->history);
     1788                        TEST(Tcontrol_t         ,out_UPDATE_RAS_VAL               [port]->read(),update_ras(it_upt->condition));
     1789                        if (update_ras(it_upt->condition))
     1790                          {
     1791//                      TEST(Tcontrol_t         ,out_UPDATE_RAS_FLUSH             [port]->read(),0);
     1792                        TEST(Tcontrol_t         ,out_UPDATE_RAS_PUSH              [port]->read(),push_ras  (it_upt->condition));
     1793                        TEST(Taddress_t         ,out_UPDATE_RAS_ADDRESS           [port]->read(),it_upt->ras_address);
     1794                        TEST(Tptr_t             ,out_UPDATE_RAS_INDEX             [port]->read(),it_upt->ras_index);
     1795                        TEST(Tcontrol_t         ,out_UPDATE_RAS_PREDICTION_IFETCH [port]->read(),not it_upt->miss_ifetch);
     1796                          }
     1797
     1798                        -- it_upt;
     1799                      }
     1800                   
     1801                    SC_START(1);
     1802                  } while (not have_transaction);
     1803             
     1804                upt.pop_back();
     1805                in_UPDATE_ACK [port]->write(0);
     1806//               if (_param->_have_port_depth)
     1807//               TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]);
     1808//               TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]);
     1809              }
     1810          }
     1811//           upt.clear(); // Not yet
     1812
     1813          {
     1814            LABEL("BRANCH_EVENT - have miss decod");
     1815           
     1816            uint32_t port = context;
     1817           
     1818            {
     1819              bool have_transaction = false;
     1820             
     1821              do
     1822                {
     1823                  in_BRANCH_EVENT_ACK [port]->write((rand()%100)<percent_transaction_branch_event);
     1824                 
     1825                  SC_START(0);
     1826                 
     1827                  LABEL("BRANCH_EVENT [%d] %d - %d.",port,out_BRANCH_EVENT_VAL [port]->read(),in_BRANCH_EVENT_ACK [port]->read());
     1828                 
     1829                  if (out_BRANCH_EVENT_VAL [port]->read() and in_BRANCH_EVENT_ACK [port]->read())
     1830                    {
     1831                      LABEL("BRANCH_EVENT [%d] - Transaction accepted",port);
     1832                      have_transaction = true;
     1833                     
     1834                      LABEL("  * event.address_src  : %.8x,",event.address_src );
     1835                      LABEL("  * event.address_good : %.8x,",event.address_good);
     1836                      LABEL("  * event.take         : %.8x,",event.take        );
     1837                     
     1838                      TEST(Taddress_t,out_BRANCH_EVENT_ADDRESS_SRC      [port]->read(),event.address_src);
     1839                      TEST(Tcontrol_t,out_BRANCH_EVENT_ADDRESS_DEST_VAL [port]->read(),event.take_good);
     1840                      if (event.take_good)
     1841                      TEST(Taddress_t,out_BRANCH_EVENT_ADDRESS_DEST     [port]->read(),event.address_good);
     1842                     
     1843                      event.address_src  = 0;
     1844                      event.take         = 0;
     1845                      event.address_dest = 0;
     1846                    }
     1847                 
     1848                  SC_START(1);
     1849                } while (not have_transaction);
     1850             
     1851              in_BRANCH_EVENT_ACK [port]->write(0);
     1852            }
     1853          }
     1854         
     1855          {
     1856            LABEL("UPDATE - upt");
     1857           
     1858            uint32_t port = 0;
     1859           
     1860            LABEL("  * port    : %d",port);
     1861            std::list<request_t>::iterator it_upt = upt.begin();
     1862
     1863            for (uint32_t i=0; i<upt.size(); i++)
     1864              {
     1865                bool have_transaction = false;
     1866               
     1867                do
     1868                  {
     1869                    in_UPDATE_ACK [port]->write((rand()%100)<percent_transaction_update);
     1870
     1871//                   if (_param->_have_port_depth)
     1872//                   TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]);
     1873//                   TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]);
     1874                 
     1875                    SC_START(0);
     1876                   
     1877                    LABEL("UPDATE [%d] %d - %d.",port,out_UPDATE_VAL [port]->read(),in_UPDATE_ACK [port]->read());
     1878                   
     1879                    if (out_UPDATE_VAL [port]->read() and in_UPDATE_ACK [port]->read())
     1880                      {
     1881                        LABEL("UPDATE [%d] - Transaction accepted",port);
     1882                        have_transaction = true;
     1883                       
     1884                        if (_param->_have_port_context_id)
     1885                        TEST(Tcontext_t         ,out_UPDATE_CONTEXT_ID            [port]->read(),it_upt->context);
     1886                        TEST(Tcontrol_t         ,out_UPDATE_MISS_PREDICTION       [port]->read(),it_upt->miss_commit);
     1887                        TEST(Tcontrol_t         ,out_UPDATE_DIRECTION_GOOD        [port]->read(),it_upt->take_good);
     1888                        TEST(Tcontrol_t         ,out_UPDATE_BTB_VAL               [port]->read(),update_btb(it_upt->condition));
     1889                        if (update_btb(it_upt->condition))
     1890                          {
     1891                        TEST(Taddress_t         ,out_UPDATE_BTB_ADDRESS_SRC       [port]->read(),it_upt->address_src);
     1892                        TEST(Taddress_t         ,out_UPDATE_BTB_ADDRESS_DEST      [port]->read(),it_upt->address_dest);
     1893                        TEST(Tbranch_condition_t,out_UPDATE_BTB_CONDITION         [port]->read(),it_upt->condition);
     1894                          }
     1895                        TEST(Tcontrol_t         ,out_UPDATE_DIR_VAL               [port]->read(),update_dir(it_upt->condition) and not (it_upt->miss_ifetch or it_upt->miss_decod));
     1896                       
     1897                        if (update_dir(it_upt->condition))
     1898                        if (_param->_have_port_history)
     1899                        TEST(Thistory_t         ,out_UPDATE_DIR_HISTORY           [port]->read(),it_upt->history);
     1900                        TEST(Tcontrol_t         ,out_UPDATE_RAS_VAL               [port]->read(),update_ras(it_upt->condition));
     1901                        if (update_ras(it_upt->condition))
     1902                          {
     1903//                      TEST(Tcontrol_t         ,out_UPDATE_RAS_FLUSH             [port]->read(),0);
     1904                        TEST(Tcontrol_t         ,out_UPDATE_RAS_PUSH              [port]->read(),push_ras  (it_upt->condition));
     1905                        TEST(Taddress_t         ,out_UPDATE_RAS_ADDRESS           [port]->read(),it_upt->ras_address);
     1906                        TEST(Tptr_t             ,out_UPDATE_RAS_INDEX             [port]->read(),it_upt->ras_index);
     1907                        TEST(Tcontrol_t         ,out_UPDATE_RAS_PREDICTION_IFETCH [port]->read(),not it_upt->miss_ifetch);
     1908                          }
     1909
     1910                        -- it_upt;
     1911                      }
     1912                   
     1913                    SC_START(1);
     1914                  } while (not have_transaction);
     1915               
     1916                in_UPDATE_ACK [port]->write(0);
     1917//               if (_param->_have_port_depth)
     1918//               TEST(Tdepth_t,out_DEPTH_MIN [context]->read(), upt_bottom [context]);
     1919//               TEST(Tdepth_t,out_DEPTH_MAX [context]->read(), upt_top [context]);
     1920              }
     1921          }
     1922          upt.clear(); // Not yet
     1923
     1924          // Wait Garbage Collector
     1925          {
     1926            upt_bottom [context] = (upt_bottom [context]+1)%_param->_size_upt_queue[context];
     1927//        upt_top    [context] = (upt_top    [context]);
     1928
     1929            while ((upt_bottom [context] != out_DEPTH_MIN [context]->read()) or
     1930                   (upt_top    [context] != out_DEPTH_MAX [context]->read()))
     1931              SC_START(1);
     1932           
     1933          }
     1934        }
     1935     
    5881936    }// ITERATION
    5891937
     
    6491997//   delete [] out_BRANCH_EVENT_MISS_PREDICTION;
    6501998  delete [] out_BRANCH_EVENT_ADDRESS_SRC    ;
     1999  delete [] out_BRANCH_EVENT_ADDRESS_DEST_VAL;
    6512000  delete [] out_BRANCH_EVENT_ADDRESS_DEST   ;
    6522001 
     
    6642013  delete [] out_UPDATE_DIR_HISTORY          ;
    6652014  delete [] out_UPDATE_RAS_VAL              ;
     2015  delete [] out_UPDATE_RAS_FLUSH            ;
    6662016  delete [] out_UPDATE_RAS_PUSH             ;
    6672017  delete [] out_UPDATE_RAS_ADDRESS          ;
Note: See TracChangeset for help on using the changeset viewer.