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

Almost complete design
with Test and test platform

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/include/Types.h

    r82 r88  
    2121  typedef enum
    2222    {
    23       UPDATE_PREDICTION_STATE_EMPTY      , // Slot is empty
    24       UPDATE_PREDICTION_STATE_WAIT_DECOD , // Fetch have access at the predictor
    25       UPDATE_PREDICTION_STATE_WAITEND    , // Have make a prediction, wait branch_complete
    26       UPDATE_PREDICTION_STATE_EVENT      , // have a event - must signal at the context_unit
    27       UPDATE_PREDICTION_STATE_OK         , // branch is complete and can update predictor
    28       UPDATE_PREDICTION_STATE_KO         , // have a event - must update predictor unit
    29       UPDATE_PREDICTION_STATE_END          // branch is updated
    30     } state_t;
     23      EVENT_STATE_OK                 , // Can predict
     24      EVENT_STATE_FLUSH_UFPT         , // in decod  stage, detect a miss, continue to execute but flush ufpt
     25      EVENT_STATE_FLUSH_UFPT_AND_UPT , // in commit stage, detect a miss, stop context and flush ufpt and upt
     26      EVENT_STATE_FLUSH_UPT_RAS      , // in commit stage, detect a miss, context is stop and ufpt is flush, update RAS
     27      EVENT_STATE_FLUSH_UPT          , // in commit stage, detect a miss, context is stop and ufpt is flush
     28      EVENT_STATE_UPDATE_CONTEXT       // prediction unit is update, send signal to context manager
     29    } event_state_t;
    3130
    32   class entry_t
     31  typedef enum
     32    {
     33      UPDATE_FETCH_PREDICTION_STATE_EMPTY       , // Slot is empty
     34      UPDATE_FETCH_PREDICTION_STATE_WAIT_DECOD  , // Have make a prediction, wait decod
     35      UPDATE_FETCH_PREDICTION_STATE_EVENT       , // previous branch is a miss prediction
     36      UPDATE_FETCH_PREDICTION_STATE_END           // branch is updated
     37    } ufpt_state_t;
     38
     39  typedef enum
     40    {
     41      UPDATE_PREDICTION_STATE_EMPTY             , // Slot is empty
     42      UPDATE_PREDICTION_STATE_WAIT_END          , // Have make a prediction, wait branch_complete
     43      UPDATE_PREDICTION_STATE_OK                , // this branch is a hit prediction
     44      UPDATE_PREDICTION_STATE_KO                , // this branch is a miss prediction
     45      UPDATE_PREDICTION_STATE_EVENT             , // previous branch is a miss prediction
     46      UPDATE_PREDICTION_STATE_END                 // branch is updated
     47    } upt_state_t;
     48
     49  class ufpt_entry_t
    3350  {
    34   public : state_t             _state;
    35   public : Tcontrol_t          _ifetch_prediction;
    36   public : Tbranch_condition_t _condition;
    37   public : Taddress_t          _address_src;
    38   public : Taddress_t          _address_dest;
    39   public : Tcontrol_t          _last_take;
    40   public : Tcontrol_t          _good_take;
    41   public : Thistory_t          _history;
    42   public : Taddress_t          _address_ras;
    43   public : Tptr_t              _index_ras;
     51  public : ufpt_state_t        _state            ;
     52  public : Tbranch_condition_t _condition        ;
     53  public : Taddress_t          _address_src      ;
     54  public : Taddress_t          _address_dest     ;
     55  public : Tcontrol_t          _last_take        ;
     56//public : Tcontrol_t          _good_take        ;
     57  public : Tcontrol_t          _is_accurate      ;
     58  public : Thistory_t          _history          ;
     59  public : Taddress_t          _address_ras      ;
     60  public : Tptr_t              _index_ras        ;
     61//public : Tcontrol_t          _ifetch_prediction;
    4462  };
     63
     64  class upt_entry_t
     65  {
     66  public : upt_state_t         _state            ;
     67  public : Tbranch_condition_t _condition        ;
     68  public : Taddress_t          _address_src      ;
     69  public : Taddress_t          _address_dest     ;
     70  public : Tcontrol_t          _last_take        ;
     71  public : Tcontrol_t          _good_take        ; // not in ufpt
     72  public : Tcontrol_t          _is_accurate      ;
     73  public : Thistory_t          _history          ;
     74  public : Taddress_t          _address_ras      ;
     75  public : Tptr_t              _index_ras        ;
     76  public : Tcontrol_t          _ifetch_prediction; // not in ufpt
     77  };
     78
     79
     80// BRANCH_CONDITION_NONE_WITHOUT_WRITE_STACK         
     81// BRANCH_CONDITION_NONE_WITH_WRITE_STACK             
     82// BRANCH_CONDITION_FLAG_UNSET                       
     83// BRANCH_CONDITION_FLAG_SET                         
     84// BRANCH_CONDITION_READ_REGISTER_WITHOUT_WRITE_STACK
     85// BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK   
     86// BRANCH_CONDITION_READ_STACK                       
     87
     88
     89#define update_btb(cond)  true
     90
     91#define update_dir(cond)  ((cond == BRANCH_CONDITION_FLAG_UNSET) or \
     92                           (cond == BRANCH_CONDITION_FLAG_SET))
     93
     94#define update_ras(cond)  ((cond == BRANCH_CONDITION_NONE_WITH_WRITE_STACK         ) or \
     95                           (cond == BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK) or \
     96                           (cond == BRANCH_CONDITION_READ_STACK                    ))
     97
     98#define push_ras(cond)    ((cond == BRANCH_CONDITION_NONE_WITH_WRITE_STACK         ) or \
     99                           (cond == BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK))
     100
     101#define pop_ras(cond)     ((cond == BRANCH_CONDITION_READ_STACK                    ))
     102
     103#define need_update(cond) update_ras(cond)
    45104
    46105}; // end namespace update_prediction_table
     
    51110}; // end namespace behavioural
    52111 
     112  template<> inline std::string toString<morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::event_state_t>(const morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::event_state_t& x)
     113  {
     114    switch (x)
     115      {
     116      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::EVENT_STATE_OK                   : return "ok"                  ; break;
     117      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::EVENT_STATE_FLUSH_UFPT           : return "flush_ufpt"          ; break;
     118      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::EVENT_STATE_FLUSH_UFPT_AND_UPT   : return "flush_ufpt_and_upt"  ; break;
     119      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::EVENT_STATE_FLUSH_UPT_RAS        : return "flush_upt_ras"       ; break;
     120      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::EVENT_STATE_FLUSH_UPT            : return "flush_upt"           ; break;
     121      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::EVENT_STATE_UPDATE_CONTEXT       : return "update_context"      ; break;
     122      default    : return ""      ; break;
     123      }
     124  };
    53125
    54   template<> inline std::string toString<morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::state_t>(const morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::state_t& x)
     126  template<> inline std::string toString<morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::ufpt_state_t>(const morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::ufpt_state_t& x)
     127  {
     128    switch (x)
     129      {
     130      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_FETCH_PREDICTION_STATE_EMPTY      : return "empty"     ; break;
     131      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_FETCH_PREDICTION_STATE_WAIT_DECOD : return "wait_decod"; break;
     132      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_FETCH_PREDICTION_STATE_EVENT      : return "event"     ; break;
     133      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_FETCH_PREDICTION_STATE_END        : return "end"       ; break;
     134      default    : return ""      ; break;
     135      }
     136  };
     137
     138  template<> inline std::string toString<morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::upt_state_t>(const morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::upt_state_t& x)
    55139  {
    56140    switch (x)
    57141      {
    58142      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_EMPTY      : return "empty"     ; break;
    59       case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_WAIT_DECOD : return "wait_decod"; break;
    60       case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_WAITEND    : return "waitend"   ; break;
    61       case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_EVENT      : return "event"     ; break;
     143      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_WAIT_END   : return "wait_end"  ; break;
    62144      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_OK         : return "ok"        ; break;
    63145      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_KO         : return "ko"        ; break;
     146      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_EVENT      : return "event"     ; break;
    64147      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_END        : return "end"       ; break;
    65148      default    : return ""      ; break;
     
    67150  };
    68151
    69 
    70152}; // end namespace morpheo             
    71153
Note: See TracChangeset for help on using the changeset viewer.