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

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

1) add test with SPECINT2K
2) new config of Selftest
3) modif RAT to support multiple depth_save ... but not finish (need fix Update Prediction Table)
4) add Function_pointer but need fix

  • Property svn:keywords set to Id
File size: 15.1 KB
Line 
1#ifndef morpheo_behavioural_core_multi_execute_loop_execute_loop_multi_execute_unit_execute_unit_load_store_unit_Load_store_unit_h
2#define morpheo_behavioural_core_multi_execute_loop_execute_loop_multi_execute_unit_execute_unit_load_store_unit_Load_store_unit_h
3
4/*
5 * $Id: Load_store_unit.h 145 2010-10-13 18:15:51Z rosiere $
6 *
7 * [ Description ]
8 *
9 * Ce composant peut être amélioré en placant deux ptr de lecture au lieu d'un : un pour l'accès au cache et un pour le commit
10 */
11
12#ifdef SYSTEMC
13#include "systemc.h"
14#endif
15
16#include "Common/include/ToString.h"
17#include "Common/include/Debug.h"
18
19#include "Behavioural/Generic/Queue_Control/include/Queue_Control.h"
20
21#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Load_store_unit/include/Types.h"
22#include "Behavioural/Generic/Queue_Control/include/Queue_Control.h"
23#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Load_store_unit/include/Parameters.h"
24#ifdef STATISTICS
25#include "Behavioural/include/Stat.h"
26#endif
27#include "Behavioural/include/Component.h"
28#ifdef VHDL
29#include "Behavioural/include/Vhdl.h"
30#endif
31#include "Behavioural/include/Usage.h"
32
33#include <iostream>
34#include <fstream>
35
36namespace morpheo {
37namespace behavioural {
38namespace core {
39namespace multi_execute_loop {
40namespace execute_loop {
41namespace multi_execute_unit {
42namespace execute_unit {
43namespace load_store_unit {
44
45
46  class Load_store_unit
47#if SYSTEMC
48    : public sc_module
49#endif
50  {
51    // -----[ fields ]----------------------------------------------------
52    // Parameters
53  protected : const std::string  _name;
54  protected : const Parameters * _param;
55  private   : const Tusage_t     _usage;
56
57#ifdef STATISTICS
58  public    : Stat                           * _stat;
59
60  private   : counter_t                      * _stat_use_store_queue;
61  private   : counter_t                      * _stat_use_load_queue;
62  private   : counter_t                      * _stat_use_speculative_access_queue;
63
64  private   : counter_t                      * _stat_average_use_store_queue;
65  private   : counter_t                      * _stat_average_use_load_queue;
66  private   : counter_t                      * _stat_average_use_speculative_access_queue;
67
68  private   : counter_t                      * _stat_percent_use_store_queue;
69  private   : counter_t                      * _stat_percent_use_load_queue;
70  private   : counter_t                      * _stat_percent_use_speculative_access_queue;
71
72  private   : counter_t                      * _stat_nb_inst_load;
73  private   : counter_t                      * _stat_nb_inst_load_commit_speculative;
74  private   : counter_t                      * _stat_nb_inst_load_commit_miss;
75
76//   private   : counter_t                      * _stat_nb_load_miss_speculation;
77//   private   : counter_t                      * _stat_nb_head_ko;
78
79//   private   : counter_t                      * _stat_nb_inst_load;
80//   private   : counter_t                      * _stat_nb_inst_store;
81//   private   : counter_t                      * _stat_nb_inst_lock;
82//   private   : counter_t                      * _stat_nb_inst_prefetch;
83//   private   : counter_t                      * _stat_nb_inst_invalid;
84//   private   : counter_t                      * _stat_nb_inst_flush;
85//   private   : counter_t                      * _stat_nb_inst_sync;
86#endif
87
88  public    : Component                      * _component;
89  private   : Interfaces                     * _interfaces;
90
91#ifdef SYSTEMC
92    // ~~~~~[ Interface ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
93    // Interface
94  public    : SC_CLOCK                      *  in_CLOCK        ;
95  public    : SC_IN (Tcontrol_t)            *  in_NRESET       ;
96
97    // ~~~~~[ Interface "memory_in" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
98  public    : SC_IN (Tcontrol_t        )   **  in_MEMORY_IN_VAL                  ;//[nb_inst_memory]
99  public    : SC_OUT(Tcontrol_t        )   ** out_MEMORY_IN_ACK                  ;//[nb_inst_memory]
100  public    : SC_IN (Tcontext_t        )   **  in_MEMORY_IN_CONTEXT_ID           ;//[nb_inst_memory]
101  public    : SC_IN (Tcontext_t        )   **  in_MEMORY_IN_FRONT_END_ID         ;//[nb_inst_memory]
102  public    : SC_IN (Tcontext_t        )   **  in_MEMORY_IN_OOO_ENGINE_ID        ;//[nb_inst_memory]
103  public    : SC_IN (Tpacket_t         )   **  in_MEMORY_IN_PACKET_ID            ;//[nb_inst_memory]
104  public    : SC_IN (Toperation_t      )   **  in_MEMORY_IN_OPERATION            ;//[nb_inst_memory]
105  public    : SC_IN (Ttype_t           )   **  in_MEMORY_IN_TYPE                 ;//[nb_inst_memory]
106  public    : SC_IN (Tcontrol_t        )   **  in_MEMORY_IN_CANCEL               ;//[nb_inst_memory]
107  public    : SC_IN (Tlsq_ptr_t        )   **  in_MEMORY_IN_STORE_QUEUE_PTR_WRITE;//[nb_inst_memory]
108  public    : SC_IN (Tlsq_ptr_t        )   **  in_MEMORY_IN_STORE_QUEUE_PTR_READ ;//[nb_inst_memory]
109  public    : SC_IN (Tcontrol_t        )   **  in_MEMORY_IN_STORE_QUEUE_EMPTY    ;//[nb_inst_memory]
110  public    : SC_IN (Tlsq_ptr_t        )   **  in_MEMORY_IN_LOAD_QUEUE_PTR_WRITE ;//[nb_inst_memory]
111  public    : SC_IN (Tcontrol_t        )   **  in_MEMORY_IN_HAS_IMMEDIAT         ;//[nb_inst_memory]
112  public    : SC_IN (Tgeneral_data_t   )   **  in_MEMORY_IN_IMMEDIAT             ;//[nb_inst_memory] // memory address
113  public    : SC_IN (Tgeneral_data_t   )   **  in_MEMORY_IN_DATA_RA              ;//[nb_inst_memory] // memory address
114  public    : SC_IN (Tgeneral_data_t   )   **  in_MEMORY_IN_DATA_RB              ;//[nb_inst_memory] // data        (store)
115  public    : SC_IN (Tspecial_data_t   )   **  in_MEMORY_IN_DATA_RC              ;//[nb_inst_memory]
116  public    : SC_IN (Tcontrol_t        )   **  in_MEMORY_IN_WRITE_RD             ;//[nb_inst_memory] // = (operation==load)
117  public    : SC_IN (Tgeneral_address_t)   **  in_MEMORY_IN_NUM_REG_RD           ;//[nb_inst_memory] // destination (load)
118  public    : SC_IN (Tcontrol_t        )   **  in_MEMORY_IN_WRITE_RE             ;//[nb_inst_memory]
119  public    : SC_IN (Tspecial_address_t)   **  in_MEMORY_IN_NUM_REG_RE           ;//[nb_inst_memory]
120
121    // ~~~~~[ Interface "memory_out" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
122  public    : SC_OUT(Tcontrol_t        )   ** out_MEMORY_OUT_VAL                 ;//[nb_inst_memory]
123  public    : SC_IN (Tcontrol_t        )   **  in_MEMORY_OUT_ACK                 ;//[nb_inst_memory]
124  public    : SC_OUT(Tcontext_t        )   ** out_MEMORY_OUT_CONTEXT_ID          ;//[nb_inst_memory]
125  public    : SC_OUT(Tcontext_t        )   ** out_MEMORY_OUT_FRONT_END_ID        ;//[nb_inst_memory]
126  public    : SC_OUT(Tcontext_t        )   ** out_MEMORY_OUT_OOO_ENGINE_ID       ;//[nb_inst_memory]
127  public    : SC_OUT(Tpacket_t         )   ** out_MEMORY_OUT_PACKET_ID           ;//[nb_inst_memory]
128//public    : SC_OUT(Toperation_t      )   ** out_MEMORY_OUT_OPERATION           ;//[nb_inst_memory]
129//public    : SC_OUT(Ttype_t           )   ** out_MEMORY_OUT_TYPE                ;//[nb_inst_memory]
130  public    : SC_OUT(Tcontrol_t        )   ** out_MEMORY_OUT_CANCEL              ;//[nb_inst_memory]
131  public    : SC_OUT(Tcontrol_t        )   ** out_MEMORY_OUT_WRITE_RD            ;//[nb_inst_memory] // = (operation==load)
132  public    : SC_OUT(Tgeneral_address_t)   ** out_MEMORY_OUT_NUM_REG_RD          ;//[nb_inst_memory] // destination (load)
133  public    : SC_OUT(Tgeneral_data_t   )   ** out_MEMORY_OUT_DATA_RD             ;//[nb_inst_memory] // data        (load)
134  public    : SC_OUT(Tcontrol_t        )   ** out_MEMORY_OUT_WRITE_RE            ;//[nb_inst_memory]
135  public    : SC_OUT(Tspecial_address_t)   ** out_MEMORY_OUT_NUM_REG_RE          ;//[nb_inst_memory]
136  public    : SC_OUT(Tspecial_data_t   )   ** out_MEMORY_OUT_DATA_RE             ;//[nb_inst_memory]
137  public    : SC_OUT(Texception_t      )   ** out_MEMORY_OUT_EXCEPTION           ;//[nb_inst_memory]
138  public    : SC_OUT(Tcontrol_t        )   ** out_MEMORY_OUT_NO_SEQUENCE         ;//[nb_inst_memory]
139  public    : SC_OUT(Taddress_t        )   ** out_MEMORY_OUT_ADDRESS             ;//[nb_inst_memory]
140   
141    // ~~~~~[ Interface "dcache_req" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
142  public    : SC_OUT(Tcontrol_t        )   ** out_DCACHE_REQ_VAL                 ;//[nb_cache_port]
143  public    : SC_IN (Tcontrol_t        )   **  in_DCACHE_REQ_ACK                 ;//[nb_cache_port]
144  public    : SC_OUT(Tcontext_t        )   ** out_DCACHE_REQ_CONTEXT_ID          ;//[nb_cache_port]
145  public    : SC_OUT(Tpacket_t         )   ** out_DCACHE_REQ_PACKET_ID           ;//[nb_cache_port]
146  public    : SC_OUT(Tdcache_address_t )   ** out_DCACHE_REQ_ADDRESS             ;//[nb_cache_port]
147  public    : SC_OUT(Tdcache_type_t    )   ** out_DCACHE_REQ_TYPE                ;//[nb_cache_port]
148  public    : SC_OUT(Tdcache_data_t    )   ** out_DCACHE_REQ_WDATA               ;//[nb_cache_port]
149
150    // ~~~~~[ Interface "dcache_rsp" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
151  public    : SC_IN (Tcontrol_t        )   **  in_DCACHE_RSP_VAL                 ;//[nb_cache_port]
152  public    : SC_OUT(Tcontrol_t        )   ** out_DCACHE_RSP_ACK                 ;//[nb_cache_port]
153  public    : SC_IN (Tcontext_t        )   **  in_DCACHE_RSP_CONTEXT_ID          ;//[nb_cache_port]
154  public    : SC_IN (Tpacket_t         )   **  in_DCACHE_RSP_PACKET_ID           ;//[nb_cache_port]
155  public    : SC_IN (Tdcache_data_t    )   **  in_DCACHE_RSP_RDATA               ;//[nb_cache_port]
156  public    : SC_IN (Tdcache_error_t   )   **  in_DCACHE_RSP_ERROR               ;//[nb_cache_port]
157
158    // ~~~~~[ Interface "bypass_memory" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
159  public    : SC_OUT(Tcontrol_t        )   ** out_BYPASS_MEMORY_VAL          ; //[nb_bypass_memory]
160  public    : SC_OUT(Tcontext_t        )   ** out_BYPASS_MEMORY_OOO_ENGINE_ID; //[nb_bypass_memory]
161  public    : SC_OUT(Tgeneral_address_t)   ** out_BYPASS_MEMORY_NUM_REG      ; //[nb_bypass_memory]
162  public    : SC_OUT(Tgeneral_data_t   )   ** out_BYPASS_MEMORY_DATA         ; //[nb_bypass_memory]
163
164    // ~~~~~[ Component ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
165  protected : Tstore_queue_entry_t                                        * _store_queue                     ;//[size_store_queue]
166  protected : Tload_queue_entry_t                                         * _load_queue                      ;//[size_load_queue]
167  protected : Tspeculative_access_queue_entry_t                           * _speculative_access_queue        ;//[size_speculative_access_queue]
168  protected : morpheo::behavioural::generic::queue_control::Queue_Control * _speculative_access_queue_control;
169
170    // function pointer
171  public    : void (morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::Load_store_unit::*function_transition     ) (void);
172  public    : void (morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::Load_store_unit::*function_genMoore       ) (void);
173  public    : void (morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::Load_store_unit::*function_genMealy_dcache) (void);
174  public    : void (morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::Load_store_unit::*function_genMealy_insert) (void);
175  public    : void (morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::load_store_unit::Load_store_unit::*function_genMealy_retire) (void);
176
177    // ~~~~~[ Register ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
178
179    // ~~~~~[ Internal ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
180
181    // Registers
182  public    : Tlsq_ptr_t                    * reg_STORE_QUEUE_NB_CHECK     ;//[size_store_queue]
183//public    : Tcontrol_t                    * reg_STORE_QUEUE_INVALID      ;//[size_store_queue]
184  public    : Tlsq_ptr_t                      reg_STORE_QUEUE_PTR_READ     ;
185//public    : Tlsq_ptr_t                      reg_LOAD_QUEUE_PTR_READ      ;
186  public    : Tlsq_ptr_t                      reg_LOAD_QUEUE_CHECK_PRIORITY;
187
188    // signal
189  public    : Tlsq_ptr_t                      internal_SPECULATIVE_ACCESS_QUEUE_PTR_READ ;
190                                             
191  private   : Tcontrol_t                      internal_MEMORY_IN_ACK          ;
192  private   : uint32_t                        internal_MEMORY_IN_PORT         ;
193
194  private   : Tcontrol_t                      internal_MEMORY_OUT_VAL         ;
195  private   : Tselect_queue_t                 internal_MEMORY_OUT_SELECT_QUEUE;
196  private   : Tlsq_ptr_t                      internal_MEMORY_OUT_PTR         ;
197                                             
198  private   : Tcontrol_t                      internal_DCACHE_RSP_ACK         ;
199  private   : Tcontrol_t                      internal_DCACHE_REQ_VAL         ;
200  private   : Tselect_queue_t                 internal_DCACHE_REQ_SELECT_QUEUE;
201
202#if defined(DEBUG) and defined(DEBUG_Load_store_unit) and (DEBUG_Load_store_unit == true)
203  private   : std::ofstream                 * memory_log_file;
204#endif
205
206#endif
207
208
209    // -----[ methods ]---------------------------------------------------
210
211#ifdef SYSTEMC
212    SC_HAS_PROCESS (Load_store_unit);
213#endif
214  public  :          Load_store_unit             
215  (
216#ifdef SYSTEMC
217   sc_module_name                                name,
218#else                                         
219   std::string                                   name,
220#endif                                         
221#ifdef STATISTICS
222   morpheo::behavioural::Parameters_Statistics * param_statistics,
223#endif
224   Parameters                                  * param,
225   morpheo::behavioural::Tusage_t                usage );
226  public  :          ~Load_store_unit             (void);
227                                               
228#ifdef SYSTEMC                                 
229  private : void     allocation                (void);
230  private : void     deallocation              (void);
231
232  public  : void     constant                  (void);
233  public  : void     transition                (void);
234  public  : void     genMoore                  (void);
235  public  : void     genMealy_dcache           (void);
236  public  : void     genMealy_insert           (void);
237  public  : void     genMealy_retire           (void);
238   
239  public  : void     function_speculative_load_commit_transition      (void);
240  public  : void     function_speculative_load_commit_genMoore        (void);
241  public  : void     function_speculative_load_commit_genMealy_dcache (void);
242  public  : void     function_speculative_load_commit_genMealy_insert (void);
243  public  : void     function_speculative_load_commit_genMealy_retire (void);
244#endif                                         
245
246#ifdef STATISTICS
247  public  : void     statistics_allocation     (morpheo::behavioural::Parameters_Statistics * param_statistics);
248  public  : void     statistics_deallocation   (void);
249#endif
250                                               
251#if VHDL                                       
252  public  : void     vhdl                      (void);
253  private : void     vhdl_declaration          (Vhdl * & vhdl);
254  private : void     vhdl_body                 (Vhdl * & vhdl);
255#endif                                         
256                                               
257#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
258  private : void     end_cycle                 (void);
259#endif
260  };
261
262}; // end namespace load_store_unit
263}; // end namespace execute_unit
264}; // end namespace multi_execute_unit
265}; // end namespace execute_loop
266}; // end namespace multi_execute_loop
267}; // end namespace core
268
269}; // end namespace behavioural
270}; // end namespace morpheo             
271
272#endif
Note: See TracBrowser for help on using the repository browser.