source: trunk/IPs/systemC/processor/Morpheo/Behavioural/include/Types.h @ 111

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

1) Decod_queue : multi implementation (one_fifo, multi_fifo)
2) Issue_queue : multi implementation (in_order, out_of_order)
3) Direction : Add Meta predictor
4) Context_State : re add Branch_complete, More priority to Load miss (is not speculative)
5) Return_Address_Stack : update reg_PREDICT pointer on decod miss prediction
6) UPT : Fix bug in multi event
7) Prediction_glue : in read_stack case, insert in UPT pc_next
8) Rename select : when rob have an event (need flush), read_r{a,b,c} and write_r{d,e} is set at 0

  • Property svn:keywords set to Id
File size: 12.3 KB
Line 
1#ifndef morpheo_behavioural_Types_h
2#define morpheo_behavioural_Types_h
3
4#include "Common/include/Types.h"
5#include "Common/include/ToString.h"
6#include "Common/include/FromString.h"
7#include "Common/include/ErrorMorpheo.h"
8#include "Behavioural/include/Constants.h"
9
10namespace morpheo {
11namespace behavioural {
12 
13  //============================================
14  // Type definition
15  //============================================
16
17  // ***** general
18  typedef uint32_t           Tinstruction_t;
19  typedef bool               Tcontrol_t;
20  typedef uint8_t            Texception_t;
21  typedef uint8_t            Tcontext_t;
22  typedef uint8_t            Tpacket_t;
23  typedef uint8_t            Toperation_t;
24  typedef uint8_t            Ttype_t;
25  typedef uint8_t            Tcounter_t; // universal counter
26  typedef uint8_t            Tptr_t;     // universal pointer
27  typedef uint32_t           Tspr_t;
28  typedef uint16_t           Tspr_address_t;
29
30//typedef uint32_t           Tdestination1_t;
31//typedef uint32_t           Tdestination2_t;
32//typedef uint32_t           Texec_flag_t;
33//typedef bool               Texec_excep_t;
34                             
35  // ***** Event             
36  typedef uint8_t            Tevent_state_t;
37  typedef uint8_t            Tevent_type_t;
38                             
39  // ***** Register         
40  typedef uint32_t           Tgeneral_address_t;
41  typedef uint32_t           Tgeneral_data_t;
42  typedef uint32_t           Tspecial_address_t;
43  typedef uint32_t           Tspecial_data_t;
44                             
45  // ~~~~~ prediction_unit   
46  typedef uint32_t           Thistory_t;
47  typedef Tptr_t             Tprediction_ptr_t;
48  typedef uint8_t            Tbranch_state_t;
49  typedef uint8_t            Tbranch_condition_t;
50  typedef Tprediction_ptr_t  Tdepth_t;
51  typedef Tgeneral_data_t    Taddress_t;
52
53  // ***** component dependant
54  // ~~~~~ load store queue
55  typedef uint8_t            Taccess_t;
56  typedef Tptr_t             Tlsq_ptr_t;
57  typedef Tgeneral_address_t Tdcache_address_t;
58  typedef Tgeneral_data_t    Tdcache_data_t;
59  typedef bool               Tdcache_error_t;
60  typedef uint8_t            Tdcache_type_t;
61                             
62                             
63  // ~~~~~ ifetch           
64  typedef Tptr_t             Tinst_ifetch_ptr_t;
65  typedef Tptr_t             Tifetch_queue_ptr_t;
66  typedef Tgeneral_address_t Ticache_address_t;
67  typedef Tgeneral_data_t    Ticache_instruction_t;
68  typedef bool               Ticache_error_t;
69  typedef uint8_t            Ticache_type_t;
70
71  typedef enum
72    {
73      ORBIS32,
74      ORBIS64,
75      ORFPX32,
76      ORFPX64,
77      ORVDX64
78    } ISA;
79
80  typedef enum
81    {
82      PRIORITY_STATIC,
83      PRIORITY_ROUND_ROBIN
84    } Tpriority_t;
85
86  typedef enum
87    {
88      LOAD_BALANCING_BALANCE,
89      LOAD_BALANCING_MAXIMUM_FOR_PRIORITY
90    } Tload_balancing_t;
91
92  typedef enum
93    {
94      VICTIM_RANDOM     , // Random
95      VICTIM_ROUND_ROBIN, // Round Robin
96      VICTIM_NLU        , // Not Last Used
97      VICTIM_PSEUDO_LRU , // Pseudo Least Recently Used
98      VICTIM_LRU        , // Least Recently Used
99      VICTIM_FIFO         // First IN First OUT
100    } Tvictim_t;
101
102  typedef enum
103    {
104      PREDICTOR_NEVER_TAKE      , // Branch is never  Take
105      PREDICTOR_ALWAYS_TAKE     , // Branch is always Take
106      PREDICTOR_STATIC          , // If the address of destination is previous, then the branch is take
107      PREDICTOR_LAST_TAKE       , // The direction is as the last time (if is the first time : static)
108      PREDICTOR_COUNTER         , // Counter table
109      PREDICTOR_LOCAL           , // Counter bank indexed with history bank
110      PREDICTOR_GLOBAL          , // Counter bank indexed with history table
111      PREDICTOR_META            , // A meta_predictor choose between 2 predictor : the local or the global
112      PREDICTOR_CUSTOM            // Not predefined scheme
113    } Tpredictor_t;
114
115  //--------------------------------------------------[ instruction ]-----
116  class instruction_t
117  {
118  public :
119    Ttype_t      _type      ;
120    Toperation_t _operation ;
121    ISA          _isa_subset;
122    uint8_t      _isa_class ;
123
124    instruction_t (Ttype_t      type      ,
125                   Toperation_t operation ,
126                   ISA          isa_subset,
127                   uint8_t      isa_class )
128    {
129      _type       = type      ;
130      _operation  = operation ;
131      _isa_subset = isa_subset;
132      _isa_class  = isa_class ;
133    }
134  };
135
136  instruction_t instruction_information (uint32_t instruction);
137  uint32_t      instruction_size_data   (uint32_t instruction);
138
139  //----------------------------------------------[ spr_mode_access ]-----
140  class spr_access_mode_t
141  {
142  public : uint8_t _user_access_mode      ;
143  public : uint8_t _supervisor_access_mode;
144   
145  public : spr_access_mode_t (uint32_t user_access_mode       = SPR_ACCESS_MODE_NONE,
146                              uint32_t supervisor_access_mode = SPR_ACCESS_MODE_NONE)
147    {
148      _user_access_mode       = user_access_mode      ;
149      _supervisor_access_mode = supervisor_access_mode;
150    }
151  };
152
153}; // end namespace behavioural
154
155  template<> inline std::string toString<morpheo::behavioural::Tpriority_t>(const morpheo::behavioural::Tpriority_t& x)
156  {
157    switch (x)
158      {
159      case morpheo::behavioural::PRIORITY_STATIC      : return "priority_static"; break;
160      case morpheo::behavioural::PRIORITY_ROUND_ROBIN : return "priority_round_robin"; break;
161      default    : return ""      ; break;
162      }
163  };
164
165  template<> inline morpheo::behavioural::Tpriority_t fromString<morpheo::behavioural::Tpriority_t>(const std::string& x)
166  {
167    if ( (x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::PRIORITY_STATIC))) == 0) or
168         (x.compare("priority_static")      == 0))
169      return morpheo::behavioural::PRIORITY_STATIC;
170    if ( (x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::PRIORITY_ROUND_ROBIN))) == 0) or
171         (x.compare("priority_round_robin") == 0))
172      return morpheo::behavioural::PRIORITY_ROUND_ROBIN;
173    throw (ERRORMORPHEO ("fromString","Unknow string : \""+x+"\""));
174  };
175
176  template<> inline std::string toString<morpheo::behavioural::Tload_balancing_t>(const morpheo::behavioural::Tload_balancing_t& x)
177  {
178    switch (x)
179      {
180      case morpheo::behavioural::LOAD_BALANCING_BALANCE              : return "load_balancing_balance"; break;
181      case morpheo::behavioural::LOAD_BALANCING_MAXIMUM_FOR_PRIORITY : return "load_balancing_maximum_for_priority"; break;
182      default    : return ""      ; break;
183      }
184  };
185
186  template<> inline morpheo::behavioural::Tload_balancing_t fromString<morpheo::behavioural::Tload_balancing_t>(const std::string& x)
187  {
188    if ( (x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::LOAD_BALANCING_BALANCE))) == 0) or
189         (x.compare("load_balancing_balance") == 0))
190      return morpheo::behavioural::LOAD_BALANCING_BALANCE;
191    if ( (x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::LOAD_BALANCING_MAXIMUM_FOR_PRIORITY))) == 0) or
192         (x.compare("load_balancing_maximum_for_priority") == 0))
193      return morpheo::behavioural::LOAD_BALANCING_MAXIMUM_FOR_PRIORITY;
194    throw (ERRORMORPHEO ("fromString","Unknow string : \""+x+"\""));
195  };
196
197  template<> inline std::string toString<morpheo::behavioural::Tvictim_t>(const morpheo::behavioural::Tvictim_t& x)
198  {
199    switch (x)
200      {
201      case morpheo::behavioural::VICTIM_RANDOM      : return "victim_random"     ; break;
202      case morpheo::behavioural::VICTIM_ROUND_ROBIN : return "victim_round_robin"; break;
203      case morpheo::behavioural::VICTIM_NLU         : return "victim_nlu"        ; break;
204      case morpheo::behavioural::VICTIM_PSEUDO_LRU  : return "victim_pseudo_lru" ; break;
205      case morpheo::behavioural::VICTIM_LRU         : return "victim_lru"        ; break;
206      case morpheo::behavioural::VICTIM_FIFO        : return "victim_fifo"       ; break;
207      default    : return ""      ; break;
208      }
209  };
210
211  template<> inline morpheo::behavioural::Tvictim_t fromString<morpheo::behavioural::Tvictim_t>(const std::string& x)
212  {
213    if ( (x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::VICTIM_RANDOM     ))) == 0) or
214         (x.compare("victim_random")      == 0))
215      return morpheo::behavioural::VICTIM_RANDOM;
216    if ( (x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::VICTIM_ROUND_ROBIN))) == 0) or
217         (x.compare("victim_round_robin") == 0))
218      return morpheo::behavioural::VICTIM_ROUND_ROBIN;
219    if ( (x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::VICTIM_NLU        ))) == 0) or
220         (x.compare("victim_nlu")         == 0))
221      return morpheo::behavioural::VICTIM_NLU;
222    if ( (x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::VICTIM_PSEUDO_LRU ))) == 0) or
223         (x.compare("victim_pseudo_lru")  == 0))
224      return morpheo::behavioural::VICTIM_PSEUDO_LRU;
225    if ( (x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::VICTIM_LRU        ))) == 0) or
226         (x.compare("victim_lru")         == 0))
227      return morpheo::behavioural::VICTIM_LRU;
228    if ( (x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::VICTIM_FIFO       ))) == 0) or
229         (x.compare("victim_fifo")        == 0))
230      return morpheo::behavioural::VICTIM_FIFO;
231    throw (ERRORMORPHEO ("fromString","Unknow string : \""+x+"\""));
232  };
233
234  template<> inline std::string toString<morpheo::behavioural::Tpredictor_t>(const morpheo::behavioural::Tpredictor_t& x)
235  {
236    switch (x)
237      {
238      case morpheo::behavioural::PREDICTOR_NEVER_TAKE  : return "predictor_never_take" ; break;
239      case morpheo::behavioural::PREDICTOR_ALWAYS_TAKE : return "predictor_always_take"; break;
240      case morpheo::behavioural::PREDICTOR_STATIC      : return "predictor_static"     ; break;
241      case morpheo::behavioural::PREDICTOR_LAST_TAKE   : return "predictor_last_take"  ; break;
242      case morpheo::behavioural::PREDICTOR_COUNTER     : return "predictor_counter"    ; break;
243      case morpheo::behavioural::PREDICTOR_LOCAL       : return "predictor_local"      ; break;
244      case morpheo::behavioural::PREDICTOR_GLOBAL      : return "predictor_global"     ; break;
245      case morpheo::behavioural::PREDICTOR_META        : return "predictor_meta"       ; break;
246      case morpheo::behavioural::PREDICTOR_CUSTOM      : return "predictor_custom"     ; break;
247      default    : return ""      ; break;
248      }
249  };
250
251  template<> inline morpheo::behavioural::Tpredictor_t fromString<morpheo::behavioural::Tpredictor_t>(const std::string& x)
252  {
253    if ( (x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::PREDICTOR_NEVER_TAKE ))) == 0) or
254         (x.compare("predictor_never_take")  == 0))
255      return morpheo::behavioural::PREDICTOR_NEVER_TAKE;
256    if ( (x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::PREDICTOR_ALWAYS_TAKE))) == 0) or
257         (x.compare("predictor_always_take") == 0))
258      return morpheo::behavioural::PREDICTOR_ALWAYS_TAKE;
259    if ( (x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::PREDICTOR_STATIC     ))) == 0) or
260         (x.compare("predictor_static")      == 0))
261      return morpheo::behavioural::PREDICTOR_STATIC;
262    if ( (x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::PREDICTOR_LAST_TAKE  ))) == 0) or
263         (x.compare("predictor_last_take")   == 0))
264      return morpheo::behavioural::PREDICTOR_LAST_TAKE;
265    if ( (x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::PREDICTOR_COUNTER    ))) == 0) or
266         (x.compare("predictor_counter")     == 0))
267      return morpheo::behavioural::PREDICTOR_COUNTER;
268    if ( (x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::PREDICTOR_LOCAL      ))) == 0) or
269         (x.compare("predictor_local")       == 0))
270      return morpheo::behavioural::PREDICTOR_LOCAL;
271    if ( (x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::PREDICTOR_GLOBAL     ))) == 0) or
272         (x.compare("predictor_global")      == 0))
273      return morpheo::behavioural::PREDICTOR_GLOBAL;
274    if ( (x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::PREDICTOR_META       ))) == 0) or
275         (x.compare("predictor_meta")        == 0))
276      return morpheo::behavioural::PREDICTOR_META;
277    if ( (x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::PREDICTOR_CUSTOM     ))) == 0) or
278         (x.compare("predictor_custom")      == 0))
279      return morpheo::behavioural::PREDICTOR_CUSTOM;
280    throw (ERRORMORPHEO ("fromString","Unknow string : \""+x+"\""));
281  };
282
283}; // end namespace morpheo             
284#endif
Note: See TracBrowser for help on using the repository browser.