source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_transition.cpp @ 82

Last change on this file since 82 was 82, checked in by rosiere, 16 years ago
  • support locale (now must "just" translate)
  • update all component with new test format
  • update all component with usage
  • New component : decod queue and prediction_unit
  • Property svn:keywords set to Id
File size: 13.7 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id: Update_Prediction_Table_transition.cpp 82 2008-05-01 16:48:45Z rosiere $
4 *
5 * [ Description ]
6 *
7 */
8
9#include "Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/include/Update_Prediction_Table.h"
10
11namespace morpheo                    {
12namespace behavioural {
13namespace core {
14namespace multi_front_end {
15namespace front_end {
16namespace prediction_unit {
17namespace update_prediction_table {
18
19
20#undef  FUNCTION
21#define FUNCTION "Update_Prediction_Table::transition"
22  void Update_Prediction_Table::transition (void)
23  {
24    log_printf(FUNC,Update_Prediction_Table,FUNCTION,"Begin");
25
26    if (PORT_READ(in_NRESET) == 0)
27      {
28        for (uint32_t i=0; i<_param->_nb_context; i++)
29          {
30            reg_TOP                [i] = 0;
31            reg_BOTTOM             [i] = 0;
32            reg_NB_ELT             [i] = 0;
33            reg_NB_ELT_UPDATE      [i] = 0;
34            reg_NB_ELT_NEED_UPDATE [i] = 0;
35            for (uint32_t j=0; j<_param->_size_queue[i]; j++)
36              reg_UPDATE_PREDICTION_TABLE [i][j]._state = UPDATE_PREDICTION_STATE_EMPTY;
37          }
38        reg_UPDATE_PRIORITY = 0;
39      }
40    else
41      {
42        // ===================================================================
43        // =====[ PREDICT ]===================================================
44        // ===================================================================
45        for (uint32_t i=0; i<_param->_nb_inst_predict; i++)
46          if (PORT_READ(in_PREDICT_VAL[i]) and internal_PREDICT_ACK [i])
47            {
48              Tcontext_t context = (_param->_have_port_context_id)?PORT_READ(in_PREDICT_CONTEXT_ID [i]):0;
49              uint32_t   top     = reg_TOP [context];
50
51              log_printf(TRACE,Update_Prediction_Table,FUNCTION,"PREDICT[%d] - Accepted",i);
52              log_printf(TRACE,Update_Prediction_Table,FUNCTION," * context : %d",context);
53              log_printf(TRACE,Update_Prediction_Table,FUNCTION," * top     : %d",top);
54              log_printf(TRACE,Update_Prediction_Table,FUNCTION," * nb_elt  : %d",reg_NB_ELT[context]);
55
56              reg_UPDATE_PREDICTION_TABLE [context][top]._state        = UPDATE_PREDICTION_STATE_WAIT_DECOD;
57              reg_UPDATE_PREDICTION_TABLE [context][top]._ifetch_prediction = true;
58              reg_UPDATE_PREDICTION_TABLE [context][top]._condition    = PORT_READ(in_PREDICT_BTB_CONDITION    [i]);
59              reg_UPDATE_PREDICTION_TABLE [context][top]._address_src  = PORT_READ(in_PREDICT_BTB_ADDRESS_SRC  [i]);
60              reg_UPDATE_PREDICTION_TABLE [context][top]._address_dest = PORT_READ(in_PREDICT_BTB_ADDRESS_DEST [i]);
61              reg_UPDATE_PREDICTION_TABLE [context][top]._last_take    = PORT_READ(in_PREDICT_BTB_LAST_TAKE    [i]);
62            //reg_UPDATE_PREDICTION_TABLE [context][top]._good_take   
63              reg_UPDATE_PREDICTION_TABLE [context][top]._history      = (_param->_have_port_history)?PORT_READ(in_PREDICT_DIR_HISTORY [i]):0;
64              reg_UPDATE_PREDICTION_TABLE [context][top]._address_ras  = PORT_READ(in_PREDICT_RAS_ADDRESS      [i]);
65              reg_UPDATE_PREDICTION_TABLE [context][top]._index_ras    = PORT_READ(in_PREDICT_RAS_INDEX        [i]);
66
67              reg_TOP    [context] = (top+1)%_param->_size_queue [context];
68              reg_NB_ELT [context] ++;
69            }
70
71        // ===================================================================
72        // =====[ DECOD ]=====================================================
73        // ===================================================================
74        for (uint32_t i=0; i<_param->_nb_inst_decod; i++)
75          if (PORT_READ(in_DECOD_VAL[i]) and internal_DECOD_ACK [i])
76            {
77              Tcontext_t context     = (_param->_have_port_context_id)?PORT_READ(in_DECOD_CONTEXT_ID [i]):0;
78              Tcontrol_t miss_ifetch = PORT_READ(in_DECOD_MISS_IFETCH [i]);
79              Tcontrol_t miss_decod  = PORT_READ(in_DECOD_MISS_DECOD  [i]);
80
81              log_printf(TRACE,Update_Prediction_Table,FUNCTION,"DECOD[%d] - Accepted",i);
82              log_printf(TRACE,Update_Prediction_Table,FUNCTION," * context     : %d",context);
83              log_printf(TRACE,Update_Prediction_Table,FUNCTION," * miss_ifetch : %d",miss_ifetch);
84              log_printf(TRACE,Update_Prediction_Table,FUNCTION," * miss_decod  : %d",miss_decod);
85              log_printf(TRACE,Update_Prediction_Table,FUNCTION," * nb_elt      : %d",reg_NB_ELT[context]);
86             
87              // Test if miss ifetch
88              //   miss ifetch = decod a branch and the predict unit have not predict this branch ... gloup :P
89              if (miss_ifetch or miss_decod)
90                {
91                  Tdepth_t depth = (_param->_have_port_max_depth)?PORT_READ(in_DECOD_UPDATE_PREDICTION_ID [i]):0;
92                  Tdepth_t top   = reg_TOP [context];
93
94                  reg_UPDATE_PREDICTION_TABLE [context][top]._state        = UPDATE_PREDICTION_STATE_WAITEND;
95                  reg_UPDATE_PREDICTION_TABLE [context][top]._ifetch_prediction = false; // static prediction
96                  reg_UPDATE_PREDICTION_TABLE [context][top]._condition    = PORT_READ(in_DECOD_BTB_CONDITION    [i]);
97                  reg_UPDATE_PREDICTION_TABLE [context][top]._address_src  = PORT_READ(in_DECOD_BTB_ADDRESS_SRC  [i]);
98                  reg_UPDATE_PREDICTION_TABLE [context][top]._address_dest = PORT_READ(in_DECOD_BTB_ADDRESS_DEST [i]);
99                  reg_UPDATE_PREDICTION_TABLE [context][top]._last_take    = PORT_READ(in_DECOD_BTB_LAST_TAKE    [i]);
100                //reg_UPDATE_PREDICTION_TABLE [context][top]._good_take
101                //reg_UPDATE_PREDICTION_TABLE [context][top]._history
102                  reg_UPDATE_PREDICTION_TABLE [context][top]._address_ras  = PORT_READ(in_DECOD_RAS_ADDRESS      [i]);
103                  reg_UPDATE_PREDICTION_TABLE [context][top]._index_ras    = PORT_READ(in_DECOD_RAS_INDEX        [i]);
104
105                  // Invalid all previous "ifetch" prediction
106                  // (ifetch prediction = prediction make in fetch stage and not again comming in decod stage)
107                  uint32_t nb_elt_miss        = ((top> depth)?top:(top+_param->_size_queue[context]))-depth;
108                  uint32_t nb_elt_need_update = 0;
109                  for (uint32_t j=0; j<nb_elt_miss; j++)
110                    {
111                      uint32_t k=(depth+j)%_param->_size_queue[context];
112                     
113                      // Ifetch have make a prediction and it's a miss
114                      // When ifetch predict :
115                      //   * btb is not change       -> needn't update
116                      //   * direction is not change -> needn't update
117                      //   * ras have change         -> need    update
118
119                      Tbranch_condition_t cond = reg_UPDATE_PREDICTION_TABLE [context][k]._condition;
120                      if ((cond == BRANCH_CONDITION_NONE_WITH_WRITE_STACK) or
121                          (cond == BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK) or
122                          (cond == BRANCH_CONDITION_READ_STACK))
123                        {
124                          nb_elt_need_update ++;
125                          reg_UPDATE_PREDICTION_TABLE [context][k]._state = UPDATE_PREDICTION_STATE_KO;
126                        }
127                      else
128                        {
129                          reg_UPDATE_PREDICTION_TABLE [context][k]._state = UPDATE_PREDICTION_STATE_END;
130                        }
131                    }
132                  reg_UPDATE_PREDICTION_TABLE [context][depth]._state = UPDATE_PREDICTION_STATE_EVENT; // rewrite
133
134                  reg_TOP                [context] = (depth+1)%_param->_size_queue [context];
135                  reg_NB_ELT_NEED_UPDATE [context] += nb_elt_need_update;
136                  reg_NB_ELT             [context] ++;
137                }
138              else
139                {
140                  // Normal case : branch is previous predicated, change state of branch
141                  Tdepth_t depth = (_param->_have_port_max_depth)?PORT_READ(in_DECOD_UPDATE_PREDICTION_ID [i]):0;
142
143                  reg_UPDATE_PREDICTION_TABLE [context][depth]._state = UPDATE_PREDICTION_STATE_WAITEND;
144                }
145            }
146
147        // ===================================================================
148        // =====[ BRANCH_COMPLETE ]===========================================
149        // ===================================================================
150        for (uint32_t i=0; i<_param->_nb_inst_branch_complete; i++)
151          if (PORT_READ(in_BRANCH_COMPLETE_VAL[i]) and internal_BRANCH_COMPLETE_ACK [i])
152            {
153              Tcontext_t context = (_param->_have_port_context_id)?PORT_READ(in_BRANCH_COMPLETE_CONTEXT_ID [i]):0;
154              Tdepth_t   depth   = (_param->_have_port_max_depth     )?PORT_READ(in_BRANCH_COMPLETE_DEPTH      [i]):0;
155
156              log_printf(TRACE,Update_Prediction_Table,FUNCTION,"BRANCH_COMPLETE[%d] - Accepted",i);
157              log_printf(TRACE,Update_Prediction_Table,FUNCTION," * context : %d",context);
158              log_printf(TRACE,Update_Prediction_Table,FUNCTION," * depth   : %d",depth);
159              log_printf(TRACE,Update_Prediction_Table,FUNCTION," * nb_elt  : %d",reg_NB_ELT[context]);
160             
161              if (internal_BRANCH_COMPLETE_MISS_PREDICTION [i])
162                {
163                  // Miss case
164                  reg_UPDATE_PREDICTION_TABLE [context][depth]._state = UPDATE_PREDICTION_STATE_EVENT;
165
166                  // Another prediction (prediction with depth higer)
167                  Tdepth_t top                = reg_TOP [context];
168                  uint32_t nb_elt_miss        = ((top> depth)?top:(top+_param->_size_queue[context]))-depth;
169                  uint32_t nb_elt_need_update = 1;
170                  for (uint32_t j=1; j<nb_elt_miss; j++)
171                    {
172                      uint32_t k=(depth+j)%_param->_size_queue[context];
173                     
174                      // Ifetch have make a prediction and it's a miss
175                      // When ifetch predict :
176                      //   * btb is not change       -> needn't update
177                      //   * direction is not change -> needn't update
178                      //   * ras have change         -> need    update
179
180                      Tbranch_condition_t cond = reg_UPDATE_PREDICTION_TABLE [context][k]._condition;
181                      if ((cond == BRANCH_CONDITION_NONE_WITH_WRITE_STACK) or
182                          (cond == BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK) or
183                          (cond == BRANCH_CONDITION_READ_STACK))
184                        {
185                          nb_elt_need_update ++;
186                          reg_UPDATE_PREDICTION_TABLE [context][k]._state = UPDATE_PREDICTION_STATE_KO;
187                        }
188                      else
189                        {
190                          reg_UPDATE_PREDICTION_TABLE [context][k]._state = UPDATE_PREDICTION_STATE_END;
191                        }
192                    }
193                  reg_NB_ELT_NEED_UPDATE [context] += nb_elt_need_update;
194
195                  // Update pointer :
196                  reg_TOP                [context]  = depth;
197                  reg_NB_ELT             [context] -= nb_elt_miss;
198                }
199              else
200                {
201                  // Hit case
202#ifdef DEBUG_TEST
203                  if (reg_UPDATE_PREDICTION_TABLE [context][depth]._state != UPDATE_PREDICTION_STATE_WAITEND)
204                    ERRORMORPHEO(FUNCTION,"Branche complete : invalid state");
205#endif
206                  reg_UPDATE_PREDICTION_TABLE [context][depth]._state = UPDATE_PREDICTION_STATE_OK;
207                }
208
209              // In all case : update good_take and address_destination
210              reg_UPDATE_PREDICTION_TABLE [context][depth]._good_take    = internal_BRANCH_COMPLETE_TAKE         [i];
211              reg_UPDATE_PREDICTION_TABLE [context][depth]._address_dest = internal_BRANCH_COMPLETE_ADDRESS_DEST [i];
212            }
213
214        // ===================================================================
215        // =====[ UPDATE ]====================================================
216        // ===================================================================
217        for (uint32_t i=0; i<_param->_nb_inst_update; i++)
218          if (internal_UPDATE_VAL[i] and PORT_READ(in_UPDATE_ACK [i]))
219            {
220              Tcontext_t context = internal_UPDATE_CONTEXT_ID [i];
221              Tdepth_t   depth   = internal_UPDATE_DEPTH      [i];
222
223              log_printf(TRACE,Update_Prediction_Table,FUNCTION,"UPDATE[%d] - Accepted",i);
224              log_printf(TRACE,Update_Prediction_Table,FUNCTION," * context : %d",context);
225              log_printf(TRACE,Update_Prediction_Table,FUNCTION," * depth   : %d",depth);
226
227              if (reg_UPDATE_PREDICTION_TABLE [context][depth]._state == UPDATE_PREDICTION_STATE_KO)
228                reg_NB_ELT_NEED_UPDATE [context] --;
229
230              reg_UPDATE_PREDICTION_TABLE [context][depth]._state = UPDATE_PREDICTION_STATE_END;
231            }
232       
233        // Round robin
234        reg_UPDATE_PRIORITY = (reg_UPDATE_PRIORITY+1)%_param->_nb_context;
235
236        // ===================================================================
237        // =====[ BRANCH_EVENT ]==============================================
238        // ===================================================================
239        for (uint32_t i=0; i<_param->_nb_context; i++)
240          if (internal_BRANCH_EVENT_VAL [i] and PORT_READ(in_BRANCH_EVENT_ACK [i]))
241          {
242            Tdepth_t depth = internal_BRANCH_EVENT_DEPTH [i];
243           
244            reg_UPDATE_PREDICTION_TABLE [i][depth]._state = UPDATE_PREDICTION_STATE_KO;
245          }
246
247        // ===================================================================
248        // =====[ GARBAGE COLLECTOR ]=========================================
249        // ===================================================================
250
251        for (uint32_t i=0; i<_param->_nb_context; i++)
252          {
253            uint32_t bottom = reg_BOTTOM [i];
254           
255            // Test if the tail of queue is finish (ok or ko and update)
256            if (reg_UPDATE_PREDICTION_TABLE [i][bottom]._state == UPDATE_PREDICTION_STATE_END)
257              {
258                log_printf(TRACE,Update_Prediction_Table,FUNCTION,"GARBAGE_COLLECTOR");
259                log_printf(TRACE,Update_Prediction_Table,FUNCTION," * context : %d",i);
260                log_printf(TRACE,Update_Prediction_Table,FUNCTION," * bottom  : %d",bottom);
261
262                reg_UPDATE_PREDICTION_TABLE [i][bottom]._state = UPDATE_PREDICTION_STATE_EMPTY;
263                reg_BOTTOM [i] = (bottom+1)%_param->_size_queue [i];
264                if (reg_NB_ELT [i]>0)
265                  reg_NB_ELT [i] --;
266              }
267          }
268      }
269
270#if (DEBUG >= DEBUG_TRACE)
271    log_printf(TRACE,Update_Prediction_Table,FUNCTION,"Dump Update_Prediction_Table");
272    log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * reg_UPDATE_PRIORITY      : %d",reg_UPDATE_PRIORITY);
273    for (uint32_t i=0; i<_param->_nb_context; i++)
274      {
275        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * Update_Prediction_Table   [%d]",i);
276        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * reg_TOP                : %d",reg_TOP                [i]);
277        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * reg_BOTTOM             : %d",reg_BOTTOM             [i]);
278        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * reg_NB_ELT             : %d",reg_NB_ELT             [i]);
279        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * reg_NB_ELT_NEED_UPDATE : %d",reg_NB_ELT_NEED_UPDATE [i]);
280        for (uint32_t j=0; j<_param->_size_queue[i]; j++)
281          log_printf(TRACE,Update_Prediction_Table,FUNCTION,"      [%d] %s %x",j,toString(reg_UPDATE_PREDICTION_TABLE [i][j]._state).c_str(),reg_UPDATE_PREDICTION_TABLE [i][j]._address_src);
282      }
283#endif
284
285
286#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
287    end_cycle ();
288#endif
289
290    log_printf(FUNC,Update_Prediction_Table,FUNCTION,"End");
291  };
292
293}; // end namespace update_prediction_table
294}; // end namespace prediction_unit
295}; // end namespace front_end
296}; // end namespace multi_front_end
297}; // end namespace core
298
299}; // end namespace behavioural
300}; // end namespace morpheo             
301#endif
Note: See TracBrowser for help on using the repository browser.