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

Last change on this file since 78 was 78, checked in by rosiere, 16 years ago

Add :

  • Execute_loop (must be test systemC)
  • Prediction
    • Direction : predifined scheme
    • Branch Target Buffer
  • iFetch_unit
    • ifetch_queue
    • pc management
  • Decod_unit
    • coming soon : support for custom operation
  • Rename_unit
    • RAT
    • Free_list
    • Dependence RAW check
    • Load store unit pointer
  • New Environnement (hierarchy_memory will remove in a next version)


Modif :

  • Manage Custom Operation
  • All component in execute_loop to use the new statistics management

Not Finish :

  • Return Address Stack
  • Environnement
File size: 12.2 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$
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    : Tlsq_ptr_t           _load_queue_ptr_write;
70  public    : Tdcache_address_t    _address             ;
71  public    : Tgeneral_data_t      _wdata               ;
72//public    : Tcontrol_t           _write_rd            ;
73//public    : Tgeneral_address_t   _num_reg_rd          ;
74  public    : Texception_t         _exception           ;
75
76    friend std::ostream & operator << (std::ostream& os, const Tstore_queue_entry_t & x) 
77    {
78      return os << " * state                               : " << x._state << std::endl
79                << "   * packet                            : " << toString(x._packet_id) << std::endl
80                << "   * context, front_end, ooo_engine_id : " << toString(x._context_id) << " - " << toString(x._front_end_id) << " - " << toString(x._ooo_engine_id) << std::endl
81                << "   * operation                         : " << toString(x._operation) << std::endl
82                << "   * load_ptr                          : " << toString(x._load_queue_ptr_write) << std::endl
83                << "   * exception                         : " << toString(x._exception) << std::endl
84                << std::hex
85                << "   * address                           : " << toString(x._address)<< std::endl
86                << "   * wdata                             : " << toString(x._wdata) << std::endl
87                << std::dec;
88    }
89  };
90 
91 
92
93  // ----------------------------------------------------------
94  // Speculative_Access  Queue
95  // ----------------------------------------------------------
96
97  typedef enum
98    {
99      SPECULATIVE_ACCESS_QUEUE_EMPTY            //entry is empty
100      ,SPECULATIVE_ACCESS_QUEUE_WAIT_CACHE      //entry is valid and can access at the dcache
101      ,SPECULATIVE_ACCESS_QUEUE_WAIT_LOAD_QUEUE //entry wait an empty slot in load queue
102    } Tspeculative_access_queue_state_t;
103
104  class Tspeculative_access_queue_entry_t
105  {
106  public    : Tspeculative_access_queue_state_t  _state                ;
107  public    : Tcontext_t                         _context_id           ;
108  public    : Tcontext_t                         _front_end_id         ;
109  public    : Tcontext_t                         _ooo_engine_id        ;
110  public    : Tpacket_t                          _packet_id            ;
111  public    : Toperation_t                       _operation            ;
112  public    : Tlsq_ptr_t                         _load_queue_ptr_write ;
113  public    : Tlsq_ptr_t                         _store_queue_ptr_write;
114  public    : Tdcache_address_t                  _address              ;
115  public    : Tcontrol_t                         _write_rd             ;
116  public    : Tgeneral_address_t                 _num_reg_rd           ;
117  public    : Texception_t                       _exception            ;
118
119    friend std::ostream & operator << (std::ostream& os, const Tspeculative_access_queue_entry_t & x)
120    {
121      return os << " * state                               : " << x._state << std::endl
122                << "   * packet                            : " << toString(x._packet_id) << std::endl
123                << "   * context, front_end, ooo_engine_id : " << toString(x._context_id) << " - " << toString(x._front_end_id) << " - " << toString(x._ooo_engine_id) << std::endl
124                << "   * operation                         : " << toString(x._operation) << std::endl
125                << "   * load, store ptr_write             : " << toString(x._load_queue_ptr_write) << " - " << toString(x._store_queue_ptr_write) << std::endl
126                << "   * exception                         : " << toString(x._exception) << std::endl
127                << std::hex
128                << "   * address                           : " << toString(x._address)<< std::endl
129                << std::dec
130                << "   * write_rd, num_reg_rd              : " << toString(x._write_rd) << " - " << toString(x._num_reg_rd)<< std::endl;
131    }
132  };
133
134  // ----------------------------------------------------------
135  // Load  Queue
136  // ----------------------------------------------------------
137
138  //                                   HAVE_DCACHE_RSP MUST_CHECK STD::DECOD_BARRIER
139  // OPERATION_MEMORY_LOAD             X               X          -
140  // OPERATION_MEMORY_LOCK             -               -          -
141  // OPERATION_MEMORY_INVALIDATE       -               -          X
142  // OPERATION_MEMORY_PREFETCH         -               -          -
143  // OPERATION_MEMORY_FLUSH            -               -          X
144  // OPERATION_MEMORY_SYNCHRONIZATION  X               -          X
145 
146#define have_dcache_rsp(x) (is_operation_memory_load(x) or (x==OPERATION_MEMORY_SYNCHRONIZATION))
147#define must_check(x)      (is_operation_memory_load(x))
148
149#define      MASK_CHECK_BYTE_HIT    0xff // 1111_1111
150 
151  typedef enum
152    {
153      LOAD_QUEUE_EMPTY         //entry is empty
154      ,LOAD_QUEUE_WAIT_CHECK   //entry must wait the respons and check dependence with store
155      ,LOAD_QUEUE_WAIT         //entry must wait the respons
156      ,LOAD_QUEUE_COMMIT_CHECK //entry must check dependence and can commit speculative
157      ,LOAD_QUEUE_CHECK        //entry must check dependence with store
158      ,LOAD_QUEUE_COMMIT       //entry must commit the instruction
159    } Tload_queue_state_t;
160
161  class Tload_queue_entry_t
162  {
163  public    : Tload_queue_state_t  _state            ;
164  public    : Tcontext_t           _context_id       ;
165  public    : Tcontext_t           _front_end_id     ;
166  public    : Tcontext_t           _ooo_engine_id    ;
167  public    : Tpacket_t            _packet_id        ;
168  public    : Toperation_t         _operation        ;
169  public    : Tlsq_ptr_t           _store_queue_ptr_write;
170  public    : Tdcache_address_t    _address          ;
171  public    : Tdcache_address_t    _check_hit_byte   ; 
172  public    : Tcontrol_t           _check_hit        ;
173  public    : Tdcache_address_t    _shift            ;
174  public    : Tcontrol_t           _is_load_signed   ;
175  public    : Taccess_t            _access_size      ;
176  public    : Tgeneral_data_t      _rdata            ;
177  public    : Tcontrol_t           _write_rd         ;
178  public    : Tgeneral_address_t   _num_reg_rd       ;
179  public    : Texception_t         _exception        ;
180
181    friend std::ostream & operator << (std::ostream& os, const Tload_queue_entry_t & x)
182    {
183      return os << " * state                               : " << x._state << std::endl
184                << "   * packet                            : " << toString(x._packet_id) << std::endl
185                << "   * context, front_end, ooo_engine_id : " << toString(x._context_id) << " - " << toString(x._front_end_id) << " - " << toString(x._ooo_engine_id) << std::endl
186                << "   * operation                         : " << toString(x._operation) << std::endl
187                << "   * store_queue_ptr_write             : " << toString(x._store_queue_ptr_write) << std::endl
188                << "   * exception                         : " << toString(x._exception) << std::endl
189                << "   * check_hit, check_hit_byte         : " << toString(x._check_hit) << " - " << toString(x._check_hit_byte) << std::endl
190                << std::hex
191                << "   * address                           : " << toString(x._address)<< std::endl
192                << "   * rdata                             : " << toString(x._rdata) << std::endl
193                << std::dec
194                << "   * write_rd, num_reg_rd              : " << toString(x._write_rd) << " - " << toString(x._num_reg_rd)<< std::endl;
195    }
196
197  };
198
199}; // end namespace load_store_unit
200}; // end namespace execute_unit
201}; // end namespace multi_execute_unit
202}; // end namespace execute_loop
203}; // end namespace multi_execute_loop
204}; // end namespace core
205}; // end namespace behavioural
206
207  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)
208  {
209    switch (x)
210      {
211      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;
212      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;
213      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;
214//       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;
215      default    : return ""      ; break;
216      }
217  };
218
219  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)
220  {
221    if ( (x.compare("0")                       == 0) or
222         (x.compare("no_speculative_load")     == 0))
223      return morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::NO_SPECULATIVE_LOAD;
224    if ( (x.compare("1")                       == 0) or
225         (x.compare("speculative_load_access") == 0))
226      return morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::SPECULATIVE_LOAD_ACCESS;
227    if ( (x.compare("2")                       == 0) or
228         (x.compare("speculative_load_commit") == 0))
229      return morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::SPECULATIVE_LOAD_COMMIT;
230//     if ( (x.compare("3")                       == 0) or
231//          (x.compare("speculative_load_bypass") == 0))
232//       return morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::SPECULATIVE_LOAD_BYPASS;
233   
234    throw (ErrorMorpheo ("<fromString> : Unknow string : \""+x+"\""));
235  };
236
237}; // end namespace morpheo             
238
239#endif
Note: See TracBrowser for help on using the repository browser.