Ignore:
Timestamp:
Dec 10, 2008, 7:31:39 PM (16 years ago)
Author:
rosiere
Message:

Almost complete design
with Test and test platform

Location:
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer
Files:
1 added
44 edited

Legend:

Unmodified
Added
Removed
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Glue/SelfTest/Makefile

    r81 r88  
    2424library_clean                   : Branch_Target_Buffer_Glue_library_clean
    2525
     26local_clean                     :
     27
    2628include                         $(DIR_COMPONENT)/Makefile.deps
    2729include                         $(DIR_MORPHEO)/Behavioural/Makefile.flags
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Glue/SelfTest/src/main.cpp

    r81 r88  
    5555         _nb_inst_predict    ,
    5656         _nb_inst_decod      ,
    57          _nb_inst_update     );
     57         _nb_inst_update     ,
     58         true // is_toplevel
     59         );
    5860     
    5961      msg(_("%s"),param->print(1).c_str());
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Glue/SelfTest/src/test.cpp

    r82 r88  
    2323#endif
    2424
     25  Tusage_t _usage = USE_ALL;
     26
     27//   _usage = usage_unset(_usage,USE_SYSTEMC              );
     28//   _usage = usage_unset(_usage,USE_VHDL                 );
     29//   _usage = usage_unset(_usage,USE_VHDL_TESTBENCH       );
     30//   _usage = usage_unset(_usage,USE_VHDL_TESTBENCH_ASSERT);
     31//   _usage = usage_unset(_usage,USE_POSITION             );
     32//   _usage = usage_unset(_usage,USE_STATISTICS           );
     33//   _usage = usage_unset(_usage,USE_INFORMATION          );
     34
    2535  Branch_Target_Buffer_Glue * _Branch_Target_Buffer_Glue = new Branch_Target_Buffer_Glue
    2636    (name.c_str(),
     
    2939#endif
    3040     _param,
    31      USE_ALL);
     41     _usage);
    3242 
    3343#ifdef SYSTEMC
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Glue/include/Parameters.h

    r81 r88  
    2929  public : uint32_t   _size_buffer       ;
    3030  public : uint32_t   _associativity     ;
    31   public : uint32_t   _size_address      ;
     31//public : uint32_t   _size_address      ;
    3232  public : uint32_t   _nb_inst_predict   ;
    3333  public : uint32_t   _nb_inst_decod     ;
     
    5151                        uint32_t   nb_inst_predict   ,
    5252                        uint32_t   nb_inst_decod     ,
    53                         uint32_t   nb_inst_update    );
     53                        uint32_t   nb_inst_update    ,
     54                        bool       is_toplevel=false
     55                        );
    5456//   public : Parameters  (Parameters & param) ;
    5557  public : ~Parameters () ;
     58
     59  public :        void            copy       (void);
    5660
    5761  public :        Parameters_test msg_error  (void);
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Glue/src/Branch_Target_Buffer_Glue.cpp

    r81 r88  
    3939    log_printf(FUNC,Branch_Target_Buffer_Glue,FUNCTION,"Begin");
    4040
     41#if DEBUG_Branch_Target_Buffer_Glue == true
     42    log_printf(INFO,Branch_Target_Buffer_Glue,FUNCTION,_("<%s> Parameters"),_name.c_str());
     43
     44    std::cout << *param << std::endl;
     45#endif   
     46
    4147    log_printf(INFO,Branch_Target_Buffer_Glue,FUNCTION,"Allocation");
    4248
     
    4854
    4955#ifdef STATISTICS
    50     if (_usage & USE_STATISTICS)
     56    if (usage_is_set(_usage,USE_STATISTICS))
    5157      {
    5258        log_printf(INFO,Branch_Target_Buffer_Glue,FUNCTION,"Allocation of statistics");
     
    5763
    5864#ifdef VHDL
    59     if (_usage & USE_VHDL)
     65    if (usage_is_set(_usage,USE_VHDL))
    6066      {
    6167        // generate the vhdl
     
    6773
    6874#ifdef SYSTEMC
    69     if (_usage & USE_SYSTEMC)
     75    if (usage_is_set(_usage,USE_SYSTEMC))
    7076      {
    7177# if defined(STATISTICS) or defined(VHDL_TESTBENCH)
     
    104110          }
    105111       
    106 # ifdef SYSTEMCASS_SPECIFIC
    107         // List dependency information
    108 
    109         for (uint32_t i=0; i<_param->_nb_inst_predict; i++)
    110           {
    111             for (uint32_t j=0; j<_param->_associativity; j++)
    112             (*(out_PREDICT_HIT            [i])) (*(in_PREDICT_REGISTER_HIT          [i][j]));
    113             if (_param->_have_port_victim)
    114             (*(out_PREDICT_HIT            [i])) (*(in_PREDICT_SORT_INDEX            [i]));
    115 
    116             for (uint32_t j=0; j<_param->_associativity; j++)
    117             (*(out_PREDICT_ADDRESS_SRC    [i])) (*(in_PREDICT_REGISTER_ADDRESS_SRC  [i][j]));
    118             if (_param->_have_port_victim)
    119             (*(out_PREDICT_ADDRESS_SRC    [i])) (*(in_PREDICT_SORT_INDEX            [i]));
    120 
    121             for (uint32_t j=0; j<_param->_associativity; j++)
    122             (*(out_PREDICT_ADDRESS_DEST   [i])) (*(in_PREDICT_REGISTER_ADDRESS_DEST [i][j]));
    123             if (_param->_have_port_victim)
    124             (*(out_PREDICT_ADDRESS_DEST   [i])) (*(in_PREDICT_SORT_INDEX            [i]));
    125 
    126             for (uint32_t j=0; j<_param->_associativity; j++)
    127             (*(out_PREDICT_CONDITION      [i])) (*(in_PREDICT_REGISTER_CONDITION    [i][j]));
    128             if (_param->_have_port_victim)
    129             (*(out_PREDICT_CONDITION      [i])) (*(in_PREDICT_SORT_INDEX            [i]));
    130 
    131             for (uint32_t j=0; j<_param->_associativity; j++)
    132             (*(out_PREDICT_LAST_TAKE      [i])) (*(in_PREDICT_REGISTER_LAST_TAKE    [i][j]));
    133             if (_param->_have_port_victim)
    134             (*(out_PREDICT_LAST_TAKE      [i])) (*(in_PREDICT_SORT_INDEX            [i]));
    135 
    136             for (uint32_t j=0; j<_param->_associativity; j++)
    137             (*(out_PREDICT_IS_ACCURATE    [i])) (*(in_PREDICT_REGISTER_IS_ACCURATE  [i][j]));
    138             if (_param->_have_port_victim)
    139             (*(out_PREDICT_IS_ACCURATE    [i])) (*(in_PREDICT_SORT_INDEX            [i]));
    140 
    141 
    142             (*(out_PREDICT_ACK            [i])) (*(in_PREDICT_REGISTER_ACK          [i]));
    143             if (_param->_have_port_victim)
    144               {
    145             (*(out_PREDICT_ACK            [i])) (*(in_PREDICT_SORT_VAL              [i]));
    146             (*(out_PREDICT_ACK            [i])) (*(in_PREDICT_VICTIM_ACK            [i]));
    147               }
    148 
    149             (*(out_PREDICT_REGISTER_VAL   [i])) (*(in_PREDICT_VAL                   [i]));
    150             if (_param->_have_port_victim)
    151               {
    152             (*(out_PREDICT_REGISTER_VAL   [i])) (*(in_PREDICT_SORT_VAL              [i]));
    153             (*(out_PREDICT_REGISTER_VAL   [i])) (*(in_PREDICT_VICTIM_ACK            [i]));
    154               }
    155 
    156             if (_param->_have_port_victim)
    157               {
    158             (*(out_PREDICT_VICTIM_VAL     [i])) (*(in_PREDICT_VAL                   [i]));
    159             (*(out_PREDICT_VICTIM_VAL     [i])) (*(in_PREDICT_REGISTER_ACK          [i]));
    160             (*(out_PREDICT_VICTIM_VAL     [i])) (*(in_PREDICT_SORT_VAL              [i]));
    161 
    162             for (uint32_t j=0; j<_param->_associativity; j++)
    163             (*(out_PREDICT_VICTIM_HIT     [i])) (*(in_PREDICT_REGISTER_HIT          [i][j]));
    164             (*(out_PREDICT_VICTIM_HIT     [i])) (*(in_PREDICT_SORT_INDEX            [i]));
    165 
    166             if (not _param->_is_full_associative)
    167               {
    168             for (uint32_t j=0; j<_param->_associativity; j++)
    169             (*(out_PREDICT_VICTIM_ADDRESS [i])) (*(in_PREDICT_REGISTER_ADDRESS_SRC  [i][j]));
    170             (*(out_PREDICT_VICTIM_ADDRESS [i])) (*(in_PREDICT_SORT_INDEX            [i]));
    171               }
    172             (*(out_PREDICT_VICTIM_INDEX   [i])) (*(in_PREDICT_SORT_INDEX            [i]));
    173               }
    174           }
    175 # endif
     112// # ifdef SYSTEMCASS_SPECIFIC
     113//      // List dependency information
     114
     115//      for (uint32_t i=0; i<_param->_nb_inst_predict; i++)
     116//        {
     117//          for (uint32_t j=0; j<_param->_associativity; j++)
     118//          (*(out_PREDICT_HIT            [i])) (*(in_PREDICT_REGISTER_HIT          [i][j]));
     119//          if (_param->_have_port_victim)
     120//          (*(out_PREDICT_HIT            [i])) (*(in_PREDICT_SORT_INDEX            [i]));
     121
     122//          for (uint32_t j=0; j<_param->_associativity; j++)
     123//          (*(out_PREDICT_ADDRESS_SRC    [i])) (*(in_PREDICT_REGISTER_ADDRESS_SRC  [i][j]));
     124//          if (_param->_have_port_victim)
     125//          (*(out_PREDICT_ADDRESS_SRC    [i])) (*(in_PREDICT_SORT_INDEX            [i]));
     126
     127//          for (uint32_t j=0; j<_param->_associativity; j++)
     128//          (*(out_PREDICT_ADDRESS_DEST   [i])) (*(in_PREDICT_REGISTER_ADDRESS_DEST [i][j]));
     129//          if (_param->_have_port_victim)
     130//          (*(out_PREDICT_ADDRESS_DEST   [i])) (*(in_PREDICT_SORT_INDEX            [i]));
     131
     132//          for (uint32_t j=0; j<_param->_associativity; j++)
     133//          (*(out_PREDICT_CONDITION      [i])) (*(in_PREDICT_REGISTER_CONDITION    [i][j]));
     134//          if (_param->_have_port_victim)
     135//          (*(out_PREDICT_CONDITION      [i])) (*(in_PREDICT_SORT_INDEX            [i]));
     136
     137//          for (uint32_t j=0; j<_param->_associativity; j++)
     138//          (*(out_PREDICT_LAST_TAKE      [i])) (*(in_PREDICT_REGISTER_LAST_TAKE    [i][j]));
     139//          if (_param->_have_port_victim)
     140//          (*(out_PREDICT_LAST_TAKE      [i])) (*(in_PREDICT_SORT_INDEX            [i]));
     141
     142//          for (uint32_t j=0; j<_param->_associativity; j++)
     143//          (*(out_PREDICT_IS_ACCURATE    [i])) (*(in_PREDICT_REGISTER_IS_ACCURATE  [i][j]));
     144//          if (_param->_have_port_victim)
     145//          (*(out_PREDICT_IS_ACCURATE    [i])) (*(in_PREDICT_SORT_INDEX            [i]));
     146
     147
     148//          (*(out_PREDICT_ACK            [i])) (*(in_PREDICT_REGISTER_ACK          [i]));
     149//          if (_param->_have_port_victim)
     150//            {
     151//          (*(out_PREDICT_ACK            [i])) (*(in_PREDICT_SORT_VAL              [i]));
     152//          (*(out_PREDICT_ACK            [i])) (*(in_PREDICT_VICTIM_ACK            [i]));
     153//            }
     154
     155//          (*(out_PREDICT_REGISTER_VAL   [i])) (*(in_PREDICT_VAL                   [i]));
     156//          if (_param->_have_port_victim)
     157//            {
     158//          (*(out_PREDICT_REGISTER_VAL   [i])) (*(in_PREDICT_SORT_VAL              [i]));
     159//          (*(out_PREDICT_REGISTER_VAL   [i])) (*(in_PREDICT_VICTIM_ACK            [i]));
     160//            }
     161
     162//          if (_param->_have_port_victim)
     163//            {
     164//          (*(out_PREDICT_VICTIM_VAL     [i])) (*(in_PREDICT_VAL                   [i]));
     165//          (*(out_PREDICT_VICTIM_VAL     [i])) (*(in_PREDICT_REGISTER_ACK          [i]));
     166//          (*(out_PREDICT_VICTIM_VAL     [i])) (*(in_PREDICT_SORT_VAL              [i]));
     167
     168//          for (uint32_t j=0; j<_param->_associativity; j++)
     169//          (*(out_PREDICT_VICTIM_HIT     [i])) (*(in_PREDICT_REGISTER_HIT          [i][j]));
     170//          (*(out_PREDICT_VICTIM_HIT     [i])) (*(in_PREDICT_SORT_INDEX            [i]));
     171
     172//          if (not _param->_is_full_associative)
     173//            {
     174//          for (uint32_t j=0; j<_param->_associativity; j++)
     175//          (*(out_PREDICT_VICTIM_ADDRESS [i])) (*(in_PREDICT_REGISTER_ADDRESS_SRC  [i][j]));
     176//          (*(out_PREDICT_VICTIM_ADDRESS [i])) (*(in_PREDICT_SORT_INDEX            [i]));
     177//            }
     178//          (*(out_PREDICT_VICTIM_INDEX   [i])) (*(in_PREDICT_SORT_INDEX            [i]));
     179//            }
     180//        }
     181// # endif
    176182
    177183        log_printf(INFO,Branch_Target_Buffer_Glue,FUNCTION,"Method - genMealy_decod");
     
    271277
    272278#ifdef STATISTICS
    273     if (_usage & USE_STATISTICS)
     279    if (usage_is_set(_usage,USE_STATISTICS))
    274280      {
    275281        statistics_deallocation();
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Glue/src/Branch_Target_Buffer_Glue_allocation.cpp

    r81 r88  
    6565        ALLOC1_SIGNAL_OUT(out_PREDICT_ACK           , "ack"           ,Tcontrol_t         , 1);
    6666        ALLOC1_SIGNAL_OUT(out_PREDICT_HIT           , "hit"           ,Tcontrol_t         , 1);
    67         ALLOC1_SIGNAL_OUT(out_PREDICT_ADDRESS_SRC   , "address_src"   ,Tgeneral_data_t    , _param->_size_address);
    68         ALLOC1_SIGNAL_OUT(out_PREDICT_ADDRESS_DEST  , "address_dest"  ,Tgeneral_data_t    , _param->_size_address);
     67        ALLOC1_SIGNAL_OUT(out_PREDICT_ADDRESS_SRC   , "address_src"   ,Tgeneral_data_t    , _param->_size_instruction_address);
     68        ALLOC1_SIGNAL_OUT(out_PREDICT_ADDRESS_DEST  , "address_dest"  ,Tgeneral_data_t    , _param->_size_instruction_address);
    6969        ALLOC1_SIGNAL_OUT(out_PREDICT_CONDITION     , "condition"     ,Tbranch_condition_t, _param->_size_branch_condition);
    7070        ALLOC1_SIGNAL_OUT(out_PREDICT_LAST_TAKE     , "last_take"     ,Tcontrol_t         , 1);
     
    8989
    9090        ALLOC2_SIGNAL_IN ( in_PREDICT_REGISTER_HIT         ,"register_hit"         ,Tcontrol_t         ,1);
    91         ALLOC2_SIGNAL_IN ( in_PREDICT_REGISTER_ADDRESS_SRC ,"register_address_src" ,Tgeneral_data_t    ,_param->_size_address);
    92         ALLOC2_SIGNAL_IN ( in_PREDICT_REGISTER_ADDRESS_DEST,"register_address_dest",Tgeneral_data_t    ,_param->_size_address);
     91        ALLOC2_SIGNAL_IN ( in_PREDICT_REGISTER_ADDRESS_SRC ,"register_address_src" ,Tgeneral_data_t    ,_param->_size_instruction_address);
     92        ALLOC2_SIGNAL_IN ( in_PREDICT_REGISTER_ADDRESS_DEST,"register_address_dest",Tgeneral_data_t    ,_param->_size_instruction_address);
    9393        ALLOC2_SIGNAL_IN ( in_PREDICT_REGISTER_CONDITION   ,"register_condition"   ,Tbranch_condition_t,_param->_size_branch_condition);
    9494        ALLOC2_SIGNAL_IN ( in_PREDICT_REGISTER_LAST_TAKE   ,"register_last_take"   ,Tcontrol_t         ,1);
     
    104104      ALLOC1_SIGNAL_OUT(out_DECOD_ACK           ,"ack"           ,Tcontrol_t     ,1);
    105105      if (not _param->_is_full_associative)
    106       ALLOC1_SIGNAL_IN ( in_DECOD_ADDRESS_SRC   ,"address_src"   ,Tgeneral_data_t,_param->_size_address);
     106      ALLOC1_SIGNAL_IN ( in_DECOD_ADDRESS_SRC   ,"address_src"   ,Tgeneral_data_t,_param->_size_instruction_address);
    107107
    108108      ALLOC1_SIGNAL_OUT(out_DECOD_REGISTER_VAL  ,"register_val"  ,Tcontrol_t     ,1);
     
    124124      ALLOC1_SIGNAL_OUT(out_UPDATE_ACK           ,"ack"           ,Tcontrol_t     ,1);
    125125      if (not _param->_is_full_associative)
    126       ALLOC1_SIGNAL_IN ( in_UPDATE_ADDRESS_SRC   ,"address_src"   ,Tgeneral_data_t,_param->_size_address);
     126      ALLOC1_SIGNAL_IN ( in_UPDATE_ADDRESS_SRC   ,"address_src"   ,Tgeneral_data_t,_param->_size_instruction_address);
    127127
    128128      ALLOC1_SIGNAL_OUT(out_UPDATE_REGISTER_VAL  ,"register_val"  ,Tcontrol_t     ,1);
     
    140140
    141141#ifdef POSITION
    142     _component->generate_file();
     142    if (usage_is_set(_usage,USE_POSITION))
     143      _component->generate_file();
    143144#endif
    144145
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Glue/src/Branch_Target_Buffer_Glue_deallocation.cpp

    r81 r88  
    2424    log_printf(FUNC,Branch_Target_Buffer_Glue,FUNCTION,"Begin");
    2525
    26     if (_usage & USE_SYSTEMC)
     26    if (usage_is_set(_usage,USE_SYSTEMC))
    2727      {
    2828        delete     in_CLOCK ;
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Glue/src/Branch_Target_Buffer_Glue_end_cycle.cpp

    r81 r88  
    2626
    2727#ifdef STATISTICS
    28     _stat->end_cycle();
     28    if (usage_is_set(_usage,USE_STATISTICS))
     29      _stat->end_cycle();
    2930#endif   
    3031
     
    3233    // Evaluation before read the ouput signal
    3334//  sc_start(0);
    34     _interfaces->testbench();
     35    if (usage_is_set(_usage,USE_VHDL_TESTBENCH))
     36      _interfaces->testbench();
    3537#endif
    3638
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Glue/src/Parameters.cpp

    r81 r88  
    2727                          uint32_t   nb_inst_predict   ,
    2828                          uint32_t   nb_inst_decod     ,
    29                           uint32_t   nb_inst_update    )
     29                          uint32_t   nb_inst_update    ,
     30                          bool       is_toplevel)
    3031  {
    3132    log_printf(FUNC,Branch_Target_Buffer_Glue,FUNCTION,"Begin");
     
    3435    _size_buffer            = size_buffer       ;
    3536    _associativity          = associativity     ;
    36     _size_address           = size_address      ;
     37//  _size_address           = size_address      ;
    3738    _nb_inst_predict        = nb_inst_predict   ;
    3839    _nb_inst_decod          = nb_inst_decod     ;
     
    5051
    5152    test();
     53
     54    if (is_toplevel)
     55      {
     56        _size_instruction_address = size_address;
     57
     58        copy();
     59      }
     60
    5261    log_printf(FUNC,Branch_Target_Buffer_Glue,FUNCTION,"End");
    5362  };
     
    7079  };
    7180
     81#undef  FUNCTION
     82#define FUNCTION "Branch_Target_Buffer_Glue::copy"
     83  void Parameters::copy (void)
     84  {
     85    log_printf(FUNC,Branch_Target_Buffer_Glue,FUNCTION,"Begin");
     86    log_printf(FUNC,Branch_Target_Buffer_Glue,FUNCTION,"End");
     87  };
     88
    7289}; // end namespace branch_target_buffer_glue
    7390}; // end namespace branch_target_buffer
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Glue/src/Parameters_print.cpp

    r81 r88  
    3131    xml.singleton_begin("size_buffer       "); xml.attribut("value",toString(_size_buffer       )); xml.singleton_end();
    3232    xml.singleton_begin("associativity     "); xml.attribut("value",toString(_associativity     )); xml.singleton_end();
    33     xml.singleton_begin("size_address      "); xml.attribut("value",toString(_size_address      )); xml.singleton_end();
     33//  xml.singleton_begin("size_address      "); xml.attribut("value",toString(_size_address      )); xml.singleton_end();
    3434    xml.singleton_begin("nb_inst_predict   "); xml.attribut("value",toString(_nb_inst_predict   )); xml.singleton_end();
    3535    xml.singleton_begin("nb_inst_decod     "); xml.attribut("value",toString(_nb_inst_decod     )); xml.singleton_end();
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Register/Makefile.deps

    r81 r88  
    1616#-----[ Directory ]----------------------------------------
    1717
    18 Branch_Target_Buffer_Register_DIR                       =       $(DIR_MORPHEO)/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Register
     18Branch_Target_Buffer_Register_DIR               =       $(DIR_MORPHEO)/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Register
    1919
    2020#-----[ Library ]------------------------------------------
    2121
    2222Branch_Target_Buffer_Register_LIBRARY           =       -lBranch_Target_Buffer_Register \
    23                                         $(Behavioural_LIBRARY) 
     23                                                        $(Behavioural_LIBRARY) 
    2424
    25 Branch_Target_Buffer_Register_DIR_LIBRARY               =       -L$(Branch_Target_Buffer_Register_DIR)/lib      \
    26                                         $(Behavioural_DIR_LIBRARY)
     25Branch_Target_Buffer_Register_DIR_LIBRARY       =       -L$(Branch_Target_Buffer_Register_DIR)/lib      \
     26                                                        $(Behavioural_DIR_LIBRARY)
    2727
    2828#-----[ Rules ]--------------------------------------------
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Register/SelfTest/Makefile

    r81 r88  
    2424library_clean                   : Branch_Target_Buffer_Register_library_clean
    2525
     26local_clean                     :
     27
    2628include                         $(DIR_COMPONENT)/Makefile.deps
    2729include                         $(DIR_MORPHEO)/Behavioural/Makefile.flags
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Register/SelfTest/config_min.cfg

    r82 r88  
    441       1       *4      # size_buffer   
    551       1       *4      # associativity 
    6 32      32      *2      # size_address   
     630      30      *2      # size_address   
    772       2       +1      # size_counter   
    881       1       *4      # nb_inst_predict
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Register/SelfTest/config_mono_context.cfg

    r81 r88  
    4416      16      *4      # size_buffer   
    552       16      *4      # associativity 
    6 32      32      *2      # size_address   
     630      30      *2      # size_address   
    772       2       +1      # size_counter   
    881       4       *4      # nb_inst_predict
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Register/SelfTest/config_multi_context.cfg

    r81 r88  
    778       64      *4      # size_buffer   
    884       8       *2      # associativity 
    9 32      32      *2      # size_address   
     930      30      *2      # size_address   
    10102       2       +1      # size_counter   
    11111       4       *4      # nb_inst_predict
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Register/SelfTest/src/main.cpp

    r81 r88  
    6767         _nb_inst_predict,
    6868         _nb_inst_decod  ,
    69          _nb_inst_commit );
     69         _nb_inst_commit ,
     70         true // is_toplevel
     71         );
    7072     
    7173      msg(_("%s"),param->print(1).c_str());
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Register/SelfTest/src/test.cpp

    r82 r88  
    1414#include "Common/include/BitManipulation.h"
    1515#include "Behavioural/include/Allocation.h"
    16 
    17   class entry_t
    18   {
    19   public : Tcontrol_t          _val             ;
    20   public : Tcontext_t          _context         ;
    21   public : Tcontrol_t          _address_dest_val;
    22   public : Tgeneral_data_t     _address_src     ;
    23   public : Tgeneral_data_t     _address_dest    ;
    24   public : Tbranch_condition_t _condition       ;
    25   public : Tcontrol_t          _last_take       ;
    26   public : Tcounter_t          _accurate        ;
    27 
    28   public : bool hit (morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::branch_target_buffer::branch_target_buffer_register::Parameters * _param,
    29                      Tgeneral_data_t addr_test,
    30                      Tcontext_t      context)
    31     {
    32       Tgeneral_data_t addr_src_offset  = (_address_src  >> _param->_shift_offset)&_param->_mask_offset;
    33       Tgeneral_data_t addr_src_index   = (_address_src  >> _param->_shift_bank  )&_param->_mask_bank  ;
    34       Tgeneral_data_t addr_src_tag     = (_address_src  >> _param->_shift_tag   );
    35      
    36       Tgeneral_data_t addr_test_offset = (addr_test >> _param->_shift_offset)&_param->_mask_offset;
    37       Tgeneral_data_t addr_test_index  = (addr_test >> _param->_shift_bank  )&_param->_mask_bank  ;
    38       Tgeneral_data_t addr_test_tag    = (addr_test >> _param->_shift_tag   );
    39 
    40       bool is_hit = ( (_val             == 1               ) and
    41                       (_context         == context         ) and
    42                       (addr_test_tag    == addr_src_tag    ) and
    43                       (addr_test_index  == addr_src_index  ) and
    44                       (addr_test_offset <= addr_src_offset ));
    45 
    46       LABEL("address_src  (tag, index, offset) : %.8x %.8x %.8x",addr_src_tag, addr_src_index, addr_src_offset);
    47       LABEL("address_test (tag, index, offset) : %.8x %.8x %.8x - hit : %d",addr_test_tag, addr_test_index, addr_test_offset, is_hit);
    48       return is_hit;
    49     }
    50    
    51   public : void print (void)
    52     {
    53       LABEL("%d - %.2d %.8x %.1d %.8x %.3d %.1d %.4d",
    54             _val             ,
    55             _context         ,
    56             _address_src     ,
    57             _address_dest_val,
    58             _address_dest    ,
    59             _condition       ,
    60             _last_take       ,
    61             _accurate        );
    62 
    63     }
    64    
    65   };
    66 
    67 
    68 
    69 Tgeneral_data_t gen_addr (morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::branch_target_buffer::branch_target_buffer_register::Parameters * _param,
    70                           Tgeneral_data_t index)
    71 {
    72   Tgeneral_data_t addr_tag     = (rand()%(2*_param->_associativity)) << _param->_shift_tag   ;
    73   Tgeneral_data_t addr_index   = (index &_param->_mask_bank        ) << _param->_shift_bank  ;
    74   Tgeneral_data_t addr_offset  = (rand()&_param->_mask_offset      ) << _param->_shift_offset;
    75 
    76   LABEL("gen_addr     (tag, index, offset) : %.8x %.8x %.8x",addr_tag, addr_index, addr_offset);
    77 
    78   return (addr_tag    |
    79           addr_index  |
    80           addr_offset );
    81 }
    82 
     16#include "Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Register/SelfTest/include/test_BTB.h"
    8317
    8418void test (string name,
     
    9024  morpheo::behavioural::Parameters_Statistics * _parameters_statistics = new morpheo::behavioural::Parameters_Statistics (5,50);
    9125#endif
     26
     27  Tusage_t _usage = USE_ALL;
     28
     29//   _usage = usage_unset(_usage,USE_SYSTEMC              );
     30//   _usage = usage_unset(_usage,USE_VHDL                 );
     31//   _usage = usage_unset(_usage,USE_VHDL_TESTBENCH       );
     32//   _usage = usage_unset(_usage,USE_VHDL_TESTBENCH_ASSERT);
     33//   _usage = usage_unset(_usage,USE_POSITION             );
     34//   _usage = usage_unset(_usage,USE_STATISTICS           );
     35//   _usage = usage_unset(_usage,USE_INFORMATION          );
    9236
    9337  Branch_Target_Buffer_Register * _Branch_Target_Buffer_Register = new Branch_Target_Buffer_Register
     
    9741#endif
    9842     _param,
    99      USE_ALL);
     43     _usage);
    10044 
    10145#ifdef SYSTEMC
     
    269213          in_DECOD_VICTIM          [i]->write(rand()%_param->_associativity);
    270214          in_DECOD_CONTEXT_ID      [i]->write(rand()%_param->_nb_context);
    271           in_DECOD_ADDRESS_SRC     [i]->write(addr);
     215          in_DECOD_ADDRESS_SRC     [i]->write( addr);
    272216          in_DECOD_ADDRESS_DEST    [i]->write(~addr);
    273217          in_DECOD_CONDITION       [i]->write((addr&1)?BRANCH_CONDITION_FLAG_SET:BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK);
     
    284228          in_UPDATE_VICTIM          [i]->write(rand()%_param->_associativity);
    285229          in_UPDATE_CONTEXT_ID      [i]->write(rand()%_param->_nb_context);
    286           in_UPDATE_ADDRESS_SRC     [i]->write(addr);
     230          in_UPDATE_ADDRESS_SRC     [i]->write( addr);
    287231          in_UPDATE_ADDRESS_DEST    [i]->write(~addr);
    288232          in_UPDATE_CONDITION       [i]->write((addr&1)?BRANCH_CONDITION_FLAG_SET:BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK);
     
    334278
    335279            bool hit = false;
    336            
    337             for (uint32_t j=0; j<_param->_associativity; j++)
    338               hit |= ((tab_old[j]._val         == 1) and
    339                       (tab_old[j]._context     == in_DECOD_CONTEXT_ID  [i]->read()) and
    340                       (tab_old[j]._address_src == in_DECOD_ADDRESS_SRC [i]->read()));
     280
     281            Tptr_t k;
     282            for (k=0; k<_param->_associativity; k++)
     283              {
     284                hit |= ((tab_old[k]._val         == 1) and
     285                        (tab_old[k]._context     == in_DECOD_CONTEXT_ID  [i]->read()) and
     286                        (tab_old[k]._address_src == in_DECOD_ADDRESS_SRC [i]->read()));
     287
     288                if (hit)
     289                  break;
     290              }
    341291
    342292            if (not hit)
    343293              {
    344                 Tptr_t k = in_DECOD_VICTIM [i]->read();
    345 
     294                k = in_DECOD_VICTIM [i]->read();
    346295                LABEL("  * miss");
    347296                LABEL("  * victim      : %d",k);
     
    354303                tab[k]._condition        = in_DECOD_CONDITION   [i]->read();
    355304                tab[k]._last_take        = in_DECOD_LAST_TAKE   [i]->read();
    356                 //tab[k]._accurate         = _param->_first_accurate_if_hit;
     305                tab[k]._accurate         =(in_DECOD_IS_ACCURATE [i]->read())?_param->_first_accurate_if_hit:_param->_first_accurate_if_miss;
    357306              }
    358307            else
    359308              {
    360                 LABEL("  * miss");
    361               }
    362            
    363             TEST(Tcontrol_t, out_DECOD_HIT [i]->read(), hit);
     309                LABEL("  * hit");
     310              }
     311         
     312            if (_param->_have_port_victim)
     313              {
     314            TEST(Tcontrol_t, out_DECOD_HIT       [i]->read(), hit);
     315            if (hit)
     316            TEST(Tptr_t    , out_DECOD_HIT_INDEX [i]->read(), k);
     317              }
    364318          }
    365319
     
    373327            bool hit = false;
    374328           
    375             Tptr_t k = 0;
    376             for (uint32_t j=0; j<_param->_associativity; j++)
    377               {
    378                 hit |= ((tab_old[j]._val         == 1) and
    379                         (tab_old[j]._context     == in_UPDATE_CONTEXT_ID  [i]->read()) and
    380                         (tab_old[j]._address_src == in_UPDATE_ADDRESS_SRC [i]->read()));
     329            Tptr_t k;
     330            for (k=0; k<_param->_associativity; k++)
     331              {
     332                hit |= ((tab_old[k]._val         == 1) and
     333                        (tab_old[k]._context     == in_UPDATE_CONTEXT_ID  [i]->read()) and
     334                        (tab_old[k]._address_src == in_UPDATE_ADDRESS_SRC [i]->read()));
    381335                if (hit)
    382                   {
    383                     k = j;
    384                     break;
    385                   }
     336                  break;
    386337              }
    387338
     
    400351                tab[k]._condition        = in_UPDATE_CONDITION   [i]->read();
    401352                tab[k]._last_take        = in_UPDATE_LAST_TAKE   [i]->read();
    402                 //tab[k]._accurate         = (in_UPDATE_MISS_PREDICTION [i]->read())?_param->_first_accurate_if_miss:_param->_first_accurate_if_hit;
     353                tab[k]._accurate         = (in_UPDATE_MISS_PREDICTION [i]->read())?_param->_first_accurate_if_miss:_param->_first_accurate_if_hit;
    403354              }
    404355            else
     
    414365                tab[k]._condition        = in_UPDATE_CONDITION   [i]->read();
    415366                tab[k]._last_take        = in_UPDATE_LAST_TAKE   [i]->read();
    416                 //tab[k]._accurate         = (in_UPDATE_MISS_PREDICTION [i]->read())?_param->_first_accurate_if_miss:_param->_first_accurate_if_hit;
    417               }
    418 
    419             TEST(Tcontrol_t, out_UPDATE_HIT [i]->read(), hit);
     367
     368
     369                Tcounter_t accurate_old = tab[k]._accurate;
     370                // hit  : increase accurate
     371                // miss : decrease accurate
     372                Tcounter_t accurate_new = (in_UPDATE_MISS_PREDICTION [i]->read())?((accurate_old>0)?(accurate_old-1):accurate_old):((accurate_old<_param->_accurate_max)?(accurate_old+1):accurate_old);
     373               
     374                // test if accurate go to the threshold
     375                if ((accurate_old >= _param->_accurate_limit) and
     376                    (accurate_new <  _param->_accurate_limit))
     377                  accurate_new = 0;
     378               
     379
     380                tab[k]._accurate         = accurate_new;
     381              }
     382
     383            if (_param->_have_port_victim)
     384              {
     385            TEST(Tcontrol_t, out_UPDATE_HIT       [i]->read(), hit);
     386            if (hit)
     387            TEST(Tptr_t    , out_UPDATE_HIT_INDEX [i]->read(), k);
     388              }
    420389          }
    421390
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Register/include/Parameters.h

    r81 r88  
    3131  public : uint32_t   _size_buffer    ;
    3232  public : uint32_t   _associativity  ;
    33   public : uint32_t   _size_address   ;
     33//public : uint32_t   _size_address   ;
    3434  public : uint32_t   _size_counter   ;
    3535  public : uint32_t   _nb_inst_predict;
     
    3838
    3939  public : uint32_t   _size_bank      ;
    40   public : uint32_t   _size_context_id;
     40//public : uint32_t   _size_context_id;
    4141  public : uint32_t   _size_victim    ;
    4242
    43   public : bool       _have_port_context_id;
     43//public : bool       _have_port_context_id;
    4444  public : bool       _have_port_victim    ;
    4545
     
    6565                        uint32_t   nb_inst_predict,
    6666                        uint32_t   nb_inst_decod  ,
    67                         uint32_t   nb_inst_update );
     67                        uint32_t   nb_inst_update ,
     68                        bool       is_toplevel=false
     69                        );
    6870//   public : Parameters  (Parameters & param) ;
    6971  public : ~Parameters () ;
     72
     73  public :        void            copy       (void);
    7074
    7175  public :        Parameters_test msg_error  (void);
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Register/src/Branch_Target_Buffer_Register.cpp

    r82 r88  
    3939    log_printf(FUNC,Branch_Target_Buffer_Register,FUNCTION,"Begin");
    4040
     41#if DEBUG_Branch_Target_Buffer_Register == true
     42    log_printf(INFO,Branch_Target_Buffer_Register,FUNCTION,_("<%s> Parameters"),_name.c_str());
     43
     44    std::cout << *param << std::endl;
     45#endif   
     46
    4147    log_printf(INFO,Branch_Target_Buffer_Register,FUNCTION,"Allocation");
    4248
     
    4854
    4955#ifdef STATISTICS
    50     if (_usage & USE_STATISTICS)
     56    if (usage_is_set(_usage,USE_STATISTICS))
    5157      {
    5258        log_printf(INFO,Branch_Target_Buffer_Register,FUNCTION,"Allocation of statistics");
     
    5763
    5864#ifdef VHDL
    59     if (_usage & USE_VHDL)
     65    if (usage_is_set(_usage,USE_VHDL))
    6066      {
    6167        // generate the vhdl
     
    6773
    6874#ifdef SYSTEMC
    69     if (_usage & USE_SYSTEMC)
     75    if (usage_is_set(_usage,USE_SYSTEMC))
    7076      {
    7177        // Constant
     
    108114          }
    109115
    110 # ifdef SYSTEMCASS_SPECIFIC
    111         // List dependency information
    112         for (uint32_t i=0; i<_param->_nb_inst_predict; i++)
    113           for (uint32_t j=0; j<_param->_associativity; j++)
    114             {
    115               (*(out_PREDICT_HIT          [i][j])) (*(in_PREDICT_ADDRESS    [i]));
    116               if (_param->_have_port_context_id)
    117               (*(out_PREDICT_HIT          [i][j])) (*(in_PREDICT_CONTEXT_ID [i]));
    118 
    119               (*(out_PREDICT_ADDRESS_SRC  [i][j])) (*(in_PREDICT_ADDRESS    [i]));
    120               if (_param->_have_port_context_id)
    121               (*(out_PREDICT_ADDRESS_SRC  [i][j])) (*(in_PREDICT_CONTEXT_ID [i]));
    122 
    123               (*(out_PREDICT_ADDRESS_DEST [i][j])) (*(in_PREDICT_ADDRESS    [i]));
    124               if (_param->_have_port_context_id)
    125               (*(out_PREDICT_ADDRESS_DEST [i][j])) (*(in_PREDICT_CONTEXT_ID [i]));
    126 
    127               (*(out_PREDICT_CONDITION    [i][j])) (*(in_PREDICT_ADDRESS    [i]));
    128               if (_param->_have_port_context_id)
    129               (*(out_PREDICT_CONDITION    [i][j])) (*(in_PREDICT_CONTEXT_ID [i]));
    130 
    131               (*(out_PREDICT_LAST_TAKE    [i][j])) (*(in_PREDICT_ADDRESS    [i]));
    132               if (_param->_have_port_context_id)
    133               (*(out_PREDICT_LAST_TAKE    [i][j])) (*(in_PREDICT_CONTEXT_ID [i]));
    134 
    135               (*(out_PREDICT_IS_ACCURATE  [i][j])) (*(in_PREDICT_ADDRESS    [i]));
    136               if (_param->_have_port_context_id)
    137               (*(out_PREDICT_IS_ACCURATE  [i][j])) (*(in_PREDICT_CONTEXT_ID [i]));
    138           }
    139 # endif
     116// # ifdef SYSTEMCASS_SPECIFIC
     117//      // List dependency information
     118//      for (uint32_t i=0; i<_param->_nb_inst_predict; i++)
     119//        for (uint32_t j=0; j<_param->_associativity; j++)
     120//          {
     121//            (*(out_PREDICT_HIT          [i][j])) (*(in_PREDICT_ADDRESS    [i]));
     122//            if (_param->_have_port_context_id)
     123//            (*(out_PREDICT_HIT          [i][j])) (*(in_PREDICT_CONTEXT_ID [i]));
     124
     125//            (*(out_PREDICT_ADDRESS_SRC  [i][j])) (*(in_PREDICT_ADDRESS    [i]));
     126//            if (_param->_have_port_context_id)
     127//            (*(out_PREDICT_ADDRESS_SRC  [i][j])) (*(in_PREDICT_CONTEXT_ID [i]));
     128
     129//            (*(out_PREDICT_ADDRESS_DEST [i][j])) (*(in_PREDICT_ADDRESS    [i]));
     130//            if (_param->_have_port_context_id)
     131//            (*(out_PREDICT_ADDRESS_DEST [i][j])) (*(in_PREDICT_CONTEXT_ID [i]));
     132
     133//            (*(out_PREDICT_CONDITION    [i][j])) (*(in_PREDICT_ADDRESS    [i]));
     134//            if (_param->_have_port_context_id)
     135//            (*(out_PREDICT_CONDITION    [i][j])) (*(in_PREDICT_CONTEXT_ID [i]));
     136
     137//            (*(out_PREDICT_LAST_TAKE    [i][j])) (*(in_PREDICT_ADDRESS    [i]));
     138//            if (_param->_have_port_context_id)
     139//            (*(out_PREDICT_LAST_TAKE    [i][j])) (*(in_PREDICT_CONTEXT_ID [i]));
     140
     141//            (*(out_PREDICT_IS_ACCURATE  [i][j])) (*(in_PREDICT_ADDRESS    [i]));
     142//            if (_param->_have_port_context_id)
     143//            (*(out_PREDICT_IS_ACCURATE  [i][j])) (*(in_PREDICT_CONTEXT_ID [i]));
     144//        }
     145// # endif
    140146
    141147        if (_param->_have_port_victim)
     
    215221
    216222#ifdef STATISTICS
    217     if (_usage & USE_STATISTICS)
     223    if (usage_is_set(_usage,USE_STATISTICS))
    218224      {
    219225        statistics_deallocation();
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Register/src/Branch_Target_Buffer_Register_allocation.cpp

    r82 r88  
    6464      ALLOC1_VALACK_OUT(out_PREDICT_ACK         ,ACK);
    6565      ALLOC1_SIGNAL_IN ( in_PREDICT_CONTEXT_ID  ,"context_id"  ,Tcontext_t         ,_param->_size_context_id);
    66       ALLOC1_SIGNAL_IN ( in_PREDICT_ADDRESS     ,"address"     ,Tgeneral_data_t    ,_param->_size_address);
     66      ALLOC1_SIGNAL_IN ( in_PREDICT_ADDRESS     ,"address"     ,Tgeneral_data_t    ,_param->_size_instruction_address);
    6767
    6868      {
     
    7070 
    7171        ALLOC2_SIGNAL_OUT(out_PREDICT_HIT         ,"hit"         ,Tcontrol_t         ,1);
    72         ALLOC2_SIGNAL_OUT(out_PREDICT_ADDRESS_SRC ,"address_src" ,Tgeneral_data_t    ,_param->_size_address);
    73         ALLOC2_SIGNAL_OUT(out_PREDICT_ADDRESS_DEST,"address_dest",Tgeneral_data_t    ,_param->_size_address);
     72        ALLOC2_SIGNAL_OUT(out_PREDICT_ADDRESS_SRC ,"address_src" ,Tgeneral_data_t    ,_param->_size_instruction_address);
     73        ALLOC2_SIGNAL_OUT(out_PREDICT_ADDRESS_DEST,"address_dest",Tgeneral_data_t    ,_param->_size_instruction_address);
    7474        ALLOC2_SIGNAL_OUT(out_PREDICT_CONDITION   ,"condition"   ,Tbranch_condition_t,_param->_size_branch_state);
    7575        ALLOC2_SIGNAL_OUT(out_PREDICT_LAST_TAKE   ,"last_take"   ,Tcontrol_t         ,1);
     
    9191        }
    9292      ALLOC1_SIGNAL_IN ( in_DECOD_CONTEXT_ID     ,"context_id"     ,Tcontext_t         ,_param->_size_context_id);
    93       ALLOC1_SIGNAL_IN ( in_DECOD_ADDRESS_SRC    ,"address_src"    ,Tgeneral_data_t    ,_param->_size_address);
    94       ALLOC1_SIGNAL_IN ( in_DECOD_ADDRESS_DEST   ,"address_dest"   ,Tgeneral_data_t    ,_param->_size_address);
     93      ALLOC1_SIGNAL_IN ( in_DECOD_ADDRESS_SRC    ,"address_src"    ,Tgeneral_data_t    ,_param->_size_instruction_address);
     94      ALLOC1_SIGNAL_IN ( in_DECOD_ADDRESS_DEST   ,"address_dest"   ,Tgeneral_data_t    ,_param->_size_instruction_address);
    9595      ALLOC1_SIGNAL_IN ( in_DECOD_CONDITION      ,"condition"      ,Tbranch_condition_t,_param->_size_branch_state);
    9696      ALLOC1_SIGNAL_IN ( in_DECOD_LAST_TAKE      ,"last_take"      ,Tcontrol_t         ,1);
     
    112112        }
    113113      ALLOC1_SIGNAL_IN ( in_UPDATE_CONTEXT_ID     ,"context_id"     ,Tcontext_t         ,_param->_size_context_id);
    114       ALLOC1_SIGNAL_IN ( in_UPDATE_ADDRESS_SRC    ,"address_src"    ,Tgeneral_data_t    ,_param->_size_address);
    115       ALLOC1_SIGNAL_IN ( in_UPDATE_ADDRESS_DEST   ,"address_dest"   ,Tgeneral_data_t    ,_param->_size_address);
     114      ALLOC1_SIGNAL_IN ( in_UPDATE_ADDRESS_SRC    ,"address_src"    ,Tgeneral_data_t    ,_param->_size_instruction_address);
     115      ALLOC1_SIGNAL_IN ( in_UPDATE_ADDRESS_DEST   ,"address_dest"   ,Tgeneral_data_t    ,_param->_size_instruction_address);
    116116      ALLOC1_SIGNAL_IN ( in_UPDATE_CONDITION      ,"condition"      ,Tbranch_condition_t,_param->_size_branch_state);
    117117      ALLOC1_SIGNAL_IN ( in_UPDATE_LAST_TAKE      ,"last_take"      ,Tcontrol_t         ,1);
     
    119119    }
    120120
     121    if (usage_is_set(_usage,USE_SYSTEMC))
     122      {
    121123    // ~~~~~[ Internal ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
    122124    reg_BTB = new btb_entry_t * [_param->_size_bank];
     
    133135    internal_UPDATE_NUM_BANK  = new uint32_t   [_param->_nb_inst_update];
    134136    internal_UPDATE_NUM_ENTRY = new uint32_t   [_param->_nb_inst_update];
     137      }
    135138
    136139    // ~~~~~[ Component ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
    137140
    138141#ifdef POSITION
    139     _component->generate_file();
     142    if (usage_is_set(_usage,USE_POSITION))
     143      _component->generate_file();
    140144#endif
    141145
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Register/src/Branch_Target_Buffer_Register_deallocation.cpp

    r82 r88  
    2424    log_printf(FUNC,Branch_Target_Buffer_Register,FUNCTION,"Begin");
    2525
    26     if (_usage & USE_SYSTEMC)
     26    if (usage_is_set(_usage,USE_SYSTEMC))
    2727      {
    2828        delete    in_CLOCK ;
     
    4242        delete []  in_DECOD_VAL             ;
    4343        delete [] out_DECOD_ACK             ;
     44        if (_param->_have_port_victim)
     45          {
    4446        delete [] out_DECOD_HIT             ;
    45         if (_param->_have_port_victim)
    4647        delete [] out_DECOD_HIT_INDEX       ;
    47         if (_param->_have_port_victim)
    4848        delete []  in_DECOD_VICTIM          ;
     49          }
    4950        if (_param->_have_port_context_id)
    5051        delete []  in_DECOD_CONTEXT_ID      ;
     
    5758        delete []  in_UPDATE_VAL            ;
    5859        delete [] out_UPDATE_ACK            ;
     60        if (_param->_have_port_victim)
     61          {
    5962        delete [] out_UPDATE_HIT            ;
    60         if (_param->_have_port_victim)
    6163        delete [] out_UPDATE_HIT_INDEX      ;
    62         if (_param->_have_port_victim)
    6364        delete []  in_UPDATE_VICTIM         ;
     65          }
    6466        if (_param->_have_port_context_id)
    6567        delete []  in_UPDATE_CONTEXT_ID     ;
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Register/src/Branch_Target_Buffer_Register_end_cycle.cpp

    r81 r88  
    2626
    2727#ifdef STATISTICS
    28     _stat->end_cycle();
     28    if (usage_is_set(_usage,USE_STATISTICS))
     29      _stat->end_cycle();
    2930#endif   
    3031
     
    3233    // Evaluation before read the ouput signal
    3334//  sc_start(0);
    34     _interfaces->testbench();
     35    if (usage_is_set(_usage,USE_VHDL_TESTBENCH))
     36      _interfaces->testbench();
    3537#endif
    3638
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Register/src/Branch_Target_Buffer_Register_genMealy_decod.cpp

    r82 r88  
    2222  void Branch_Target_Buffer_Register::genMealy_decod (void)
    2323  {
    24     log_printf(FUNC,Branch_Target_Buffer_Register,FUNCTION,"Begin");
     24    log_begin(Branch_Target_Buffer_Register,FUNCTION);
     25    log_function(Branch_Target_Buffer_Register,FUNCTION,_name.c_str());
    2526
    2627    for (uint32_t i=0; i<_param->_nb_inst_decod; i++)
     
    5556      }
    5657
    57     log_printf(FUNC,Branch_Target_Buffer_Register,FUNCTION,"End");
     58    log_end(Branch_Target_Buffer_Register,FUNCTION);
    5859  };
    5960
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Register/src/Branch_Target_Buffer_Register_genMealy_predict.cpp

    r81 r88  
    2222  void Branch_Target_Buffer_Register::genMealy_predict (void)
    2323  {
    24     log_printf(FUNC,Branch_Target_Buffer_Register,FUNCTION,"Begin");
    25 
     24    log_begin(Branch_Target_Buffer_Register,FUNCTION);
     25    log_function(Branch_Target_Buffer_Register,FUNCTION,_name.c_str());
     26   
    2627    for (uint32_t i=0; i<_param->_nb_inst_predict; i++)
    2728      {
     29        log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"  * PREDICT [%d]",i);
    2830        Tcontext_t      context   = (_param->_have_port_context_id)?PORT_READ(in_PREDICT_CONTEXT_ID  [i]):0;
    2931        Tgeneral_data_t address   = PORT_READ(in_PREDICT_ADDRESS [i]);
     
    3335        Tgeneral_data_t address_offset = (address >> _param->_shift_offset)&_param->_mask_offset;
    3436
    35 //      log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"address_    (tag, bank, offset) : %.8x %.8x %.8x",address_tag,num_bank, address_offset);
     37        log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"    * address_    (tag, bank, offset) : %.8x %.8x %.8x",address_tag,num_bank, address_offset);
    3638
    3739        for (uint32_t j=0; j<_param->_associativity; j++)
     
    4648                              (address_src_offset                >= address_offset));
    4749
    48 //          log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"address_src (tag, bank, offset) : %.8x %.8x %.8x - hit : %d",address_src_tag,num_bank,address_src_offset, hit);
     50            log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"    * address_src (tag, bank, offset) : %.8x %.8x %.8x - hit : %d",address_src_tag,num_bank,address_src_offset, hit);
    4951
    5052            // Hit :
     
    6264      }
    6365
    64     log_printf(FUNC,Branch_Target_Buffer_Register,FUNCTION,"End");
     66    log_end(Branch_Target_Buffer_Register,FUNCTION);
    6567  };
    6668
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Register/src/Branch_Target_Buffer_Register_genMealy_update.cpp

    r82 r88  
    2222  void Branch_Target_Buffer_Register::genMealy_update (void)
    2323  {
    24     log_printf(FUNC,Branch_Target_Buffer_Register,FUNCTION,"Begin");
     24    log_begin(Branch_Target_Buffer_Register,FUNCTION);
     25    log_function(Branch_Target_Buffer_Register,FUNCTION,_name.c_str());
    2526
    2627    for (uint32_t i=0; i<_param->_nb_inst_update; i++)
     
    5556      }
    5657
    57     log_printf(FUNC,Branch_Target_Buffer_Register,FUNCTION,"End");
     58    log_end(Branch_Target_Buffer_Register,FUNCTION);
    5859  };
    5960
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Register/src/Branch_Target_Buffer_Register_transition.cpp

    r82 r88  
    2222  void Branch_Target_Buffer_Register::transition (void)
    2323  {
    24     log_printf(FUNC,Branch_Target_Buffer_Register,FUNCTION,"Begin");
     24    log_begin(Branch_Target_Buffer_Register,FUNCTION);
     25    log_function(Branch_Target_Buffer_Register,FUNCTION,_name.c_str());
    2526
    2627    if (PORT_READ(in_NRESET) == 0)
     
    8384          if (PORT_READ(in_UPDATE_VAL [i]) and internal_UPDATE_ACK [i])
    8485            {
     86              log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"  * UPDATE [%d]",i);
     87 
    8588              bool     hit       = internal_UPDATE_HIT      [i];
    8689              uint32_t num_bank  = internal_UPDATE_NUM_BANK [i];
     
    8992
    9093              // detect new branch !!! insert in branch target buffer
     94              log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"    * hit       : %d",hit);
     95              log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"    * num_bank  : %d",num_bank );
     96              log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"    * num_entry : %d",num_entry);
     97
    9198              Tcounter_t accurate_new = 0;
    9299
     
    123130                  accurate_new =  (miss_pred)?_param->_first_accurate_if_miss:_param->_first_accurate_if_hit;
    124131
    125                   reg_BTB[num_bank][num_entry]._val              = 1;
    126                   reg_BTB[num_bank][num_entry]._context          = (_param->_have_port_context_id)?PORT_READ(in_UPDATE_CONTEXT_ID [i]):0;
    127                   reg_BTB[num_bank][num_entry]._address_src      = PORT_READ(in_UPDATE_ADDRESS_SRC  [i]);
    128                   reg_BTB[num_bank][num_entry]._condition        = PORT_READ(in_UPDATE_CONDITION    [i]);
    129                   reg_BTB[num_bank][num_entry]._last_take        = PORT_READ(in_UPDATE_LAST_TAKE    [i]);
    130                 }
     132//                reg_BTB[num_bank][num_entry]._val              = 1;
     133//                reg_BTB[num_bank][num_entry]._context          = (_param->_have_port_context_id)?PORT_READ(in_UPDATE_CONTEXT_ID [i]):0;
     134//                reg_BTB[num_bank][num_entry]._address_src      = PORT_READ(in_UPDATE_ADDRESS_SRC  [i]);
     135//                reg_BTB[num_bank][num_entry]._condition        = PORT_READ(in_UPDATE_CONDITION    [i]);
     136//                reg_BTB[num_bank][num_entry]._last_take        = PORT_READ(in_UPDATE_LAST_TAKE    [i]);
     137                  reg_BTB[num_bank][num_entry]._address_dest_val = 0;
     138                }
    131139
    132140              // =====[ All Case ]
    133               if (reg_BTB[num_bank][num_entry]._address_dest_val == 0)
    134                 {
    135                   reg_BTB[num_bank][num_entry]._address_dest_val = 1;
    136                   reg_BTB[num_bank][num_entry]._address_dest     = PORT_READ(in_UPDATE_ADDRESS_DEST [i]);
    137                 }
     141//            if (reg_BTB[num_bank][num_entry]._address_dest_val == 0)
     142//              {
     143//                reg_BTB[num_bank][num_entry]._address_dest_val = 1;
     144//                reg_BTB[num_bank][num_entry]._address_dest     = PORT_READ(in_UPDATE_ADDRESS_DEST [i]);
     145//              }
     146              reg_BTB[num_bank][num_entry]._val              = 1;
     147              reg_BTB[num_bank][num_entry]._context          = (_param->_have_port_context_id)?PORT_READ(in_UPDATE_CONTEXT_ID [i]):0;
     148              reg_BTB[num_bank][num_entry]._address_src      = PORT_READ(in_UPDATE_ADDRESS_SRC  [i]);
     149              reg_BTB[num_bank][num_entry]._condition        = PORT_READ(in_UPDATE_CONDITION    [i]);
     150              reg_BTB[num_bank][num_entry]._last_take        = PORT_READ(in_UPDATE_LAST_TAKE    [i]);
     151              reg_BTB[num_bank][num_entry]._address_dest_val = 1;
     152              reg_BTB[num_bank][num_entry]._address_dest     = PORT_READ(in_UPDATE_ADDRESS_DEST [i]);
    138153              reg_BTB[num_bank][num_entry]._accurate         = accurate_new;
    139154            }
    140155
     156#if (DEBUG >= DEBUG_TRACE) and DEBUG_Branch_Target_Buffer_Register
     157        log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"  * Dump BTB");
    141158        for (uint32_t i=0; i<_param->_size_bank; i++)
    142159          for (uint32_t j=0; j<_param->_associativity; j++)
    143             log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"[%.4d][%.4d] %d - %.2d %.8x %.1d %.8x %.3d %.1d %.4d",
     160            log_printf(TRACE,Branch_Target_Buffer_Register,FUNCTION,"    [%.4d][%.4d] %d - %.4d %.8x (%.8x) %.1d %.8x (%.8x) %.3d %.1d %.4d",
    144161                       i,j,
    145162                       reg_BTB [i][j]._val             ,
    146163                       reg_BTB [i][j]._context         ,
    147164                       reg_BTB [i][j]._address_src     ,
     165                       reg_BTB [i][j]._address_src <<2,
    148166                       reg_BTB [i][j]._address_dest_val,
    149167                       reg_BTB [i][j]._address_dest    ,
     168                       reg_BTB [i][j]._address_dest<<2 ,
    150169                       reg_BTB [i][j]._condition       ,
    151170                       reg_BTB [i][j]._last_take       ,
    152171                       reg_BTB [i][j]._accurate        );
     172#endif
    153173      }
    154    
     174
    155175#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
    156176    end_cycle ();
    157177#endif
    158178
    159     log_printf(FUNC,Branch_Target_Buffer_Register,FUNCTION,"End");
     179    log_end(Branch_Target_Buffer_Register,FUNCTION);
    160180  };
    161181
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Register/src/Parameters.cpp

    r81 r88  
    3030                          uint32_t   nb_inst_predict,
    3131                          uint32_t   nb_inst_decod  ,
    32                           uint32_t   nb_inst_update )
     32                          uint32_t   nb_inst_update ,
     33                          bool       is_toplevel)
    3334  {
    3435    log_printf(FUNC,Branch_Target_Buffer_Register,FUNCTION,"Begin");
     
    3839    _size_buffer     = size_buffer    ;
    3940    _associativity   = associativity  ;
    40     _size_address    = size_address   ;
    4141    _size_counter    = size_counter   ;
    4242    _nb_inst_predict = nb_inst_predict;
     
    4545
    4646    _size_bank       = size_buffer/associativity;
    47     _size_context_id = log2(nb_context);
    4847    _size_victim     = log2(associativity);
    4948
    50     _have_port_context_id   = (_size_context_id > 0);
    5149    _have_port_victim       = (_size_victim     > 0);
    5250
     
    8179    test();
    8280
     81    if (is_toplevel)
     82      {
     83        _size_instruction_address = size_address   ;
     84        _size_context_id          = log2(nb_context);
     85        _have_port_context_id     = (_size_context_id > 0);
     86
     87        copy ();
     88      }
     89
    8390    log_printf(FUNC,Branch_Target_Buffer_Register,FUNCTION,"End");
    8491  };
     
    101108  };
    102109
     110#undef  FUNCTION
     111#define FUNCTION "Branch_Target_Buffer_Register::copy"
     112  void Parameters::copy ()
     113  {
     114    log_printf(FUNC,Branch_Target_Buffer_Register,FUNCTION,"Begin");
     115    log_printf(FUNC,Branch_Target_Buffer_Register,FUNCTION,"End");
     116  };
     117
    103118}; // end namespace branch_target_buffer_register
    104119}; // end namespace branch_target_buffer
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Register/src/Parameters_msg_error.cpp

    r81 r88  
    2929
    3030    if (_size_counter < 2 )
    31       test.error("size_counter must be >= 2.");
     31      test.error(_("size_counter must be >= 2.\n"));
    3232
    3333    if ((_associativity == 0) or
    3434        (_associativity > _size_buffer))
    35       test.error("associativity must be > 0 and <= size_buffer.");
     35      test.error(_("associativity must be > 0 and <= size_buffer.\n"));
    3636
    3737    if (_associativity == 1) // special case : full assoc and direct map ... also we print direct map
    38       test.information("Branch Target Buffer is Direct Map");
     38      test.information(_("Branch Target Buffer is Direct Map.\n"));
    3939    else
    4040      if (_associativity == _size_buffer)
    41         test.information("Branch Target Buffer is Full associative");
     41        test.information(_("Branch Target Buffer is Full associative.\n"));
    4242      else
    43         test.information("Branch Target Buffer is Semi associative");
     43        test.information(_("Branch Target Buffer is Semi associative.\n"));
    4444
    4545    for (uint32_t i=0; i<_nb_context; i++)
    4646      if (_associativity < (_nb_instruction[i]/2))
    47         test.error("associativity must be >= nb_instruction["+toString(i)+"]/2.");
     47        test.error(toString(_("associativity must be >= nb_instruction[%d]/2.\n"),i));
    4848
    4949    log_printf(FUNC,Branch_Target_Buffer_Register,FUNCTION,"End");
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Register/src/Parameters_print.cpp

    r81 r88  
    3131    xml.singleton_begin("size_buffer    "); xml.attribut("value",toString(_size_buffer    )); xml.singleton_end();
    3232    xml.singleton_begin("associativity  "); xml.attribut("value",toString(_associativity  )); xml.singleton_end();
    33     xml.singleton_begin("size_address   "); xml.attribut("value",toString(_size_address   )); xml.singleton_end();
     33//  xml.singleton_begin("size_address   "); xml.attribut("value",toString(_size_address   )); xml.singleton_end();
    3434    xml.singleton_begin("size_counter   "); xml.attribut("value",toString(_size_counter   )); xml.singleton_end();
    3535    xml.singleton_begin("nb_inst_predict"); xml.attribut("value",toString(_nb_inst_predict)); xml.singleton_end();
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/SelfTest/Makefile

    r81 r88  
    2424library_clean                   : Branch_Target_Buffer_library_clean
    2525
     26local_clean                     :
     27
    2628include                         $(DIR_COMPONENT)/Makefile.deps
    2729include                         $(DIR_MORPHEO)/Behavioural/Makefile.flags
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/SelfTest/config_min.cfg

    r82 r88  
    441       1       *4      # size_buffer   
    551       1       *4      # associativity 
    6 32      32      *2      # size_address   
     630      30      *2      # size_address   
    772       2       +1      # size_counter   
    881       1       *4      # nb_inst_predict
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/SelfTest/config_mono_context.cfg

    r81 r88  
    4416      16      *4      # size_buffer   
    552       16      *4      # associativity 
    6 32      32      *2      # size_address   
     630      30      *2      # size_address   
    772       2       +1      # size_counter   
    881       4       *4      # nb_inst_predict
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/SelfTest/config_multi_context.cfg

    r81 r88  
    778       64      *4      # size_buffer   
    884       8       *2      # associativity 
    9 32      32      *2      # size_address   
     930      30      *2      # size_address   
    10102       2       +1      # size_counter   
    11111       4       *4      # nb_inst_predict
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/SelfTest/src/main.cpp

    r81 r88  
    7070         _nb_inst_decod  ,
    7171         _nb_inst_commit ,
    72          _victim_scheme  );
     72         _victim_scheme  ,
     73         true // is_toplevel
     74         );
    7375     
    7476      msg(_("%s"),param->print(1).c_str());
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/SelfTest/src/test.cpp

    r82 r88  
    77 */
    88
    9 #define NB_ITERATION  1024
    10 #define CYCLE_MAX     (128*NB_ITERATION)
     9#define NB_ITERATION  1
     10#define CYCLE_MAX     (10000*NB_ITERATION)
    1111
    1212#include "Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/SelfTest/include/test.h"
    1313#include "Common/include/Test.h"
    1414#include "Behavioural/include/Allocation.h"
     15#include "Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/Branch_Target_Buffer_Register/SelfTest/include/test_BTB.h"
    1516
    1617void test (string name,
     
    2021
    2122#ifdef STATISTICS
    22   morpheo::behavioural::Parameters_Statistics * _parameters_statistics = new morpheo::behavioural::Parameters_Statistics (5,50);
     23  morpheo::behavioural::Parameters_Statistics * _parameters_statistics = new morpheo::behavioural::Parameters_Statistics (5,CYCLE_MAX);
    2324#endif
     25
     26  Tusage_t _usage = USE_ALL;
     27
     28//   _usage = usage_unset(_usage,USE_SYSTEMC              );
     29//   _usage = usage_unset(_usage,USE_VHDL                 );
     30//   _usage = usage_unset(_usage,USE_VHDL_TESTBENCH       );
     31//   _usage = usage_unset(_usage,USE_VHDL_TESTBENCH_ASSERT);
     32//   _usage = usage_unset(_usage,USE_POSITION             );
     33//   _usage = usage_unset(_usage,USE_STATISTICS           );
     34//   _usage = usage_unset(_usage,USE_INFORMATION          );
    2435
    2536  Branch_Target_Buffer * _Branch_Target_Buffer = new Branch_Target_Buffer
     
    2940#endif
    3041     _param,
    31      USE_ALL);
    32  
     42     _usage);
     43
    3344#ifdef SYSTEMC
    3445  /*********************************************************************
     
    110121  msg(_("<%s> : Start Simulation ............\n"),name.c_str());
    111122   
     123  // Initialisation
     124  const uint32_t seed = 0;
     125//const uint32_t seed = static_cast<uint32_t>(time(NULL));
     126
     127  srand(seed);
     128
     129  const  int32_t percent_transaction_decod   = 75;
     130  const  int32_t percent_transaction_predict = 75;
     131
     132  SC_START(0);
     133
    112134  Time * _time = new Time();
    113135
     
    116138   ********************************************************/
    117139
    118   // Initialisation
    119 
    120   const uint32_t seed = 0;
    121 //const uint32_t seed = static_cast<uint32_t>(time(NULL));
    122 
    123   srand(seed);
    124 
    125   SC_START(0);
    126   LABEL("Initialisation");
    127 
    128   LABEL("Reset");
    129   in_NRESET->write(0);
    130   SC_START(5);
    131   in_NRESET->write(1); 
    132 
    133   LABEL("Loop of Test");
    134 
    135   for (uint32_t iteration=0; iteration<NB_ITERATION; iteration ++)
    136     {
    137       LABEL("Iteration %d",iteration);
    138 
    139       SC_START(1);
    140     }
     140  {
     141    LABEL("Reset");
     142    in_NRESET->write(0);
     143    SC_START(5);
     144    in_NRESET->write(1); 
     145   
     146    LABEL("Loop of Test");
     147   
     148    Taddress_t btb_address [_param->_associativity];
     149    Tcontext_t btb_context [_param->_associativity];
     150
     151    for (uint32_t iteration=0; iteration<NB_ITERATION; iteration ++)
     152      {
     153        LABEL("Iteration %d",iteration);
     154
     155        // FIRST STEP - Test (without sort, with concurent access, same context)
     156
     157        // fill a btb line
     158#define NB_REQUEST (8*_param->_associativity)
     159        uint32_t   nb_request;
     160        uint32_t   index      = rand()&_param->_param_branch_target_buffer_register->_mask_bank;
     161        Tcontext_t context    = rand()&_param->_nb_context;
     162
     163        for (uint32_t j=0; j<_param->_associativity; j++)
     164//        btb_val     [j] = false;
     165          btb_address [j] = static_cast<Taddress_t>(-1);
     166
     167        {
     168          uint32_t associativity = 0;
     169         
     170          while (associativity < _param->_associativity)
     171            {
     172              for (uint32_t j=0; j<_param->_nb_inst_decod; j++)
     173                {
     174                  Taddress_t address = ((associativity << _param->_param_branch_target_buffer_register->_shift_tag) |
     175                                        (index         << _param->_param_branch_target_buffer_register->_shift_bank)|
     176                                        (0));
     177                 
     178                  in_DECOD_VAL             [j]->write(((rand()%100)<percent_transaction_decod) and ((associativity+j) < _param->_associativity));
     179                  in_DECOD_CONTEXT_ID      [j]->write(context);
     180                  in_DECOD_ADDRESS_SRC     [j]->write( address );
     181                  in_DECOD_ADDRESS_DEST    [j]->write(~address );
     182                  in_DECOD_CONDITION       [j]->write(BRANCH_CONDITION_FLAG_SET);
     183                  in_DECOD_LAST_TAKE       [j]->write(address&1);
     184                  in_DECOD_MISS_PREDICTION [j]->write(1);
     185                  in_DECOD_IS_ACCURATE     [j]->write(1);
     186                }
     187             
     188              SC_START(0);
     189             
     190              for (uint32_t j=0; j<_param->_nb_inst_decod; j++)
     191                if (in_DECOD_VAL [j]->read() and out_DECOD_ACK [j]->read())
     192                  {
     193                    LABEL("DECOD     [%d] Transaction Accepted",j);
     194                   
     195                    Taddress_t address = in_DECOD_ADDRESS_SRC [j]->read();
     196                   
     197                    btb_address[associativity] = address;
     198                    btb_context[associativity] = context;
     199                    associativity ++;
     200                  }
     201             
     202              SC_START(1);
     203            }
     204        }
     205       
     206        nb_request = 0;
     207
     208        while (nb_request < NB_REQUEST)
     209          {
     210            for (uint32_t i=0; i<_param->_nb_inst_predict; i++)
     211              {
     212                in_PREDICT_VAL        [i]->write(((rand()%100)<percent_transaction_predict));
     213                in_PREDICT_CONTEXT_ID [i]->write(rand()&_param->_nb_context);
     214                in_PREDICT_ADDRESS    [i]->write(gen_addr(_param->_param_branch_target_buffer_register,index));
     215              }
     216
     217            SC_START(0);
     218
     219            for (uint32_t i=0; i<_param->_nb_inst_predict; i++)
     220              if (in_PREDICT_VAL [i]->read() and out_PREDICT_ACK [i]->read())
     221                {
     222                  LABEL("PREDICT   [%d] Transaction Accepted",i);
     223                 
     224                  Tcontrol_t hit          = out_PREDICT_HIT          [i]->read();
     225                  Taddress_t address      =  in_PREDICT_ADDRESS      [i]->read();
     226                  Taddress_t address_src  = out_PREDICT_ADDRESS_SRC  [i]->read();
     227                  Taddress_t address_dest = out_PREDICT_ADDRESS_DEST [i]->read();
     228
     229                  Taddress_t tag          = address >> _param->_param_branch_target_buffer_register->_shift_tag;
     230                 
     231                  Tcontrol_t my_hit = false;
     232                  Tcontrol_t my_addr;
     233
     234                  for (uint32_t i=0; i<_param->_associativity; i++)
     235                    {
     236                      Taddress_t btb_address [_param->_associativity];
     237                      Tcontext_t btb_context [_param->_associativity];
     238                    }
     239                 
     240                  if (hit)
     241                    {
     242                      TEST(Tbranch_condition_t,out_PREDICT_CONDITION   [i]->read(),BRANCH_CONDITION_FLAG_SET);
     243                      TEST(Tcontrol_t         ,out_PREDICT_LAST_TAKE   [i]->read(),address_src&1);
     244//                    TEST(Tcontrol_t         ,out_PREDICT_IS_ACCURATE [i]->read(), );
     245                    }
     246
     247                  nb_request ++;
     248                }
     249           
     250            SC_START(1);
     251          }
     252      }
     253  }
    141254
    142255  /********************************************************
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/include/Parameters.h

    r81 r88  
    3333  public : uint32_t   _size_buffer    ;
    3434  public : uint32_t   _associativity  ;
    35   public : uint32_t   _size_address   ;
     35//public : uint32_t   _size_address   ;
    3636  public : uint32_t   _size_counter   ;
    3737  public : uint32_t   _nb_inst_predict;
     
    4141
    4242  public : uint32_t   _size_bank      ;
    43   public : uint32_t   _size_context_id;
     43//public : uint32_t   _size_context_id;
    4444  public : uint32_t   _size_victim    ;
    4545
    46   public : bool       _have_port_context_id;
     46//public : bool       _have_port_context_id;
    4747  public : bool       _have_component_victim;
    4848  public : bool       _is_full_associative;
     
    6363                        uint32_t   nb_inst_decod  ,
    6464                        uint32_t   nb_inst_update ,
    65                         Tvictim_t  victim_scheme  );
     65                        Tvictim_t  victim_scheme  ,
     66                        bool       is_toplevel=false
     67                        );
    6668//   public : Parameters  (Parameters & param) ;
    6769  public : ~Parameters () ;
     70
     71  public :        void            copy       (void);
    6872
    6973  public :        Parameters_test msg_error  (void);
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/src/Branch_Target_Buffer.cpp

    r81 r88  
    4040    log_printf(INFO,Branch_Target_Buffer,FUNCTION,"Allocation");
    4141
     42#if DEBUG_Branch_Target_Buffer == true
     43    log_printf(INFO,Branch_Target_Buffer,FUNCTION,_("<%s> Parameters"),_name.c_str());
     44
     45    std::cout << *param << std::endl;
     46#endif   
     47
    4248    allocation (
    4349#ifdef STATISTICS
     
    4753
    4854#ifdef STATISTICS
    49     if (_usage & USE_STATISTICS)
     55    if (usage_is_set(_usage,USE_STATISTICS))
    5056      {
    5157        log_printf(INFO,Branch_Target_Buffer,FUNCTION,"Allocation of statistics");
     
    5662
    5763#ifdef VHDL
    58     if (_usage & USE_VHDL)
     64    if (usage_is_set(_usage,USE_VHDL))
    5965      {
    6066        // generate the vhdl
     
    6672
    6773#ifdef SYSTEMC
    68     if (_usage & USE_SYSTEMC)
     74    if (usage_is_set(_usage,USE_SYSTEMC))
    6975      {
    70         log_printf(INFO,Branch_Target_Buffer,FUNCTION,"Method - transition");
     76        log_printf(INFO,Branch_Target_Buffer,FUNCTION,_("Method - transition"));
    7177
    7278        SC_METHOD (transition);
     
    9096
    9197#ifdef STATISTICS
    92     if (_usage & USE_STATISTICS)
     98    if (usage_is_set(_usage,USE_STATISTICS))
    9399      {
    94100        statistics_deallocation();
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/src/Branch_Target_Buffer_allocation.cpp

    r82 r88  
    6464      ALLOC1_VALACK_OUT(out_PREDICT_ACK         ,ACK);
    6565      ALLOC1_SIGNAL_IN ( in_PREDICT_CONTEXT_ID  ,"context_id"  ,Tcontext_t         ,_param->_size_context_id);
    66       ALLOC1_SIGNAL_IN ( in_PREDICT_ADDRESS     ,"address"     ,Tgeneral_data_t    ,_param->_size_address);
     66      ALLOC1_SIGNAL_IN ( in_PREDICT_ADDRESS     ,"address"     ,Tgeneral_data_t    ,_param->_size_instruction_address);
    6767      ALLOC1_SIGNAL_OUT(out_PREDICT_HIT         ,"hit"         ,Tcontrol_t         ,1);
    68       ALLOC1_SIGNAL_OUT(out_PREDICT_ADDRESS_SRC ,"address_src" ,Tgeneral_data_t    ,_param->_size_address);
    69       ALLOC1_SIGNAL_OUT(out_PREDICT_ADDRESS_DEST,"address_dest",Tgeneral_data_t    ,_param->_size_address);
     68      ALLOC1_SIGNAL_OUT(out_PREDICT_ADDRESS_SRC ,"address_src" ,Tgeneral_data_t    ,_param->_size_instruction_address);
     69      ALLOC1_SIGNAL_OUT(out_PREDICT_ADDRESS_DEST,"address_dest",Tgeneral_data_t    ,_param->_size_instruction_address);
    7070      ALLOC1_SIGNAL_OUT(out_PREDICT_CONDITION   ,"condition"   ,Tbranch_condition_t,_param->_size_branch_condition);
    7171      ALLOC1_SIGNAL_OUT(out_PREDICT_LAST_TAKE   ,"last_take"   ,Tcontrol_t         ,1);
     
    8080      ALLOC1_VALACK_OUT(out_DECOD_ACK            ,ACK);
    8181      ALLOC1_SIGNAL_IN ( in_DECOD_CONTEXT_ID     ,"context_id"     ,Tcontext_t         ,_param->_size_context_id);
    82       ALLOC1_SIGNAL_IN ( in_DECOD_ADDRESS_SRC    ,"address_src"    ,Tgeneral_data_t    ,_param->_size_address);
    83       ALLOC1_SIGNAL_IN ( in_DECOD_ADDRESS_DEST   ,"address_dest"   ,Tgeneral_data_t    ,_param->_size_address);
     82      ALLOC1_SIGNAL_IN ( in_DECOD_ADDRESS_SRC    ,"address_src"    ,Tgeneral_data_t    ,_param->_size_instruction_address);
     83      ALLOC1_SIGNAL_IN ( in_DECOD_ADDRESS_DEST   ,"address_dest"   ,Tgeneral_data_t    ,_param->_size_instruction_address);
    8484      ALLOC1_SIGNAL_IN ( in_DECOD_CONDITION      ,"condition"      ,Tbranch_condition_t,_param->_size_branch_condition);
    8585      ALLOC1_SIGNAL_IN ( in_DECOD_LAST_TAKE      ,"last_take"      ,Tcontrol_t         ,1);
     
    9595      ALLOC1_VALACK_OUT(out_UPDATE_ACK            ,ACK);
    9696      ALLOC1_SIGNAL_IN ( in_UPDATE_CONTEXT_ID     ,"context_id"     ,Tcontext_t         ,_param->_size_context_id);
    97       ALLOC1_SIGNAL_IN ( in_UPDATE_ADDRESS_SRC    ,"address_src"    ,Tgeneral_data_t    ,_param->_size_address);
    98       ALLOC1_SIGNAL_IN ( in_UPDATE_ADDRESS_DEST   ,"address_dest"   ,Tgeneral_data_t    ,_param->_size_address);
     97      ALLOC1_SIGNAL_IN ( in_UPDATE_ADDRESS_SRC    ,"address_src"    ,Tgeneral_data_t    ,_param->_size_instruction_address);
     98      ALLOC1_SIGNAL_IN ( in_UPDATE_ADDRESS_DEST   ,"address_dest"   ,Tgeneral_data_t    ,_param->_size_instruction_address);
    9999      ALLOC1_SIGNAL_IN ( in_UPDATE_CONDITION      ,"condition"      ,Tbranch_condition_t,_param->_size_branch_condition);
    100100      ALLOC1_SIGNAL_IN ( in_UPDATE_LAST_TAKE      ,"last_take"      ,Tcontrol_t         ,1);
     
    590590    }
    591591    // ~~~~~[ Others ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    592 //      _component->test_map();
    593 
    594 #ifdef POSITION
    595     _component->generate_file();
     592
     593#if DEBUG_Branch_Target_Buffer == true
     594    _component->test_map();
     595#endif
     596
     597#ifdef POSITION
     598    if (usage_is_set(_usage,USE_POSITION))
     599      _component->generate_file();
    596600#endif
    597601
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/src/Branch_Target_Buffer_deallocation.cpp

    r82 r88  
    2323    log_printf(FUNC,Branch_Target_Buffer,FUNCTION,"Begin");
    2424
    25     if (_usage & USE_SYSTEMC)
     25    if (usage_is_set(_usage,USE_SYSTEMC))
    2626      {
    2727        delete    in_CLOCK ;
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/src/Branch_Target_Buffer_end_cycle.cpp

    r81 r88  
    2525
    2626#ifdef STATISTICS
    27     _stat->end_cycle();
     27    if (usage_is_set(_usage,USE_STATISTICS))
     28      _stat->end_cycle();
    2829#endif   
    2930
     
    3132    // Evaluation before read the ouput signal
    3233//  sc_start(0);
    33     _interfaces->testbench();
     34    if (usage_is_set(_usage,USE_VHDL_TESTBENCH))
     35      _interfaces->testbench();
    3436#endif
    3537
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/src/Branch_Target_Buffer_statistics_allocation.cpp

    r81 r88  
    3434        _stat->add_stat(_component_victim ->_stat);
    3535      }
    36     _stat->add_stat(_component_branch_target_buffer_glue    ->_stat);
     36
     37//     _stat->add_stat(_component_branch_target_buffer_glue    ->_stat);
    3738    _stat->add_stat(_component_branch_target_buffer_register->_stat);
    3839
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/src/Branch_Target_Buffer_statistics_deallocation.cpp

    r81 r88  
     1
    12#ifdef STATISTICS
    23/*
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/src/Parameters.cpp

    r81 r88  
    2929                          uint32_t   nb_inst_decod  ,
    3030                          uint32_t   nb_inst_update ,
    31                           Tvictim_t  victim_scheme  )
     31                          Tvictim_t  victim_scheme  ,
     32                          bool       is_toplevel)
    3233  {
    3334    log_printf(FUNC,Branch_Target_Buffer,FUNCTION,"Begin");
     
    3738    _size_buffer     = size_buffer    ;
    3839    _associativity   = associativity  ;
    39     _size_address    = size_address   ;
    4040    _size_counter    = size_counter   ;
    4141    _nb_inst_predict = nb_inst_predict;
     
    4545
    4646    _size_bank       = size_buffer/associativity;
    47     _size_context_id = log2(nb_context);
    4847    _size_victim     = log2(associativity);
    4948
    50     _have_port_context_id   = (_size_context_id > 0);
    5149    _have_component_victim  = (_size_victim     > 0);
    5250    _is_full_associative    = _size_bank == 1;
    5351    uint32_t nb_access = nb_inst_predict + nb_inst_decod + nb_inst_update;
     52
     53    test();
    5454
    5555    if (_have_component_victim)
     
    7878       _size_buffer       ,
    7979       _associativity     ,
    80        _size_address      ,
     80        size_address      ,
    8181       _nb_inst_predict   ,
    8282       _nb_inst_decod     ,
    8383       _nb_inst_update    );
    84    
     84
    8585    _param_branch_target_buffer_register = new morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::branch_target_buffer::branch_target_buffer_register::Parameters
    8686      (_nb_context     ,
     
    8888       _size_buffer    ,
    8989       _associativity  ,
    90        _size_address   ,
     90        size_address   ,
    9191       _size_counter   ,
    9292       _nb_inst_predict,
     
    9494       _nb_inst_update );
    9595
    96     test();
     96    if (is_toplevel)
     97      {
     98        _size_instruction_address = size_address   ;
     99        _size_context_id          = log2(nb_context);
     100        _have_port_context_id     = (_size_context_id > 0);
     101
     102        copy ();
     103      }
     104
    97105    log_printf(FUNC,Branch_Target_Buffer,FUNCTION,"End");
    98106  };
     
    125133  };
    126134
     135
     136#undef  FUNCTION
     137#define FUNCTION "Branch_Target_Buffer::copy"
     138  void Parameters::copy (void)
     139  {
     140    log_printf(FUNC,Branch_Target_Buffer,FUNCTION,"Begin");
     141
     142    if (_have_component_victim)
     143      {
     144        COPY(_param_sort);
     145        COPY(_param_victim);
     146      }
     147    COPY(_param_branch_target_buffer_glue);
     148    COPY(_param_branch_target_buffer_register);
     149
     150    log_printf(FUNC,Branch_Target_Buffer,FUNCTION,"End");
     151  };
     152
     153
    127154}; // end namespace branch_target_buffer
    128155}; // end namespace prediction_unit
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Branch_Target_Buffer/src/Parameters_print.cpp

    r81 r88  
    3030    xml.singleton_begin("size_buffer    "); xml.attribut("value",toString(_size_buffer    )); xml.singleton_end();
    3131    xml.singleton_begin("associativity  "); xml.attribut("value",toString(_associativity  )); xml.singleton_end();
    32     xml.singleton_begin("size_address   "); xml.attribut("value",toString(_size_address   )); xml.singleton_end();
     32//  xml.singleton_begin("size_address   "); xml.attribut("value",toString(_size_address   )); xml.singleton_end();
    3333    xml.singleton_begin("size_counter   "); xml.attribut("value",toString(_size_counter   )); xml.singleton_end();
    3434    xml.singleton_begin("nb_inst_predict"); xml.attribut("value",toString(_nb_inst_predict)); xml.singleton_end();
Note: See TracChangeset for help on using the changeset viewer.