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 @ 111

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

1) Decod_queue : multi implementation (one_fifo, multi_fifo)
2) Issue_queue : multi implementation (in_order, out_of_order)
3) Direction : Add Meta predictor
4) Context_State : re add Branch_complete, More priority to Load miss (is not speculative)
5) Return_Address_Stack : update reg_PREDICT pointer on decod miss prediction
6) UPT : Fix bug in multi event
7) Prediction_glue : in read_stack case, insert in UPT pc_next
8) Rename select : when rob have an event (need flush), read_r{a,b,c} and write_r{d,e} is set at 0

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