source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_genMoore.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
File size: 5.9 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_printf(FUNC,Update_Prediction_Table,FUNCTION,"Begin");
25
26    // ===================================================================
27    // =====[ DEPTH ]=====================================================
28    // ===================================================================
29
30    for (uint32_t i=0; i<_param->_nb_context; i++)
31      {
32        if (_param->_have_port_depth [i])
33          {
34            PORT_WRITE(out_DEPTH_TAIL      [i], reg_BOTTOM [i]);
35          }
36        PORT_WRITE(out_DEPTH_NB_BRANCH [i], reg_NB_ELT [i]);
37      }
38    // ===================================================================
39    // =====[ UPDATE ]====================================================
40    // ===================================================================
41
42    Tdepth_t tab_depth [_param->_nb_context];
43    for (uint32_t i=0; i<_param->_nb_context; i++)
44      tab_depth [i] = reg_BOTTOM [i];
45
46    for (uint32_t i=0; i<_param->_nb_inst_update; i++)
47      {
48        uint32_t   context = (reg_UPDATE_PRIORITY+i)%_param->_nb_context;
49        Tdepth_t   depth   = tab_depth[context];
50        state_t    state   = reg_UPDATE_PREDICTION_TABLE [context][depth]._state;
51       
52        Tcontrol_t val     = ((state == UPDATE_PREDICTION_STATE_OK) or
53                              (state == UPDATE_PREDICTION_STATE_KO));
54
55//      log_printf(TRACE,Update_Prediction_Table,FUNCTION,"UPDATE [%d] (genMoore)",i);
56//      log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * context     : %d",context);
57//      log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * depth       : %d",depth);
58//      log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * state       : %s",toString(state).c_str());
59//      log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * val         : %d",val);
60//      log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * addr_src    : %x",reg_UPDATE_PREDICTION_TABLE [context][depth]._address_src );
61//      log_printf(TRACE,Update_Prediction_Table,FUNCTION,"  * addr_dest   : %x",reg_UPDATE_PREDICTION_TABLE [context][depth]._address_dest);
62
63        if (val)
64          {
65            Tbranch_condition_t cond    = reg_UPDATE_PREDICTION_TABLE [context][depth]._condition;
66                     
67            Tcontrol_t          ifetch  = reg_UPDATE_PREDICTION_TABLE [context][depth]._ifetch_prediction;
68            Tcontrol_t          btb_val = true;
69            Tcontrol_t          dir_val = (ifetch and // not ifetch == static prediction
70                                           ((cond == BRANCH_CONDITION_FLAG_UNSET) or
71                                            (cond == BRANCH_CONDITION_FLAG_SET)));
72            Tcontrol_t          ras_val = ((cond == BRANCH_CONDITION_NONE_WITH_WRITE_STACK) or
73                                           (cond == BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK) or
74                                           (cond == BRANCH_CONDITION_READ_STACK));
75           
76            Tcontrol_t          push = ((cond == BRANCH_CONDITION_NONE_WITH_WRITE_STACK) or
77                                        (cond == BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK));
78
79            if (_param->_have_port_context_id)
80            PORT_WRITE(out_UPDATE_CONTEXT_ID            [i],context);
81            PORT_WRITE(out_UPDATE_MISS_PREDICTION       [i],(state == UPDATE_PREDICTION_STATE_KO));
82            PORT_WRITE(out_UPDATE_DIRECTION_GOOD        [i],reg_UPDATE_PREDICTION_TABLE [context][depth]._good_take   );
83            PORT_WRITE(out_UPDATE_BTB_VAL               [i],btb_val);
84            PORT_WRITE(out_UPDATE_BTB_ADDRESS_SRC       [i],reg_UPDATE_PREDICTION_TABLE [context][depth]._address_src );
85            PORT_WRITE(out_UPDATE_BTB_ADDRESS_DEST      [i],reg_UPDATE_PREDICTION_TABLE [context][depth]._address_dest);
86            PORT_WRITE(out_UPDATE_BTB_CONDITION         [i],cond);
87            PORT_WRITE(out_UPDATE_DIR_VAL               [i],dir_val);
88            if (_param->_have_port_history)
89            PORT_WRITE(out_UPDATE_DIR_HISTORY           [i],reg_UPDATE_PREDICTION_TABLE [context][depth]._history     );
90            PORT_WRITE(out_UPDATE_RAS_VAL               [i],ras_val);
91            PORT_WRITE(out_UPDATE_RAS_PUSH              [i],push);
92            PORT_WRITE(out_UPDATE_RAS_ADDRESS           [i],reg_UPDATE_PREDICTION_TABLE [context][depth]._address_ras );
93            PORT_WRITE(out_UPDATE_RAS_INDEX             [i],reg_UPDATE_PREDICTION_TABLE [context][depth]._index_ras   );
94            PORT_WRITE(out_UPDATE_RAS_PREDICTION_IFETCH [i],ifetch);
95
96            internal_UPDATE_CONTEXT_ID [i] = context;
97            internal_UPDATE_DEPTH      [i] = depth;
98
99            tab_depth[context] = (depth+1)%_param->_size_queue[context];
100          }
101
102        internal_UPDATE_VAL [i] = val;
103        PORT_WRITE(out_UPDATE_VAL [i], internal_UPDATE_VAL [i]);
104      }
105
106    // ===================================================================
107    // =====[ BRANCH_EVENT ]==============================================
108    // ===================================================================
109    for (uint32_t i=0; i<_param->_nb_context; i++)
110      {
111        Tdepth_t   depth   = (reg_BOTTOM [i] + reg_NB_ELT_UPDATE [i])%_param->_size_queue [i];
112        state_t    state   = reg_UPDATE_PREDICTION_TABLE [i][depth]._state;
113       
114        Tcontrol_t val     = (state == UPDATE_PREDICTION_STATE_EVENT);
115
116        if (val)
117          {
118            PORT_WRITE(out_BRANCH_EVENT_ADDRESS_SRC  [i], reg_UPDATE_PREDICTION_TABLE [i][depth]._address_src );
119            PORT_WRITE(out_BRANCH_EVENT_ADDRESS_DEST [i], reg_UPDATE_PREDICTION_TABLE [i][depth]._address_dest);
120            internal_BRANCH_EVENT_DEPTH [i] = depth;
121          }
122
123        internal_BRANCH_EVENT_VAL   [i] = val;
124        PORT_WRITE(out_BRANCH_EVENT_VAL [i], internal_BRANCH_EVENT_VAL [i]);
125      }
126    log_printf(FUNC,Update_Prediction_Table,FUNCTION,"End");
127  };
128
129}; // end namespace update_prediction_table
130}; // end namespace prediction_unit
131}; // end namespace front_end
132}; // end namespace multi_front_end
133}; // end namespace core
134
135}; // end namespace behavioural
136}; // end namespace morpheo             
137#endif
Note: See TracBrowser for help on using the repository browser.