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

Last change on this file since 88 was 88, checked in by rosiere, 16 years ago

Almost complete design
with Test and test platform

File size: 13.6 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id$
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::genMoore"
22  void Update_Prediction_Table::genMoore (void)
23  {
24    log_begin(Update_Prediction_Table,FUNCTION);
25    log_function(Update_Prediction_Table,FUNCTION,_name.c_str());
26    log_printf(NONE,Update_Prediction_Table,FUNCTION,FUNCTION);
27
28    if (PORT_READ(in_NRESET) == 1)
29      {
30
31    // ===================================================================
32    // =====[ DEPTH ]=====================================================
33    // ===================================================================
34
35    for (uint32_t i=0; i<_param->_nb_context; i++)
36      {
37        if (_param->_have_port_depth)
38          {
39        PORT_WRITE(out_DEPTH_CURRENT [i], reg_UPT_TOP    [i]);
40        PORT_WRITE(out_DEPTH_MIN     [i], reg_UPT_BOTTOM [i]);
41          }
42        PORT_WRITE(out_DEPTH_MAX     [i], reg_UPT_TOP    [i]);
43      }
44
45    // ===================================================================
46    // =====[ UPDATE ]====================================================
47    // ===================================================================
48
49    bool     retire_ras_from_ufpt [_param->_nb_context]; // event ufpt -> restore RAS, else update upt
50    bool     retire_ras_from_upt  [_param->_nb_context]; // event upt  -> restore RAS, else restore others structure
51    bool     ufpt_update          [_param->_nb_context];
52    bool     upt_update           [_param->_nb_context];
53    Tdepth_t tab_ufpt_depth       [_param->_nb_context];
54    Tdepth_t tab_upt_depth        [_param->_nb_context];
55
56    for (uint32_t i=0; i<_param->_nb_context; i++)
57      {
58        event_state_t event_state = reg_EVENT_STATE [i];
59
60        retire_ras_from_ufpt [i] = ((event_state == EVENT_STATE_FLUSH_UFPT        ) or
61                                    (event_state == EVENT_STATE_FLUSH_UFPT_AND_UPT));
62        retire_ras_from_upt  [i] = (event_state == EVENT_STATE_FLUSH_UPT_RAS);
63
64        ufpt_update          [i] = true;
65        upt_update           [i] = true;
66        tab_ufpt_depth       [i] = reg_UFPT_UPDATE [i];
67        tab_upt_depth        [i] = reg_UPT_UPDATE  [i];
68      }
69
70    for (uint32_t i=0; i<_param->_nb_inst_update; i++)
71      {
72        Tcontext_t          context     = (reg_UPDATE_PRIORITY+i)%_param->_nb_context;
73
74        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * UPDATE [%d] (genMoore)",i);
75        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * context         : %d",context);
76        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * event_state     : %s",toString(reg_EVENT_STATE [context]).c_str());
77
78        Tcontrol_t          val                  = false;
79        Tcontrol_t          val_without_ack      = false;
80        Tcontrol_t          miss_prediction      ;
81        Tcontrol_t          direction_good       ;
82        Tcontrol_t          btb_val              ;
83        Taddress_t          btb_address_src      ;
84        Taddress_t          btb_address_dest     ;
85        Tbranch_condition_t btb_condition        ;
86        Tcontrol_t          dir_val              ;
87        Thistory_t          dir_history          ;
88        Tcontrol_t          ras_val              ;
89        Tcontrol_t          ras_push             ;
90        Taddress_t          ras_address          ;
91        Tptr_t              ras_index            ;
92        Tcontrol_t          ras_prediction_ifetch;
93
94        // Test if update fetch prediction table need update port
95        if (retire_ras_from_ufpt [context])
96          {
97            if (ufpt_update [context])
98              {
99                // Update Fetch Prediction Table
100                // An update of ufpt is to previous miss. Just restore Return Address Stack
101               
102                Tdepth_t            depth     = tab_ufpt_depth[context];
103                ufpt_state_t        state     = reg_UPDATE_FETCH_PREDICTION_TABLE [context][depth]._state; 
104                Tbranch_condition_t condition = reg_UPDATE_FETCH_PREDICTION_TABLE [context][depth]._condition; 
105               
106                log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * Update Fetch Prediction Table");
107                log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * depth           : %d",depth    );
108                log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * state           : %s",toString(state    ).c_str());
109                log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * condition       : %s",toString(condition).c_str());
110               
111                val                   = (state == UPDATE_FETCH_PREDICTION_STATE_EVENT);
112                miss_prediction       = 1;
113//              direction_good        = ;
114                btb_val               = 0; // don't update btb (is update by the event branch)
115//              btb_address_src       = ;
116//              btb_address_dest      = ;
117//              btb_condition         = ;
118                dir_val               = 0; // don't update btb (is update by the event branch (if conditionnal branch))
119//              dir_history           = ;
120                ras_val               = update_ras(condition); // repop/ repush data -> don't corrupt ras
121                ras_push              = push_ras(condition);
122                ras_address           = reg_UPDATE_FETCH_PREDICTION_TABLE [context][depth]._address_ras;
123                ras_index             = reg_UPDATE_FETCH_PREDICTION_TABLE [context][depth]._index_ras;
124                ras_prediction_ifetch = 1;
125               
126                internal_UPDATE_FROM_UFPT [i] = true;
127                internal_UPDATE_DEPTH     [i] = depth;
128                internal_UPDATE_RAS       [i] = false;
129
130                // Warning : don't update same entry
131                if (depth == reg_UFPT_BOTTOM[context])
132                  ufpt_update [context] = false;
133               
134                tab_ufpt_depth[context] = (depth==0)?(_param->_size_ufpt_queue[context]-1):(depth-1);
135              }
136          }
137        else
138          {
139            if (upt_update [context])
140              {
141                // Update Prediction Table
142               
143                Tdepth_t            depth     = tab_upt_depth[context];
144                upt_state_t         state     = reg_UPDATE_PREDICTION_TABLE [context][depth]._state; 
145                Tbranch_condition_t condition = reg_UPDATE_PREDICTION_TABLE [context][depth]._condition; 
146                Tcontrol_t          ifetch    = reg_UPDATE_PREDICTION_TABLE [context][depth]._ifetch_prediction;
147               
148                log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * Update Prediction Table");
149                log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * depth           : %d",depth    );
150                log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * state           : %s",toString(state    ).c_str());
151                log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * condition       : %s",toString(condition).c_str());
152             
153                Tcontrol_t          state_is_ok_ko           = ((state == UPDATE_PREDICTION_STATE_OK) or
154                                                                (state == UPDATE_PREDICTION_STATE_KO));
155                Tcontrol_t          state_is_event           = (state == UPDATE_PREDICTION_STATE_EVENT);
156                Tcontrol_t          state_is_event_update    = state_is_event and     need_update(condition);
157                Tcontrol_t          state_is_event_no_update = state_is_event and not need_update(condition);
158
159                if (retire_ras_from_upt [context])
160                  {
161                val                   = state_is_event_update;
162                val_without_ack       = state_is_event_no_update;
163                  }
164                else
165                  {
166                val                   = state_is_ok_ko;
167                val_without_ack       = false;
168                  }                 
169
170                miss_prediction       = (state != UPDATE_PREDICTION_STATE_OK);
171                direction_good        = reg_UPDATE_PREDICTION_TABLE [context][depth]._good_take   ;
172                btb_val               = update_btb(condition);
173                btb_address_src       = reg_UPDATE_PREDICTION_TABLE [context][depth]._address_src ;
174                btb_address_dest      = reg_UPDATE_PREDICTION_TABLE [context][depth]._address_dest;
175                btb_condition         = condition;
176                dir_val               = update_dir(condition) and ifetch; // if not ifetch, then static prediction
177                dir_history           = reg_UPDATE_PREDICTION_TABLE [context][depth]._history     ;
178                ras_val               = update_ras(condition); // repop/ repush data -> don't corrupt ras
179                ras_push              = push_ras(condition);
180                ras_address           = reg_UPDATE_PREDICTION_TABLE [context][depth]._address_ras;
181                ras_index             = reg_UPDATE_PREDICTION_TABLE [context][depth]._index_ras;
182                ras_prediction_ifetch = ifetch;
183
184                internal_UPDATE_FROM_UFPT [i] = false;
185                internal_UPDATE_DEPTH     [i] = depth;
186                internal_UPDATE_RAS       [i] = retire_ras_from_upt [context];
187
188                // Warning : don't update same entry
189                if (retire_ras_from_upt [context])
190                  {
191                    // Restore RAS.
192                    if ((depth == reg_UPT_BOTTOM[context]) or not (val or val_without_ack))
193                      upt_update [context] = false;
194                   
195                    tab_upt_depth[context] = (depth==0)?(_param->_size_upt_queue[context]-1):(depth-1);
196                  }
197                else
198                  {
199                    if ((depth == reg_UPT_TOP [context]) or not (val or val_without_ack))
200                      upt_update [context] = false;
201                   
202                    tab_upt_depth[context] = (depth+1)%_param->_size_upt_queue[context];
203                  }
204              }
205          }
206
207        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * val             : %d",val    );
208        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * val_without_ack : %d",val_without_ack);
209        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * btb_val         : %d",btb_val);
210        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * dir_val         : %d",dir_val);
211        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * ras_val         : %d",ras_val);
212
213        internal_UPDATE_VAL             [i] = val;
214        internal_UPDATE_VAL_WITHOUT_ACK [i] = val_without_ack;
215        internal_UPDATE_CONTEXT_ID      [i] = context;
216
217        PORT_WRITE(out_UPDATE_VAL                   [i],internal_UPDATE_VAL [i]);
218        if (val)
219          {
220        if (_param->_have_port_context_id)
221        PORT_WRITE(out_UPDATE_CONTEXT_ID            [i],context              );
222        PORT_WRITE(out_UPDATE_MISS_PREDICTION       [i],miss_prediction      );
223        PORT_WRITE(out_UPDATE_DIRECTION_GOOD        [i],direction_good       );
224        PORT_WRITE(out_UPDATE_BTB_VAL               [i],btb_val              );
225        PORT_WRITE(out_UPDATE_BTB_ADDRESS_SRC       [i],btb_address_src      );
226
227        log_printf(TRACE,Update_Prediction_Table,FUNCTION,"    * address_src     : %.8x",btb_address_src);
228
229        PORT_WRITE(out_UPDATE_BTB_ADDRESS_DEST      [i],btb_address_dest     );
230        PORT_WRITE(out_UPDATE_BTB_CONDITION         [i],btb_condition        );
231        PORT_WRITE(out_UPDATE_DIR_VAL               [i],dir_val              );
232        if (_param->_have_port_history)
233        PORT_WRITE(out_UPDATE_DIR_HISTORY           [i],dir_history          );
234        PORT_WRITE(out_UPDATE_RAS_VAL               [i],ras_val              );
235        PORT_WRITE(out_UPDATE_RAS_PUSH              [i],ras_push             );
236        PORT_WRITE(out_UPDATE_RAS_ADDRESS           [i],ras_address          );
237        PORT_WRITE(out_UPDATE_RAS_INDEX             [i],ras_index            );
238        PORT_WRITE(out_UPDATE_RAS_PREDICTION_IFETCH [i],ras_prediction_ifetch);
239          }
240      }
241
242//     // ===================================================================
243//     // =====[ BRANCH_EVENT ]==============================================
244//     // ===================================================================
245//     for (uint32_t i=0; i<_param->_nb_context; i++)
246//       {
247//      Tdepth_t   depth   = (reg_BOTTOM [i] + reg_NB_ELT_UPDATE [i])%_param->_size_queue [i];
248//      state_t    state   = reg_UPDATE_PREDICTION_TABLE [i][depth]._state;
249       
250//      Tcontrol_t val     = ((state == UPDATE_PREDICTION_STATE_EVENT) or
251//                               (state == UPDATE_PREDICTION_STATE_WAITEND_AND_EVENT));
252
253//      if (val)
254//        {
255// //          breakpoint ("UPT : have an branch_event (depth %d)",depth);
256//          PORT_WRITE(out_BRANCH_EVENT_ADDRESS_SRC  [i], reg_UPDATE_PREDICTION_TABLE [i][depth]._address_src );
257//          PORT_WRITE(out_BRANCH_EVENT_ADDRESS_DEST [i], reg_UPDATE_PREDICTION_TABLE [i][depth]._address_dest);
258//          internal_BRANCH_EVENT_DEPTH [i] = depth;
259//        }
260
261//      internal_BRANCH_EVENT_VAL   [i] = val;
262//      PORT_WRITE(out_BRANCH_EVENT_VAL [i], internal_BRANCH_EVENT_VAL [i]);
263//       }
264
265      }
266    log_end(Update_Prediction_Table,FUNCTION);
267  };
268
269}; // end namespace update_prediction_table
270}; // end namespace prediction_unit
271}; // end namespace front_end
272}; // end namespace multi_front_end
273}; // end namespace core
274
275}; // end namespace behavioural
276}; // end namespace morpheo             
277#endif
Note: See TracBrowser for help on using the repository browser.