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

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

1) Update Prediction Table - New architecture (systemC) done (and tested) -> need change interface in top level
2) Change documentation on VHDL generation
3) Change VHDL constant (case std_logic and std_logic_vector)

  • Property svn:keywords set to Id
File size: 8.7 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 95 2008-12-16 16:24:26Z 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 envent (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              // branch is updated, don't update pointer
48    } upt_state_t;
49
50  class ufpt_entry_t
51  {
52  public : ufpt_state_t        _state            ;
53  public : Tbranch_condition_t _condition        ;
54  public : Taddress_t          _address_src      ;
55  public : Taddress_t          _address_dest     ;
56  public : Tcontrol_t          _last_take        ;
57//public : Tcontrol_t          _good_take        ;
58  public : Tcontrol_t          _is_accurate      ;
59  public : Thistory_t          _history          ;
60  public : Taddress_t          _address_ras      ;
61  public : Tptr_t              _index_ras        ;
62//public : Tcontrol_t          _ifetch_prediction;
63  };
64
65  class upt_entry_t
66  {
67  public : upt_state_t         _state            ;
68  public : Tbranch_condition_t _condition        ;
69  public : Taddress_t          _address_src      ;
70  public : Taddress_t          _address_dest     ;
71  public : Tcontrol_t          _last_take        ;
72  public : Tcontrol_t          _good_take        ; // not in ufpt
73  public : Tcontrol_t          _is_accurate      ;
74  public : Thistory_t          _history          ;
75  public : Taddress_t          _address_ras      ;
76  public : Tptr_t              _index_ras        ;
77  public : Tcontrol_t          _ifetch_prediction; // not in ufpt
78  };
79
80
81// BRANCH_CONDITION_NONE_WITHOUT_WRITE_STACK         
82// BRANCH_CONDITION_NONE_WITH_WRITE_STACK             
83// BRANCH_CONDITION_FLAG_UNSET                       
84// BRANCH_CONDITION_FLAG_SET                         
85// BRANCH_CONDITION_READ_REGISTER_WITHOUT_WRITE_STACK
86// BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK   
87// BRANCH_CONDITION_READ_STACK                       
88
89
90#define update_btb(cond)  true
91
92#define update_dir(cond)  ((cond == BRANCH_CONDITION_FLAG_UNSET) or \
93                           (cond == BRANCH_CONDITION_FLAG_SET))
94
95#define update_ras(cond)  ((cond == BRANCH_CONDITION_NONE_WITH_WRITE_STACK         ) or \
96                           (cond == BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK) or \
97                           (cond == BRANCH_CONDITION_READ_STACK                    ))
98
99#define push_ras(cond)    ((cond == BRANCH_CONDITION_NONE_WITH_WRITE_STACK         ) or \
100                           (cond == BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK))
101
102#define pop_ras(cond)     ((cond == BRANCH_CONDITION_READ_STACK                    ))
103
104#define need_update(cond) update_ras(cond)
105
106}; // end namespace update_prediction_table
107}; // end namespace prediction_unit
108}; // end namespace front_end
109}; // end namespace multi_front_end
110}; // end namespace core
111}; // end namespace behavioural
112 
113  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)
114  {
115    switch (x)
116      {
117      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::EVENT_STATE_OK                      : return "ok"                     ; break;
118      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::EVENT_STATE_FLUSH_UFPT              : return "flush_ufpt"             ; break;
119      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;
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      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::EVENT_STATE_WAIT_END_EVENT          : return "wait_and_event"         ; break;
123      default    : return ""      ; break;
124      }
125  };
126
127  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)
128  {
129    switch (x)
130      {
131      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_FETCH_PREDICTION_STATE_EMPTY      : return "empty"     ; break;
132      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_FETCH_PREDICTION_STATE_WAIT_DECOD : return "wait_decod"; break;
133      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_FETCH_PREDICTION_STATE_EVENT      : return "event"     ; break;
134      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_FETCH_PREDICTION_STATE_END        : return "end"       ; break;
135      default    : return ""      ; break;
136      }
137  };
138
139  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)
140  {
141    switch (x)
142      {
143      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_EMPTY      : return "empty"     ; break;
144      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_WAIT_END   : return "wait_end"  ; break;
145      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_OK         : return "ok"        ; break;
146      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_KO         : return "ko"        ; break;
147      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_EVENT      : return "event"     ; break;
148      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_END_OK     : return "end_ok"    ; break;
149      case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_END_KO     : return "end_ko"    ; break;
150      default    : return ""      ; break;
151      }
152  };
153
154}; // end namespace morpheo             
155
156#endif
Note: See TracBrowser for help on using the repository browser.