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

Last change on this file since 136 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: 14.1 KB
Line 
1#ifndef morpheo_behavioural_core_multi_ooo_engine_ooo_engine_issue_queue_Issue_queue_h
2#define morpheo_behavioural_core_multi_ooo_engine_ooo_engine_issue_queue_Issue_queue_h
3
4/*
5 * $Id: Issue_queue.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/Issue_queue/include/Parameters.h"
17#include "Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Issue_queue/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#include <iostream>
32
33namespace morpheo {
34namespace behavioural {
35
36namespace core {
37namespace multi_ooo_engine {
38namespace ooo_engine {
39namespace issue_queue {
40
41
42  class Issue_queue
43#if SYSTEMC
44    : public sc_module
45#endif
46  {
47    // -----[ fields ]----------------------------------------------------
48    // Parameters
49  protected : const std::string  _name;
50  protected : const Parameters * _param;
51  private   : const Tusage_t     _usage;
52
53#ifdef STATISTICS
54  public    : Stat                           * _stat;
55  private   : counter_t                     ** _stat_bank_nb_inst;
56  private   : counter_t                      * _stat_nb_inst_reexecute;
57  private   : counter_t                     ** _stat_nb_inst_issue_in;
58  private   : counter_t                      * _stat_nb_inst_issue_out;
59#endif
60
61  public    : Component                      * _component;
62  private   : Interfaces                     * _interfaces;
63
64#ifdef SYSTEMC
65    // ~~~~~[ Interface ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
66    // ~~~~~[ Interface : "" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
67  public    : SC_CLOCK                      *  in_CLOCK        ;
68  public    : SC_IN (Tcontrol_t)            *  in_NRESET       ;
69
70    // ~~~~~[ Interface : "issue_in" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
71  public    : SC_IN (Tcontrol_t        )  ***  in_ISSUE_IN_VAL                   ;//[nb_rename_unit][nb_inst_rename]
72  public    : SC_OUT(Tcontrol_t        )  *** out_ISSUE_IN_ACK                   ;//[nb_rename_unit][nb_inst_rename]
73  public    : SC_IN (Tcontext_t        )  ***  in_ISSUE_IN_CONTEXT_ID            ;//[nb_rename_unit][nb_inst_rename]
74  public    : SC_IN (Tcontext_t        )  ***  in_ISSUE_IN_FRONT_END_ID          ;//[nb_rename_unit][nb_inst_rename]
75  public    : SC_IN (Tpacket_t         )  ***  in_ISSUE_IN_PACKET_ID             ;//[nb_rename_unit][nb_inst_rename]
76  public    : SC_IN (Toperation_t      )  ***  in_ISSUE_IN_OPERATION             ;//[nb_rename_unit][nb_inst_rename]
77  public    : SC_IN (Ttype_t           )  ***  in_ISSUE_IN_TYPE                  ;//[nb_rename_unit][nb_inst_rename]
78  public    : SC_IN (Tlsq_ptr_t        )  ***  in_ISSUE_IN_STORE_QUEUE_PTR_WRITE ;//[nb_rename_unit][nb_inst_rename]
79  public    : SC_IN (Tlsq_ptr_t        )  ***  in_ISSUE_IN_STORE_QUEUE_PTR_READ  ;//[nb_rename_unit][nb_inst_rename]
80  public    : SC_IN (Tcontrol_t        )  ***  in_ISSUE_IN_STORE_QUEUE_EMPTY     ;//[nb_rename_unit][nb_inst_rename]
81  public    : SC_IN (Tlsq_ptr_t        )  ***  in_ISSUE_IN_LOAD_QUEUE_PTR_WRITE  ;//[nb_rename_unit][nb_inst_rename]
82  public    : SC_IN (Tcontrol_t        )  ***  in_ISSUE_IN_HAS_IMMEDIAT          ;//[nb_rename_unit][nb_inst_rename]
83  public    : SC_IN (Tgeneral_data_t   )  ***  in_ISSUE_IN_IMMEDIAT              ;//[nb_rename_unit][nb_inst_rename]
84  public    : SC_IN (Tcontrol_t        )  ***  in_ISSUE_IN_READ_RA               ;//[nb_rename_unit][nb_inst_rename]
85  public    : SC_IN (Tgeneral_address_t)  ***  in_ISSUE_IN_NUM_REG_RA            ;//[nb_rename_unit][nb_inst_rename]
86  public    : SC_IN (Tcontrol_t        )  ***  in_ISSUE_IN_READ_RB               ;//[nb_rename_unit][nb_inst_rename]
87  public    : SC_IN (Tgeneral_address_t)  ***  in_ISSUE_IN_NUM_REG_RB            ;//[nb_rename_unit][nb_inst_rename]
88  public    : SC_IN (Tcontrol_t        )  ***  in_ISSUE_IN_READ_RC               ;//[nb_rename_unit][nb_inst_rename]
89  public    : SC_IN (Tspecial_address_t)  ***  in_ISSUE_IN_NUM_REG_RC            ;//[nb_rename_unit][nb_inst_rename]
90  public    : SC_IN (Tcontrol_t        )  ***  in_ISSUE_IN_WRITE_RD              ;//[nb_rename_unit][nb_inst_rename]
91  public    : SC_IN (Tgeneral_address_t)  ***  in_ISSUE_IN_NUM_REG_RD            ;//[nb_rename_unit][nb_inst_rename]
92  public    : SC_IN (Tcontrol_t        )  ***  in_ISSUE_IN_WRITE_RE              ;//[nb_rename_unit][nb_inst_rename]
93  public    : SC_IN (Tspecial_address_t)  ***  in_ISSUE_IN_NUM_REG_RE            ;//[nb_rename_unit][nb_inst_rename]
94
95    // ~~~~~[ Interface : "reexecute" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
96  public    : SC_IN (Tcontrol_t        )   **  in_REEXECUTE_VAL                  ;//[nb_inst_reexecute]
97  public    : SC_OUT(Tcontrol_t        )   ** out_REEXECUTE_ACK                  ;//[nb_inst_reexecute]
98  public    : SC_IN (Tcontext_t        )   **  in_REEXECUTE_CONTEXT_ID           ;//[nb_inst_reexecute]
99  public    : SC_IN (Tcontext_t        )   **  in_REEXECUTE_FRONT_END_ID         ;//[nb_inst_reexecute]
100  public    : SC_IN (Tpacket_t         )   **  in_REEXECUTE_PACKET_ID            ;//[nb_inst_reexecute]
101  public    : SC_IN (Toperation_t      )   **  in_REEXECUTE_OPERATION            ;//[nb_inst_reexecute]
102  public    : SC_IN (Ttype_t           )   **  in_REEXECUTE_TYPE                 ;//[nb_inst_reexecute]
103  public    : SC_IN (Tlsq_ptr_t        )   **  in_REEXECUTE_STORE_QUEUE_PTR_WRITE;//[nb_inst_reexecute]
104  public    : SC_IN (Tlsq_ptr_t        )   **  in_REEXECUTE_STORE_QUEUE_PTR_READ ;//[nb_inst_reexecute]
105  public    : SC_IN (Tcontrol_t        )   **  in_REEXECUTE_STORE_QUEUE_EMPTY    ;//[nb_inst_reexecute]
106  public    : SC_IN (Tlsq_ptr_t        )   **  in_REEXECUTE_LOAD_QUEUE_PTR_WRITE ;//[nb_inst_reexecute]
107  public    : SC_IN (Tcontrol_t        )   **  in_REEXECUTE_HAS_IMMEDIAT         ;//[nb_inst_reexecute]
108  public    : SC_IN (Tgeneral_data_t   )   **  in_REEXECUTE_IMMEDIAT             ;//[nb_inst_reexecute]
109  public    : SC_IN (Tcontrol_t        )   **  in_REEXECUTE_READ_RA              ;//[nb_inst_reexecute]
110  public    : SC_IN (Tgeneral_address_t)   **  in_REEXECUTE_NUM_REG_RA           ;//[nb_inst_reexecute]
111  public    : SC_IN (Tcontrol_t        )   **  in_REEXECUTE_READ_RB              ;//[nb_inst_reexecute]
112  public    : SC_IN (Tgeneral_address_t)   **  in_REEXECUTE_NUM_REG_RB           ;//[nb_inst_reexecute]
113  public    : SC_IN (Tcontrol_t        )   **  in_REEXECUTE_READ_RC              ;//[nb_inst_reexecute]
114  public    : SC_IN (Tspecial_address_t)   **  in_REEXECUTE_NUM_REG_RC           ;//[nb_inst_reexecute]
115  public    : SC_IN (Tcontrol_t        )   **  in_REEXECUTE_WRITE_RD             ;//[nb_inst_reexecute]
116  public    : SC_IN (Tgeneral_address_t)   **  in_REEXECUTE_NUM_REG_RD           ;//[nb_inst_reexecute]
117  public    : SC_IN (Tcontrol_t        )   **  in_REEXECUTE_WRITE_RE             ;//[nb_inst_reexecute]
118  public    : SC_IN (Tspecial_address_t)   **  in_REEXECUTE_NUM_REG_RE           ;//[nb_inst_reexecute]
119
120    // ~~~~~[ Interface : "issue_out" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
121  public    : SC_OUT(Tcontrol_t        )   ** out_ISSUE_OUT_VAL                  ;//[nb_inst_issue]
122  public    : SC_IN (Tcontrol_t        )   **  in_ISSUE_OUT_ACK                  ;//[nb_inst_issue]
123  public    : SC_OUT(Tcontext_t        )   ** out_ISSUE_OUT_CONTEXT_ID           ;//[nb_inst_issue]
124  public    : SC_OUT(Tcontext_t        )   ** out_ISSUE_OUT_FRONT_END_ID         ;//[nb_inst_issue]
125  public    : SC_OUT(Tpacket_t         )   ** out_ISSUE_OUT_PACKET_ID            ;//[nb_inst_issue]
126  public    : SC_OUT(Toperation_t      )   ** out_ISSUE_OUT_OPERATION            ;//[nb_inst_issue]
127  public    : SC_OUT(Ttype_t           )   ** out_ISSUE_OUT_TYPE                 ;//[nb_inst_issue]
128  public    : SC_OUT(Tcontrol_t        )   ** out_ISSUE_OUT_CANCEL               ;//[nb_inst_issue]
129  public    : SC_OUT(Tlsq_ptr_t        )   ** out_ISSUE_OUT_STORE_QUEUE_PTR_WRITE;//[nb_inst_issue]
130  public    : SC_OUT(Tlsq_ptr_t        )   ** out_ISSUE_OUT_STORE_QUEUE_PTR_READ ;//[nb_inst_issue]
131  public    : SC_OUT(Tcontrol_t        )   ** out_ISSUE_OUT_STORE_QUEUE_EMPTY    ;//[nb_inst_issue]
132  public    : SC_OUT(Tlsq_ptr_t        )   ** out_ISSUE_OUT_LOAD_QUEUE_PTR_WRITE ;//[nb_inst_issue]
133  public    : SC_OUT(Tcontrol_t        )   ** out_ISSUE_OUT_HAS_IMMEDIAT         ;//[nb_inst_issue]
134  public    : SC_OUT(Tgeneral_data_t   )   ** out_ISSUE_OUT_IMMEDIAT             ;//[nb_inst_issue]
135  public    : SC_OUT(Tcontrol_t        )   ** out_ISSUE_OUT_READ_RA              ;//[nb_inst_issue]
136  public    : SC_OUT(Tgeneral_address_t)   ** out_ISSUE_OUT_NUM_REG_RA           ;//[nb_inst_issue]
137  public    : SC_OUT(Tcontrol_t        )   ** out_ISSUE_OUT_READ_RB              ;//[nb_inst_issue]
138  public    : SC_OUT(Tgeneral_address_t)   ** out_ISSUE_OUT_NUM_REG_RB           ;//[nb_inst_issue]
139  public    : SC_OUT(Tcontrol_t        )   ** out_ISSUE_OUT_READ_RC              ;//[nb_inst_issue]
140  public    : SC_OUT(Tspecial_address_t)   ** out_ISSUE_OUT_NUM_REG_RC           ;//[nb_inst_issue]
141  public    : SC_OUT(Tcontrol_t        )   ** out_ISSUE_OUT_WRITE_RD             ;//[nb_inst_issue]
142  public    : SC_OUT(Tgeneral_address_t)   ** out_ISSUE_OUT_NUM_REG_RD           ;//[nb_inst_issue]
143  public    : SC_OUT(Tcontrol_t        )   ** out_ISSUE_OUT_WRITE_RE             ;//[nb_inst_issue]
144  public    : SC_OUT(Tspecial_address_t)   ** out_ISSUE_OUT_NUM_REG_RE           ;//[nb_inst_issue]
145
146    // ~~~~~[ Component ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
147  private   : generic::priority::Priority   * _priority_in ;
148
149    // in_order implementation only
150    // out_of_order implementation only
151  private   : generic::priority::Priority   * _priority_reg;
152  private   : generic::priority::Priority   * _priority_out;
153
154    // ~~~~~[ Register ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
155    // common implementation
156  private   : std::list<entry_t*>           * _issue_queue;
157  private   : std::list<entry_t*>             _reexecute_queue;
158
159    // in_order implementation only
160  private   : uint32_t                        reg_NUM_BANK_HEAD;
161  private   : uint32_t                        reg_NUM_BANK_TAIL;
162    // out_of_order implementation only
163 
164    // ~~~~~[ Internal ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
165    // common implementation
166  private   : Tcontrol_t                    * internal_ISSUE_OUT_VAL            ;//[nb_inst_issue]
167  private   : Tcontrol_t                    * internal_ISSUE_OUT_FROM_REEXECUTE ;//[nb_inst_issue]
168  private   : uint32_t                      * internal_ISSUE_OUT_NUM_BANK       ;//[nb_inst_issue]
169  private   : entry_t *                     * internal_ISSUE_OUT_ENTRY          ;//[nb_inst_issue]
170
171  private   : Tcontrol_t                    * internal_REEXECUTE_ACK            ;//[nb_inst_reexecute]
172
173    // in_order implementation only
174  private   : Tcontrol_t                    * internal_BANK_IN_ACK              ;//[nb_bank]
175  private   : uint32_t                      * internal_BANK_IN_NUM_RENAME_UNIT  ;//[nb_bank]
176  private   : uint32_t                      * internal_BANK_IN_NUM_INST         ;//[nb_bank]
177    // out_of_order implementation only
178  public    : Tcontrol_t                   ** internal_ISSUE_IN_ACK             ;//[nb_rename_unit][nb_inst_rename]
179
180    // function pointer
181  public    : void (morpheo::behavioural::core::multi_ooo_engine::ooo_engine::issue_queue::Issue_queue::*function_transition) (void);
182  public    : void (morpheo::behavioural::core::multi_ooo_engine::ooo_engine::issue_queue::Issue_queue::*function_genMoore  ) (void);
183  public    : void (morpheo::behavioural::core::multi_ooo_engine::ooo_engine::issue_queue::Issue_queue::*function_genMealy_issue_in ) (void);
184  public    : void (morpheo::behavioural::core::multi_ooo_engine::ooo_engine::issue_queue::Issue_queue::*function_genMealy_issue_out) (void);
185#endif
186
187    // -----[ Methods ]---------------------------------------------------
188
189#ifdef SYSTEMC
190    SC_HAS_PROCESS (Issue_queue);
191#endif
192  public  :          Issue_queue             
193  (
194#ifdef SYSTEMC
195   sc_module_name                                name,
196#else                                         
197   std::string                                   name,
198#endif                                         
199#ifdef STATISTICS
200   morpheo::behavioural::Parameters_Statistics * param_statistics,
201#endif
202   Parameters                                  * param,
203   morpheo::behavioural::Tusage_t                usage
204   );
205  public  :          ~Issue_queue             (void);
206                                               
207  private : void        allocation                (
208#ifdef STATISTICS
209                                                   morpheo::behavioural::Parameters_Statistics * param_statistics
210#else
211                                                   void
212#endif
213                                                   );
214  private : void        deallocation              (void);
215                                               
216#ifdef SYSTEMC                                 
217  public  : void        transition                          (void);
218  public  : void        genMoore                            (void);
219  public  : void        genMealy_issue_in                   (void);
220  public  : void        genMealy_issue_out                  (void);
221
222  public  : void        function_in_order_transition        (void);
223  public  : void        function_in_order_genMealy_issue_out(void);
224  public  : void        function_in_order_genMoore          (void);
225
226  public  : void        function_out_of_order_transition    (void);
227  public  : void        function_out_of_order_genMoore      (void);
228#endif                                         
229
230#if VHDL                                       
231  public  : void        vhdl                      (void);
232  private : void        vhdl_declaration          (Vhdl * & vhdl);
233  private : void        vhdl_body                 (Vhdl * & vhdl);
234#endif                                         
235
236#ifdef STATISTICS
237  public  : void        statistics_allocation     (morpheo::behavioural::Parameters_Statistics * param_statistics);
238  public  : void        statistics_deallocation   (void);
239#endif
240#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
241  private : void        end_cycle                 (void);
242#endif
243  };
244
245}; // end namespace issue_queue
246}; // end namespace ooo_engine
247}; // end namespace multi_ooo_engine
248}; // end namespace core
249
250}; // end namespace behavioural
251}; // end namespace morpheo             
252
253#endif
Note: See TracBrowser for help on using the repository browser.