source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Commit_unit/include/Commit_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: 27.5 KB
Line 
1#ifndef morpheo_behavioural_core_multi_ooo_engine_ooo_engine_commit_unit_Commit_unit_h
2#define morpheo_behavioural_core_multi_ooo_engine_ooo_engine_commit_unit_Commit_unit_h
3
4/*
5 * $Id: Commit_unit.h 145 2010-10-13 18:15:51Z 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/Commit_unit/include/Parameters.h"
17#include "Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Commit_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#include <fstream>
34
35namespace morpheo {
36namespace behavioural {
37namespace core {
38namespace multi_ooo_engine {
39namespace ooo_engine {
40namespace commit_unit {
41
42#ifdef STATISTICS
43  typedef std::map<uint32_t,uint32_t> stat_inst_fusion_t;
44#endif
45
46  class Commit_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  public    : counters_t                    ** _stat_nb_inst_insert               ;//[nb_rename_unit]
61  public    : counters_t                    ** _stat_nb_inst_retire               ;//[nb_rename_unit]
62  public    : counters_t                    ** _stat_nb_inst_commit               ;//[nb_rename_unit]
63
64  public    : counter_t                      * _stat_nb_inst_commit_conflit_access;
65  public    : counter_t                     ** _stat_nb_inst_retire_ok            ;//[nb_thread]
66  public    : counter_t                     ** _stat_nb_inst_retire_ko            ;//[nb_thread]
67  public    : counter_t                     ** _stat_nb_inst_instruction          ;//[nb_instruction]
68  public    : counter_t                     ** _stat_nb_inst_type                 ;//[nb_type]
69  public    : counter_t                     ** _stat_bank_nb_inst                 ;//[nb_bank]
70
71  public    : counter_t                     ** _stat_nb_cycle_state_no_event      ;//[nb_thread]     
72  public    : counter_t                     ** _stat_nb_cycle_state_not_yet_event ;//[nb_thread]
73  public    : counter_t                     ** _stat_nb_cycle_state_event         ;//[nb_thread]
74  public    : counter_t                     ** _stat_nb_cycle_state_wait_end      ;//[nb_thread]
75
76//public    : uint32_t                       * _stat_last_inst                    ;//[nb_thread]
77  public    : uint32_t                       * _stat_last_inst_type               ;//[nb_thread]
78  public    : uint32_t                       * _stat_last_inst_operation          ;//[nb_thread]
79  public    : stat_inst_fusion_t             * _stat_inst_fusion                  ;//[nb_thread]
80#endif
81
82  public    : Component                      * _component;
83  private   : Interfaces                     * _interfaces;
84
85#ifdef SYSTEMC
86    // ~~~~~[ Interface ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
87    // ~~~~~[ Interface : "" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
88  public    : SC_CLOCK                      *  in_CLOCK        ;
89  public    : SC_IN (Tcontrol_t)            *  in_NRESET       ;
90
91    // ~~~~~[ Interface "insert" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
92  public    : SC_IN (Tcontrol_t         ) ***  in_INSERT_VAL                       ;//[nb_rename_unit][nb_inst_insert]
93  public    : SC_OUT(Tcontrol_t         ) *** out_INSERT_ACK                       ;//[nb_rename_unit][nb_inst_insert]
94  public    : SC_IN (Tcontext_t         ) ***  in_INSERT_FRONT_END_ID              ;//[nb_rename_unit][nb_inst_insert]
95  public    : SC_IN (Tcontext_t         ) ***  in_INSERT_CONTEXT_ID                ;//[nb_rename_unit][nb_inst_insert]
96  public    : SC_OUT(Tpacket_t          ) *** out_INSERT_PACKET_ID                 ;//[nb_rename_unit][nb_inst_insert]
97//public    : SC_IN (Tcontext_t         ) ***  in_INSERT_RENAME_UNIT_ID            ;//[nb_rename_unit][nb_inst_insert]
98  public    : SC_IN (Tdepth_t           ) ***  in_INSERT_DEPTH                     ;//[nb_rename_unit][nb_inst_insert]
99  public    : SC_IN (Tcontrol_t         ) ***  in_INSERT_SAVE_RAT                  ;//[nb_rename_unit][nb_inst_insert]
100#ifdef STATISTICS
101  public    : SC_IN (uint32_t           ) ***  in_INSERT_INSTRUCTION               ;//[nb_rename_unit][nb_inst_insert]
102#endif
103  public    : SC_IN (Ttype_t            ) ***  in_INSERT_TYPE                      ;//[nb_rename_unit][nb_inst_insert]
104  public    : SC_IN (Toperation_t       ) ***  in_INSERT_OPERATION                 ;//[nb_rename_unit][nb_inst_insert]
105  public    : SC_IN (Tcontrol_t         ) ***  in_INSERT_NO_EXECUTE                ;//[nb_rename_unit][nb_inst_insert]
106  public    : SC_IN (Tcontrol_t         ) ***  in_INSERT_LAST_EVENT                ;//[nb_rename_unit][nb_inst_insert]
107  public    : SC_IN (Tcontrol_t         ) ***  in_INSERT_IS_DELAY_SLOT             ;//[nb_rename_unit][nb_inst_insert]
108#ifdef DEBUG
109  public    : SC_IN (Taddress_t         ) ***  in_INSERT_ADDRESS                   ;//[nb_rename_unit][nb_inst_insert]
110#endif
111  public    : SC_IN (Taddress_t         ) ***  in_INSERT_ADDRESS_NEXT              ;//[nb_rename_unit][nb_inst_insert]
112  public    : SC_IN (Texception_t       ) ***  in_INSERT_EXCEPTION                 ;//[nb_rename_unit][nb_inst_insert]
113  public    : SC_IN (Texception_t       ) ***  in_INSERT_EXCEPTION_USE             ;//[nb_rename_unit][nb_inst_insert]
114  public    : SC_IN (Tlsq_ptr_t         ) ***  in_INSERT_STORE_QUEUE_PTR_WRITE     ;//[nb_rename_unit][nb_inst_insert]
115  public    : SC_IN (Tlsq_ptr_t         ) ***  in_INSERT_LOAD_QUEUE_PTR_WRITE      ;//[nb_rename_unit][nb_inst_insert]
116#ifdef DEBUG
117  public    : SC_IN (Tcontrol_t         ) ***  in_INSERT_READ_RA                   ;//[nb_rename_unit][nb_inst_insert]
118  public    : SC_IN (Tgeneral_address_t ) ***  in_INSERT_NUM_REG_RA_LOG            ;//[nb_rename_unit][nb_inst_insert]
119  public    : SC_IN (Tgeneral_address_t ) ***  in_INSERT_NUM_REG_RA_PHY            ;//[nb_rename_unit][nb_inst_insert]
120#endif
121  public    : SC_IN (Tcontrol_t         ) ***  in_INSERT_READ_RB                   ;//[nb_rename_unit][nb_inst_insert]
122#ifdef DEBUG
123  public    : SC_IN (Tgeneral_address_t ) ***  in_INSERT_NUM_REG_RB_LOG            ;//[nb_rename_unit][nb_inst_insert]
124  public    : SC_IN (Tgeneral_address_t ) ***  in_INSERT_NUM_REG_RB_PHY            ;//[nb_rename_unit][nb_inst_insert]
125  public    : SC_IN (Tcontrol_t         ) ***  in_INSERT_READ_RC                   ;//[nb_rename_unit][nb_inst_insert]
126  public    : SC_IN (Tspecial_address_t ) ***  in_INSERT_NUM_REG_RC_LOG            ;//[nb_rename_unit][nb_inst_insert]
127  public    : SC_IN (Tspecial_address_t ) ***  in_INSERT_NUM_REG_RC_PHY            ;//[nb_rename_unit][nb_inst_insert]
128#endif
129  public    : SC_IN (Tcontrol_t         ) ***  in_INSERT_WRITE_RD                  ;//[nb_rename_unit][nb_inst_insert]
130  public    : SC_IN (Tgeneral_address_t ) ***  in_INSERT_NUM_REG_RD_LOG            ;//[nb_rename_unit][nb_inst_insert]
131  public    : SC_IN (Tgeneral_address_t ) ***  in_INSERT_NUM_REG_RD_PHY_OLD        ;//[nb_rename_unit][nb_inst_insert]
132  public    : SC_IN (Tgeneral_address_t ) ***  in_INSERT_NUM_REG_RD_PHY_NEW        ;//[nb_rename_unit][nb_inst_insert]
133  public    : SC_IN (Tcontrol_t         ) ***  in_INSERT_WRITE_RE                  ;//[nb_rename_unit][nb_inst_insert]
134  public    : SC_IN (Tspecial_address_t ) ***  in_INSERT_NUM_REG_RE_LOG            ;//[nb_rename_unit][nb_inst_insert]
135  public    : SC_IN (Tspecial_address_t ) ***  in_INSERT_NUM_REG_RE_PHY_OLD        ;//[nb_rename_unit][nb_inst_insert]
136  public    : SC_IN (Tspecial_address_t ) ***  in_INSERT_NUM_REG_RE_PHY_NEW        ;//[nb_rename_unit][nb_inst_insert]
137                                                                                   
138    // ~~~~~[ Interface "retire" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~         
139  public    : SC_OUT(Tcontrol_t         ) *** out_RETIRE_VAL                       ;//[nb_rename_unit][nb_inst_retire]
140  public    : SC_IN (Tcontrol_t         ) ***  in_RETIRE_ACK                       ;//[nb_rename_unit][nb_inst_retire]
141  public    : SC_OUT(Tcontext_t         ) *** out_RETIRE_FRONT_END_ID              ;//[nb_rename_unit][nb_inst_retire]
142  public    : SC_OUT(Tcontext_t         ) *** out_RETIRE_CONTEXT_ID                ;//[nb_rename_unit][nb_inst_retire]
143//public    : SC_OUT(Tcontext_t         ) *** out_RETIRE_RENAME_UNIT_ID            ;//[nb_rename_unit][nb_inst_retire]
144//public    : SC_OUT(Tdepth_t           ) *** out_RETIRE_DEPTH                     ;//[nb_rename_unit][nb_inst_retire]
145  public    : SC_OUT(Tcontrol_t         ) *** out_RETIRE_USE_STORE_QUEUE           ;//[nb_rename_unit][nb_inst_retire]
146  public    : SC_OUT(Tcontrol_t         ) *** out_RETIRE_USE_LOAD_QUEUE            ;//[nb_rename_unit][nb_inst_retire]
147  public    : SC_OUT(Tlsq_ptr_t         ) *** out_RETIRE_STORE_QUEUE_PTR_WRITE     ;//[nb_rename_unit][nb_inst_retire]
148  public    : SC_OUT(Tlsq_ptr_t         ) *** out_RETIRE_LOAD_QUEUE_PTR_WRITE      ;//[nb_rename_unit][nb_inst_retire]
149//public    : SC_OUT(Tcontrol_t         ) *** out_RETIRE_READ_RA                   ;//[nb_rename_unit][nb_inst_retire]
150//public    : SC_OUT(Tgeneral_address_t ) *** out_RETIRE_NUM_REG_RA_PHY            ;//[nb_rename_unit][nb_inst_retire]
151//public    : SC_OUT(Tcontrol_t         ) *** out_RETIRE_READ_RB                   ;//[nb_rename_unit][nb_inst_retire]
152//public    : SC_OUT(Tgeneral_address_t ) *** out_RETIRE_NUM_REG_RB_PHY            ;//[nb_rename_unit][nb_inst_retire]
153//public    : SC_OUT(Tcontrol_t         ) *** out_RETIRE_READ_RC                   ;//[nb_rename_unit][nb_inst_retire]
154//public    : SC_OUT(Tspecial_address_t ) *** out_RETIRE_NUM_REG_RC_PHY            ;//[nb_rename_unit][nb_inst_retire]
155  public    : SC_OUT(Tcontrol_t         ) *** out_RETIRE_WRITE_RD                  ;//[nb_rename_unit][nb_inst_retire]
156  public    : SC_OUT(Tgeneral_address_t ) *** out_RETIRE_NUM_REG_RD_LOG            ;//[nb_rename_unit][nb_inst_retire]
157  public    : SC_OUT(Tgeneral_address_t ) *** out_RETIRE_NUM_REG_RD_PHY_OLD        ;//[nb_rename_unit][nb_inst_retire]
158  public    : SC_OUT(Tgeneral_address_t ) *** out_RETIRE_NUM_REG_RD_PHY_NEW        ;//[nb_rename_unit][nb_inst_retire]
159  public    : SC_OUT(Tcontrol_t         ) *** out_RETIRE_WRITE_RE                  ;//[nb_rename_unit][nb_inst_retire]
160  public    : SC_OUT(Tspecial_address_t ) *** out_RETIRE_NUM_REG_RE_LOG            ;//[nb_rename_unit][nb_inst_retire]
161  public    : SC_OUT(Tspecial_address_t ) *** out_RETIRE_NUM_REG_RE_PHY_OLD        ;//[nb_rename_unit][nb_inst_retire]
162  public    : SC_OUT(Tspecial_address_t ) *** out_RETIRE_NUM_REG_RE_PHY_NEW        ;//[nb_rename_unit][nb_inst_retire]
163  public    : SC_OUT(Tcontrol_t         ) *** out_RETIRE_RESTORE                   ;//[nb_rename_unit][nb_inst_retire]
164  public    : SC_OUT(Tcontrol_t         ) *** out_RETIRE_RESTORE_RD_PHY_OLD        ;//[nb_rename_unit][nb_inst_retire]
165  public    : SC_OUT(Tcontrol_t         ) *** out_RETIRE_RESTORE_RE_PHY_OLD        ;//[nb_rename_unit][nb_inst_retire]
166
167    // ~~~~~[ Interface : "commit" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~         
168  public    : SC_OUT(Tcontrol_t         ) *** out_RETIRE_EVENT_VAL                 ;//[nb_front_end][nb_context]
169  public    : SC_IN (Tcontrol_t         ) ***  in_RETIRE_EVENT_ACK                 ;//[nb_front_end][nb_context]
170  public    : SC_OUT(Tevent_state_t     ) *** out_RETIRE_EVENT_STATE               ;//[nb_front_end][nb_context]
171//public    : SC_OUT(Tcontrol_t         ) *** out_RETIRE_EVENT_FLUSH               ;//[nb_front_end][nb_context]
172  public    : SC_OUT(Tcontrol_t         ) *** out_RETIRE_EVENT_STOP                ;//[nb_front_end][nb_context]
173  public    : SC_OUT(Tevent_type_t      ) *** out_RETIRE_EVENT_TYPE                ;//[nb_front_end][nb_context]
174  public    : SC_OUT(Tdepth_t           ) *** out_RETIRE_EVENT_DEPTH               ;//[nb_front_end][nb_context]
175
176    // ~~~~~[ Interface : "commit" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~         
177  public    : SC_IN (Tcontrol_t         )  **  in_COMMIT_VAL                       ;//[nb_inst_commit]
178  public    : SC_OUT(Tcontrol_t         )  ** out_COMMIT_ACK                       ;//[nb_inst_commit]
179  public    : SC_IN (Tcontrol_t         )  **  in_COMMIT_WEN                       ;//[nb_inst_commit]
180  public    : SC_IN (Tpacket_t          )  **  in_COMMIT_PACKET_ID                 ;//[nb_inst_commit]
181//public    : SC_IN (Toperation_t       )  **  in_COMMIT_OPERATION                 ;//[nb_inst_commit]
182//public    : SC_IN (Ttype_t            )  **  in_COMMIT_TYPE                      ;//[nb_inst_commit]
183  public    : SC_IN (Tcontrol_t         )  **  in_COMMIT_CANCEL                    ;//[nb_inst_commit]
184  public    : SC_IN (Tspecial_data_t    )  **  in_COMMIT_FLAGS                     ;//[nb_inst_commit]
185  public    : SC_IN (Texception_t       )  **  in_COMMIT_EXCEPTION                 ;//[nb_inst_commit]
186  public    : SC_IN (Tcontrol_t         )  **  in_COMMIT_NO_SEQUENCE               ;//[nb_inst_commit]
187  public    : SC_IN (Taddress_t         )  **  in_COMMIT_ADDRESS                   ;//[nb_inst_commit]
188  public    : SC_OUT(Tgeneral_address_t )  ** out_COMMIT_NUM_REG_RD                ;//[nb_inst_commit]
189                                                                                   
190    // ~~~~~[ Interface : "reexecute" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~         
191  public    : SC_OUT(Tcontrol_t         )  ** out_REEXECUTE_VAL                    ;//[nb_inst_reexecute]
192  public    : SC_IN (Tcontrol_t         )  **  in_REEXECUTE_ACK                    ;//[nb_inst_reexecute]
193  public    : SC_OUT(Tcontext_t         )  ** out_REEXECUTE_CONTEXT_ID             ;//[nb_inst_reexecute]
194  public    : SC_OUT(Tcontext_t         )  ** out_REEXECUTE_FRONT_END_ID           ;//[nb_inst_reexecute]
195  public    : SC_OUT(Tpacket_t          )  ** out_REEXECUTE_PACKET_ID              ;//[nb_inst_reexecute]
196  public    : SC_OUT(Toperation_t       )  ** out_REEXECUTE_OPERATION              ;//[nb_inst_reexecute]
197  public    : SC_OUT(Ttype_t            )  ** out_REEXECUTE_TYPE                   ;//[nb_inst_reexecute]
198  public    : SC_OUT(Tlsq_ptr_t         )  ** out_REEXECUTE_STORE_QUEUE_PTR_WRITE  ;//[nb_inst_reexecute]
199                                                                                   
200    // ~~~~~[ Interface : "branch_complete" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~         
201  public    : SC_OUT(Tcontrol_t         )  ** out_BRANCH_COMPLETE_VAL              ;//[nb_inst_branch_complete]
202  public    : SC_IN (Tcontrol_t         )  **  in_BRANCH_COMPLETE_ACK              ;//[nb_inst_branch_complete]
203  public    : SC_OUT(Tcontext_t         )  ** out_BRANCH_COMPLETE_CONTEXT_ID       ;//[nb_inst_branch_complete]
204  public    : SC_OUT(Tcontext_t         )  ** out_BRANCH_COMPLETE_FRONT_END_ID     ;//[nb_inst_branch_complete]
205  public    : SC_OUT(Tdepth_t           )  ** out_BRANCH_COMPLETE_DEPTH            ;//[nb_inst_branch_complete]
206  public    : SC_OUT(Taddress_t         )  ** out_BRANCH_COMPLETE_ADDRESS          ;//[nb_inst_branch_complete]
207//public    : SC_OUT(Tcontrol_t         )  ** out_BRANCH_COMPLETE_FLAG             ;//[nb_inst_branch_complete]
208  public    : SC_OUT(Tcontrol_t         )  ** out_BRANCH_COMPLETE_NO_SEQUENCE      ;//[nb_inst_branch_complete]
209  public    : SC_IN (Tcontrol_t         )  **  in_BRANCH_COMPLETE_MISS_PREDICTION  ;//[nb_inst_branch_complete]
210                                                                                   
211    // ~~~~~[ Interface : "update" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
212  public    : SC_OUT(Tcontrol_t         )   * out_UPDATE_VAL                       ;
213  public    : SC_IN (Tcontrol_t         )   *  in_UPDATE_ACK                       ;
214  public    : SC_OUT(Tcontext_t         )   * out_UPDATE_CONTEXT_ID                ;
215  public    : SC_OUT(Tcontext_t         )   * out_UPDATE_FRONT_END_ID              ;
216  public    : SC_OUT(Tdepth_t           )   * out_UPDATE_DEPTH                     ;
217  public    : SC_OUT(Tevent_type_t      )   * out_UPDATE_TYPE                      ;
218  public    : SC_OUT(Tcontrol_t         )   * out_UPDATE_IS_DELAY_SLOT             ;
219  public    : SC_OUT(Taddress_t         )   * out_UPDATE_ADDRESS                   ;
220  public    : SC_OUT(Tcontrol_t         )   * out_UPDATE_ADDRESS_EPCR_VAL          ;
221  public    : SC_OUT(Taddress_t         )   * out_UPDATE_ADDRESS_EPCR              ;
222  public    : SC_OUT(Tcontrol_t         )   * out_UPDATE_ADDRESS_EEAR_VAL          ;
223  public    : SC_OUT(Tgeneral_data_t    )   * out_UPDATE_ADDRESS_EEAR              ;
224
225    // ~~~~~[ Interface "event" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
226  public    : SC_IN (Tcontrol_t         ) ***  in_EVENT_VAL                        ;//[nb_front_end][nb_context]
227  public    : SC_OUT(Tcontrol_t         ) *** out_EVENT_ACK                        ;//[nb_front_end][nb_context]
228  public    : SC_IN (Taddress_t         ) ***  in_EVENT_ADDRESS                    ;//[nb_front_end][nb_context]
229  public    : SC_IN (Taddress_t         ) ***  in_EVENT_ADDRESS_NEXT               ;//[nb_front_end][nb_context]
230  public    : SC_IN (Tcontrol_t         ) ***  in_EVENT_ADDRESS_NEXT_VAL           ;//[nb_front_end][nb_context]
231  public    : SC_IN (Tcontrol_t         ) ***  in_EVENT_IS_DS_TAKE                 ;//[nb_front_end][nb_context]
232
233    // ~~~~~[ Interface : "nb_inst" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~         
234  public    : SC_OUT(Tcounter_t         ) *** out_NB_INST_COMMIT_ALL               ;//[nb_front_end][nb_context]
235  public    : SC_OUT(Tcounter_t         ) *** out_NB_INST_COMMIT_MEM               ;//[nb_front_end][nb_context]
236  public    : SC_IN (Tcounter_t         ) ***  in_NB_INST_DECOD_ALL                ;//[nb_front_end][nb_context]
237                                                                                   
238//  // ~~~~~[ Interface : "depth" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~         
239//public    : SC_IN (Tdepth_t           ) ***  in_DEPTH_MIN                        ;//[nb_front_end][nb_context]
240//public    : SC_IN (Tdepth_t           ) ***  in_DEPTH_MAX                        ;//[nb_front_end][nb_context]
241//public    : SC_IN (Tcontrol_t         ) ***  in_DEPTH_FULL                       ;//[nb_front_end][nb_context]
242
243    // ~~~~~[ Interface : "spr_read" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
244  public    : SC_IN (Tcontrol_t         ) ***  in_SPR_READ_SR_OVE                  ;//[nb_front_end][nb_context]
245
246    // ~~~~~[ Interface : "spr_write" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
247  public    : SC_OUT(Tcontrol_t         ) *** out_SPR_WRITE_VAL                    ;//[nb_front_end][nb_context]
248  public    : SC_IN (Tcontrol_t         ) ***  in_SPR_WRITE_ACK                    ;//[nb_front_end][nb_context]
249  public    : SC_OUT(Tcontrol_t         ) *** out_SPR_WRITE_SR_F_VAL               ;//[nb_front_end][nb_context]
250  public    : SC_OUT(Tcontrol_t         ) *** out_SPR_WRITE_SR_F                   ;//[nb_front_end][nb_context]
251  public    : SC_OUT(Tcontrol_t         ) *** out_SPR_WRITE_SR_CY_VAL              ;//[nb_front_end][nb_context]
252  public    : SC_OUT(Tcontrol_t         ) *** out_SPR_WRITE_SR_CY                  ;//[nb_front_end][nb_context]
253  public    : SC_OUT(Tcontrol_t         ) *** out_SPR_WRITE_SR_OV_VAL              ;//[nb_front_end][nb_context]
254  public    : SC_OUT(Tcontrol_t         ) *** out_SPR_WRITE_SR_OV                  ;//[nb_front_end][nb_context]
255
256    // ~~~~~[ interface : "info" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
257#ifdef DEBUG_TEST
258  public    : SC_OUT(bool               )   * out_INFO_ROB_EMPTY                   ;
259#endif
260
261    // ~~~~~[ Component ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~         
262  private   : generic::priority::Priority   * _priority_insert                     ;
263                                                                                   
264    // ~~~~~[ Register ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~         
265  private   : double                       ** _nb_cycle_idle;
266
267  private   : std::list<entry_t*>           * _rob                                 ;//[nb_bank]
268                                                                                   
269  private   : uint32_t                        reg_NUM_BANK_HEAD                    ;
270  private   : uint32_t                        reg_NUM_BANK_TAIL                    ;
271  private   : uint32_t                        reg_NUM_PTR_TAIL                     ;
272  private   : uint32_t                      * reg_BANK_PTR                         ;//[nb_bank]
273
274  private   : Tcounter_t                   ** reg_NB_INST_COMMIT_ALL               ;//[nb_front_end][nb_context]
275  private   : Tcounter_t                   ** reg_NB_INST_COMMIT_MEM               ;//[nb_front_end][nb_context]
276  private   : Tcounter_t                  *** reg_NB_INST_DEPTH                    ;//[nb_front_end][nb_context][nb_branch_speculated]
277
278  private   : Tcommit_event_state_t        ** reg_EVENT_STATE                      ;//[nb_front_end][nb_context]
279  private   : Tevent_type_t                ** reg_EVENT_TYPE                       ;//[nb_front_end][nb_context]
280//private   : bool                         ** reg_EVENT_FLUSH                      ;//[nb_front_end][nb_context]
281//private   : bool                         ** reg_EVENT_STOP                       ;//[nb_front_end][nb_context]
282//private   : uint32_t                     ** reg_EVENT_NUM_BANK                   ;//[nb_front_end][nb_context]
283//private   : uint32_t                     ** reg_EVENT_NUM_PTR                    ;//[nb_front_end][nb_context]
284//private   : bool                         ** reg_EVENT_CAN_RESTART                ;//[nb_front_end][nb_context]
285  private   : uint32_t                     ** reg_EVENT_PACKET                     ;//[nb_front_end][nb_context]
286  private   : Tdepth_t                     ** reg_EVENT_DEPTH                      ;//[nb_front_end][nb_context]
287  private   : uint32_t                     ** reg_EVENT_NB_INST                    ;//[nb_front_end][nb_context]
288  private   : bool                         ** reg_EVENT_LAST                       ;//[nb_front_end][nb_context]
289  private   : uint32_t                     ** reg_EVENT_LAST_NUM_BANK              ;//[nb_front_end][nb_context]
290  private   : uint32_t                     ** reg_EVENT_LAST_NUM_PTR               ;//[nb_front_end][nb_context]
291
292  private   : bool                         ** reg_EVENT_NEXT_STOP                  ;//[nb_front_end][nb_context]
293  private   : uint32_t                     ** reg_EVENT_NEXT_PACKET                ;//[nb_front_end][nb_context]
294
295//private   : Taddress_t                   ** reg_PC_PREVIOUS                      ;//[nb_front_end][nb_context]
296  private   : Taddress_t                   ** reg_PC_CURRENT                       ;//[nb_front_end][nb_context]
297  private   : Taddress_t                   ** reg_PC_CURRENT_IS_DS                 ;//[nb_front_end][nb_context]
298  private   : Taddress_t                   ** reg_PC_CURRENT_IS_DS_TAKE            ;//[nb_front_end][nb_context]
299  private   : Taddress_t                   ** reg_PC_NEXT                          ;//[nb_front_end][nb_context]
300
301  private   : bool                        *** rat_gpr_update_table                 ;//[nb_front_end][nb_context][nb_general_register_logic]
302  private   : bool                        *** rat_spr_update_table                 ;//[nb_front_end][nb_context][nb_special_register_logic]
303                                                                                   
304    // ~~~~~[ Internal ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~         
305  private   : Tcontrol_t                    * internal_BANK_INSERT_VAL             ;//[nb_bank]
306  private   : uint32_t                      * internal_BANK_INSERT_NUM_RENAME_UNIT ;//[nb_bank]
307  private   : uint32_t                      * internal_BANK_INSERT_NUM_INST        ;//[nb_bank]
308
309#ifdef STATISTICS
310  private   : uint32_t                        internal_BANK_COMMIT_CONFLIT_ACCESS  ;
311#endif
312  private   : Tcontrol_t                   ** internal_BANK_COMMIT_VAL             ;//[nb_bank][nb_bank_access_commit]
313  private   : uint32_t                     ** internal_BANK_COMMIT_NUM_INST        ;//[nb_bank][nb_bank_access_commit]
314  private   : entry_t *                    ** internal_BANK_COMMIT_ENTRY           ;//[nb_bank][nb_bank_access_commit]
315
316  private   : uint32_t                        internal_BANK_RETIRE_HEAD              ;
317  private   : Tcontrol_t                    * internal_BANK_RETIRE_VAL               ;//[nb_bank]
318  private   : uint32_t                      * internal_BANK_RETIRE_NUM_RENAME_UNIT   ;//[nb_bank]
319  private   : uint32_t                      * internal_BANK_RETIRE_NUM_INST          ;//[nb_bank]
320//private   : Tcontrol_t                    * internal_BANK_RETIRE_RESTORE           ;//[nb_bank]
321  private   : Tcontrol_t                    * internal_BANK_RETIRE_RESTORE_RD_PHY_OLD;//[nb_bank]
322  private   : Tcontrol_t                    * internal_BANK_RETIRE_RESTORE_RE_PHY_OLD;//[nb_bank]
323
324  private   : Tcontrol_t                    * internal_REEXECUTE_VAL               ;//[nb_inst_reexecute]
325  private   : uint32_t                      * internal_REEXECUTE_NUM_BANK          ;//[nb_inst_reexecute]
326
327  private   : Tcontrol_t                    * internal_BRANCH_COMPLETE_VAL         ;//[nb_inst_branch_complete]
328  private   : uint32_t                      * internal_BRANCH_COMPLETE_NUM_BANK    ;//[nb_inst_branch_complete]
329
330  private   : Tcontrol_t                      internal_UPDATE_VAL                  ;
331  private   : uint32_t                        internal_UPDATE_NUM_BANK             ;
332
333  private   : Tcontrol_t                   ** internal_EVENT_ACK                   ;//[nb_front_end][nb_context]
334
335  private   : Tcontrol_t                   ** internal_RETIRE_EVENT_VAL            ;//[nb_front_end][nb_context]
336
337  private   : bool                        *** internal_rat_gpr_update_table;//[nb_front_end][nb_context][nb_general_register_logic]
338  private   : bool                        *** internal_rat_spr_update_table;//[nb_front_end][nb_context][nb_special_register_logic]
339#endif
340
341#if defined(DEBUG) and defined(DEBUG_Commit_unit) and (DEBUG_Commit_unit == true)
342  private   : std::ofstream                 * instruction_log_file;
343#endif
344
345    // -----[ Methods ]---------------------------------------------------
346
347#ifdef SYSTEMC
348    SC_HAS_PROCESS (Commit_unit);
349#endif
350  public  :          Commit_unit             
351  (
352#ifdef SYSTEMC
353   sc_module_name                                name,
354#else                                         
355   std::string                                   name,
356#endif                                         
357#ifdef STATISTICS
358   morpheo::behavioural::Parameters_Statistics * param_statistics,
359#endif
360   Parameters                                  * param,
361   morpheo::behavioural::Tusage_t                usage
362   );
363  public  :          ~Commit_unit             (void);
364                                               
365  private : void        allocation                (
366#ifdef STATISTICS
367                                                   morpheo::behavioural::Parameters_Statistics * param_statistics
368#else
369                                                   void
370#endif
371                                                   );
372  private : void        deallocation              (void);
373                                               
374#ifdef SYSTEMC                                 
375  public  : void        constant                  (void);
376  public  : void        transition                (void);
377  public  : void        genMoore                  (void);
378  public  : void        genMealy_insert           (void);
379  public  : void        genMealy_retire           (void);
380  public  : void        genMealy_commit           (void);
381#endif                                         
382
383#if VHDL                                       
384  public  : void        vhdl                      (void);
385  private : void        vhdl_declaration          (Vhdl * & vhdl);
386  private : void        vhdl_body                 (Vhdl * & vhdl);
387#endif                                         
388
389#ifdef STATISTICS
390  public  : void        statistics_allocation     (morpheo::behavioural::Parameters_Statistics * param_statistics);
391  public  : void        statistics_deallocation   (void);
392#endif
393#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
394  private : void        end_cycle                 (void);
395#endif
396  };
397
398}; // end namespace commit_unit
399}; // end namespace ooo_engine
400}; // end namespace multi_ooo_engine
401}; // end namespace core
402
403}; // end namespace behavioural
404}; // end namespace morpheo             
405
406#endif
Note: See TracBrowser for help on using the repository browser.