Ignore:
Timestamp:
Apr 15, 2008, 8:40:01 PM (16 years ago)
Author:
rosiere
Message:
  • Finish Environment (and test)
  • Continue predictor_unit
  • Add external tools
  • svn keyword "Id" set
Location:
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src
Files:
4 added
13 edited

Legend:

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

    • Property svn:keywords set to Id
    r78 r81  
    77
    88#include "Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/include/Parameters.h"
     9#include "Common/include/Max.h"
    910
    1011namespace morpheo {
     
    1920#undef  FUNCTION
    2021#define FUNCTION "Update_Prediction_Table::Parameters"
    21   Parameters::Parameters ()
     22  Parameters::Parameters (uint32_t   nb_context             ,
     23                          uint32_t * size_queue             ,
     24                          uint32_t   size_address           ,
     25                          uint32_t   nb_inst_predict        ,
     26                          uint32_t   nb_inst_decod          ,
     27                          uint32_t   nb_inst_branch_complete,
     28                          uint32_t   nb_inst_update         ,
     29                          uint32_t   size_history           ,
     30                          uint32_t * size_ras_index         )
    2231  {
    2332    log_printf(FUNC,Update_Prediction_Table,FUNCTION,"Begin");
     33
     34    _nb_context              = nb_context             ;
     35    _size_queue              = size_queue             ;
     36    _size_address            = size_address           ;
     37    _nb_inst_predict         = nb_inst_predict        ;
     38    _nb_inst_decod           = nb_inst_decod          ;
     39    _nb_inst_branch_complete = nb_inst_branch_complete;
     40    _nb_inst_update          = nb_inst_update         ;
     41    _size_history            = size_history           ;
     42    _size_ras_index          = size_ras_index         ;
     43   
     44    _size_context_id         = log2(nb_context);
     45    _size_depth              = log2(max<uint32_t>(size_queue,nb_context));
     46    _max_size_ras_index      = max<uint32_t>(_size_ras_index,nb_context);
     47
     48    _have_port_context_id    = _size_context_id> 0;
     49    _have_port_depth         = _size_depth     > 0;
     50    _have_port_history       = _size_history   > 0;
     51   
    2452    test();
    2553    log_printf(FUNC,Update_Prediction_Table,FUNCTION,"End");
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Parameters_msg_error.cpp

    • Property svn:keywords set to Id
    r78 r81  
    2727    Parameters_test test ("Update_Prediction_Table");
    2828
     29    if (morpheo::behavioural::test<Tdepth_t>(_size_depth) == false)
     30      test.error("type \"Tdepth_t\" is too small.");
     31
    2932    log_printf(FUNC,Update_Prediction_Table,FUNCTION,"End");
    3033
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Parameters_print.cpp

    • Property svn:keywords set to Id
    r78 r81  
    2727
    2828    xml.balise_open("update_prediction_table");
    29 //  xml.singleton_begin(""); xml.attribut("value",toString(_)); xml.singleton_end();
     29    xml.singleton_begin("nb_context             "); xml.attribut("value",toString(_nb_context             )); xml.singleton_end();
     30    xml.singleton_begin("size_address           "); xml.attribut("value",toString(_size_address           )); xml.singleton_end();
     31    xml.singleton_begin("nb_inst_predict        "); xml.attribut("value",toString(_nb_inst_predict        )); xml.singleton_end();
     32    xml.singleton_begin("nb_inst_decod          "); xml.attribut("value",toString(_nb_inst_decod          )); xml.singleton_end();
     33    xml.singleton_begin("nb_inst_branch_complete"); xml.attribut("value",toString(_nb_inst_branch_complete)); xml.singleton_end();
     34    xml.singleton_begin("nb_inst_update         "); xml.attribut("value",toString(_nb_inst_update         )); xml.singleton_end();
     35    xml.singleton_begin("size_history           "); xml.attribut("value",toString(_size_history           )); xml.singleton_end();
     36    for (uint32_t i=0;i<_nb_context; i++)
     37      {
     38        xml. balise_open_begin("component");
     39        xml.  attribut("type","context");
     40        xml.  attribut("id"  ,toString(i));
     41        xml. balise_open_end();
     42        xml.  singleton_begin("size_queue             "); xml.attribut("value",toString(_size_queue             [i])); xml.singleton_end();
     43        xml.  singleton_begin("size_ras_index         "); xml.attribut("value",toString(_size_ras_index         [i])); xml.singleton_end();
     44        xml. balise_close();
     45      }
    3046    xml.balise_close();
    3147
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table.cpp

    • Property svn:keywords set to Id
    r78 r81  
    3838    log_printf(FUNC,Update_Prediction_Table,FUNCTION,"Begin");
    3939
     40    usage_environment(_usage);
     41
    4042    log_printf(INFO,Update_Prediction_Table,FUNCTION,"Allocation");
    4143
     
    6870    if (_usage & USE_SYSTEMC)
    6971      {
     72
     73        for (uint32_t i=0; i<_param->_nb_inst_branch_complete; i++)
     74          {
     75            internal_BRANCH_COMPLETE_ACK [i] = 1;
     76            PORT_WRITE(out_BRANCH_COMPLETE_ACK [i], internal_BRANCH_COMPLETE_ACK [i]);
     77          }
     78
    7079        log_printf(INFO,Update_Prediction_Table,FUNCTION,"Method - transition");
    7180
     
    7685# ifdef SYSTEMCASS_SPECIFIC
    7786        // List dependency information
     87# endif   
     88
     89        log_printf(INFO,Update_Prediction_Table,FUNCTION,"Method - genMoore");
     90
     91        SC_METHOD (genMoore);
     92        dont_initialize ();
     93        sensitive << (*(in_CLOCK)).neg();
     94       
     95# ifdef SYSTEMCASS_SPECIFIC
     96        // List dependency information
     97# endif   
     98
     99        log_printf(INFO,Update_Prediction_Table,FUNCTION,"Method - genMealy_predict");
     100
     101        SC_METHOD (genMealy_predict);
     102        dont_initialize ();
     103        sensitive << (*(in_CLOCK)).neg(); // use internal register
     104        for (uint32_t i=0; i<_param->_nb_inst_predict; i++)
     105          {
     106            if (_param->_have_port_context_id)
     107              sensitive << (*(in_PREDICT_CONTEXT_ID [i]));
     108            sensitive << (*(in_PREDICT_BTB_IS_ACCURATE [i]));
     109          }
     110       
     111# ifdef SYSTEMCASS_SPECIFIC
     112        // List dependency information
     113        for (uint32_t i=0; i<_param->_nb_inst_predict; i++)
     114          {
     115            (*(out_PREDICT_ACK                  [i])) (*(in_PREDICT_BTB_IS_ACCURATE [i]));
     116            if (_param->_have_port_context_id)
     117            (*(out_PREDICT_ACK                  [i])) (*(in_PREDICT_CONTEXT_ID      [i]));
     118          }
     119# endif   
     120
     121        log_printf(INFO,Update_Prediction_Table,FUNCTION,"Method - genMealy_decod");
     122
     123        SC_METHOD (genMealy_decod);
     124        dont_initialize ();
     125        sensitive << (*(in_CLOCK)).neg(); // use internal register
     126        for (uint32_t i=0; i<_param->_nb_inst_decod; i++)
     127          {
     128            if (_param->_have_port_context_id)
     129              sensitive << (*(in_DECOD_CONTEXT_ID [i]));
     130            sensitive << (*(in_DECOD_MISS_PREDICTION [i]));
     131          }
     132       
     133# ifdef SYSTEMCASS_SPECIFIC
     134        // List dependency information
     135        for (uint32_t i=0; i<_param->_nb_inst_decod; i++)
     136          {
     137            (*(out_DECOD_ACK                  [i])) (*(in_DECOD_MISS_PREDICTION [i]));
     138            if (_param->_have_port_context_id)
     139            (*(out_DECOD_ACK                  [i])) (*(in_DECOD_CONTEXT_ID      [i]));
     140          }
     141# endif   
     142
     143        log_printf(INFO,Update_Prediction_Table,FUNCTION,"Method - genMealy_branch_complete");
     144
     145        SC_METHOD (genMealy_branch_complete);
     146        dont_initialize ();
     147        sensitive << (*(in_CLOCK)).neg(); // use internal register
     148        for (uint32_t i=0; i<_param->_nb_inst_branch_complete; i++)
     149          {
     150            if (_param->_have_port_context_id)
     151            sensitive << (*(in_BRANCH_COMPLETE_CONTEXT_ID [i]));
     152            if (_param->_have_port_depth)
     153            sensitive << (*(in_BRANCH_COMPLETE_DEPTH [i]));
     154            sensitive << (*(in_BRANCH_COMPLETE_FLAG    [i]))
     155                      << (*(in_BRANCH_COMPLETE_ADDRESS [i]));
     156          }
     157       
     158# ifdef SYSTEMCASS_SPECIFIC
     159        // List dependency information
     160        for (uint32_t i=0; i<_param->_nb_inst_branch_complete; i++)
     161          {
     162            if (_param->_have_port_context_id)
     163            (*(out_BRANCH_COMPLETE_MISS_PREDICTION [i])) (*(in_BRANCH_COMPLETE_CONTEXT_ID [i]));
     164            if (_param->_have_port_depth)
     165            (*(out_BRANCH_COMPLETE_MISS_PREDICTION [i])) (*(in_BRANCH_COMPLETE_DEPTH      [i]));
     166            (*(out_BRANCH_COMPLETE_MISS_PREDICTION [i])) (*(in_BRANCH_COMPLETE_FLAG       [i]));
     167            (*(out_BRANCH_COMPLETE_MISS_PREDICTION [i])) (*(in_BRANCH_COMPLETE_ADDRESS    [i]));
     168
     169            if (_param->_have_port_context_id)
     170            (*(out_BRANCH_COMPLETE_TAKE            [i])) (*(in_BRANCH_COMPLETE_CONTEXT_ID [i]));
     171            if (_param->_have_port_depth)
     172            (*(out_BRANCH_COMPLETE_TAKE            [i])) (*(in_BRANCH_COMPLETE_DEPTH      [i]));
     173            (*(out_BRANCH_COMPLETE_TAKE            [i])) (*(in_BRANCH_COMPLETE_FLAG       [i]));
     174
     175            if (_param->_have_port_context_id)
     176            (*(out_BRANCH_COMPLETE_ADDRESS_SRC     [i])) (*(in_BRANCH_COMPLETE_CONTEXT_ID [i]));
     177            if (_param->_have_port_depth)
     178            (*(out_BRANCH_COMPLETE_ADDRESS_SRC     [i])) (*(in_BRANCH_COMPLETE_DEPTH      [i]));
     179
     180            if (_param->_have_port_context_id)
     181            (*(out_BRANCH_COMPLETE_ADDRESS_DEST    [i])) (*(in_BRANCH_COMPLETE_CONTEXT_ID [i]));
     182            if (_param->_have_port_depth)
     183            (*(out_BRANCH_COMPLETE_ADDRESS_DEST    [i])) (*(in_BRANCH_COMPLETE_DEPTH      [i]));
     184            (*(out_BRANCH_COMPLETE_ADDRESS_DEST    [i])) (*(in_BRANCH_COMPLETE_ADDRESS    [i]));
     185          }
    78186# endif   
    79187       
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_allocation.cpp

    • Property svn:keywords set to Id
    r78 r81  
    5555      in_NRESET       = interface->set_signal_in  <Tcontrol_t> ("nreset",1, RESET_VHDL_YES);
    5656    }
     57
     58    // ~~~~~[ Interface : "predict" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     59    {
     60      ALLOC1_INTERFACE("predict", IN,SOUTH, "predict", _param->_nb_inst_predict);
     61     
     62      ALLOC1_VALACK_IN ( in_PREDICT_VAL                 ,VAL);
     63      ALLOC1_VALACK_OUT(out_PREDICT_ACK                 ,ACK);
     64      ALLOC1_SIGNAL_IN ( in_PREDICT_CONTEXT_ID          ,"context_id"          ,Tcontext_t         ,_param->_size_context_id);
     65      ALLOC1_SIGNAL_IN ( in_PREDICT_BTB_ADDRESS_SRC     ,"btb_address_src"     ,Taddress_t         ,_param->_size_address);
     66      ALLOC1_SIGNAL_IN ( in_PREDICT_BTB_ADDRESS_DEST    ,"btb_address_dest"    ,Taddress_t         ,_param->_size_address);
     67      ALLOC1_SIGNAL_IN ( in_PREDICT_BTB_CONDITION       ,"btb_condition"       ,Tbranch_condition_t,_param->_size_branch_condition);
     68      ALLOC1_SIGNAL_IN ( in_PREDICT_BTB_LAST_TAKE       ,"btb_last_take"       ,Tcontrol_t         ,1);
     69      ALLOC1_SIGNAL_IN ( in_PREDICT_BTB_IS_ACCURATE     ,"btb_is_accurate"     ,Tcontrol_t         ,1);
     70      ALLOC1_SIGNAL_IN ( in_PREDICT_DIR_HISTORY         ,"dir_history"         ,Thistory_t         ,_param->_size_history);
     71      ALLOC1_SIGNAL_IN ( in_PREDICT_RAS_ADDRESS         ,"ras_address"         ,Taddress_t         ,_param->_size_address);
     72      ALLOC1_SIGNAL_IN ( in_PREDICT_RAS_INDEX           ,"ras_index"           ,Tptr_t             ,_param->_max_size_ras_index);
     73//       ALLOC1_SIGNAL_OUT(out_PREDICT_UPDATE_PREDICTION_ID,"update_prediction_id",Tprediction_ptr_t  ,_param->_size_depth);
     74    }
     75
     76    // ~~~~~[ Interface : "decod" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     77    {
     78      ALLOC1_INTERFACE("predict", IN,SOUTH, "predict", _param->_nb_inst_predict);
     79
     80      ALLOC1_VALACK_IN ( in_DECOD_VAL                 ,VAL);
     81      ALLOC1_VALACK_OUT(out_DECOD_ACK                 ,ACK);
     82      ALLOC1_SIGNAL_IN ( in_DECOD_CONTEXT_ID          ,"context_id"          ,Tcontext_t         ,_param->_size_context_id);
     83      ALLOC1_SIGNAL_IN ( in_DECOD_BTB_ADDRESS_SRC     ,"btb_address_src"     ,Taddress_t         ,_param->_size_address);
     84      ALLOC1_SIGNAL_IN ( in_DECOD_BTB_ADDRESS_DEST    ,"btb_address_dest"    ,Taddress_t         ,_param->_size_address);
     85      ALLOC1_SIGNAL_IN ( in_DECOD_BTB_CONDITION       ,"btb_condition"       ,Tbranch_condition_t,_param->_size_branch_condition);
     86      ALLOC1_SIGNAL_IN ( in_DECOD_BTB_LAST_TAKE       ,"btb_last_take"       ,Tcontrol_t         ,1);
     87      ALLOC1_SIGNAL_IN ( in_DECOD_RAS_ADDRESS         ,"ras_address"         ,Taddress_t         ,_param->_size_address);
     88      ALLOC1_SIGNAL_IN ( in_DECOD_RAS_INDEX           ,"ras_index"           ,Tptr_t             ,_param->_max_size_ras_index);
     89      ALLOC1_SIGNAL_IN ( in_DECOD_MISS_PREDICTION     ,"miss_prediction"     ,Tcontrol_t         ,1);
     90      ALLOC1_SIGNAL_IN ( in_DECOD_UPDATE_PREDICTION_ID,"update_prediction_id",Tprediction_ptr_t  ,_param->_size_depth);
     91//    ALLOC1_SIGNAL_OUT(out_DECOD_DEPTH               ,"depth"               ,Tdepth_t           ,_param->_size_depth);
     92    }
     93
     94    // ~~~~~[ Interface : "branch_complete" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     95    {
     96      ALLOC1_INTERFACE("branch_complete", IN,SOUTH, "branch_complete", _param->_nb_inst_branch_complete);
     97
     98     
     99      ALLOC1_VALACK_IN ( in_BRANCH_COMPLETE_VAL            ,VAL);
     100      ALLOC1_VALACK_OUT(out_BRANCH_COMPLETE_ACK            ,ACK);
     101      ALLOC1_SIGNAL_IN ( in_BRANCH_COMPLETE_CONTEXT_ID     ,"context_id"     ,Tcontext_t,_param->_size_context_id);
     102      ALLOC1_SIGNAL_IN ( in_BRANCH_COMPLETE_DEPTH          ,"depth"          ,Tdepth_t  ,_param->_size_depth);
     103      ALLOC1_SIGNAL_IN ( in_BRANCH_COMPLETE_ADDRESS        ,"address"        ,Taddress_t,_param->_size_address);
     104      ALLOC1_SIGNAL_IN ( in_BRANCH_COMPLETE_FLAG           ,"flag"           ,Tcontrol_t,1);
     105      ALLOC1_SIGNAL_OUT(out_BRANCH_COMPLETE_MISS_PREDICTION,"miss_prediction",Tcontrol_t,1);
     106      ALLOC1_SIGNAL_OUT(out_BRANCH_COMPLETE_TAKE           ,"take"           ,Tcontrol_t,1);
     107      ALLOC1_SIGNAL_OUT(out_BRANCH_COMPLETE_ADDRESS_SRC    ,"address_src"    ,Taddress_t,_param->_size_address);
     108      ALLOC1_SIGNAL_OUT(out_BRANCH_COMPLETE_ADDRESS_DEST   ,"address_dest"   ,Taddress_t,_param->_size_address);
     109    }
     110
     111    // ~~~~~[ Interface : "update" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     112    {
     113      ALLOC1_INTERFACE("update",OUT,SOUTH, "update", _param->_nb_inst_update);
     114
     115      ALLOC1_VALACK_OUT(out_UPDATE_VAL                  ,VAL);
     116      ALLOC1_VALACK_IN ( in_UPDATE_ACK                  ,ACK);
     117      ALLOC1_SIGNAL_OUT(out_UPDATE_CONTEXT_ID           ,"context_id"           ,Tcontext_t         ,_param->_size_context_id);
     118      ALLOC1_SIGNAL_OUT(out_UPDATE_MISS_PREDICTION      ,"miss_prediction"      ,Tcontrol_t         ,1);
     119      ALLOC1_SIGNAL_OUT(out_UPDATE_DIRECTION_GOOD       ,"direction_good"       ,Tcontrol_t         ,1);
     120      ALLOC1_SIGNAL_OUT(out_UPDATE_BTB_VAL              ,"btb_val"              ,Tcontrol_t         ,1);
     121      ALLOC1_SIGNAL_OUT(out_UPDATE_BTB_ADDRESS_SRC      ,"btb_address_src"      ,Taddress_t         ,_param->_size_address);
     122      ALLOC1_SIGNAL_OUT(out_UPDATE_BTB_ADDRESS_DEST     ,"btb_address_dest"     ,Taddress_t         ,_param->_size_address);
     123      ALLOC1_SIGNAL_OUT(out_UPDATE_BTB_CONDITION        ,"btb_condition"        ,Tbranch_condition_t,_param->_size_branch_condition);
     124      ALLOC1_SIGNAL_OUT(out_UPDATE_DIR_VAL              ,"dir_val"              ,Tcontrol_t         ,1);
     125      ALLOC1_SIGNAL_OUT(out_UPDATE_DIR_HISTORY          ,"dir_history"          ,Thistory_t         ,_param->_size_history);
     126      ALLOC1_SIGNAL_OUT(out_UPDATE_RAS_VAL              ,"ras_val"              ,Tcontrol_t         ,1);
     127      ALLOC1_SIGNAL_OUT(out_UPDATE_RAS_ADDRESS          ,"ras_address"          ,Taddress_t         ,_param->_size_address);
     128      ALLOC1_SIGNAL_OUT(out_UPDATE_RAS_INDEX            ,"ras_index"            ,Tptr_t             ,_param->_max_size_ras_index);
     129      ALLOC1_SIGNAL_OUT(out_UPDATE_RAS_PREDICTION_IFETCH,"ras_prediction_ifetch",Tcontrol_t         ,1);
     130    }
     131
     132    // ~~~~~[ Interface : "depth" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     133    {
     134      ALLOC1_INTERFACE("depth",OUT,SOUTH, "depth", _param->_nb_context);
     135
     136      ALLOC1_SIGNAL_OUT(out_DEPTH_NB_BRANCH,"NB_BRANCH",Tdepth_t,_param->_size_depth);
     137      ALLOC1_SIGNAL_OUT(out_DEPTH_TAIL,"TAIL",Tdepth_t,_param->_size_depth);
     138    }
     139
     140    // ~~~~~[ Internal ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     141    internal_PREDICT_ACK                     = new Tcontrol_t [_param->_nb_inst_predict];
     142    internal_DECOD_ACK                       = new Tcontrol_t [_param->_nb_inst_decod];
     143    internal_BRANCH_COMPLETE_ACK             = new Tcontrol_t [_param->_nb_inst_branch_complete];
     144    internal_BRANCH_COMPLETE_MISS_PREDICTION = new Tcontrol_t [_param->_nb_inst_branch_complete];
     145    internal_BRANCH_COMPLETE_TAKE            = new Tcontrol_t [_param->_nb_inst_branch_complete];
     146    internal_BRANCH_COMPLETE_ADDRESS_DEST    = new Taddress_t [_param->_nb_inst_branch_complete];
     147    internal_UPDATE_VAL                      = new Tcontrol_t [_param->_nb_inst_update];
     148    internal_UPDATE_CONTEXT_ID               = new Tcontext_t [_param->_nb_inst_update];
     149    internal_UPDATE_DEPTH                    = new Tdepth_t   [_param->_nb_inst_update];
     150
     151    // ~~~~~[ Register ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
     152    reg_TOP                     = new uint32_t  [_param->_nb_context];
     153    reg_BOTTOM                  = new uint32_t  [_param->_nb_context];
     154    reg_NB_ELT                  = new uint32_t  [_param->_nb_context];
     155    reg_NB_ELT_NEED_UPDATE      = new uint32_t  [_param->_nb_context];
     156    reg_UPDATE_PREDICTION_TABLE = new entry_t * [_param->_nb_context];
     157    for (uint32_t i=0; i<_param->_nb_context; i++)
     158      {
     159#ifndef NO_INIT
     160        reg_TOP [i] = 0;
     161#endif
     162        reg_UPDATE_PREDICTION_TABLE [i] = new entry_t [_param->_size_queue[i]];
     163      }
    57164    // ~~~~~[ Component ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
    58165
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_deallocation.cpp

    • Property svn:keywords set to Id
    r78 r81  
    2727        delete    in_CLOCK ;
    2828        delete    in_NRESET;
     29
     30        // ~~~~~[ Interface : "predict" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     31        delete []  in_PREDICT_VAL                 ;
     32        delete [] out_PREDICT_ACK                 ;
     33        if (_param->_have_port_context_id)
     34        delete []  in_PREDICT_CONTEXT_ID          ;
     35        delete []  in_PREDICT_BTB_ADDRESS_SRC     ;
     36        delete []  in_PREDICT_BTB_ADDRESS_DEST    ;
     37        delete []  in_PREDICT_BTB_CONDITION       ;
     38        delete []  in_PREDICT_BTB_LAST_TAKE       ;
     39        delete []  in_PREDICT_BTB_IS_ACCURATE     ;
     40        if (_param->_have_port_history)
     41        delete []  in_PREDICT_DIR_HISTORY         ;
     42        delete []  in_PREDICT_RAS_ADDRESS         ;
     43        delete []  in_PREDICT_RAS_INDEX           ;
     44//      if (_param->_have_port_depth)
     45//      delete [] out_PREDICT_UPDATE_PREDICTION_ID;
     46       
     47        // ~~~~~[ Interface : "decod" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     48        delete []  in_DECOD_VAL                   ;
     49        delete [] out_DECOD_ACK                   ;
     50        if (_param->_have_port_context_id)
     51        delete []  in_DECOD_CONTEXT_ID            ;
     52        delete []  in_DECOD_BTB_ADDRESS_SRC       ;
     53        delete []  in_DECOD_BTB_ADDRESS_DEST      ;
     54        delete []  in_DECOD_BTB_CONDITION         ;
     55        delete []  in_DECOD_BTB_LAST_TAKE         ;
     56        delete []  in_DECOD_RAS_ADDRESS           ;
     57        delete []  in_DECOD_RAS_INDEX             ;
     58        delete []  in_DECOD_MISS_PREDICTION       ;
     59        if (_param->_have_port_depth)
     60        delete []  in_DECOD_UPDATE_PREDICTION_ID  ;
     61//      if (_param->_have_port_depth)
     62//      delete [] out_DECOD_DEPTH                 ;
     63       
     64        // ~~~~~[ Interface : "branch_complete" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     65        delete []  in_BRANCH_COMPLETE_VAL            ;
     66        delete [] out_BRANCH_COMPLETE_ACK            ;
     67        if (_param->_have_port_context_id)
     68        delete []  in_BRANCH_COMPLETE_CONTEXT_ID     ;
     69        if (_param->_have_port_depth)
     70        delete []  in_BRANCH_COMPLETE_DEPTH          ;
     71        delete []  in_BRANCH_COMPLETE_ADDRESS        ;
     72        delete []  in_BRANCH_COMPLETE_FLAG           ;
     73        delete [] out_BRANCH_COMPLETE_MISS_PREDICTION;
     74        delete [] out_BRANCH_COMPLETE_TAKE           ;
     75        delete [] out_BRANCH_COMPLETE_ADDRESS_SRC    ;
     76        delete [] out_BRANCH_COMPLETE_ADDRESS_DEST   ;
     77       
     78        // ~~~~~[ Interface : "update" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     79        delete [] out_UPDATE_VAL                  ;
     80        delete []  in_UPDATE_ACK                  ;
     81        if (_param->_have_port_context_id)
     82        delete [] out_UPDATE_CONTEXT_ID           ;
     83        delete [] out_UPDATE_MISS_PREDICTION      ;
     84        delete [] out_UPDATE_DIRECTION_GOOD       ;
     85        delete [] out_UPDATE_BTB_VAL              ;
     86        delete [] out_UPDATE_BTB_ADDRESS_SRC      ;
     87        delete [] out_UPDATE_BTB_ADDRESS_DEST     ;
     88        delete [] out_UPDATE_BTB_CONDITION        ;
     89        delete [] out_UPDATE_DIR_VAL              ;
     90        if (_param->_have_port_history)
     91        delete [] out_UPDATE_DIR_HISTORY          ;
     92        delete [] out_UPDATE_RAS_VAL              ;
     93        delete [] out_UPDATE_RAS_ADDRESS          ;
     94        delete [] out_UPDATE_RAS_INDEX            ;
     95        delete [] out_UPDATE_RAS_PREDICTION_IFETCH;
     96
     97        // ~~~~~[ Interface : "depth" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     98        if (_param->_have_port_depth)
     99          {
     100        delete [] out_DEPTH_NB_BRANCH;
     101        delete [] out_DEPTH_TAIL;
     102          }
    29103      }
     104
     105    // ~~~~~[ Internal ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     106    delete [] internal_PREDICT_ACK                     ;
     107    delete [] internal_DECOD_ACK                       ;
     108    delete [] internal_BRANCH_COMPLETE_ACK             ;
     109    delete [] internal_BRANCH_COMPLETE_MISS_PREDICTION ;
     110    delete [] internal_BRANCH_COMPLETE_TAKE            ;
     111    delete [] internal_BRANCH_COMPLETE_ADDRESS_DEST    ;
     112    delete [] internal_UPDATE_VAL                      ;
     113    delete [] internal_UPDATE_CONTEXT_ID               ;
     114    delete [] internal_UPDATE_DEPTH                    ;
     115
     116    // ~~~~~[ Register ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
     117    delete [] reg_TOP;
     118    delete [] reg_BOTTOM;
     119    delete [] reg_NB_ELT;
     120    delete [] reg_NB_ELT_NEED_UPDATE;
     121    for (uint32_t i=0; i<_param->_nb_context; i++)
     122      delete [] reg_UPDATE_PREDICTION_TABLE [i];
     123    delete [] reg_UPDATE_PREDICTION_TABLE;
     124
    30125    // ~~~~~[ Component ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
    31126
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_end_cycle.cpp

    • Property svn:keywords set to Id
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_statistics_allocation.cpp

    • Property svn:keywords set to Id
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_statistics_deallocation.cpp

    • Property svn:keywords set to Id
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_transition.cpp

    • Property svn:keywords set to Id
    r78 r81  
    2424    log_printf(FUNC,Update_Prediction_Table,FUNCTION,"Begin");
    2525
     26    if (PORT_READ(in_NRESET) == 0)
     27      {
     28        for (uint32_t i=0; i<_param->_nb_context; i++)
     29          {
     30            reg_TOP                [i] = 0;
     31            reg_BOTTOM             [i] = 0;
     32            reg_NB_ELT             [i] = 0;
     33            reg_NB_ELT_NEED_UPDATE [i] = 0;
     34            for (uint32_t j=0; j<_param->_size_queue[i]; j++)
     35              reg_UPDATE_PREDICTION_TABLE [i][j]._state = UPDATE_PREDICTION_STATE_EMPTY;
     36          }
     37        reg_UPDATE_PRIORITY = 0;
     38      }
     39    else
     40      {
     41        // ===================================================================
     42        // =====[ PREDICT ]===================================================
     43        // ===================================================================
     44        for (uint32_t i=0; i<_param->_nb_inst_predict; i++)
     45          if (PORT_READ(in_PREDICT_VAL[i]) and internal_PREDICT_ACK [i])
     46            {
     47              Tcontext_t context = (_param->_have_port_context_id)?PORT_READ(in_PREDICT_CONTEXT_ID [i]):0;
     48              uint32_t   top     = reg_TOP [context];
     49
     50              log_printf(TRACE,Update_Prediction_Table,FUNCTION,"PREDICT[%d] - Accepted",i);
     51              log_printf(TRACE,Update_Prediction_Table,FUNCTION," * context : %d",context);
     52              log_printf(TRACE,Update_Prediction_Table,FUNCTION," * top     : %d",top);
     53              log_printf(TRACE,Update_Prediction_Table,FUNCTION," * nb_elt  : %d",reg_NB_ELT[context]);
     54
     55              reg_UPDATE_PREDICTION_TABLE [context][top]._state        = UPDATE_PREDICTION_STATE_WAIT_DECOD;
     56              reg_UPDATE_PREDICTION_TABLE [context][top]._ifetch_prediction = true;
     57              reg_UPDATE_PREDICTION_TABLE [context][top]._condition    = PORT_READ(in_PREDICT_BTB_CONDITION    [i]);
     58              reg_UPDATE_PREDICTION_TABLE [context][top]._address_src  = PORT_READ(in_PREDICT_BTB_ADDRESS_SRC  [i]);
     59              reg_UPDATE_PREDICTION_TABLE [context][top]._address_dest = PORT_READ(in_PREDICT_BTB_ADDRESS_DEST [i]);
     60              reg_UPDATE_PREDICTION_TABLE [context][top]._last_take    = PORT_READ(in_PREDICT_BTB_LAST_TAKE    [i]);
     61            //reg_UPDATE_PREDICTION_TABLE [context][top]._good_take   
     62              reg_UPDATE_PREDICTION_TABLE [context][top]._history      = (_param->_have_port_history)?PORT_READ(in_PREDICT_DIR_HISTORY [i]):0;
     63              reg_UPDATE_PREDICTION_TABLE [context][top]._address_ras  = PORT_READ(in_PREDICT_RAS_ADDRESS      [i]);
     64              reg_UPDATE_PREDICTION_TABLE [context][top]._index_ras    = PORT_READ(in_PREDICT_RAS_INDEX        [i]);
     65
     66              reg_TOP    [context] = (top+1)%_param->_size_queue [context];
     67              reg_NB_ELT [context] ++;
     68            }
     69
     70        // ===================================================================
     71        // =====[ DECOD ]=====================================================
     72        // ===================================================================
     73        for (uint32_t i=0; i<_param->_nb_inst_decod; i++)
     74          if (PORT_READ(in_DECOD_VAL[i]) and internal_DECOD_ACK [i])
     75            {
     76              Tcontext_t context = (_param->_have_port_context_id)?PORT_READ(in_DECOD_CONTEXT_ID [i]):0;
     77              Tcontrol_t miss    = PORT_READ(in_DECOD_MISS_PREDICTION [i]);
     78
     79              log_printf(TRACE,Update_Prediction_Table,FUNCTION,"DECOD[%d] - Accepted",i);
     80              log_printf(TRACE,Update_Prediction_Table,FUNCTION," * context : %d",context);
     81              log_printf(TRACE,Update_Prediction_Table,FUNCTION," * miss    : %d",miss);
     82              log_printf(TRACE,Update_Prediction_Table,FUNCTION," * nb_elt  : %d",reg_NB_ELT[context]);
     83             
     84              // Test if miss ifetch
     85              //   miss ifetch = decod a branch and the predict unit have not predict this branch ... gloup :P
     86              if (miss)
     87                {
     88                  Tdepth_t depth = (_param->_have_port_depth)?PORT_READ(in_DECOD_UPDATE_PREDICTION_ID [i]):0;
     89                  Tdepth_t top   = reg_TOP [context];
     90
     91                  reg_UPDATE_PREDICTION_TABLE [context][top]._state        = UPDATE_PREDICTION_STATE_WAITEND;
     92                  reg_UPDATE_PREDICTION_TABLE [context][top]._ifetch_prediction = false; // static prediction
     93                  reg_UPDATE_PREDICTION_TABLE [context][top]._condition    = PORT_READ(in_DECOD_BTB_CONDITION    [i]);
     94                  reg_UPDATE_PREDICTION_TABLE [context][top]._address_src  = PORT_READ(in_DECOD_BTB_ADDRESS_SRC  [i]);
     95                  reg_UPDATE_PREDICTION_TABLE [context][top]._address_dest = PORT_READ(in_DECOD_BTB_ADDRESS_DEST [i]);
     96                  reg_UPDATE_PREDICTION_TABLE [context][top]._last_take    = PORT_READ(in_DECOD_BTB_LAST_TAKE    [i]);
     97                //reg_UPDATE_PREDICTION_TABLE [context][top]._good_take
     98                //reg_UPDATE_PREDICTION_TABLE [context][top]._history
     99                  reg_UPDATE_PREDICTION_TABLE [context][top]._address_ras  = PORT_READ(in_DECOD_RAS_ADDRESS      [i]);
     100                  reg_UPDATE_PREDICTION_TABLE [context][top]._index_ras    = PORT_READ(in_DECOD_RAS_INDEX        [i]);
     101
     102                  // Invalid all previous "ifetch" prediction
     103                  // (ifetch prediction = prediction make in fetch stage and not again comming in decod stage)
     104                  uint32_t nb_elt_miss        = ((top> depth)?top:(top+_param->_size_queue[context]))-depth;
     105                  uint32_t nb_elt_need_update = 0;
     106                  for (uint32_t j=0; j<nb_elt_miss; j++)
     107                    {
     108                      uint32_t k=(depth+j)%_param->_size_queue[context];
     109                     
     110                      // Ifetch have make a prediction and it's a miss
     111                      // When ifetch predict :
     112                      //   * btb is not change       -> needn't update
     113                      //   * direction is not change -> needn't update
     114                      //   * ras have change         -> need    update
     115
     116                      Tbranch_condition_t cond = reg_UPDATE_PREDICTION_TABLE [context][k]._condition;
     117                      if ((cond == BRANCH_CONDITION_NONE_WITH_WRITE_STACK) or
     118                          (cond == BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK) or
     119                          (cond == BRANCH_CONDITION_READ_STACK))
     120                        {
     121                          nb_elt_need_update ++;
     122                          reg_UPDATE_PREDICTION_TABLE [context][k]._state = UPDATE_PREDICTION_STATE_KO;
     123                        }
     124                      else
     125                        {
     126                          reg_UPDATE_PREDICTION_TABLE [context][k]._state = UPDATE_PREDICTION_STATE_END;
     127                        }
     128                    }
     129
     130                  reg_TOP                [context] = (depth+1)%_param->_size_queue [context];
     131                  reg_NB_ELT_NEED_UPDATE [context] += nb_elt_need_update;
     132                  reg_NB_ELT             [context] ++;
     133                }
     134              else
     135                {
     136                  // Normal case : branch is previous predicated, change state of branch
     137                  Tdepth_t depth = (_param->_have_port_depth)?PORT_READ(in_DECOD_UPDATE_PREDICTION_ID [i]):0;
     138
     139                  reg_UPDATE_PREDICTION_TABLE [context][depth]._state = UPDATE_PREDICTION_STATE_WAITEND;
     140                }
     141            }
     142
     143        // ===================================================================
     144        // =====[ BRANCH_COMPLETE ]===========================================
     145        // ===================================================================
     146        for (uint32_t i=0; i<_param->_nb_inst_branch_complete; i++)
     147          if (PORT_READ(in_BRANCH_COMPLETE_VAL[i]) and internal_BRANCH_COMPLETE_ACK [i])
     148            {
     149              Tcontext_t context = (_param->_have_port_context_id)?PORT_READ(in_BRANCH_COMPLETE_CONTEXT_ID [i]):0;
     150              Tdepth_t   depth   = (_param->_have_port_depth     )?PORT_READ(in_BRANCH_COMPLETE_DEPTH      [i]):0;
     151
     152              log_printf(TRACE,Update_Prediction_Table,FUNCTION,"BRANCH_COMPLETE[%d] - Accepted",i);
     153              log_printf(TRACE,Update_Prediction_Table,FUNCTION," * context : %d",context);
     154              log_printf(TRACE,Update_Prediction_Table,FUNCTION," * depth   : %d",depth);
     155              log_printf(TRACE,Update_Prediction_Table,FUNCTION," * nb_elt  : %d",reg_NB_ELT[context]);
     156             
     157              if (internal_BRANCH_COMPLETE_MISS_PREDICTION [i])
     158                {
     159                  // Miss case
     160                  reg_UPDATE_PREDICTION_TABLE [context][depth]._state = UPDATE_PREDICTION_STATE_KO;
     161
     162                  // Another prediction (prediction with depth higer)
     163                  Tdepth_t top                = reg_TOP [context];
     164                  uint32_t nb_elt_miss        = ((top> depth)?top:(top+_param->_size_queue[context]))-depth;
     165                  uint32_t nb_elt_need_update = 1;
     166                  for (uint32_t j=1; j<nb_elt_miss; j++)
     167                    {
     168                      uint32_t k=(depth+j)%_param->_size_queue[context];
     169                     
     170                      // Ifetch have make a prediction and it's a miss
     171                      // When ifetch predict :
     172                      //   * btb is not change       -> needn't update
     173                      //   * direction is not change -> needn't update
     174                      //   * ras have change         -> need    update
     175
     176                      Tbranch_condition_t cond = reg_UPDATE_PREDICTION_TABLE [context][k]._condition;
     177                      if ((cond == BRANCH_CONDITION_NONE_WITH_WRITE_STACK) or
     178                          (cond == BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK) or
     179                          (cond == BRANCH_CONDITION_READ_STACK))
     180                        {
     181                          nb_elt_need_update ++;
     182                          reg_UPDATE_PREDICTION_TABLE [context][k]._state = UPDATE_PREDICTION_STATE_KO;
     183                        }
     184                      else
     185                        {
     186                          reg_UPDATE_PREDICTION_TABLE [context][k]._state = UPDATE_PREDICTION_STATE_END;
     187                        }
     188                    }
     189                  reg_NB_ELT_NEED_UPDATE [context] += nb_elt_need_update;
     190
     191                  // Update pointer :
     192                  reg_TOP                [context]  = depth;
     193                  reg_NB_ELT             [context] -= nb_elt_miss;
     194                }
     195              else
     196                {
     197                  // Hit case
     198#ifdef DEBUG_TEST
     199                  if (reg_UPDATE_PREDICTION_TABLE [context][depth]._state != UPDATE_PREDICTION_STATE_WAITEND)
     200                    ERRORMORPHEO(FUNCTION,"Branche complete : invalid state");
     201#endif
     202                  reg_UPDATE_PREDICTION_TABLE [context][depth]._state = UPDATE_PREDICTION_STATE_OK;
     203                }
     204
     205              // In all case : update good_take and address_destination
     206              reg_UPDATE_PREDICTION_TABLE [context][depth]._good_take    = internal_BRANCH_COMPLETE_TAKE         [i];
     207              reg_UPDATE_PREDICTION_TABLE [context][depth]._address_dest = internal_BRANCH_COMPLETE_ADDRESS_DEST [i];
     208            }
     209
     210        // ===================================================================
     211        // =====[ UPDATE ]====================================================
     212        // ===================================================================
     213        for (uint32_t i=0; i<_param->_nb_inst_update; i++)
     214          if (internal_UPDATE_VAL[i] and PORT_READ(in_UPDATE_ACK [i]))
     215            {
     216              Tcontext_t context = internal_UPDATE_CONTEXT_ID [i];
     217              Tdepth_t   depth   = internal_UPDATE_DEPTH      [i];
     218
     219              log_printf(TRACE,Update_Prediction_Table,FUNCTION,"UPDATE[%d] - Accepted",i);
     220              log_printf(TRACE,Update_Prediction_Table,FUNCTION," * context : %d",context);
     221              log_printf(TRACE,Update_Prediction_Table,FUNCTION," * depth   : %d",depth);
     222
     223              if (reg_UPDATE_PREDICTION_TABLE [context][depth]._state == UPDATE_PREDICTION_STATE_KO)
     224                reg_NB_ELT_NEED_UPDATE [context] --;
     225
     226              reg_UPDATE_PREDICTION_TABLE [context][depth]._state = UPDATE_PREDICTION_STATE_END;
     227            }
     228       
     229        // Round robin
     230        reg_UPDATE_PRIORITY = (reg_UPDATE_PRIORITY+1)%_param->_nb_context;
     231
     232        // ===================================================================
     233        // =====[ GARBAGE COLLECTOR ]=========================================
     234        // ===================================================================
     235
     236        for (uint32_t i=0; i<_param->_nb_context; i++)
     237          {
     238            uint32_t bottom = reg_BOTTOM [i];
     239           
     240            // Test if the tail of queue is finish (ok or ko and update)
     241            if (reg_UPDATE_PREDICTION_TABLE [i][bottom]._state == UPDATE_PREDICTION_STATE_END)
     242              {
     243                log_printf(TRACE,Update_Prediction_Table,FUNCTION,"GARBAGE_COLLECTOR");
     244                log_printf(TRACE,Update_Prediction_Table,FUNCTION," * context : %d",i);
     245                log_printf(TRACE,Update_Prediction_Table,FUNCTION," * bottom  : %d",bottom);
     246
     247                reg_UPDATE_PREDICTION_TABLE [i][bottom]._state = UPDATE_PREDICTION_STATE_EMPTY;
     248                reg_BOTTOM [i] = (bottom+1)%_param->_size_queue [i];
     249                if (reg_NB_ELT [i]>0)
     250                  reg_NB_ELT [i] --;
     251              }
     252          }
     253      }
     254
     255// #if (DEBUG >= DEBUG_TRACE)
     256    log_printf(TRACE,Update_Prediction_Table,FUNCTION,"Dump Update_Prediction_Table");
     257    log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * reg_UPDATE_PRIORITY      : %d",reg_UPDATE_PRIORITY);
     258    for (uint32_t i=0; i<_param->_nb_context; i++)
     259      {
     260        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * Update_Prediction_Table [%d]",i);
     261        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * reg_TOP                : %d",reg_TOP                [i]);
     262        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * reg_BOTTOM             : %d",reg_BOTTOM             [i]);
     263        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * reg_NB_ELT             : %d",reg_NB_ELT             [i]);
     264        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * reg_NB_ELT_NEED_UPDATE : %d",reg_NB_ELT_NEED_UPDATE [i]);
     265        for (uint32_t j=0; j<_param->_size_queue[i]; j++)
     266          log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      [%d] %s %x",j,toString(reg_UPDATE_PREDICTION_TABLE [i][j]._state).c_str(),reg_UPDATE_PREDICTION_TABLE [i][j]._address_src);
     267      }
     268// #endif
     269
     270
    26271#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
    27272    end_cycle ();
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_vhdl.cpp

    • Property svn:keywords set to Id
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_vhdl_body.cpp

    • Property svn:keywords set to Id
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_vhdl_declaration.cpp

    • Property svn:keywords set to Id
Note: See TracChangeset for help on using the changeset viewer.