source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/include/OOO_Engine.h @ 101

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

1) Add soc test
2) fix bug (Pc management, Decod and execute, Update prediction ...)

  • Property svn:keywords set to Id
File size: 18.3 KB
Line 
1#ifndef morpheo_behavioural_core_multi_ooo_engine_ooo_engine_OOO_Engine_h
2#define morpheo_behavioural_core_multi_ooo_engine_ooo_engine_OOO_Engine_h
3
4/*
5 * $Id: OOO_Engine.h 101 2009-01-15 17:19:08Z rosiere $
6 *
7 * [ Description ]
8 *
9 */
10
11#ifdef SYSTEMC
12#include "systemc.h"
13#endif
14
15#include "Behavioural/Core/Multi_OOO_Engine/OOO_Engine/include/Parameters.h"
16#include "Behavioural/include/Types.h"
17
18#ifdef STATISTICS
19#include "Behavioural/include/Stat.h"
20#endif
21#include "Behavioural/include/Component.h"
22#ifdef VHDL
23#include "Behavioural/include/Vhdl.h"
24#endif
25#include "Behavioural/include/Usage.h"
26
27#include "Common/include/ToString.h"
28#include "Common/include/Debug.h"
29
30#include <iostream>
31
32#include "Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/include/Rename_unit.h"
33#include "Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Commit_unit/include/Commit_unit.h"
34#include "Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Issue_queue/include/Issue_queue.h"
35#include "Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Reexecute_unit/include/Reexecute_unit.h"
36#include "Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Special_Register_unit/include/Special_Register_unit.h"
37#include "Behavioural/Core/Multi_OOO_Engine/OOO_Engine/OOO_Engine_Glue/include/OOO_Engine_Glue.h"
38
39namespace morpheo {
40namespace behavioural {
41namespace core {
42namespace multi_ooo_engine {
43namespace ooo_engine {
44
45  class OOO_Engine
46#if SYSTEMC
47    : public sc_module
48#endif
49  {
50    // -----[ fields ]----------------------------------------------------
51    // Parameters
52  protected : const std::string  _name;
53  protected : const Parameters * _param;
54  private   : const Tusage_t     _usage;
55
56#ifdef STATISTICS
57  public    : Stat                           * _stat;
58#endif
59
60  public    : Component                      * _component;
61  private   : Interfaces                     * _interfaces;
62
63#ifdef SYSTEMC
64    // ~~~~~[ Interface ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
65    // ~~~~~[ Interface : "" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
66  public    : SC_CLOCK                      *  in_CLOCK ;
67  public    : SC_IN (Tcontrol_t)            *  in_NRESET;
68
69    // ~~~~~[ Interface : "rename" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
70  public    : SC_IN (Tcontrol_t        )  ***  in_RENAME_VAL                       ;//[nb_front_end][nb_inst_decod]
71  public    : SC_OUT(Tcontrol_t        )  *** out_RENAME_ACK                       ;//[nb_front_end][nb_inst_decod]
72  public    : SC_IN (Tcontext_t        )  ***  in_RENAME_FRONT_END_ID              ;//[nb_front_end][nb_inst_decod]
73  public    : SC_IN (Tcontext_t        )  ***  in_RENAME_CONTEXT_ID                ;//[nb_front_end][nb_inst_decod]
74  public    : SC_IN (Tdepth_t          )  ***  in_RENAME_DEPTH                     ;//[nb_front_end][nb_inst_decod]
75  public    : SC_IN (Ttype_t           )  ***  in_RENAME_TYPE                      ;//[nb_front_end][nb_inst_decod]
76  public    : SC_IN (Toperation_t      )  ***  in_RENAME_OPERATION                 ;//[nb_front_end][nb_inst_decod]
77  public    : SC_IN (Tcontrol_t        )  ***  in_RENAME_NO_EXECUTE                ;//[nb_front_end][nb_inst_decod]
78  public    : SC_IN (Tcontrol_t        )  ***  in_RENAME_IS_DELAY_SLOT             ;//[nb_front_end][nb_inst_decod]
79  public    : SC_IN (Taddress_t        )  ***  in_RENAME_ADDRESS                   ;//[nb_front_end][nb_inst_decod]
80  public    : SC_IN (Tcontrol_t        )  ***  in_RENAME_HAS_IMMEDIAT              ;//[nb_front_end][nb_inst_decod]
81  public    : SC_IN (Tgeneral_data_t   )  ***  in_RENAME_IMMEDIAT                  ;//[nb_front_end][nb_inst_decod]
82  public    : SC_IN (Tcontrol_t        )  ***  in_RENAME_READ_RA                   ;//[nb_front_end][nb_inst_decod]
83  public    : SC_IN (Tgeneral_address_t)  ***  in_RENAME_NUM_REG_RA                ;//[nb_front_end][nb_inst_decod]
84  public    : SC_IN (Tcontrol_t        )  ***  in_RENAME_READ_RB                   ;//[nb_front_end][nb_inst_decod]
85  public    : SC_IN (Tgeneral_address_t)  ***  in_RENAME_NUM_REG_RB                ;//[nb_front_end][nb_inst_decod]
86  public    : SC_IN (Tcontrol_t        )  ***  in_RENAME_READ_RC                   ;//[nb_front_end][nb_inst_decod]
87  public    : SC_IN (Tspecial_address_t)  ***  in_RENAME_NUM_REG_RC                ;//[nb_front_end][nb_inst_decod]
88  public    : SC_IN (Tcontrol_t        )  ***  in_RENAME_WRITE_RD                  ;//[nb_front_end][nb_inst_decod]
89  public    : SC_IN (Tgeneral_address_t)  ***  in_RENAME_NUM_REG_RD                ;//[nb_front_end][nb_inst_decod]
90  public    : SC_IN (Tcontrol_t        )  ***  in_RENAME_WRITE_RE                  ;//[nb_front_end][nb_inst_decod]
91  public    : SC_IN (Tspecial_address_t)  ***  in_RENAME_NUM_REG_RE                ;//[nb_front_end][nb_inst_decod]
92  public    : SC_IN (Texception_t      )  ***  in_RENAME_EXCEPTION_USE             ;//[nb_front_end][nb_inst_decod]
93  public    : SC_IN (Texception_t      )  ***  in_RENAME_EXCEPTION                 ;//[nb_front_end][nb_inst_decod]
94
95    // ~~~~~[ Interface : "issue" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
96  public    : SC_OUT(Tcontrol_t        )   ** out_ISSUE_VAL                        ;//[nb_inst_issue]
97  public    : SC_IN (Tcontrol_t        )   **  in_ISSUE_ACK                        ;//[nb_inst_issue]
98  public    : SC_OUT(Tcontext_t        )   ** out_ISSUE_FRONT_END_ID               ;//[nb_inst_issue]
99  public    : SC_OUT(Tcontext_t        )   ** out_ISSUE_CONTEXT_ID                 ;//[nb_inst_issue]
100  public    : SC_OUT(Tpacket_t         )   ** out_ISSUE_PACKET_ID                  ;//[nb_inst_issue]
101  public    : SC_OUT(Ttype_t           )   ** out_ISSUE_TYPE                       ;//[nb_inst_issue]
102  public    : SC_OUT(Toperation_t      )   ** out_ISSUE_OPERATION                  ;//[nb_inst_issue]
103  public    : SC_OUT(Tlsq_ptr_t        )   ** out_ISSUE_STORE_QUEUE_PTR_WRITE      ;//[nb_inst_issue]
104  public    : SC_OUT(Tlsq_ptr_t        )   ** out_ISSUE_LOAD_QUEUE_PTR_WRITE       ;//[nb_inst_issue]
105  public    : SC_OUT(Tcontrol_t        )   ** out_ISSUE_HAS_IMMEDIAT               ;//[nb_inst_issue]
106  public    : SC_OUT(Tgeneral_data_t   )   ** out_ISSUE_IMMEDIAT                   ;//[nb_inst_issue]
107  public    : SC_OUT(Tcontrol_t        )   ** out_ISSUE_READ_RA                    ;//[nb_inst_issue]
108  public    : SC_OUT(Tgeneral_address_t)   ** out_ISSUE_NUM_REG_RA                 ;//[nb_inst_issue]
109  public    : SC_OUT(Tcontrol_t        )   ** out_ISSUE_READ_RB                    ;//[nb_inst_issue]
110  public    : SC_OUT(Tgeneral_address_t)   ** out_ISSUE_NUM_REG_RB                 ;//[nb_inst_issue]
111  public    : SC_OUT(Tcontrol_t        )   ** out_ISSUE_READ_RC                    ;//[nb_inst_issue]
112  public    : SC_OUT(Tspecial_address_t)   ** out_ISSUE_NUM_REG_RC                 ;//[nb_inst_issue]
113  public    : SC_OUT(Tcontrol_t        )   ** out_ISSUE_WRITE_RD                   ;//[nb_inst_issue]
114  public    : SC_OUT(Tgeneral_address_t)   ** out_ISSUE_NUM_REG_RD                 ;//[nb_inst_issue]
115  public    : SC_OUT(Tcontrol_t        )   ** out_ISSUE_WRITE_RE                   ;//[nb_inst_issue]
116  public    : SC_OUT(Tspecial_address_t)   ** out_ISSUE_NUM_REG_RE                 ;//[nb_inst_issue]
117
118    // ~~~~~[ Interface "execute_loop" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
119  public    : SC_IN (Tcontrol_t        )  ***  in_EXECUTE_LOOP_VAL                 ;//[nb_execute_loop][nb_inst_execute]
120  public    : SC_OUT(Tcontrol_t        )  *** out_EXECUTE_LOOP_ACK                 ;//[nb_execute_loop][nb_inst_execute]
121  public    : SC_IN (Tcontext_t        )  ***  in_EXECUTE_LOOP_FRONT_END_ID        ;//[nb_execute_loop][nb_inst_execute]
122  public    : SC_IN (Tcontext_t        )  ***  in_EXECUTE_LOOP_CONTEXT_ID          ;//[nb_execute_loop][nb_inst_execute]
123  public    : SC_IN (Tpacket_t         )  ***  in_EXECUTE_LOOP_PACKET_ID           ;//[nb_execute_loop][nb_inst_execute]
124//public    : SC_IN (Ttype_t           )  ***  in_EXECUTE_LOOP_TYPE                ;//[nb_execute_loop][nb_inst_execute]
125//public    : SC_IN (Toperation_t      )  ***  in_EXECUTE_LOOP_OPERATION           ;//[nb_execute_loop][nb_inst_execute]
126  public    : SC_IN (Tspecial_data_t   )  ***  in_EXECUTE_LOOP_FLAGS               ;//[nb_execute_loop][nb_inst_execute]
127  public    : SC_IN (Texception_t      )  ***  in_EXECUTE_LOOP_EXCEPTION           ;//[nb_execute_loop][nb_inst_execute]
128  public    : SC_IN (Tcontrol_t        )  ***  in_EXECUTE_LOOP_NO_SEQUENCE         ;//[nb_execute_loop][nb_inst_execute]
129  public    : SC_IN (Taddress_t        )  ***  in_EXECUTE_LOOP_ADDRESS             ;//[nb_execute_loop][nb_inst_execute]
130  public    : SC_IN (Tgeneral_data_t   )  ***  in_EXECUTE_LOOP_DATA                ;//[nb_execute_loop][nb_inst_execute]
131
132    // ~~~~~[ Interface "insert" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
133  public    : SC_OUT(Tcontrol_t        )   ** out_INSERT_VAL                       ;//[nb_inst_insert]
134  public    : SC_IN (Tcontrol_t        )   **  in_INSERT_ACK                       ;//[nb_inst_insert]
135  public    : SC_OUT(Tcontrol_t        )   ** out_INSERT_RD_USE                    ;//[nb_inst_insert]
136  public    : SC_OUT(Tgeneral_address_t)   ** out_INSERT_RD_NUM_REG                ;//[nb_inst_insert]
137  public    : SC_OUT(Tcontrol_t        )   ** out_INSERT_RE_USE                    ;//[nb_inst_insert]
138  public    : SC_OUT(Tspecial_address_t)   ** out_INSERT_RE_NUM_REG                ;//[nb_inst_insert]
139
140//     // ~~~~~[ Interface "retire" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
141//   public    : SC_OUT(Tcontrol_t        )   ** out_RETIRE_VAL                       ;//[nb_inst_retire]
142//   public    : SC_IN (Tcontrol_t        )   **  in_RETIRE_ACK                       ;//[nb_inst_retire]
143//   public    : SC_OUT(Tcontrol_t        )   ** out_RETIRE_RD_OLD_USE                ;//[nb_inst_retire]
144//   public    : SC_OUT(Tgeneral_address_t)   ** out_RETIRE_RD_OLD_NUM_REG            ;//[nb_inst_retire]
145//   public    : SC_OUT(Tcontrol_t        )   ** out_RETIRE_RD_NEW_USE                ;//[nb_inst_retire]
146//   public    : SC_OUT(Tgeneral_address_t)   ** out_RETIRE_RD_NEW_NUM_REG            ;//[nb_inst_retire]
147//   public    : SC_OUT(Tcontrol_t        )   ** out_RETIRE_RE_OLD_USE                ;//[nb_inst_retire]
148//   public    : SC_OUT(Tspecial_address_t)   ** out_RETIRE_RE_OLD_NUM_REG            ;//[nb_inst_retire]
149//   public    : SC_OUT(Tcontrol_t        )   ** out_RETIRE_RE_NEW_USE                ;//[nb_inst_retire]
150//   public    : SC_OUT(Tspecial_address_t)   ** out_RETIRE_RE_NEW_NUM_REG            ;//[nb_inst_retire]
151
152    // ~~~~~[ Interface : "branch_complete" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~         
153  public    : SC_OUT(Tcontrol_t        )   ** out_BRANCH_COMPLETE_VAL              ;//[nb_inst_branch_complete]
154  public    : SC_IN (Tcontrol_t        )   **  in_BRANCH_COMPLETE_ACK              ;//[nb_inst_branch_complete]
155  public    : SC_OUT(Tcontext_t        )   ** out_BRANCH_COMPLETE_FRONT_END_ID     ;//[nb_inst_branch_complete]
156  public    : SC_OUT(Tcontext_t        )   ** out_BRANCH_COMPLETE_CONTEXT_ID       ;//[nb_inst_branch_complete]
157  public    : SC_OUT(Tdepth_t          )   ** out_BRANCH_COMPLETE_DEPTH            ;//[nb_inst_branch_complete]
158  public    : SC_OUT(Taddress_t        )   ** out_BRANCH_COMPLETE_ADDRESS          ;//[nb_inst_branch_complete]
159  public    : SC_OUT(Tcontrol_t        )   ** out_BRANCH_COMPLETE_NO_SEQUENCE      ;//[nb_inst_branch_complete]
160  public    : SC_IN (Tcontrol_t        )   **  in_BRANCH_COMPLETE_MISS_PREDICTION  ;//[nb_inst_branch_complete]
161                                                                                   
162    // ~~~~~[ Interface : "commit_event" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
163  public    : SC_OUT(Tcontrol_t        )    * out_COMMIT_EVENT_VAL                 ;
164  public    : SC_IN (Tcontrol_t        )    *  in_COMMIT_EVENT_ACK                 ;
165  public    : SC_OUT(Tcontext_t        )    * out_COMMIT_EVENT_FRONT_END_ID        ;
166  public    : SC_OUT(Tcontext_t        )    * out_COMMIT_EVENT_CONTEXT_ID          ;
167  public    : SC_OUT(Tdepth_t          )    * out_COMMIT_EVENT_DEPTH               ;
168  public    : SC_OUT(Tevent_type_t     )    * out_COMMIT_EVENT_TYPE                ;
169  public    : SC_OUT(Tcontrol_t        )    * out_COMMIT_EVENT_IS_DELAY_SLOT       ;
170  public    : SC_OUT(Taddress_t        )    * out_COMMIT_EVENT_ADDRESS             ;
171  public    : SC_OUT(Taddress_t        )    * out_COMMIT_EVENT_ADDRESS_EPCR        ;
172  public    : SC_OUT(Tcontrol_t        )    * out_COMMIT_EVENT_ADDRESS_EEAR_VAL    ;
173  public    : SC_OUT(Tgeneral_data_t   )    * out_COMMIT_EVENT_ADDRESS_EEAR        ;
174
175    // ~~~~~[ Interface "event" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
176  public    : SC_IN (Tcontrol_t        )  ***  in_EVENT_VAL                        ;//[nb_front_end][nb_context]
177  public    : SC_OUT(Tcontrol_t        )  *** out_EVENT_ACK                        ;//[nb_front_end][nb_context]
178  public    : SC_IN (Taddress_t        )  ***  in_EVENT_ADDRESS                    ;//[nb_front_end][nb_context]
179  public    : SC_IN (Taddress_t        )  ***  in_EVENT_ADDRESS_NEXT               ;//[nb_front_end][nb_context]
180  public    : SC_IN (Tcontrol_t        )  ***  in_EVENT_ADDRESS_NEXT_VAL           ;//[nb_front_end][nb_context]
181  public    : SC_IN (Tcontrol_t        )  ***  in_EVENT_IS_DS_TAKE                 ;//[nb_front_end][nb_context]
182
183    // ~~~~~[ Interface "spr_event" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
184  public    : SC_IN (Tcontrol_t        )  ***  in_SPR_EVENT_VAL                    ;//[nb_front_end][nb_context]
185  public    : SC_OUT(Tcontrol_t        )  *** out_SPR_EVENT_ACK                    ;//[nb_front_end][nb_context]
186  public    : SC_IN (Tspr_t            )  ***  in_SPR_EVENT_EPCR                   ;//[nb_front_end][nb_context]
187  public    : SC_IN (Tcontrol_t        )  ***  in_SPR_EVENT_EEAR_WEN               ;//[nb_front_end][nb_context]
188  public    : SC_IN (Tspr_t            )  ***  in_SPR_EVENT_EEAR                   ;//[nb_front_end][nb_context]
189  public    : SC_IN (Tcontrol_t        )  ***  in_SPR_EVENT_SR_DSX                 ;//[nb_front_end][nb_context]
190  public    : SC_IN (Tcontrol_t        )  ***  in_SPR_EVENT_SR_TO_ESR              ;//[nb_front_end][nb_context]
191                                                                                   
192    // ~~~~~[ Interface : "nb_inst" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~         
193  public    : SC_OUT(Tcounter_t        )  *** out_NB_INST_COMMIT_ALL               ;//[nb_front_end][nb_context]
194  public    : SC_OUT(Tcounter_t        )  *** out_NB_INST_COMMIT_MEM               ;//[nb_front_end][nb_context]
195                                                                                   
196    // ~~~~~[ Interface : "depth" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~         
197  public    : SC_IN (Tdepth_t          )  ***  in_DEPTH_MIN                        ;//[nb_front_end][nb_context]
198  public    : SC_IN (Tdepth_t          )  ***  in_DEPTH_MAX                        ;//[nb_front_end][nb_context]
199  public    : SC_IN (Tcontrol_t        )  ***  in_DEPTH_FULL                       ;//[nb_front_end][nb_context]
200
201    // ~~~~~[ Interface : "spr" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~         
202  public    : SC_OUT(Tcontrol_t        )  *** out_SPR_SR_IEE                       ;//[nb_front_end][nb_context] - Interrupt Exception Enabled
203  public    : SC_OUT(Tcontrol_t        )  *** out_SPR_SR_EPH                       ;//[nb_front_end][nb_context] - Exception Prefix High
204
205    // ~~~~~[ Component ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
206  private   : morpheo::behavioural::core::multi_ooo_engine::ooo_engine::rename_unit          ::Rename_unit           ** _component_rename_unit          ;
207  private   : morpheo::behavioural::core::multi_ooo_engine::ooo_engine::commit_unit          ::Commit_unit            * _component_commit_unit          ;
208  private   : morpheo::behavioural::core::multi_ooo_engine::ooo_engine::issue_queue          ::Issue_queue            * _component_issue_queue          ;
209  private   : morpheo::behavioural::core::multi_ooo_engine::ooo_engine::reexecute_unit       ::Reexecute_unit         * _component_reexecute_unit       ;   
210  private   : morpheo::behavioural::core::multi_ooo_engine::ooo_engine::special_register_unit::Special_Register_unit  * _component_special_register_unit;
211  private   : morpheo::behavioural::core::multi_ooo_engine::ooo_engine::ooo_engine_glue      ::OOO_Engine_Glue        * _component_glue                 ;
212
213    // ~~~~~[ Register ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
214
215    // ~~~~~[ Internal ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
216#endif
217
218    // -----[ Methods ]---------------------------------------------------
219
220#ifdef SYSTEMC
221    SC_HAS_PROCESS (OOO_Engine);
222#endif
223  public  :          OOO_Engine             
224  (
225#ifdef SYSTEMC
226   sc_module_name                                name,
227#else                                         
228   std::string                                   name,
229#endif                                         
230#ifdef STATISTICS
231   morpheo::behavioural::Parameters_Statistics * param_statistics,
232#endif
233   Parameters                                  * param,
234   morpheo::behavioural::Tusage_t                usage
235   );
236  public  :          ~OOO_Engine             (void);
237                                               
238  private : void        allocation                (
239#ifdef STATISTICS
240                                                   morpheo::behavioural::Parameters_Statistics * param_statistics
241#else
242                                                   void
243#endif
244                                                   );
245  private : void        deallocation              (void);
246                                               
247#ifdef SYSTEMC                                 
248# if defined(STATISTICS) or defined(VHDL_TESTBENCH)
249  public  : void        transition                (void);
250# endif                                       
251#endif                                         
252
253#if VHDL                                       
254  public  : void        vhdl                      (void);
255#endif                                         
256
257#ifdef STATISTICS
258  public  : void        statistics_allocation     (morpheo::behavioural::Parameters_Statistics * param_statistics);
259  public  : void        statistics_deallocation   (void);
260#endif
261#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
262  private : void        end_cycle                 (void);
263#endif
264  };
265
266}; // end namespace ooo_engine
267}; // end namespace multi_ooo_engine
268}; // end namespace core
269
270}; // end namespace behavioural
271}; // end namespace morpheo             
272
273#endif
Note: See TracBrowser for help on using the repository browser.