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

Last change on this file was 139, checked in by rosiere, 14 years ago
  • Add test for all configuration
  • RAT : add rat scheme (depth_save)
  • Property svn:keywords set to Id
File size: 8.3 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id: Decod_queue_function_one_fifo_transition.cpp 139 2010-07-30 14:47:27Z 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        {
49        decod_queue_entry_t * entry = NULL;
50
51#ifdef STATISTICS
52        uint32_t nb_decod_in = 0;
53#endif
54
55        for (uint32_t i=0; i<_param->_nb_inst_decod; i++)
56          {
57            if (PORT_READ(in_DECOD_IN_VAL [i]) and internal_DECOD_IN_ACK[i])
58              {
59                log_printf(TRACE,Decod_queue,FUNCTION,_("  * DECOD_IN  [%d]"),i);
60
61                if (entry == NULL)
62                 {
63                   // Once creation and insert in queue
64                   entry = new decod_queue_entry_t (_param->_nb_inst_decod);
65                   reg_QUEUE->push_back(entry);
66                 }
67
68#ifdef STATISTICS
69                nb_decod_in ++;
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#ifdef STATISTICS
80                entry->_instruction   [i] = PORT_READ(in_DECOD_IN_INSTRUCTION   [i]);
81#endif
82                entry->_type          [i] = PORT_READ(in_DECOD_IN_TYPE          [i]);
83                entry->_operation     [i] = PORT_READ(in_DECOD_IN_OPERATION     [i]);
84                entry->_no_execute    [i] = PORT_READ(in_DECOD_IN_NO_EXECUTE    [i]);
85                entry->_is_delay_slot [i] = PORT_READ(in_DECOD_IN_IS_DELAY_SLOT [i]);
86                entry->_save_rat      [i] = PORT_READ(in_DECOD_IN_SAVE_RAT      [i]);
87#ifdef DEBUG
88                entry->_address       [i] = PORT_READ(in_DECOD_IN_ADDRESS       [i]);
89#endif
90                entry->_address_next  [i] = PORT_READ(in_DECOD_IN_ADDRESS_NEXT  [i]);
91                entry->_has_immediat  [i] = PORT_READ(in_DECOD_IN_HAS_IMMEDIAT  [i]);
92                entry->_immediat      [i] = PORT_READ(in_DECOD_IN_IMMEDIAT      [i]);
93                entry->_read_ra       [i] = PORT_READ(in_DECOD_IN_READ_RA       [i]);
94                entry->_num_reg_ra    [i] = PORT_READ(in_DECOD_IN_NUM_REG_RA    [i]);
95                entry->_read_rb       [i] = PORT_READ(in_DECOD_IN_READ_RB       [i]);
96                entry->_num_reg_rb    [i] = PORT_READ(in_DECOD_IN_NUM_REG_RB    [i]);
97                entry->_read_rc       [i] = PORT_READ(in_DECOD_IN_READ_RC       [i]);
98                entry->_num_reg_rc    [i] = PORT_READ(in_DECOD_IN_NUM_REG_RC    [i]);
99                entry->_write_rd      [i] = PORT_READ(in_DECOD_IN_WRITE_RD      [i]);
100                entry->_num_reg_rd    [i] = PORT_READ(in_DECOD_IN_NUM_REG_RD    [i]);
101                entry->_write_re      [i] = PORT_READ(in_DECOD_IN_WRITE_RE      [i]);
102                entry->_num_reg_re    [i] = PORT_READ(in_DECOD_IN_NUM_REG_RE    [i]);
103                entry->_exception_use [i] = PORT_READ(in_DECOD_IN_EXCEPTION_USE [i]);
104                entry->_exception     [i] = PORT_READ(in_DECOD_IN_EXCEPTION     [i]);
105
106                reg_NB_INST [context] ++;
107
108                log_printf(TRACE,Decod_queue,FUNCTION,_("    * nb_inst : %d"),reg_NB_INST [context]);
109                log_printf(TRACE,Decod_queue,FUNCTION,_("    * PUSH queue"));
110              }
111          }
112
113#ifdef STATISTICS
114        if (usage_is_set(_usage,USE_STATISTICS))
115          {
116            if (nb_decod_in > 0)
117              {
118                if (nb_decod_in == _param->_nb_inst_decod)
119                  (*_stat_decode_in_full) ++;
120                else
121                  (*_stat_decode_in_average) += nb_decod_in;
122              }
123            else
124              {
125                (*_stat_decode_in_empty) ++;
126              }
127          }
128#endif
129        }
130
131        //--------------------------------------------------------------------
132        //-----[ DECOD_OUT ]--------------------------------------------------
133        //--------------------------------------------------------------------
134        if (not reg_QUEUE->empty())
135          {
136            bool find = false;
137           
138            for (uint32_t i=0; i<_param->_nb_inst_decod; i++)
139              {
140                // Test transaction : if ok then invalid slot
141                // In order by rename logic
142                if (internal_DECOD_OUT_VAL [i] and internal_DECOD_OUT_ACK[i])
143                  {
144                    log_printf(TRACE,Decod_queue,FUNCTION,_("  * DECOD_OUT [%d]"),i);
145               
146#ifdef DEBUG_TEST
147                    if (reg_LAST_SLOT != i)
148                      throw ERRORMORPHEO(FUNCTION,toString(_("reg_LAST_SLOT (%d) is different at decod_out port (%d)."),reg_LAST_SLOT,i));
149#endif
150                    reg_LAST_SLOT ++;
151
152                    reg_QUEUE->front()->_val [i] = 0;
153
154                    Tcontext_t context = reg_QUEUE->front()->_context_id [i];
155                    log_printf(TRACE,Decod_queue,FUNCTION,_("    * context : %d"),context);
156                   
157                    reg_NB_INST       [context] --;
158                    if (reg_NB_INST_EVENT [context] > 0)
159                    reg_NB_INST_EVENT [context] --;
160
161                    log_printf(TRACE,Decod_queue,FUNCTION,_("    * nb_inst : %d"),reg_NB_INST [context]);
162                  }
163                // Test if slot is (again) valid, if yes, then have less one instruction in the entry
164                find |= reg_QUEUE->front()->_val [i];
165              }
166           
167            // test if can free the entry : test if have consume all entry
168            if (not find) // no valid instruction in current slot
169              {
170                log_printf(TRACE,Decod_queue,FUNCTION,_("    * POP  queue"));
171
172                // can pop the slot
173                delete reg_QUEUE->front();
174                reg_QUEUE->pop_front();
175
176                reg_LAST_SLOT = 0;
177              }
178          }
179
180        //--------------------------------------------------------------------
181        //-----[ CONTEXT_EVENT ]----------------------------------------------
182        //--------------------------------------------------------------------
183        for (uint32_t i=0; i<_param->_nb_context; i++)
184          if (PORT_READ(in_CONTEXT_EVENT [i]))
185            reg_NB_INST_EVENT [i] = reg_NB_INST [i];
186      }
187
188#if defined(DEBUG) and defined(DEBUG_Decod_queue) and (DEBUG >= DEBUG_TRACE)
189    log_printf(TRACE,Decod_queue,FUNCTION,"  * Dump decod_queue");
190    log_printf(TRACE,Decod_queue,FUNCTION,"    * reg_LAST_SLOT : %d",reg_LAST_SLOT);
191    uint32_t x=0;
192    for (std::list<decod_queue_entry_t*>::iterator it=reg_QUEUE->begin();
193         it!=reg_QUEUE->end();
194         it++)
195      {
196        for (uint32_t i=0; i<_param->_nb_inst_decod; i++)
197          {
198            if ((*it)->_val [i])
199              log_printf(TRACE,Decod_queue,FUNCTION,"    * [%.4d][%.4d] %.1d, %.3d %.2d, %.2d %.3d %.1d %.1d %.1d, 0x%.8x (0x%.8x), %.1d 0x%.8x, %.1d %.2d, %.1d %.2d, %.1d %.2d, %.1d %.2d, %.1d %.2d, %.1d %.2d"
200                         ,x
201                         ,i
202                         ,(*it)->_val           [i]
203                         ,(*it)->_context_id    [i]
204                         ,(*it)->_depth         [i]
205                         ,(*it)->_type          [i]
206                         ,(*it)->_operation     [i]
207                         ,(*it)->_no_execute    [i]
208                         ,(*it)->_is_delay_slot [i]
209                         ,(*it)->_save_rat      [i]
210                         ,(*it)->_address       [i]
211                         ,(*it)->_address       [i]<<2
212                         ,(*it)->_has_immediat  [i]
213                         ,(*it)->_immediat      [i]
214                         ,(*it)->_read_ra       [i]
215                         ,(*it)->_num_reg_ra    [i]
216                         ,(*it)->_read_rb       [i]
217                         ,(*it)->_num_reg_rb    [i]
218                         ,(*it)->_read_rc       [i]
219                         ,(*it)->_num_reg_rc    [i]
220                         ,(*it)->_write_rd      [i]
221                         ,(*it)->_num_reg_rd    [i]
222                         ,(*it)->_write_re      [i]
223                         ,(*it)->_num_reg_re    [i]
224                         ,(*it)->_exception_use [i]
225                         ,(*it)->_exception     [i]
226                         );
227            else
228              log_printf(TRACE,Decod_queue,FUNCTION,"    * [%.4d][%.4d] %d"
229                         ,x
230                         ,i
231                         ,(*it)->_val           [i]
232                         );
233
234          }
235        x++;
236      }
237#endif
238   
239#ifdef STATISTICS
240    if (usage_is_set(_usage,USE_STATISTICS))
241      { 
242        (*_stat_use_queue) += reg_QUEUE->size();
243        for (uint32_t i=0; i<_param->_nb_context; i++)
244          (*_stat_nb_inst [i]) += reg_NB_INST [i];
245      }
246#endif
247
248    log_end(Decod_queue,FUNCTION);
249  };
250
251}; // end namespace decod_queue
252}; // end namespace decod_unit
253}; // end namespace front_end
254}; // end namespace multi_front_end
255}; // end namespace core
256
257}; // end namespace behavioural
258}; // end namespace morpheo             
259#endif
Note: See TracBrowser for help on using the repository browser.