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

Last change on this file since 55 was 55, checked in by rosiere, 17 years ago

Ajout SystemC read_queue et reservation_station
Ajout port au bloc registerfile_monolithic (à ajouter également au bloc registerfile et registerfile_multi_banked)
Modif param : passage de pointeur (attention, tous les composants n'ont pas été tous modifier)

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