source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/include/Types.h @ 101

Last change on this file since 101 was 101, checked in by rosiere, 15 years ago

1) Add soc test
2) fix bug (Pc management, Decod and execute, Update prediction ...)

  • Property svn:keywords set to Id
File size: 9.0 KB
Line 
1#ifndef morpheo_behavioural_core_multi_front_end_front_end_prediction_unit_update_prediction_table_Types_h
2#define morpheo_behavioural_core_multi_front_end_front_end_prediction_unit_update_prediction_table_Types_h
3
4/*
5 * $Id: Types.h 101 2009-01-15 17:19:08Z rosiere $
6 *
7 * [ Description ]
8 *
9 */
10
11#include "Behavioural/include/Types.h"
12
13namespace morpheo {
14namespace behavioural {
15namespace core {
16namespace multi_front_end {
17namespace front_end {
18namespace prediction_unit {
19namespace update_prediction_table {
20
21  typedef enum
22    {
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             , // in commit stage, detect a miss, context is stop and ufpt is flush, update RAS
27      EVENT_STATE_UPDATE_CONTEXT        , // prediction unit is update, send signal to context manager
28      EVENT_STATE_WAIT_END_EVENT          // prediction unit is ok, wait the end of event (send by Context State)
29    } event_state_t;
30
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_OK            , // branch is updated,       update pointer
47      UPDATE_PREDICTION_STATE_END_KO_WAIT_END   , // branch is updated, don't update pointer
48      UPDATE_PREDICTION_STATE_END_KO              // branch is updated, don't update pointer
49    } upt_state_t;
50
51  class ufpt_entry_t
52  {
53  public : ufpt_state_t        _state            ;
54  public : Tbranch_condition_t _condition        ;
55  public : Taddress_t          _address_src      ;
56  public : Taddress_t          _address_dest     ;
57  public : Tcontrol_t          _last_take        ;
58//public : Tcontrol_t          _good_take        ;
59  public : Tcontrol_t          _is_accurate      ;
60  public : Thistory_t          _history          ;
61  public : Taddress_t          _address_ras      ;
62  public : Tptr_t              _index_ras        ;
63//public : Tcontrol_t          _ifetch_prediction;
64  };
65
66  class upt_entry_t
67  {
68  public : upt_state_t         _state            ;
69  public : Tbranch_condition_t _condition        ;
70  public : Taddress_t          _address_src      ;
71  public : Taddress_t          _address_dest     ;
72  public : Tcontrol_t          _last_take        ;
73  public : Tcontrol_t          _good_take        ; // not in ufpt
74  public : Tcontrol_t          _is_accurate      ;
75  public : Thistory_t          _history          ;
76  public : Taddress_t          _address_ras      ;
77  public : Tptr_t              _index_ras        ;
78  public : Tcontrol_t          _ifetch_prediction; // not in ufpt
79  };
80
81
82// BRANCH_CONDITION_NONE_WITHOUT_WRITE_STACK         
83// BRANCH_CONDITION_NONE_WITH_WRITE_STACK             
84// BRANCH_CONDITION_FLAG_UNSET                       
85// BRANCH_CONDITION_FLAG_SET                         
86// BRANCH_CONDITION_READ_REGISTER_WITHOUT_WRITE_STACK
87// BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK   
88// BRANCH_CONDITION_READ_STACK                       
89
90
91#define update_btb(cond)  true
92
93#define update_dir(cond)  ((cond == BRANCH_CONDITION_FLAG_UNSET) or \
94                           (cond == BRANCH_CONDITION_FLAG_SET))
95
96#define update_ras(cond)  ((cond == BRANCH_CONDITION_NONE_WITH_WRITE_STACK         ) or \
97                           (cond == BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK) or \
98                           (cond == BRANCH_CONDITION_READ_STACK                    ))
99
100#define push_ras(cond)    ((cond == BRANCH_CONDITION_NONE_WITH_WRITE_STACK         ) or \
101                           (cond == BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK))
102
103#define pop_ras(cond)     ((cond == BRANCH_CONDITION_READ_STACK                    ))
104
105#define need_update(cond) update_ras(cond)
106
107}; // end namespace update_prediction_table
108}; // end namespace prediction_unit
109}; // end namespace front_end
110}; // end namespace multi_front_end
111}; // end namespace core
112}; // end namespace behavioural
113 
114  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)
115  {
116    switch (x)
117      {
118      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::EVENT_STATE_OK                      : return "ok"                     ; break;
119      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::EVENT_STATE_FLUSH_UFPT              : return "flush_ufpt"             ; break;
120      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;
121      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::EVENT_STATE_FLUSH_UPT               : return "flush_upt"              ; break;
122      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::EVENT_STATE_UPDATE_CONTEXT          : return "update_context"         ; break;
123      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::EVENT_STATE_WAIT_END_EVENT          : return "wait_and_event"         ; break;
124      default    : return ""      ; break;
125      }
126  };
127
128  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)
129  {
130    switch (x)
131      {
132      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_FETCH_PREDICTION_STATE_EMPTY      : return "empty"     ; break;
133      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_FETCH_PREDICTION_STATE_WAIT_DECOD : return "wait_decod"; break;
134      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_FETCH_PREDICTION_STATE_EVENT      : return "event"     ; break;
135      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_FETCH_PREDICTION_STATE_END        : return "end"       ; break;
136      default    : return ""      ; break;
137      }
138  };
139
140  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)
141  {
142    switch (x)
143      {
144      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_EMPTY      : return "empty"     ; break;
145      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_WAIT_END   : return "wait_end"  ; break;
146      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_OK         : return "ok"        ; break;
147      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_KO         : return "ko"        ; break;
148      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_EVENT      : return "event"     ; break;
149      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_END_OK     : return "end_ok"    ; break;
150      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_END_KO_WAIT_END: return "end_ko_wait_end"    ; break;
151      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_END_KO     : return "end_ko"    ; break;
152      default    : return ""      ; break;
153      }
154  };
155
156}; // end namespace morpheo             
157
158#endif
Note: See TracBrowser for help on using the repository browser.