source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Read_unit/Read_unit/Read_queue/src/Read_queue_transition.cpp @ 123

Last change on this file since 123 was 123, checked in by rosiere, 15 years ago

1) Fix performance
2) add auto generation to SPECINT2000
3) add reset in genMoore and genMealy

  • Property svn:keywords set to Id
File size: 11.2 KB
Line 
1#ifdef SYSTEMC
2//#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
3/*
4 * $Id: Read_queue_transition.cpp 123 2009-06-08 20:43:30Z rosiere $
5 *
6 * [ Description ]
7 *
8 */
9
10#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Read_unit/Read_unit/Read_queue/include/Read_queue.h"
11
12namespace morpheo                    {
13namespace behavioural {
14namespace core {
15namespace multi_execute_loop {
16namespace execute_loop {
17namespace multi_read_unit {
18namespace read_unit {
19namespace read_queue {
20
21
22#undef  FUNCTION
23#define FUNCTION "Read_queue::transition"
24  void Read_queue::transition (void)
25  {
26    log_begin(Read_queue,FUNCTION);
27    log_function(Read_queue,FUNCTION,_name.c_str());
28
29    if (PORT_READ(in_NRESET) == 0)
30      {
31        // Flush queue
32        // FIXME "queue reset"
33        // > 1) flush one slot by cycle
34        // > 2) flush all slot in one cycle
35
36        while (_queue->empty() == false)
37          {
38            delete _queue->front();
39            _queue->pop_front();
40          }
41        // _queue->clear();
42
43        // Init, else error in registerfile
44        _queue_head->_ooo_engine_id = 0;
45        // not necessary
46        _queue_head->_read_ra_val = false;
47        _queue_head->_read_rb_val = false;
48        _queue_head->_read_rc_val = false;
49
50        _queue_head->_data_ra_val = false;
51        _queue_head->_data_rb_val = false;
52        _queue_head->_data_rc_val = false;
53
54        _queue_head->_num_reg_ra  = 0;
55        _queue_head->_num_reg_rb  = 0;
56        _queue_head->_num_reg_rc  = 0;
57      }
58    else
59      {
60//      cout << "Transition Begin  : Print queue_head" << endl;
61//      if (_queue->empty ())
62//        cout << "queue is empty !!!" << endl;
63//      else
64//        cout << (*_queue_head) << endl;
65
66        log_printf(TRACE,Read_queue,FUNCTION,"  * Read_queue size (begin) : %d",(int)_queue->size());
67        // Write to read_queue
68
69        bool not_full      = not (_queue->size() == _param->_size_queue);
70        bool     empty     =     _queue->empty();
71        bool need_new_head = false;
72       
73        log_printf(TRACE,Read_queue,FUNCTION,"    * test transaction READ_QUEUE_IN  : %d,%d",PORT_READ(in_READ_QUEUE_IN_VAL), not_full);
74        if ((PORT_READ(in_READ_QUEUE_IN_VAL) == 1) and not_full)
75          {
76            Tread_queue_entry_t * entry = new Tread_queue_entry_t;
77
78            if(_param->_have_port_context_id   )
79            entry->_context_id   = PORT_READ(in_READ_QUEUE_IN_CONTEXT_ID  );
80            if(_param->_have_port_front_end_id )
81            entry->_front_end_id = PORT_READ(in_READ_QUEUE_IN_FRONT_END_ID);
82            if(_param->_have_port_ooo_engine_id)
83            entry->_ooo_engine_id= PORT_READ(in_READ_QUEUE_IN_OOO_ENGINE_ID);
84            if(_param->_have_port_rob_ptr      )
85            entry->_rob_id       = PORT_READ(in_READ_QUEUE_IN_ROB_ID      );
86            entry->_operation    = PORT_READ(in_READ_QUEUE_IN_OPERATION   );
87            entry->_type         = PORT_READ(in_READ_QUEUE_IN_TYPE        );
88            entry->_store_queue_ptr_write = PORT_READ(in_READ_QUEUE_IN_STORE_QUEUE_PTR_WRITE);
89            entry->_store_queue_ptr_read  = PORT_READ(in_READ_QUEUE_IN_STORE_QUEUE_PTR_READ );
90            entry->_store_queue_empty     = PORT_READ(in_READ_QUEUE_IN_STORE_QUEUE_EMPTY    );
91            if (_param->_have_port_load_queue_ptr)
92            entry->_load_queue_ptr_write  = PORT_READ(in_READ_QUEUE_IN_LOAD_QUEUE_PTR_WRITE );
93            entry->_has_immediat = PORT_READ(in_READ_QUEUE_IN_HAS_IMMEDIAT);
94            entry->_immediat     = PORT_READ(in_READ_QUEUE_IN_IMMEDIAT    );
95            entry->_read_ra      = PORT_READ(in_READ_QUEUE_IN_READ_RA     );
96            entry->_num_reg_ra   = PORT_READ(in_READ_QUEUE_IN_NUM_REG_RA  );
97            entry->_read_rb      = PORT_READ(in_READ_QUEUE_IN_READ_RB     );
98            entry->_num_reg_rb   = PORT_READ(in_READ_QUEUE_IN_NUM_REG_RB  );
99            entry->_read_rc      = PORT_READ(in_READ_QUEUE_IN_READ_RC     );
100            entry->_num_reg_rc   = PORT_READ(in_READ_QUEUE_IN_NUM_REG_RC  );
101            entry->_write_rd     = PORT_READ(in_READ_QUEUE_IN_WRITE_RD    );
102            entry->_num_reg_rd   = PORT_READ(in_READ_QUEUE_IN_NUM_REG_RD  );
103            entry->_write_re     = PORT_READ(in_READ_QUEUE_IN_WRITE_RE    );
104            entry->_num_reg_re   = PORT_READ(in_READ_QUEUE_IN_NUM_REG_RE  );
105
106            log_printf(TRACE,Read_queue,FUNCTION,"    * push (id : %d-%d)",entry->_context_id, entry->_rob_id);
107            _queue->push_back(entry);
108
109            // read next new head
110            if (empty)
111              {
112                log_printf(TRACE,Read_queue,FUNCTION,"    * queue was    empty");
113                need_new_head = true;
114              }
115          }
116
117        // Read from read_queue
118        log_printf(TRACE,Read_queue,FUNCTION,"  * test transaction READ_QUEUE_OUT : %d,%d",internal_READ_QUEUE_OUT_VAL, PORT_READ(in_READ_QUEUE_OUT_ACK));
119        if ((    internal_READ_QUEUE_OUT_VAL  == 1) and
120            (PORT_READ(in_READ_QUEUE_OUT_ACK) == 1))
121          {
122            // Pop the entry
123            log_printf(TRACE,Read_queue,FUNCTION,"    * pop  (id : %d-%d)",_queue->front()->_context_id, _queue->front()->_rob_id);
124            _queue->pop_front();
125
126            // read next new head
127            if (_queue->empty() == false)
128              {
129                log_printf(TRACE,Read_queue,FUNCTION,"    * queue was not empty");
130                need_new_head = true;
131              }
132          }
133        else
134          {
135            // no transaction, update queue_head
136            _queue_head->_read_ra_val = internal_READ_QUEUE_OUT_READ_RA_VAL ;
137            _queue_head->_data_ra_val = internal_READ_QUEUE_OUT_DATA_RA_VAL ;
138            _queue_head->_data_ra     = internal_READ_QUEUE_OUT_DATA_RA     ;
139
140            _queue_head->_read_rb_val = internal_READ_QUEUE_OUT_READ_RB_VAL ;
141            _queue_head->_data_rb_val = internal_READ_QUEUE_OUT_DATA_RB_VAL ;
142            _queue_head->_data_rb     = internal_READ_QUEUE_OUT_DATA_RB     ;
143
144            _queue_head->_read_rc_val = internal_READ_QUEUE_OUT_READ_RC_VAL ;
145            _queue_head->_data_rc_val = internal_READ_QUEUE_OUT_DATA_RC_VAL ;
146            _queue_head->_data_rc     = internal_READ_QUEUE_OUT_DATA_RC     ;
147          }
148
149        if (need_new_head == true)
150          {
151            log_printf(TRACE,Read_queue,FUNCTION,"  * new head");
152            (*_queue_head) = (*_queue->front());
153          }
154       
155//      cout << "Transition End    : Print queue_head" << endl;
156//      if (_queue->empty ())
157//        cout << "queue is empty !!!" << endl;
158//      else
159//        cout << (*_queue_head) << endl;
160
161#if (DEBUG >= DEBUG_TRACE) and (DEBUG_Read_queue == true)
162        log_printf(TRACE,Read_queue,FUNCTION,"  * Dump Read_queue");
163        log_printf(TRACE,Read_queue,FUNCTION,"    * size : %d / %d",(int)_queue->size(),_param->_size_queue);
164
165        if (_queue->size()>0)
166          {
167            log_printf(TRACE,Read_queue,FUNCTION,"    * [%.4d] %.2d %.2d %.2d %.4d, %.2d %.3d, %.2d %.2d %.1d %.2d, %.1d %.8x, %.1d %.1d %.4d %.1d %.8x, %.1d %.1d %.4d %.1d %.8x, %.1d %.1d %.4d %.1d %.2x, %.1d %.4d, %.1d %.4d (%s)",
168                       0,
169
170                       _queue_head->_context_id           ,
171                       _queue_head->_front_end_id         ,
172                       _queue_head->_ooo_engine_id        ,
173                       _queue_head->_rob_id               ,
174
175                       _queue_head->_type                 ,
176                       _queue_head->_operation            ,
177
178                       _queue_head->_store_queue_ptr_write,
179                       _queue_head->_store_queue_ptr_read ,
180                       _queue_head->_store_queue_empty    ,
181                       _queue_head->_load_queue_ptr_write ,
182
183                       _queue_head->_has_immediat         ,
184                       _queue_head->_immediat             ,
185
186                       _queue_head->_read_ra              ,
187                       _queue_head->_read_ra_val          ,
188                       _queue_head->_num_reg_ra           ,
189                       _queue_head->_data_ra_val          ,
190                       _queue_head->_data_ra              ,
191
192                       _queue_head->_read_rb              ,
193                       _queue_head->_read_rb_val          ,
194                       _queue_head->_num_reg_rb           ,
195                       _queue_head->_data_rb_val          ,
196                       _queue_head->_data_rb              ,
197
198                       _queue_head->_read_rc              ,
199                       _queue_head->_read_rc_val          ,
200                       _queue_head->_num_reg_rc           ,
201                       _queue_head->_data_rc_val          ,
202                       _queue_head->_data_rc              ,
203
204                       _queue_head->_write_rd             ,
205                       _queue_head->_num_reg_rd           ,
206                       
207                       _queue_head->_write_re             ,
208                       _queue_head->_num_reg_re           ,
209
210                       toString(_queue_head->_type).c_str());
211
212
213            std::list<Tread_queue_entry_t *>::iterator it=_queue->begin();
214            ++it; // first is already printed
215            uint32_t i=1;
216
217            for (;it!=_queue->end(); ++it)
218              {
219                log_printf(TRACE,Read_queue,FUNCTION,"    * [%.4d] %.2d %.2d %.2d %.4d, %.2d %.3d, %.2d %.2d %.1d %.2d, %.1d %.8x, %.1d   %.4d           , %.1d   %.4d           , %.1d   %.4d     , %.1d %.4d, %.1d %.4d (%s)",
220                           i,
221                           
222                           (*it)->_context_id           ,
223                           (*it)->_front_end_id         ,
224                           (*it)->_ooo_engine_id        ,
225                           (*it)->_rob_id               ,
226                           
227                           (*it)->_type                 ,
228                           (*it)->_operation            ,
229                           
230                           (*it)->_store_queue_ptr_write,
231                           (*it)->_store_queue_ptr_read ,
232                           (*it)->_store_queue_empty    ,
233                           (*it)->_load_queue_ptr_write ,
234                           
235                           (*it)->_has_immediat         ,
236                           (*it)->_immediat             ,
237                           
238                           (*it)->_read_ra              ,
239//                         (*it)->_read_ra_val          ,
240                           (*it)->_num_reg_ra           ,
241//                         (*it)->_data_ra_val          ,
242//                         (*it)->_data_ra              ,
243                           
244                           (*it)->_read_rb              ,
245//                         (*it)->_read_rb_val          ,
246                           (*it)->_num_reg_rb           ,
247//                         (*it)->_data_rb_val          ,
248//                         (*it)->_data_rb              ,
249                           
250                           (*it)->_read_rc              ,
251//                         (*it)->_read_rc_val          ,
252                           (*it)->_num_reg_rc           ,
253//                         (*it)->_data_rc_val          ,
254//                         (*it)->_data_rc              ,
255                           
256                           (*it)->_write_rd             ,
257                           (*it)->_num_reg_rd           ,
258                           
259                           (*it)->_write_re             ,
260                           (*it)->_num_reg_re           ,
261
262                           toString((*it)->_type).c_str());
263
264                ++i;
265              }
266          }
267#endif
268      }
269
270#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
271        end_cycle ();
272#endif
273
274    log_end(Read_queue,FUNCTION);
275  };
276
277}; // end namespace read_queue
278}; // end namespace read_unit
279}; // end namespace multi_read_unit
280}; // end namespace execute_loop
281}; // end namespace multi_execute_loop
282}; // end namespace core
283
284}; // end namespace behavioural
285}; // end namespace morpheo             
286#endif
287//#endif
Note: See TracBrowser for help on using the repository browser.