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

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