Changeset 88 for trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_genMoore.cpp
- Timestamp:
- Dec 10, 2008, 7:31:39 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_genMoore.cpp
r82 r88 22 22 void Update_Prediction_Table::genMoore (void) 23 23 { 24 log_printf(FUNC,Update_Prediction_Table,FUNCTION,"Begin"); 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 { 25 30 26 31 // =================================================================== … … 30 35 for (uint32_t i=0; i<_param->_nb_context; i++) 31 36 { 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 } 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 38 45 // =================================================================== 39 46 // =====[ UPDATE ]==================================================== 40 47 // =================================================================== 41 48 42 Tdepth_t tab_depth [_param->_nb_context]; 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 43 56 for (uint32_t i=0; i<_param->_nb_context; i++) 44 tab_depth [i] = reg_BOTTOM [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 } 45 69 46 70 for (uint32_t i=0; i<_param->_nb_inst_update; i++) 47 71 { 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; 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; 51 249 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"); 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); 127 267 }; 128 268
Note: See TracChangeset
for help on using the changeset viewer.