source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Issue_queue/src/Issue_queue_transition.cpp @ 109

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

1) Configuration : instance configuration file : regroup similar instance
2) Configuration : timing default = 0
3) Debug/Commit_unit : Add watch dog timer
4) Issue_queue : Test parameters : add test if type is optionnal
5) Cor_glue : Fix insert index
6) Free_list : remove bank_by_pop (else deadlock)
7) Update Free List : add register to source event

  • Property svn:keywords set to Id
File size: 8.9 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id: Issue_queue_transition.cpp 109 2009-02-16 20:28:31Z rosiere $
4 *
5 * [ Description ]
6 *
7 */
8
9#include "Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Issue_queue/include/Issue_queue.h"
10
11namespace morpheo                    {
12namespace behavioural {
13namespace core {
14namespace multi_ooo_engine {
15namespace ooo_engine {
16namespace issue_queue {
17
18
19#undef  FUNCTION
20#define FUNCTION "Issue_queue::transition"
21  void Issue_queue::transition (void)
22  {
23    log_begin(Issue_queue,FUNCTION);
24    log_function(Issue_queue,FUNCTION,_name.c_str());
25
26    if (PORT_READ(in_NRESET) == 0)
27      {
28        _priority_in ->reset();
29        _priority_out->reset();
30        _priority_reg->reset();
31       
32        for (uint32_t i=0; i<_param->_nb_bank; i++)
33          _issue_queue [i].clear();
34      }
35    else
36      {
37        _priority_in ->transition();
38        _priority_out->transition();
39        _priority_reg->transition();
40
41        // ===================================================================
42        // =====[ ISSUE_IN ]==================================================
43        // ===================================================================
44        for (uint32_t i=0; i<_param->_nb_bank; i++)
45          if (internal_BANK_IN_ACK [i])
46            {
47              entry_t * entry = NULL;
48
49              if (internal_BANK_IN_IS_REEXECUTE [i])
50                {
51                  uint32_t y = internal_BANK_IN_NUM_INST [i];
52             
53                  if (PORT_READ(in_REEXECUTE_VAL [y]))
54                    {
55                      log_printf(TRACE,Issue_queue,FUNCTION,"  * ISSUE_IN [%d] - Transaction with REEXECUTE [%d]",i,y);
56#ifdef STATISTICS
57                      if (usage_is_set(_usage,USE_STATISTICS))
58                        (*_stat_nb_inst_reexecute) ++;
59#endif
60                      entry = new entry_t
61                        (
62                         (_param->_have_port_context_id    )?PORT_READ(in_REEXECUTE_CONTEXT_ID            [y]):0,
63                         (_param->_have_port_front_end_id  )?PORT_READ(in_REEXECUTE_FRONT_END_ID          [y]):0,
64                         (_param->_have_port_rob_ptr       )?PORT_READ(in_REEXECUTE_PACKET_ID             [y]):0,
65                                                             PORT_READ(in_REEXECUTE_OPERATION             [y]),
66                                                             PORT_READ(in_REEXECUTE_TYPE                  [y]),
67                                                             PORT_READ(in_REEXECUTE_STORE_QUEUE_PTR_WRITE [y]),
68                         (_param->_have_port_load_queue_ptr)?PORT_READ(in_REEXECUTE_LOAD_QUEUE_PTR_WRITE  [y]):0,
69                                                             PORT_READ(in_REEXECUTE_HAS_IMMEDIAT          [y]),
70                                                             PORT_READ(in_REEXECUTE_IMMEDIAT              [y]),
71                                                             PORT_READ(in_REEXECUTE_READ_RA               [y]),
72                                                             PORT_READ(in_REEXECUTE_NUM_REG_RA            [y]),
73                                                             PORT_READ(in_REEXECUTE_READ_RB               [y]),
74                                                             PORT_READ(in_REEXECUTE_NUM_REG_RB            [y]),
75                                                             PORT_READ(in_REEXECUTE_READ_RC               [y]),
76                                                             PORT_READ(in_REEXECUTE_NUM_REG_RC            [y]),
77                                                             PORT_READ(in_REEXECUTE_WRITE_RD              [y]),
78                                                             PORT_READ(in_REEXECUTE_NUM_REG_RD            [y]),
79                                                             PORT_READ(in_REEXECUTE_WRITE_RE              [y]),
80                                                             PORT_READ(in_REEXECUTE_NUM_REG_RE            [y])
81                         );
82                    }
83                }
84              else
85                {
86                  uint32_t x = internal_BANK_IN_NUM_RENAME_UNIT [i];
87                  uint32_t y = internal_BANK_IN_NUM_INST [i];
88
89                  if (PORT_READ(in_ISSUE_IN_VAL[x][y]))
90                    {
91                      log_printf(TRACE,Issue_queue,FUNCTION,"  * ISSUE_IN [%d] - Transaction with ISSUE_IN [%d][%d]",i,x,y);
92
93#ifdef STATISTICS
94                      if (usage_is_set(_usage,USE_STATISTICS))
95                        (*_stat_nb_inst_issue_in [x]) ++;
96#endif
97                      entry = new entry_t
98                        (
99                         (_param->_have_port_context_id    )?PORT_READ(in_ISSUE_IN_CONTEXT_ID            [x][y]):0,
100                         (_param->_have_port_front_end_id  )?PORT_READ(in_ISSUE_IN_FRONT_END_ID          [x][y]):0,
101                         (_param->_have_port_rob_ptr       )?PORT_READ(in_ISSUE_IN_PACKET_ID             [x][y]):0,
102                                                             PORT_READ(in_ISSUE_IN_OPERATION             [x][y]),
103                                                             PORT_READ(in_ISSUE_IN_TYPE                  [x][y]),
104                                                             PORT_READ(in_ISSUE_IN_STORE_QUEUE_PTR_WRITE [x][y]),
105                         (_param->_have_port_load_queue_ptr)?PORT_READ(in_ISSUE_IN_LOAD_QUEUE_PTR_WRITE  [x][y]):0,
106                                                             PORT_READ(in_ISSUE_IN_HAS_IMMEDIAT          [x][y]),
107                                                             PORT_READ(in_ISSUE_IN_IMMEDIAT              [x][y]),
108                                                             PORT_READ(in_ISSUE_IN_READ_RA               [x][y]),
109                                                             PORT_READ(in_ISSUE_IN_NUM_REG_RA            [x][y]),
110                                                             PORT_READ(in_ISSUE_IN_READ_RB               [x][y]),
111                                                             PORT_READ(in_ISSUE_IN_NUM_REG_RB            [x][y]),
112                                                             PORT_READ(in_ISSUE_IN_READ_RC               [x][y]),
113                                                             PORT_READ(in_ISSUE_IN_NUM_REG_RC            [x][y]),
114                                                             PORT_READ(in_ISSUE_IN_WRITE_RD              [x][y]),
115                                                             PORT_READ(in_ISSUE_IN_NUM_REG_RD            [x][y]),
116                                                             PORT_READ(in_ISSUE_IN_WRITE_RE              [x][y]),
117                                                             PORT_READ(in_ISSUE_IN_NUM_REG_RE            [x][y])
118                         );
119                    }
120                }
121
122              if (entry != NULL)
123                _issue_queue [i].push_back(entry);
124            }
125
126        // ===================================================================
127        // =====[ ISSUE_OUT ]=================================================
128        // ===================================================================
129        for (uint32_t i=0; i<_param->_nb_bank; i++)
130          {
131//          log_printf(TRACE,Issue_queue,FUNCTION,"  * internal_BANK_OUT [%d] val %d, num_inst %d",i,internal_BANK_OUT_VAL [i],internal_BANK_OUT_NUM_INST [i]);
132
133            if (internal_BANK_OUT_VAL [i])
134              {
135#ifdef STATISTICS
136                if (usage_is_set(_usage,USE_STATISTICS))
137                  (*_stat_nb_inst_issue_out) ++;
138#endif
139
140                uint32_t x = internal_BANK_OUT_NUM_INST [i];
141//              log_printf(TRACE,Issue_queue,FUNCTION,"    * ISSUE_OUT_ACK : %d",PORT_READ(in_ISSUE_OUT_ACK [x]));
142               
143                if (PORT_READ(in_ISSUE_OUT_ACK [x]))
144                  {
145                    log_printf(TRACE,Issue_queue,FUNCTION,"  * ISSUE_OUT [%d] - Transaction with ISSUE_OUT [%d]",i,x);
146
147
148                    entry_t * entry =  _issue_queue [i].front();
149                    _issue_queue [i].pop_front();
150                    delete entry;
151                  }
152              }
153          }
154      }
155
156    log_printf(TRACE,Issue_queue,FUNCTION,"  * Dump Issue_queue");
157    for (uint32_t i=0; i<_param->_nb_bank; i++)
158      {
159#ifdef STATISTICS
160        if (usage_is_set(_usage,USE_STATISTICS))
161          *(_stat_bank_nb_inst [i]) += _issue_queue[i].size();
162#endif
163        log_printf(TRACE,Issue_queue,FUNCTION,"    * Bank [%d] size : %d",i,(int)_issue_queue[i].size());
164
165        uint32_t j = 0;
166        for (std::list<entry_t*>::iterator it=_issue_queue[i].begin();it!=_issue_queue[i].end(); ++it)
167          {
168            log_printf(TRACE,Issue_queue,FUNCTION,"      [%.4d] %.2d %.2d %.4d, %.2d %.3d, %.2d %.2d, %.1d %.8x, %.1d %.4d, %.1d %.4d, %.1d %.4d, %.1d %.4d, %.1d %.4d",
169                       j,
170                       
171                       (*it)->_context_id           ,
172                       (*it)->_front_end_id         ,
173                       (*it)->_packet_id            ,
174                       
175                       (*it)->_type                 ,
176                       (*it)->_operation            ,
177                       
178                       (*it)->_store_queue_ptr_write,
179                       (*it)->_load_queue_ptr_write ,
180                       
181                       (*it)->_has_immediat         ,
182                       (*it)->_immediat             ,
183                       
184                       (*it)->_read_ra              ,
185                       (*it)->_num_reg_ra           ,
186                       
187                       (*it)->_read_rb              ,
188                       (*it)->_num_reg_rb           ,
189                       
190                       (*it)->_read_rc              ,
191                       (*it)->_num_reg_rc           ,
192                       
193                       (*it)->_write_rd             ,
194                       (*it)->_num_reg_rd           ,
195                       
196                       (*it)->_write_re             ,
197                       (*it)->_num_reg_re           );
198           
199                ++j;
200              }
201
202      }
203
204#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
205    end_cycle ();
206#endif
207
208    log_end(Issue_queue,FUNCTION);
209  };
210
211}; // end namespace issue_queue
212}; // end namespace ooo_engine
213}; // end namespace multi_ooo_engine
214}; // end namespace core
215
216}; // end namespace behavioural
217}; // end namespace morpheo             
218#endif
Note: See TracBrowser for help on using the repository browser.