source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Load_store_unit/include/Types.h @ 138

Last change on this file since 138 was 138, checked in by rosiere, 14 years ago

1) add counters_t type for interface
2) fix in check load in load_store_unit
3) add parameters (but not yet implemented)
4) change environment and add script (distcc_env.sh ...)
5) add warning if an unser change rename flag with l.mtspr instruction
6) ...

  • Property svn:keywords set to Id
File size: 18.0 KB
Line 
1#ifndef morpheo_behavioural_core_multi_execute_loop_execute_loop_multi_execute_unit_execute_unit_load_store_unit_Types_h
2#define morpheo_behavioural_core_multi_execute_loop_execute_loop_multi_execute_unit_execute_unit_load_store_unit_Types_h
3
4/*
5 * $Id: Types.h 138 2010-05-12 17:34:01Z rosiere $
6 *
7 * [ Description ]
8 *
9 */
10
11#include "Behavioural/include/Types.h"
12#include "Common/include/ToString.h"
13#include "Common/include/FromString.h"
14#include "Common/include/ErrorMorpheo.h"
15#include <ostream>
16
17namespace morpheo {
18namespace behavioural {
19namespace core {
20namespace multi_execute_loop {
21namespace execute_loop {
22namespace multi_execute_unit {
23namespace execute_unit {
24namespace load_store_unit {
25
26#define DCACHE_REQ_IS_LOAD(x)   (x<<1)
27#define DCACHE_REQ_IS_STORE(x) ((x<<1)|1)
28
29#define DCACHE_RSP_IS_LOAD(x)  ((x&1)==0)
30#define DCACHE_RSP_IS_STORE(x) ((x&1)==1)
31
32
33  typedef enum 
34    {
35       NO_SPECULATIVE_LOAD     //each load wait all previous store before the data cache access
36      ,SPECULATIVE_LOAD_ACCESS //each load wait all previous store before the commiting
37    //,SPECULATIVE_LOAD_COMMIT //each load commit the result before the end of dependence's check
38    //,SPECULATIVE_LOAD_BYPASS //each load bypass the result before the end of dependence's check
39    } Tspeculative_load_t; 
40 
41  typedef enum
42    {
43      SELECT_STORE_QUEUE,
44      SELECT_LOAD_QUEUE ,
45      SELECT_LOAD_QUEUE_SPECULATIVE
46    } Tselect_queue_t;
47 
48  // ----------------------------------------------------------
49  // Store Queue
50  // ----------------------------------------------------------
51
52  typedef enum
53    {
54      STORE_QUEUE_EMPTY                   //entry is empty
55      ,STORE_QUEUE_NO_VALID_NO_SPECULATIVE //entry is the top of rob, and operation isn't arrive
56      ,STORE_QUEUE_VALID_SPECULATIVE       //entry is arrive and wait the top of rob
57      ,STORE_QUEUE_VALID_NO_SPECULATIVE    //entry is ok, can be access at a dcache port.
58      ,STORE_QUEUE_COMMIT                  //entry have access at dcache
59    } Tstore_queue_state_t;
60
61  class Tstore_queue_entry_t
62  {
63  public    : Tstore_queue_state_t _state               ;
64  public    : Tcontext_t           _context_id          ;
65  public    : Tcontext_t           _front_end_id        ;
66  public    : Tcontext_t           _ooo_engine_id       ;
67  public    : Tpacket_t            _packet_id           ;
68  public    : Toperation_t         _operation           ;
69  public    : Tcontrol_t           _cancel              ;
70  public    : Tlsq_ptr_t           _load_queue_ptr_write;
71  public    : Tdcache_address_t    _address             ;
72  public    : Tgeneral_data_t      _wdata               ;
73//public    : Tcontrol_t           _write_rd            ;
74//public    : Tgeneral_address_t   _num_reg_rd          ;
75  public    : Texception_t         _exception           ;
76  public    : bool                 _send_commit         ;
77
78    friend std::ostream & operator << (std::ostream& os, const Tstore_queue_entry_t & x) 
79    {
80      return os << " * state                               : " << x._state << std::endl
81                << "   * packet                            : " << toString(x._packet_id) << std::endl
82                << "   * context, front_end, ooo_engine_id : " << toString(x._context_id) << " - " << toString(x._front_end_id) << " - " << toString(x._ooo_engine_id) << std::endl
83                << "   * operation, cancel                 : " << toString(x._operation) << " - " << toString(x._cancel) << std::endl
84                << "   * load_ptr                          : " << toString(x._load_queue_ptr_write) << std::endl
85                << "   * exception                         : " << toString(x._exception) << std::endl
86                << std::hex
87                << "   * address                           : " << toString(x._address)<< std::endl
88                << "   * wdata                             : " << toString(x._wdata) << std::endl
89                << std::dec;
90    }
91  };
92 
93 
94
95  // ----------------------------------------------------------
96  // Speculative_Access  Queue
97  // ----------------------------------------------------------
98
99  typedef enum
100    {
101      SPECULATIVE_ACCESS_QUEUE_EMPTY            //entry is empty
102      ,SPECULATIVE_ACCESS_QUEUE_WAIT_CACHE      //entry is valid and can access at the dcache
103      ,SPECULATIVE_ACCESS_QUEUE_WAIT_LOAD_QUEUE //entry wait an empty slot in load queue
104    } Tspeculative_access_queue_state_t;
105
106  class Tspeculative_access_queue_entry_t
107  {
108  public    : Tspeculative_access_queue_state_t  _state                ;
109  public    : Tcontext_t                         _context_id           ;
110  public    : Tcontext_t                         _front_end_id         ;
111  public    : Tcontext_t                         _ooo_engine_id        ;
112  public    : Tpacket_t                          _packet_id            ;
113  public    : Toperation_t                       _operation            ;
114  public    : Tcontrol_t                         _cancel               ;
115  public    : Tlsq_ptr_t                         _load_queue_ptr_write ;
116  public    : Tlsq_ptr_t                         _store_queue_ptr_write;
117  public    : Tlsq_ptr_t                         _store_queue_ptr_read ;
118  public    : Tcontrol_t                         _store_queue_empty    ;
119  public    : Tdcache_address_t                  _address              ;
120  public    : Tcontrol_t                         _write_rd             ;
121  public    : Tgeneral_address_t                 _num_reg_rd           ;
122  public    : Texception_t                       _exception            ;
123
124    friend std::ostream & operator << (std::ostream& os, const Tspeculative_access_queue_entry_t & x)
125    {
126      return os << " * state                               : " << x._state << std::endl
127                << "   * packet                            : " << toString(x._packet_id) << std::endl
128                << "   * context, front_end, ooo_engine_id : " << toString(x._context_id) << " - " << toString(x._front_end_id) << " - " << toString(x._ooo_engine_id) << std::endl
129                << "   * operation, cancel                 : " << toString(x._operation) << " - " << toString(x._cancel) << std::endl
130                << "   * load, store ptr_(write/read) empty: " << toString(x._load_queue_ptr_write) << " - " << toString(x._store_queue_ptr_write) << " - " << toString(x._store_queue_ptr_read) << " - " << toString(x._store_queue_empty) << std::endl
131                << "   * exception                         : " << toString(x._exception) << std::endl
132                << std::hex
133                << "   * address                           : " << toString(x._address)<< std::endl
134                << std::dec
135                << "   * write_rd, num_reg_rd              : " << toString(x._write_rd) << " - " << toString(x._num_reg_rd)<< std::endl;
136    }
137  };
138
139  // ----------------------------------------------------------
140  // Load  Queue
141  // ----------------------------------------------------------
142
143  //                                   HAVE_DCACHE_RSP MUST_CHECK DECOD_BARRIER
144  // OPERATION_MEMORY_LOAD             X               X          -
145  // OPERATION_MEMORY_LOCK             -               -          -
146  // OPERATION_MEMORY_INVALIDATE       -               -          X (mtspr)
147  // OPERATION_MEMORY_PREFETCH         -               -          -
148  // OPERATION_MEMORY_FLUSH            -               -          X (mtspr)
149  // OPERATION_MEMORY_SYNCHRONIZATION  X               -          X (msync, psync, csync)
150 
151#define have_dcache_rsp(x) (is_operation_memory_load(x) or (x==OPERATION_MEMORY_SYNCHRONIZATION))
152#define must_check(x)      (is_operation_memory_load(x))
153
154  typedef enum
155    {
156      LOAD_QUEUE_EMPTY         //entry is empty
157      ,LOAD_QUEUE_WAIT_CHECK   //entry must wait the respons and check dependence with store
158      ,LOAD_QUEUE_WAIT         //entry must wait the respons
159      ,LOAD_QUEUE_COMMIT_CHECK //entry must check dependence and can commit speculative
160      ,LOAD_QUEUE_CHECK        //entry must check dependence with store
161      ,LOAD_QUEUE_COMMIT       //entry must commit the instruction
162    } Tload_queue_state_t;
163
164  class Tload_queue_entry_t
165  {
166  public    : Tload_queue_state_t  _state            ;
167  public    : Tcontext_t           _context_id       ;
168  public    : Tcontext_t           _front_end_id     ;
169  public    : Tcontext_t           _ooo_engine_id    ;
170  public    : Tpacket_t            _packet_id        ;
171  public    : Toperation_t         _operation        ;
172  public    : Tcontrol_t           _cancel           ;
173  public    : Tlsq_ptr_t           _store_queue_ptr_write;
174  public    : Tlsq_ptr_t           _store_queue_ptr_read ;
175  public    : Tcontrol_t           _store_queue_empty    ;
176  public    : Tdcache_address_t    _address          ;
177  public    : Tdcache_address_t    _check_hit_byte   ; 
178  public    : Tcontrol_t           _check_hit        ;
179  public    : Tdcache_address_t    _shift            ;
180  public    : Tcontrol_t           _is_load_signed   ;
181  public    : Taccess_t            _access_size      ;
182  public    : Tgeneral_data_t      _rdata            ;
183  public    : Tcontrol_t           _write_rd         ;
184  public    : Tgeneral_address_t   _num_reg_rd       ;
185  public    : Texception_t         _exception        ;
186  public    : Tcontrol_t           _can_speculative_commit;
187
188    friend std::ostream & operator << (std::ostream& os, const Tload_queue_entry_t & x)
189    {
190      return os << " * state                               : " << x._state << std::endl
191                << "   * packet                            : " << toString(x._packet_id) << std::endl
192                << "   * context, front_end, ooo_engine_id : " << toString(x._context_id) << " - " << toString(x._front_end_id) << " - " << toString(x._ooo_engine_id) << std::endl
193                << "   * operation, cancel                 : " << toString(x._operation) << " - " << toString(x._cancel) << std::endl
194                << "   * store_queue ptr_(write,read) empty: " << toString(x._store_queue_ptr_write) << " - " << toString(x._store_queue_ptr_read) << " - " << toString(x._store_queue_empty) <<std::endl
195                << "   * exception                         : " << toString(x._exception) << std::endl
196                << "   * check_hit, check_hit_byte         : " << toString(x._check_hit) << " - " << toString(x._check_hit_byte) << std::endl
197                << "   * can_speculative_commit            : " << toString(x._can_speculative_commit) << std::endl
198                << std::hex
199                << "   * address                           : " << toString(x._address)<< std::endl
200                << "   * rdata                             : " << toString(x._rdata) << std::endl
201                << std::dec
202                << "   * write_rd, num_reg_rd              : " << toString(x._write_rd) << " - " << toString(x._num_reg_rd)<< std::endl;
203    }
204
205  };
206
207}; // end namespace load_store_unit
208}; // end namespace execute_unit
209}; // end namespace multi_execute_unit
210}; // end namespace execute_loop
211}; // end namespace multi_execute_loop
212}; // end namespace core
213}; // end namespace behavioural
214
215  template<> inline std::string toString<morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::Tspeculative_load_t>(const morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::Tspeculative_load_t& x)
216  {
217    switch (x)
218      {
219      case morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::NO_SPECULATIVE_LOAD     : return "no_speculative_load"    ; break;
220      case morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::SPECULATIVE_LOAD_ACCESS : return "speculative_load_access"; break;
221//    case morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::SPECULATIVE_LOAD_COMMIT : return "speculative_load_commit"; break;
222//    case morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::SPECULATIVE_LOAD_BYPASS : return "speculative_load_bypass"; break;
223      default    : return ""      ; break;
224      }
225  };
226
227  template<> inline morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::Tspeculative_load_t fromString<morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::Tspeculative_load_t>(const std::string& x)
228  {
229    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::NO_SPECULATIVE_LOAD    ))) == 0) or
230        (x.compare(toString(                      morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::NO_SPECULATIVE_LOAD     )) == 0))
231      return morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::NO_SPECULATIVE_LOAD;
232    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::SPECULATIVE_LOAD_ACCESS))) == 0) or
233        (x.compare(toString(                      morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::SPECULATIVE_LOAD_ACCESS )) == 0))
234      return morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::SPECULATIVE_LOAD_ACCESS;
235//  if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::SPECULATIVE_LOAD_COMMIT))) == 0) or
236//      (x.compare(toString(                      morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::SPECULATIVE_LOAD_COMMIT )) == 0))
237//    return morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::SPECULATIVE_LOAD_COMMIT;
238//  if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::SPECULATIVE_LOAD_BYPASS))) == 0) or
239//      (x.compare(toString(                      morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::SPECULATIVE_LOAD_BYPASS )) == 0))
240//    return morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::SPECULATIVE_LOAD_BYPASS;
241   
242    throw (ErrorMorpheo ("<fromString> : Unknow string : \""+x+"\""));
243  };
244
245
246  template<> inline std::string toString<morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::Tstore_queue_state_t>(const morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::Tstore_queue_state_t& x)
247  {
248    switch (x)
249      {
250      case morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::STORE_QUEUE_EMPTY                   : return "empty"                  ; break;
251      case morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::STORE_QUEUE_NO_VALID_NO_SPECULATIVE : return "no_valid_no_speculative"; break;
252      case morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::STORE_QUEUE_VALID_SPECULATIVE       : return "valid_speculative"      ; break;
253      case morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::STORE_QUEUE_VALID_NO_SPECULATIVE    : return "valid_no_speculative"   ; break;
254      case morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::STORE_QUEUE_COMMIT                  : return "commit"                 ; break;
255      default    : return ""      ; break;
256      }
257  };
258
259  template<> inline std::string toString<morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::Tspeculative_access_queue_state_t>(const morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::Tspeculative_access_queue_state_t& x)
260  {
261    switch (x)
262      {
263      case morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::SPECULATIVE_ACCESS_QUEUE_EMPTY           : return "empty"          ; break;
264      case morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::SPECULATIVE_ACCESS_QUEUE_WAIT_CACHE      : return "wait_cache"     ; break;
265      case morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::SPECULATIVE_ACCESS_QUEUE_WAIT_LOAD_QUEUE : return "wait_load_queue"; break;
266      default    : return ""      ; break;
267      }
268  };
269
270  template<> inline std::string toString<morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::Tload_queue_state_t>(const morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::Tload_queue_state_t& x)
271  {
272    switch (x)
273      {
274      case morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::LOAD_QUEUE_EMPTY        : return "empty"       ; break;
275      case morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::LOAD_QUEUE_WAIT_CHECK   : return "wait_check"  ; break;
276      case morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::LOAD_QUEUE_WAIT         : return "wait"        ; break;
277      case morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::LOAD_QUEUE_COMMIT_CHECK : return "commit_check"; break;
278      case morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::LOAD_QUEUE_CHECK        : return "check"       ; break;
279      case morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::LOAD_QUEUE_COMMIT       : return "commit"      ; break;
280      default    : return ""      ; break;
281      }
282  };
283
284}; // end namespace morpheo             
285
286#endif
Note: See TracBrowser for help on using the repository browser.