source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Read_unit/Read_unit/Read_queue/include/Read_queue.h @ 75

Last change on this file since 75 was 75, checked in by rosiere, 16 years ago

Update all component (except front_end) to :

  • new statistics model
  • no namespace std
File size: 17.4 KB
Line 
1#ifndef morpheo_behavioural_core_multi_execute_loop_execute_loop_multi_read_unit_read_unit_read_queue_Read_queue_h
2#define morpheo_behavioural_core_multi_execute_loop_execute_loop_multi_read_unit_read_unit_read_queue_Read_queue_h
3
4/*
5 * $Id$
6 *
7 * [ Description ]
8 *
9 */
10
11#ifdef SYSTEMC
12#include "systemc.h"
13#endif
14
15#include <iostream>
16#include <queue>
17#include "Common/include/ToString.h"
18#include "Common/include/Debug.h"
19#include "Behavioural/include/Types.h"
20
21#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Read_unit/Read_unit/Read_queue/include/Parameters.h"
22#ifdef STATISTICS
23#include "Behavioural/include/Stat.h"
24#endif
25#include "Behavioural/include/Component.h"
26#ifdef VHDL
27#include "Behavioural/include/Vhdl.h"
28#endif
29
30namespace morpheo {
31namespace behavioural {
32namespace core {
33namespace multi_execute_loop {
34namespace execute_loop {
35namespace multi_read_unit {
36namespace read_unit {
37namespace read_queue {
38 
39  class Tread_queue_entry_t
40  {
41  public    : Tcontext_t         _context_id   ;
42  public    : Tcontext_t         _front_end_id ;
43  public    : Tcontext_t         _ooo_engine_id;
44  public    : Tpacket_t          _rob_id       ;
45  public    : Toperation_t       _operation    ;
46  public    : Ttype_t            _type         ;
47  public    : Tcontrol_t         _has_immediat ;
48  public    : Tgeneral_data_t    _immediat     ;
49  public    : Tcontrol_t         _read_ra      ;
50  public    : Tgeneral_address_t _num_reg_ra   ;
51  public    : Tcontrol_t         _read_rb      ;
52  public    : Tgeneral_address_t _num_reg_rb   ;
53  public    : Tcontrol_t         _read_rc      ;
54  public    : Tspecial_address_t _num_reg_rc   ;
55  public    : Tcontrol_t         _write_rd     ;
56  public    : Tgeneral_address_t _num_reg_rd   ;
57  public    : Tcontrol_t         _write_re     ;
58  public    : Tspecial_address_t _num_reg_re   ;
59
60    friend std::ostream& operator<< (std::ostream& output_stream,
61                                morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_read_unit::read_unit::read_queue::Tread_queue_entry_t & x)
62    {
63      output_stream << " * _context_id    : " << toString(x._context_id   ) << std::endl
64                    << " * _front_end_id  : " << toString(x._front_end_id ) << std::endl
65                    << " * _ooo_engine_id : " << toString(x._ooo_engine_id) << std::endl
66                    << " * _rob_id        : " << toString(x._rob_id       ) << std::endl
67                    << " * _operation     : " << toString(x._operation    ) << std::endl
68                    << " * _type          : " << toString(x._type         ) << std::endl
69                    << " * _has_immediat  : " << toString(x._has_immediat ) << std::endl
70                    << " * _immediat      : " << toString(x._immediat     ) << std::endl
71                    << " * _read_ra       : " << toString(x._read_ra      ) << std::endl
72                    << " * _num_reg_ra    : " << toString(x._num_reg_ra   ) << std::endl
73                    << " * _read_rb       : " << toString(x._read_rb      ) << std::endl
74                    << " * _num_reg_rb    : " << toString(x._num_reg_rb   ) << std::endl
75                    << " * _read_rc       : " << toString(x._read_rc      ) << std::endl
76                    << " * _num_reg_rc    : " << toString(x._num_reg_rc   ) << std::endl
77                    << " * _write_rd      : " << toString(x._write_rd     ) << std::endl
78                    << " * _num_reg_rd    : " << toString(x._num_reg_rd   ) << std::endl
79                    << " * _write_re      : " << toString(x._write_re     ) << std::endl
80                    << " * _num_reg_re    : " << toString(x._num_reg_re   ) << std::endl;
81
82      return output_stream;
83    }
84
85  };
86
87  class Tread_queue_head_entry_t
88  {
89  public    : Tcontext_t         _context_id   ;
90  public    : Tcontext_t         _front_end_id ;
91  public    : Tcontext_t         _ooo_engine_id;
92  public    : Tpacket_t          _rob_id       ;
93  public    : Toperation_t       _operation    ;
94  public    : Ttype_t            _type         ;
95  public    : Tcontrol_t         _has_immediat ;
96  public    : Tgeneral_data_t    _immediat     ;
97  public    : Tcontrol_t         _read_ra      ;
98  public    : Tcontrol_t         _read_ra_val  ; // 1 : must access at the registerFile (after access, is set at 0)
99  public    : Tgeneral_address_t _num_reg_ra   ;
100  public    : Tcontrol_t         _data_ra_val  ; // 1 : the read of registerFile is valid
101  public    : Tgeneral_data_t    _data_ra      ;
102  public    : Tcontrol_t         _read_rb      ;
103  public    : Tcontrol_t         _read_rb_val  ;
104  public    : Tgeneral_address_t _num_reg_rb   ;
105  public    : Tcontrol_t         _data_rb_val  ;
106  public    : Tgeneral_data_t    _data_rb      ;
107  public    : Tcontrol_t         _read_rc      ;
108  public    : Tcontrol_t         _read_rc_val  ;
109  public    : Tspecial_address_t _num_reg_rc   ;
110  public    : Tcontrol_t         _data_rc_val  ;
111  public    : Tspecial_data_t    _data_rc      ;
112  public    : Tcontrol_t         _write_rd     ;
113  public    : Tgeneral_address_t _num_reg_rd   ;
114  public    : Tcontrol_t         _write_re     ;
115  public    : Tspecial_address_t _num_reg_re   ;
116
117#undef  FUNCTION
118#define FUNCTION "Tread_queue_head_entry_t::operator="
119  public    : Tread_queue_head_entry_t& operator=(Tread_queue_entry_t x)
120    {
121      log_printf(FUNC,Read_queue,FUNCTION,"Begin");
122         
123      _context_id   = x._context_id   ;
124      _front_end_id = x._front_end_id ;
125      _ooo_engine_id= x._ooo_engine_id;
126      _rob_id       = x._rob_id       ;
127      _operation    = x._operation    ;
128      _type         = x._type         ;
129      _has_immediat = x._has_immediat ;
130      _immediat     = x._immediat     ;
131      _read_ra      = x._read_ra      ;
132      _read_ra_val  = x._read_ra == 1 ; //if not must read, the registerFile is already access
133      _num_reg_ra   = x._num_reg_ra   ;
134      _data_ra_val  = x._read_ra == 0 ; //if not must read, the data is already valid
135      _data_ra      = 0               ;
136      _read_rb      = x._read_rb      ;
137      _read_rb_val  = x._read_rb == 1 ;
138      _num_reg_rb   = x._num_reg_rb   ;
139      _data_rb_val  = x._read_rb == 0 ;
140      _data_rb      = 0               ;
141      _read_rc      = x._read_rc      ;
142      _read_rc_val  = x._read_rc == 1 ;
143      _num_reg_rc   = x._num_reg_rc   ;
144      _data_rc_val  = x._read_rc == 0 ;
145      _data_rc      = 0               ;
146      _write_rd     = x._write_rd     ;
147      _num_reg_rd   = x._num_reg_rd   ;
148      _write_re     = x._write_re     ;
149      _num_reg_re   = x._num_reg_re   ;
150
151      log_printf(FUNC,Read_queue,FUNCTION,"End");
152
153      return *this;
154    }
155
156    friend std::ostream& operator<< (std::ostream& output_stream,
157                                morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_read_unit::read_unit::read_queue::Tread_queue_head_entry_t & x)
158    {
159      output_stream << " * _context_id    : " << x._context_id   << std::endl
160                    << " * _front_end_id  : " << x._front_end_id << std::endl
161                    << " * _ooo_engine_id : " << x._ooo_engine_id<< std::endl
162                    << " * _rob_id        : " << x._rob_id       << std::endl
163                    << " * _operation     : " << x._operation    << std::endl
164                    << " * _type          : " << x._type         << std::endl
165                    << " * _has_immediat  : " << x._has_immediat << std::endl
166                    << " * _immediat      : " << x._immediat     << std::endl
167                    << " * _read_ra       : " << x._read_ra      << std::endl
168                    << " * _read_ra_val   : " << x._read_ra_val  << std::endl
169                    << " * _num_reg_ra    : " << x._num_reg_ra   << std::endl
170                    << " * _data_ra_val   : " << x._data_ra_val  << std::endl
171                    << " * _data_ra       : " << x._data_ra      << std::endl
172                    << " * _read_rb       : " << x._read_rb      << std::endl
173                    << " * _read_rb_val   : " << x._read_rb_val  << std::endl
174                    << " * _num_reg_rb    : " << x._num_reg_rb   << std::endl
175                    << " * _data_rb_val   : " << x._data_rb_val  << std::endl
176                    << " * _data_rb       : " << x._data_rb      << std::endl
177                    << " * _read_rc       : " << x._read_rc      << std::endl
178                    << " * _read_rc_val   : " << x._read_rc_val  << std::endl
179                    << " * _num_reg_rc    : " << x._num_reg_rc   << std::endl
180                    << " * _data_rc_val   : " << x._data_rc_val  << std::endl
181                    << " * _data_rc       : " << x._data_rc      << std::endl
182                    << " * _write_rd      : " << x._write_rd     << std::endl
183                    << " * _num_reg_rd    : " << x._num_reg_rd   << std::endl
184                    << " * _write_re      : " << x._write_re     << std::endl
185                    << " * _num_reg_re    : " << x._num_reg_re   << std::endl;
186
187      return output_stream;
188    }
189  };
190
191  class Read_queue
192#if SYSTEMC
193    : public sc_module
194#endif
195  {
196    // -----[ fields ]----------------------------------------------------
197    // Parameters
198  protected : const std::string                _name;
199  protected : const Parameters               * _param;
200
201#ifdef STATISTICS
202  public    : Stat                           * _stat;
203#endif
204
205  public    : Component                      * _component;
206  private   : Interfaces                     * _interfaces;
207
208#ifdef SYSTEMC
209    // ~~~~~[ Interface ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
210    // Interface
211  public    : SC_CLOCK                      *  in_CLOCK               ;
212  public    : SC_IN (Tcontrol_t        )    *  in_NRESET              ;
213
214    // ~~~~~[ Interface "read_queue_in" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
215
216  public    : SC_IN (Tcontrol_t        )    *  in_READ_QUEUE_IN_VAL          ;
217  public    : SC_OUT(Tcontrol_t        )    * out_READ_QUEUE_IN_ACK          ;
218  public    : SC_IN (Tcontext_t        )    *  in_READ_QUEUE_IN_CONTEXT_ID   ;
219  public    : SC_IN (Tcontext_t        )    *  in_READ_QUEUE_IN_FRONT_END_ID ;
220  public    : SC_IN (Tcontext_t        )    *  in_READ_QUEUE_IN_OOO_ENGINE_ID;
221  public    : SC_IN (Tpacket_t         )    *  in_READ_QUEUE_IN_ROB_ID       ;
222  public    : SC_IN (Toperation_t      )    *  in_READ_QUEUE_IN_OPERATION    ;
223  public    : SC_IN (Ttype_t           )    *  in_READ_QUEUE_IN_TYPE         ;
224  public    : SC_IN (Tcontrol_t        )    *  in_READ_QUEUE_IN_HAS_IMMEDIAT ;
225  public    : SC_IN (Tgeneral_data_t   )    *  in_READ_QUEUE_IN_IMMEDIAT     ;
226  public    : SC_IN (Tcontrol_t        )    *  in_READ_QUEUE_IN_READ_RA      ;
227  public    : SC_IN (Tgeneral_address_t)    *  in_READ_QUEUE_IN_NUM_REG_RA   ;
228  public    : SC_IN (Tcontrol_t        )    *  in_READ_QUEUE_IN_READ_RB      ;
229  public    : SC_IN (Tgeneral_address_t)    *  in_READ_QUEUE_IN_NUM_REG_RB   ;
230  public    : SC_IN (Tcontrol_t        )    *  in_READ_QUEUE_IN_READ_RC      ;
231  public    : SC_IN (Tspecial_address_t)    *  in_READ_QUEUE_IN_NUM_REG_RC   ;
232  public    : SC_IN (Tcontrol_t        )    *  in_READ_QUEUE_IN_WRITE_RD     ;
233  public    : SC_IN (Tgeneral_address_t)    *  in_READ_QUEUE_IN_NUM_REG_RD   ;
234  public    : SC_IN (Tcontrol_t        )    *  in_READ_QUEUE_IN_WRITE_RE     ;
235  public    : SC_IN (Tspecial_address_t)    *  in_READ_QUEUE_IN_NUM_REG_RE   ;
236
237    // ~~~~~[ Interface "read_queue_out" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
238
239  public    : SC_OUT(Tcontrol_t        )    * out_READ_QUEUE_OUT_VAL         ;
240  public    : SC_IN (Tcontrol_t        )    *  in_READ_QUEUE_OUT_ACK         ;
241  public    : SC_OUT(Tcontext_t        )    * out_READ_QUEUE_OUT_CONTEXT_ID   ;
242  public    : SC_OUT(Tcontext_t        )    * out_READ_QUEUE_OUT_FRONT_END_ID ;
243  public    : SC_OUT(Tcontext_t        )    * out_READ_QUEUE_OUT_OOO_ENGINE_ID;
244  public    : SC_OUT(Tpacket_t         )    * out_READ_QUEUE_OUT_ROB_ID       ;
245  public    : SC_OUT(Toperation_t      )    * out_READ_QUEUE_OUT_OPERATION   ;
246  public    : SC_OUT(Ttype_t           )    * out_READ_QUEUE_OUT_TYPE        ;
247  public    : SC_OUT(Tcontrol_t        )    * out_READ_QUEUE_OUT_HAS_IMMEDIAT;
248  public    : SC_OUT(Tgeneral_data_t   )    * out_READ_QUEUE_OUT_IMMEDIAT    ;
249  public    : SC_OUT(Tcontrol_t        )    * out_READ_QUEUE_OUT_READ_RA     ;
250  public    : SC_OUT(Tgeneral_address_t)    * out_READ_QUEUE_OUT_NUM_REG_RA  ;
251  public    : SC_OUT(Tcontrol_t        )    * out_READ_QUEUE_OUT_DATA_RA_VAL ;
252  public    : SC_OUT(Tgeneral_data_t   )    * out_READ_QUEUE_OUT_DATA_RA     ;
253  public    : SC_OUT(Tcontrol_t        )    * out_READ_QUEUE_OUT_READ_RB     ;
254  public    : SC_OUT(Tgeneral_address_t)    * out_READ_QUEUE_OUT_NUM_REG_RB  ;
255  public    : SC_OUT(Tcontrol_t        )    * out_READ_QUEUE_OUT_DATA_RB_VAL ;
256  public    : SC_OUT(Tgeneral_data_t   )    * out_READ_QUEUE_OUT_DATA_RB     ;
257  public    : SC_OUT(Tcontrol_t        )    * out_READ_QUEUE_OUT_READ_RC     ;
258  public    : SC_OUT(Tspecial_address_t)    * out_READ_QUEUE_OUT_NUM_REG_RC  ;
259  public    : SC_OUT(Tcontrol_t        )    * out_READ_QUEUE_OUT_DATA_RC_VAL ;
260  public    : SC_OUT(Tspecial_data_t   )    * out_READ_QUEUE_OUT_DATA_RC     ;
261  public    : SC_OUT(Tcontrol_t        )    * out_READ_QUEUE_OUT_WRITE_RD    ;
262  public    : SC_OUT(Tgeneral_address_t)    * out_READ_QUEUE_OUT_NUM_REG_RD  ;
263  public    : SC_OUT(Tcontrol_t        )    * out_READ_QUEUE_OUT_WRITE_RE    ;
264  public    : SC_OUT(Tspecial_address_t)    * out_READ_QUEUE_OUT_NUM_REG_RE  ;
265
266    // ~~~~~[ Interface "gpr_read" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
267
268  public    : SC_OUT(Tcontrol_t        )   ** out_GPR_READ_VAL          ;
269  public    : SC_IN (Tcontrol_t        )   **  in_GPR_READ_ACK          ;
270  public    : SC_OUT(Tcontext_t        )   ** out_GPR_READ_OOO_ENGINE_ID;
271  public    : SC_OUT(Tgeneral_address_t)   ** out_GPR_READ_NUM_REG      ;
272  public    : SC_IN (Tgeneral_data_t   )   **  in_GPR_READ_DATA         ;
273  public    : SC_IN (Tcontrol_t        )   **  in_GPR_READ_DATA_VAL     ;
274
275    // ~~~~~[ Interface "spr_read" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
276
277  public    : SC_OUT(Tcontrol_t        )   ** out_SPR_READ_VAL          ;
278  public    : SC_IN (Tcontrol_t        )   **  in_SPR_READ_ACK          ;
279  public    : SC_OUT(Tcontext_t        )   ** out_SPR_READ_OOO_ENGINE_ID;
280  public    : SC_OUT(Tspecial_address_t)   ** out_SPR_READ_NUM_REG      ;
281  public    : SC_IN (Tspecial_data_t   )   **  in_SPR_READ_DATA         ;
282  public    : SC_IN (Tcontrol_t        )   **  in_SPR_READ_DATA_VAL     ;
283
284    // ~~~~~[ Interface "gpr_write" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
285
286  public    : SC_IN (Tcontrol_t        )   **  in_GPR_WRITE_VAL          ;
287  public    : SC_IN (Tcontext_t        )   **  in_GPR_WRITE_OOO_ENGINE_ID;
288  public    : SC_IN (Tgeneral_address_t)   **  in_GPR_WRITE_NUM_REG      ;
289  public    : SC_IN (Tgeneral_data_t   )   **  in_GPR_WRITE_DATA         ;
290
291    // ~~~~~[ Interface "spr_write" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
292
293  public    : SC_IN (Tcontrol_t        )   **  in_SPR_WRITE_VAL          ;
294  public    : SC_IN (Tcontext_t        )   **  in_SPR_WRITE_OOO_ENGINE_ID;
295  public    : SC_IN (Tspecial_address_t)   **  in_SPR_WRITE_NUM_REG      ;
296  public    : SC_IN (Tspecial_data_t   )   **  in_SPR_WRITE_DATA         ;
297
298    // ~~~~~[ Component ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
299
300    // ~~~~~[ Register ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
301  protected : Tread_queue_head_entry_t       * _queue_head;
302  protected : std::queue<Tread_queue_entry_t *>   * _queue;
303
304    // ~~~~~[ Internal ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
305 
306  protected  :Tcontrol_t                       internal_READ_QUEUE_OUT_VAL         ;
307  protected  :Tcontrol_t                       internal_READ_QUEUE_OUT_READ_RA_VAL ;
308  protected  :Tcontrol_t                       internal_READ_QUEUE_OUT_READ_RB_VAL ;
309  protected  :Tcontrol_t                       internal_READ_QUEUE_OUT_READ_RC_VAL ;
310
311  protected  :Tcontrol_t                       internal_READ_QUEUE_OUT_DATA_RA_VAL ;
312  protected  :Tcontrol_t                       internal_READ_QUEUE_OUT_DATA_RB_VAL ;
313  protected  :Tgeneral_data_t                  internal_READ_QUEUE_OUT_DATA_RA     ;
314  protected  :Tgeneral_data_t                  internal_READ_QUEUE_OUT_DATA_RB     ;
315  protected  :Tcontrol_t                       internal_READ_QUEUE_OUT_DATA_RC_VAL ;
316  protected  :Tspecial_data_t                  internal_READ_QUEUE_OUT_DATA_RC     ;
317#endif
318
319    // -----[ methods ]---------------------------------------------------
320
321#ifdef SYSTEMC
322    SC_HAS_PROCESS (Read_queue);
323#endif
324  public  :          Read_queue              (
325#ifdef SYSTEMC
326                                              sc_module_name                              name,
327#else                                         
328                                              std::string                                 name,
329#endif                                         
330#ifdef STATISTICS
331                                              morpheo::behavioural::Parameters_Statistics * param_statistics,
332#endif
333                                              Parameters                                  * param );
334                                               
335  public  :          Read_queue              (Parameters * param );
336  public  :          ~Read_queue             (void);
337                                               
338#ifdef SYSTEMC                                 
339  private : void     allocation                  (void);
340  private : void     deallocation                (void);
341                                               
342  public  : void     transition                  (void);
343  public  : void     genMoore                    (void);
344  public  : void     genMealy_read_queue_out_val (void); 
345  public  : void     genMealy_read_queue_out_gpr (void);
346  public  : void     genMealy_read_queue_out_spr (void);
347#endif                                         
348#ifdef STATISTICS
349  public  : void     statistics_declaration    (morpheo::behavioural::Parameters_Statistics * param_statistics);
350#endif
351                                               
352#if VHDL                                       
353  public  : void     vhdl                      (void);
354  private : void     vhdl_declaration          (Vhdl * & vhdl);
355  private : void     vhdl_body                 (Vhdl * & vhdl);
356#endif                                         
357                       
358#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
359  private : void     end_cycle                 (void);
360#endif
361  };
362
363}; // end namespace read_queue
364}; // end namespace read_unit
365}; // end namespace multi_read_unit
366}; // end namespace execute_loop
367}; // end namespace multi_execute_loop
368}; // end namespace core
369
370}; // end namespace behavioural
371}; // end namespace morpheo             
372
373#endif
Note: See TracBrowser for help on using the repository browser.