source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Decod_unit/Decod_queue/src/Decod_queue_function_one_fifo_transition.cpp @ 132

Last change on this file since 132 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: 8.0 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id: Decod_queue_function_one_fifo_transition.cpp 123 2009-06-08 20:43:30Z rosiere $
4 *
5 * [ Description ]
6 *
7 */
8
9#include "Behavioural/Core/Multi_Front_end/Front_end/Decod_unit/Decod_queue/include/Decod_queue.h"
10
11namespace morpheo                    {
12namespace behavioural {
13namespace core {
14namespace multi_front_end {
15namespace front_end {
16namespace decod_unit {
17namespace decod_queue {
18
19
20#undef  FUNCTION
21#define FUNCTION "Decod_queue::function_one_fifo_transition"
22  void Decod_queue::function_one_fifo_transition (void)
23  {
24    log_begin(Decod_queue,FUNCTION);
25    log_function(Decod_queue,FUNCTION,_name.c_str());
26
27    if (PORT_READ(in_NRESET) == 0)
28      {
29        while (not reg_QUEUE->empty())
30          {
31            delete reg_QUEUE->front();
32            reg_QUEUE->pop_front();
33          }
34
35        for (uint32_t i=0; i<_param->_nb_context; i++)
36          {
37            reg_NB_INST       [i]=0;
38            reg_NB_INST_EVENT [i]=0;
39          }
40
41        reg_LAST_SLOT = 0;
42      }
43    else
44      {
45        //--------------------------------------------------------------------
46        //-----[ DECOD_IN ]---------------------------------------------------
47        //-------------------------------------------------------------------- 
48        decod_queue_entry_t * entry = NULL;
49        for (uint32_t i=0; i<_param->_nb_inst_decod; i++)
50          {
51            if (PORT_READ(in_DECOD_IN_VAL [i]) and internal_DECOD_IN_ACK[i])
52              {
53                log_printf(TRACE,Decod_queue,FUNCTION,_("  * DECOD_IN  [%d]"),i);
54
55                if (entry == NULL)
56                 {
57                   // Once creation and insert in queue
58                   entry = new decod_queue_entry_t (_param->_nb_inst_decod);
59                   reg_QUEUE->push_back(entry);
60
61#ifdef STATISTICS
62                   if (usage_is_set(_usage,USE_STATISTICS))
63                     (*_stat_sum_transaction_decod_in) ++;
64#endif
65                 }
66
67#ifdef STATISTICS
68                if (usage_is_set(_usage,USE_STATISTICS))
69                  (*_stat_sum_inst_enable) ++;
70#endif
71
72                Tcontext_t context = (_param->_have_port_context_id)?PORT_READ(in_DECOD_IN_CONTEXT_ID [i]):0;
73
74                log_printf(TRACE,Decod_queue,FUNCTION,_("    * context : %d"),context);
75
76                entry->_val           [i] = 1;
77                entry->_context_id    [i] = context;
78                entry->_depth         [i] = (_param->_have_port_depth)?PORT_READ(in_DECOD_IN_DEPTH [i]):0;
79                entry->_type          [i] = PORT_READ(in_DECOD_IN_TYPE          [i]);
80                entry->_operation     [i] = PORT_READ(in_DECOD_IN_OPERATION     [i]);
81                entry->_no_execute    [i] = PORT_READ(in_DECOD_IN_NO_EXECUTE    [i]);
82                entry->_is_delay_slot [i] = PORT_READ(in_DECOD_IN_IS_DELAY_SLOT [i]);
83#ifdef DEBUG
84                entry->_address       [i] = PORT_READ(in_DECOD_IN_ADDRESS       [i]);
85#endif
86                entry->_address_next  [i] = PORT_READ(in_DECOD_IN_ADDRESS_NEXT  [i]);
87                entry->_has_immediat  [i] = PORT_READ(in_DECOD_IN_HAS_IMMEDIAT  [i]);
88                entry->_immediat      [i] = PORT_READ(in_DECOD_IN_IMMEDIAT      [i]);
89                entry->_read_ra       [i] = PORT_READ(in_DECOD_IN_READ_RA       [i]);
90                entry->_num_reg_ra    [i] = PORT_READ(in_DECOD_IN_NUM_REG_RA    [i]);
91                entry->_read_rb       [i] = PORT_READ(in_DECOD_IN_READ_RB       [i]);
92                entry->_num_reg_rb    [i] = PORT_READ(in_DECOD_IN_NUM_REG_RB    [i]);
93                entry->_read_rc       [i] = PORT_READ(in_DECOD_IN_READ_RC       [i]);
94                entry->_num_reg_rc    [i] = PORT_READ(in_DECOD_IN_NUM_REG_RC    [i]);
95                entry->_write_rd      [i] = PORT_READ(in_DECOD_IN_WRITE_RD      [i]);
96                entry->_num_reg_rd    [i] = PORT_READ(in_DECOD_IN_NUM_REG_RD    [i]);
97                entry->_write_re      [i] = PORT_READ(in_DECOD_IN_WRITE_RE      [i]);
98                entry->_num_reg_re    [i] = PORT_READ(in_DECOD_IN_NUM_REG_RE    [i]);
99                entry->_exception_use [i] = PORT_READ(in_DECOD_IN_EXCEPTION_USE [i]);
100                entry->_exception     [i] = PORT_READ(in_DECOD_IN_EXCEPTION     [i]);
101
102                reg_NB_INST [context] ++;
103
104                log_printf(TRACE,Decod_queue,FUNCTION,_("    * nb_inst : %d"),reg_NB_INST [context]);
105                log_printf(TRACE,Decod_queue,FUNCTION,_("    * PUSH queue"));
106              }
107          }
108
109        //--------------------------------------------------------------------
110        //-----[ DECOD_OUT ]--------------------------------------------------
111        //--------------------------------------------------------------------
112        if (not reg_QUEUE->empty())
113          {
114            bool find = false;
115           
116            for (uint32_t i=0; i<_param->_nb_inst_decod; i++)
117              {
118                // Test transaction : if ok then invalid slot
119                // In order by rename logic
120                if (internal_DECOD_OUT_VAL [i] and internal_DECOD_OUT_ACK[i])
121                  {
122                    log_printf(TRACE,Decod_queue,FUNCTION,_("  * DECOD_OUT [%d]"),i);
123               
124#ifdef DEBUG_TEST
125                    if (reg_LAST_SLOT != i)
126                      throw ERRORMORPHEO(FUNCTION,toString(_("reg_LAST_SLOT (%d) is different at decod_out port (%d)."),reg_LAST_SLOT,i));
127#endif
128                    reg_LAST_SLOT ++;
129
130                    reg_QUEUE->front()->_val [i] = 0;
131
132                    Tcontext_t context = reg_QUEUE->front()->_context_id [i];
133                    log_printf(TRACE,Decod_queue,FUNCTION,_("    * context : %d"),context);
134                   
135                    reg_NB_INST       [context] --;
136                    if (reg_NB_INST_EVENT [context] > 0)
137                    reg_NB_INST_EVENT [context] --;
138
139                    log_printf(TRACE,Decod_queue,FUNCTION,_("    * nb_inst : %d"),reg_NB_INST [context]);
140                  }
141                // Test if slot is (again) valid, if yes, then have less one instruction in the entry
142                find |= reg_QUEUE->front()->_val [i];
143              }
144           
145            // test if can free the entry : test if have consume all entry
146            if (not find) // no valid instruction in current slot
147              {
148                log_printf(TRACE,Decod_queue,FUNCTION,_("    * POP  queue"));
149
150                // can pop the slot
151                delete reg_QUEUE->front();
152                reg_QUEUE->pop_front();
153
154                reg_LAST_SLOT = 0;
155              }
156          }
157
158        //--------------------------------------------------------------------
159        //-----[ CONTEXT_EVENT ]----------------------------------------------
160        //--------------------------------------------------------------------
161        for (uint32_t i=0; i<_param->_nb_context; i++)
162          if (PORT_READ(in_CONTEXT_EVENT [i]))
163            reg_NB_INST_EVENT [i] = reg_NB_INST [i];
164      }
165
166#if defined(DEBUG) and defined(DEBUG_Decod_queue) and (DEBUG >= DEBUG_TRACE)
167    log_printf(TRACE,Decod_queue,FUNCTION,"  * Dump decod_queue");
168    log_printf(TRACE,Decod_queue,FUNCTION,"    * reg_LAST_SLOT : %d",reg_LAST_SLOT);
169    uint32_t x=0;
170    for (std::list<decod_queue_entry_t*>::iterator it=reg_QUEUE->begin();
171         it!=reg_QUEUE->end();
172         it++)
173      {
174        for (uint32_t i=0; i<_param->_nb_inst_decod; i++)
175          {
176            if ((*it)->_val [i])
177              log_printf(TRACE,Decod_queue,FUNCTION,"    * [%.4d][%.4d] %.1d, %.3d %.2d, %.2d %.3d %.1d %.1d, 0x%.8x (0x%.8x), %.1d 0x%.8x, %.1d %.2d, %.1d %.2d, %.1d %.2d, %.1d %.2d, %.1d %.2d, %.1d %.2d"
178                         ,x
179                         ,i
180                         ,(*it)->_val           [i]
181                         ,(*it)->_context_id    [i]
182                         ,(*it)->_depth         [i]
183                         ,(*it)->_type          [i]
184                         ,(*it)->_operation     [i]
185                         ,(*it)->_no_execute    [i]
186                         ,(*it)->_is_delay_slot [i]
187                         ,(*it)->_address       [i]
188                         ,(*it)->_address       [i]<<2
189                         ,(*it)->_has_immediat  [i]
190                         ,(*it)->_immediat      [i]
191                         ,(*it)->_read_ra       [i]
192                         ,(*it)->_num_reg_ra    [i]
193                         ,(*it)->_read_rb       [i]
194                         ,(*it)->_num_reg_rb    [i]
195                         ,(*it)->_read_rc       [i]
196                         ,(*it)->_num_reg_rc    [i]
197                         ,(*it)->_write_rd      [i]
198                         ,(*it)->_num_reg_rd    [i]
199                         ,(*it)->_write_re      [i]
200                         ,(*it)->_num_reg_re    [i]
201                         ,(*it)->_exception_use [i]
202                         ,(*it)->_exception     [i]
203                         );
204            else
205              log_printf(TRACE,Decod_queue,FUNCTION,"    * [%.4d][%.4d] %d"
206                         ,x
207                         ,i
208                         ,(*it)->_val           [i]
209                         );
210
211          }
212        x++;
213      }
214#endif
215   
216#ifdef STATISTICS
217    if (usage_is_set(_usage,USE_STATISTICS))
218      { 
219        *(_stat_use_queue) += reg_QUEUE->size();
220        for (uint32_t i=0; i<_param->_nb_context; i++)
221          *(_stat_nb_inst [i]) += reg_NB_INST [i];
222      }
223#endif
224
225    log_end(Decod_queue,FUNCTION);
226  };
227
228}; // end namespace decod_queue
229}; // end namespace decod_unit
230}; // end namespace front_end
231}; // end namespace multi_front_end
232}; // end namespace core
233
234}; // end namespace behavioural
235}; // end namespace morpheo             
236#endif
Note: See TracBrowser for help on using the repository browser.