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

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

1) Add new algo in ifetch queue
2) Add Cancel bit
3) new config

  • Property svn:keywords set to Id
File size: 13.3 KB
Line 
1#ifndef morpheo_behavioural_core_multi_ooo_engine_ooo_engine_reexecute_unit_Reexecute_unit_h
2#define morpheo_behavioural_core_multi_ooo_engine_ooo_engine_reexecute_unit_Reexecute_unit_h
3
4/*
5 * $Id: Reexecute_unit.h 136 2009-10-20 18:52:15Z rosiere $
6 *
7 * [ Description ]
8 *
9 */
10
11#ifdef SYSTEMC
12#include "systemc.h"
13#endif
14
15
16#include "Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Reexecute_unit/include/Parameters.h"
17#include "Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Reexecute_unit/include/Types.h"
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 "Behavioural/Generic/Priority/include/Priority.h"
31
32#include <iostream>
33
34namespace morpheo {
35namespace behavioural {
36
37namespace core {
38namespace multi_ooo_engine {
39namespace ooo_engine {
40namespace reexecute_unit {
41
42
43  class Reexecute_unit
44#if SYSTEMC
45    : public sc_module
46#endif
47  {
48    // -----[ fields ]----------------------------------------------------
49    // Parameters
50  protected : const std::string  _name;
51  protected : const Parameters * _param;
52  private   : const Tusage_t     _usage;
53
54#ifdef STATISTICS
55  public    : Stat                           * _stat;
56  private   : counter_t                     ** _stat_bank_nb_inst;
57  private   : counter_t                      * _stat_nb_inst_commit;
58  private   : counter_t                      * _stat_nb_inst_reexecute;
59  private   : counter_t                      * _stat_nb_spr_access;
60#endif
61
62  public    : Component                      * _component;
63  private   : Interfaces                     * _interfaces;
64
65#ifdef SYSTEMC
66    // ~~~~~[ Interface ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
67    // ~~~~~[ Interface : "" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
68  public    : SC_CLOCK                      *  in_CLOCK        ;
69  public    : SC_IN (Tcontrol_t)            *  in_NRESET       ;
70
71    // ~~~~~[ Interface "execute_loop" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
72  public    : SC_IN (Tcontrol_t         ) ***  in_EXECUTE_LOOP_VAL                     ;//[nb_execute_loop][nb_inst_execute]
73  public    : SC_OUT(Tcontrol_t         ) *** out_EXECUTE_LOOP_ACK                     ;//[nb_execute_loop][nb_inst_execute]
74  public    : SC_IN (Tcontext_t         ) ***  in_EXECUTE_LOOP_CONTEXT_ID              ;//[nb_execute_loop][nb_inst_execute]
75  public    : SC_IN (Tcontext_t         ) ***  in_EXECUTE_LOOP_FRONT_END_ID            ;//[nb_execute_loop][nb_inst_execute]
76  public    : SC_IN (Tpacket_t          ) ***  in_EXECUTE_LOOP_PACKET_ID               ;//[nb_execute_loop][nb_inst_execute]
77//public    : SC_IN (Toperation_t       ) ***  in_EXECUTE_LOOP_OPERATION               ;//[nb_execute_loop][nb_inst_execute]
78//public    : SC_IN (Ttype_t            ) ***  in_EXECUTE_LOOP_TYPE                    ;//[nb_execute_loop][nb_inst_execute]
79  public    : SC_IN (Tcontrol_t         ) ***  in_EXECUTE_LOOP_CANCEL                  ;//[nb_execute_loop][nb_inst_execute]
80  public    : SC_IN (Tspecial_data_t    ) ***  in_EXECUTE_LOOP_FLAGS                   ;//[nb_execute_loop][nb_inst_execute]
81  public    : SC_IN (Texception_t       ) ***  in_EXECUTE_LOOP_EXCEPTION               ;//[nb_execute_loop][nb_inst_execute]
82  public    : SC_IN (Tcontrol_t         ) ***  in_EXECUTE_LOOP_NO_SEQUENCE             ;//[nb_execute_loop][nb_inst_execute]
83  public    : SC_IN (Taddress_t         ) ***  in_EXECUTE_LOOP_ADDRESS                 ;//[nb_execute_loop][nb_inst_execute]
84  public    : SC_IN (Tgeneral_data_t    ) ***  in_EXECUTE_LOOP_DATA                    ;//[nb_execute_loop][nb_inst_execute]
85
86    // ~~~~~[ Interface "commit" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
87  public    : SC_OUT(Tcontrol_t         )  ** out_COMMIT_VAL                           ;//[nb_inst_commit]
88  public    : SC_IN (Tcontrol_t         )  **  in_COMMIT_ACK                           ;//[nb_inst_commit]
89  public    : SC_OUT(Tcontrol_t         )  ** out_COMMIT_WEN                           ;//[nb_inst_commit]
90//public    : SC_OUT(Tcontext_t         )  ** out_COMMIT_CONTEXT_ID                    ;//[nb_inst_commit]
91//public    : SC_OUT(Tcontext_t         )  ** out_COMMIT_FRONT_END_ID                  ;//[nb_inst_commit]
92  public    : SC_OUT(Tpacket_t          )  ** out_COMMIT_PACKET_ID                     ;//[nb_inst_commit]
93//public    : SC_OUT(Toperation_t       )  ** out_COMMIT_OPERATION                     ;//[nb_inst_commit]
94//public    : SC_OUT(Ttype_t            )  ** out_COMMIT_TYPE                          ;//[nb_inst_commit]
95  public    : SC_OUT(Tcontrol_t         )  ** out_COMMIT_CANCEL                        ;//[nb_inst_commit]
96  public    : SC_OUT(Tspecial_data_t    )  ** out_COMMIT_FLAGS                         ;//[nb_inst_commit]
97  public    : SC_OUT(Texception_t       )  ** out_COMMIT_EXCEPTION                     ;//[nb_inst_commit]
98  public    : SC_OUT(Tcontrol_t         )  ** out_COMMIT_NO_SEQUENCE                   ;//[nb_inst_commit]
99  public    : SC_OUT(Taddress_t         )  ** out_COMMIT_ADDRESS                       ;//[nb_inst_commit]
100  public    : SC_IN (Tgeneral_address_t )  **  in_COMMIT_NUM_REG_RD                    ;//[nb_inst_commit]
101
102    // ~~~~~[ Interface : "spr" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
103  public    : SC_OUT(Tcontrol_t         )  ** out_SPR_VAL                              ;//[nb_inst_reexecute]
104  public    : SC_IN (Tcontrol_t         )  **  in_SPR_ACK                              ;//[nb_inst_reexecute]
105  public    : SC_OUT(Tcontrol_t         )  ** out_SPR_WEN                              ;//[nb_inst_reexecute]
106  public    : SC_OUT(Tcontext_t         )  ** out_SPR_CONTEXT_ID                       ;//[nb_inst_reexecute]
107  public    : SC_OUT(Tcontext_t         )  ** out_SPR_FRONT_END_ID                     ;//[nb_inst_reexecute]
108  public    : SC_OUT(Tspr_address_t     )  ** out_SPR_NUM_GROUP                        ;//[nb_inst_reexecute]
109  public    : SC_OUT(Tspr_address_t     )  ** out_SPR_NUM_REG                          ;//[nb_inst_reexecute]
110  public    : SC_OUT(Tspr_t             )  ** out_SPR_WDATA                            ;//[nb_inst_reexecute]
111  public    : SC_IN (Tspr_t             )  **  in_SPR_RDATA                            ;//[nb_inst_reexecute]
112  public    : SC_IN (Tcontrol_t         )  **  in_SPR_INVALID                          ;//[nb_inst_reexecute]
113
114    // ~~~~~[ Interface : "reexecute_rob" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
115  public    : SC_IN (Tcontrol_t         )  **  in_REEXECUTE_ROB_VAL                    ;//[nb_inst_reexecute]
116  public    : SC_OUT(Tcontrol_t         )  ** out_REEXECUTE_ROB_ACK                    ;//[nb_inst_reexecute]
117  public    : SC_IN (Tcontext_t         )  **  in_REEXECUTE_ROB_CONTEXT_ID             ;//[nb_inst_reexecute]
118  public    : SC_IN (Tcontext_t         )  **  in_REEXECUTE_ROB_FRONT_END_ID           ;//[nb_inst_reexecute]
119  public    : SC_IN (Tpacket_t          )  **  in_REEXECUTE_ROB_PACKET_ID              ;//[nb_inst_reexecute]
120  public    : SC_IN (Toperation_t       )  **  in_REEXECUTE_ROB_OPERATION              ;//[nb_inst_reexecute]
121  public    : SC_IN (Ttype_t            )  **  in_REEXECUTE_ROB_TYPE                   ;//[nb_inst_reexecute]
122  public    : SC_IN (Tlsq_ptr_t         )  **  in_REEXECUTE_ROB_STORE_QUEUE_PTR_WRITE  ;//[nb_inst_reexecute]
123
124    // ~~~~~[ Interface : "reexecute" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
125  public    : SC_OUT(Tcontrol_t         )  ** out_REEXECUTE_VAL                        ;//[nb_inst_reexecute]
126  public    : SC_IN (Tcontrol_t         )  **  in_REEXECUTE_ACK                        ;//[nb_inst_reexecute]
127  public    : SC_OUT(Tcontext_t         )  ** out_REEXECUTE_CONTEXT_ID                 ;//[nb_inst_reexecute]
128  public    : SC_OUT(Tcontext_t         )  ** out_REEXECUTE_FRONT_END_ID               ;//[nb_inst_reexecute]
129  public    : SC_OUT(Tpacket_t          )  ** out_REEXECUTE_PACKET_ID                  ;//[nb_inst_reexecute]
130  public    : SC_OUT(Toperation_t       )  ** out_REEXECUTE_OPERATION                  ;//[nb_inst_reexecute]
131  public    : SC_OUT(Ttype_t            )  ** out_REEXECUTE_TYPE                       ;//[nb_inst_reexecute]
132  public    : SC_OUT(Tlsq_ptr_t         )  ** out_REEXECUTE_STORE_QUEUE_PTR_WRITE      ;//[nb_inst_reexecute]
133  public    : SC_OUT(Tlsq_ptr_t         )  ** out_REEXECUTE_STORE_QUEUE_PTR_READ       ;//[nb_inst_reexecute] //*
134  public    : SC_OUT(Tcontrol_t         )  ** out_REEXECUTE_STORE_QUEUE_EMPTY          ;//[nb_inst_reexecute] //*
135  public    : SC_OUT(Tlsq_ptr_t         )  ** out_REEXECUTE_LOAD_QUEUE_PTR_WRITE       ;//[nb_inst_reexecute] //*
136  public    : SC_OUT(Tcontrol_t         )  ** out_REEXECUTE_HAS_IMMEDIAT               ;//[nb_inst_reexecute]
137  public    : SC_OUT(Tgeneral_data_t    )  ** out_REEXECUTE_IMMEDIAT                   ;//[nb_inst_reexecute]
138  public    : SC_OUT(Tcontrol_t         )  ** out_REEXECUTE_READ_RA                    ;//[nb_inst_reexecute] //*
139  public    : SC_OUT(Tgeneral_address_t )  ** out_REEXECUTE_NUM_REG_RA                 ;//[nb_inst_reexecute] //*
140  public    : SC_OUT(Tcontrol_t         )  ** out_REEXECUTE_READ_RB                    ;//[nb_inst_reexecute] //*
141  public    : SC_OUT(Tgeneral_address_t )  ** out_REEXECUTE_NUM_REG_RB                 ;//[nb_inst_reexecute] //*
142  public    : SC_OUT(Tcontrol_t         )  ** out_REEXECUTE_READ_RC                    ;//[nb_inst_reexecute] //*
143  public    : SC_OUT(Tspecial_address_t )  ** out_REEXECUTE_NUM_REG_RC                 ;//[nb_inst_reexecute] //*
144  public    : SC_OUT(Tcontrol_t         )  ** out_REEXECUTE_WRITE_RD                   ;//[nb_inst_reexecute]
145  public    : SC_OUT(Tgeneral_address_t )  ** out_REEXECUTE_NUM_REG_RD                 ;//[nb_inst_reexecute]
146  public    : SC_OUT(Tcontrol_t         )  ** out_REEXECUTE_WRITE_RE                   ;//[nb_inst_reexecute] //*
147  public    : SC_OUT(Tspecial_address_t )  ** out_REEXECUTE_NUM_REG_RE                 ;//[nb_inst_reexecute] //*
148
149    // ~~~~~[ Component ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
150  private   : generic::priority::Priority   * _priority_execute_loop;
151  private   : generic::priority::Priority   * _priority_queue_in    ;
152
153    // ~~~~~[ Register ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
154  private   : std::list<entry_t *>          * _reexecute_queue                         ;//[nb_bank]
155
156    // ~~~~~[ Internal ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
157  public    : Tcontrol_t                    * internal_QUEUE_PUSH                      ;//[nb_bank]
158  public    : uint32_t                      * internal_QUEUE_NUM_EXECUTE_LOOP          ;//[nb_bank]
159  public    : uint32_t                      * internal_QUEUE_NUM_INST_EXECUTE          ;//[nb_bank]
160  public    : uint32_t                      * internal_QUEUE_NUM_INST_COMMIT           ;//[nb_bank]
161  public    : info_t                        * internal_QUEUE_INFO                      ;//[nb_bank]
162  public    : Tcontrol_t                    * internal_SPR_VAL                         ;//[nb_inst_reexecute]
163  public    : Tcontrol_t                    * internal_REEXECUTE_ROB_ACK               ;//[nb_inst_reexecute]
164  public    : Tcontrol_t                    * internal_REEXECUTE_VAL                   ;//[nb_inst_reexecute]
165#ifdef STATISTICS
166  public    : Tcontrol_t                    * internal_COMMIT_VAL                      ;//[nb_inst_commit]
167#endif
168
169#endif
170
171    // -----[ Methods ]---------------------------------------------------
172
173#ifdef SYSTEMC
174    SC_HAS_PROCESS (Reexecute_unit);
175#endif
176  public  :          Reexecute_unit             
177  (
178#ifdef SYSTEMC
179   sc_module_name                                name,
180#else                                         
181   std::string                                   name,
182#endif                                         
183#ifdef STATISTICS
184   morpheo::behavioural::Parameters_Statistics * param_statistics,
185#endif
186   Parameters                                  * param,
187   morpheo::behavioural::Tusage_t                usage
188   );
189  public  :          ~Reexecute_unit             (void);
190                                               
191  private : void        allocation                (
192#ifdef STATISTICS
193                                                   morpheo::behavioural::Parameters_Statistics * param_statistics
194#else
195                                                   void
196#endif
197                                                   );
198  private : void        deallocation              (void);
199                                               
200#ifdef SYSTEMC                                 
201  private : bool        must_reexecute            (Tspr_address_t address, info_t & info);
202
203  public  : void        constant                  (void);
204  public  : void        transition                (void);
205  public  : void        genMoore                  (void);
206  public  : void        genMealy_reexecute        (void);
207  public  : void        genMealy_commit           (void);
208#endif                                         
209
210#if VHDL                                       
211  public  : void        vhdl                      (void);
212  private : void        vhdl_declaration          (Vhdl * & vhdl);
213  private : void        vhdl_body                 (Vhdl * & vhdl);
214#endif                                         
215
216#ifdef STATISTICS
217  public  : void        statistics_allocation     (morpheo::behavioural::Parameters_Statistics * param_statistics);
218  public  : void        statistics_deallocation   (void);
219#endif
220#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
221  private : void        end_cycle                 (void);
222#endif
223  };
224
225}; // end namespace reexecute_unit
226}; // end namespace ooo_engine
227}; // end namespace multi_ooo_engine
228}; // end namespace core
229
230}; // end namespace behavioural
231}; // end namespace morpheo             
232
233#endif
Note: See TracBrowser for help on using the repository browser.