Changeset 119 for trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src
- Timestamp:
- May 25, 2009, 7:40:26 PM (15 years ago)
- Location:
- trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src
- Files:
-
- 4 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_allocation.cpp
r117 r119 129 129 ALLOC1_SIGNAL_OUT(out_BRANCH_EVENT_ADDRESS_DEST_VAL ,"address_dest_val",Tcontrol_t,1); 130 130 ALLOC1_SIGNAL_OUT(out_BRANCH_EVENT_ADDRESS_DEST ,"address_dest" ,Taddress_t,_param->_size_instruction_address); 131 ALLOC1_SIGNAL_OUT(out_BRANCH_EVENT_CAN_CONTINUE ,"can_continue" ,Tcontrol_t,1); 131 132 132 133 ALLOC1_INTERFACE_END(_param->_nb_context); … … 232 233 ALLOC1(reg_EVENT_ADDRESS_DEST_VAL ,Tcontrol_t ,_param->_nb_context); 233 234 ALLOC1(reg_EVENT_ADDRESS_DEST ,Taddress_t ,_param->_nb_context); 235 ALLOC1(reg_EVENT_CAN_CONTINUE ,Tcontrol_t ,_param->_nb_context); 234 236 } 235 237 -
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_deallocation.cpp
r112 r119 81 81 DELETE1_SIGNAL(out_BRANCH_EVENT_ADDRESS_DEST_VAL ,_param->_nb_context,1); 82 82 DELETE1_SIGNAL(out_BRANCH_EVENT_ADDRESS_DEST ,_param->_nb_context,_param->_size_instruction_address); 83 DELETE1_SIGNAL(out_BRANCH_EVENT_CAN_CONTINUE ,_param->_nb_context,1); 83 84 84 85 // ~~~~~[ Interface : "update" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 160 161 DELETE1(reg_EVENT_ADDRESS_DEST_VAL ,_param->_nb_context); 161 162 DELETE1(reg_EVENT_ADDRESS_DEST ,_param->_nb_context); 163 DELETE1(reg_EVENT_CAN_CONTINUE ,_param->_nb_context); 162 164 } 163 165 -
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_genMoore.cpp
r112 r119 287 287 PORT_WRITE(out_BRANCH_EVENT_ADDRESS_DEST_VAL [i],reg_EVENT_ADDRESS_DEST_VAL [i]); 288 288 PORT_WRITE(out_BRANCH_EVENT_ADDRESS_DEST [i],reg_EVENT_ADDRESS_DEST [i]); 289 289 PORT_WRITE(out_BRANCH_EVENT_CAN_CONTINUE [i],reg_EVENT_CAN_CONTINUE [i]); 290 290 291 internal_BRANCH_EVENT_VAL [i] = val; 291 292 } -
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_transition.cpp
r115 r119 249 249 Taddress_t address_src = PORT_READ(in_DECOD_BTB_ADDRESS_SRC [i]); 250 250 Taddress_t address_dest = PORT_READ(in_DECOD_BTB_ADDRESS_DEST [i]); 251 Tcontrol_t last_take= PORT_READ(in_DECOD_BTB_LAST_TAKE [i]);251 Tcontrol_t direction = PORT_READ(in_DECOD_BTB_LAST_TAKE [i]); 252 252 253 253 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * DECOD[%d] - Accepted",i); … … 259 259 if (miss_ifetch or miss_decod) 260 260 { 261 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * miss !!!"); 262 261 263 // Have a miss !!! 264 condition = PORT_READ(in_DECOD_BTB_CONDITION [i]); 265 is_accurate = PORT_READ(in_DECOD_IS_ACCURATE [i]); 266 267 // if can_continue else don't wait the end of all instruction 268 // can_continue = not miss_commit and the destination is accurate (know) 269 Tcontrol_t can_continue = is_accurate; 270 262 271 #ifdef DEBUG_TEST 263 272 if (reg_EVENT_STATE [context] != EVENT_STATE_OK) 264 273 throw ERRORMORPHEO(FUNCTION,_("Decod : invalid event state.")); 265 274 #endif 266 if (reg_UFPT_NB_NEED_UPDATE [context] == 0) 275 276 // miss_ifetch = branch is previously predict, but it's not the good 277 // * need flush ufpt 278 // miss_decod = branch was not detected 279 // * not necessary 280 281 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * can_continue: %d",can_continue); 282 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * direction : %d",direction ); 283 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * miss_ifetch : %d",miss_ifetch ); 284 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * change : %d",(not (can_continue and not direction and not miss_ifetch))); 285 286 // if can_continue (destination is know) and direction is not take, don't need flush fetch_unit. 287 if (not (can_continue and not direction and not miss_ifetch)) 267 288 { 268 // Change state 269 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * EVENT [%d] <- EVENT_STATE_UPDATE_CONTEXT (decod - miss - no flush ufpt)",context); 270 reg_EVENT_STATE [context] = EVENT_STATE_UPDATE_CONTEXT; 271 // reg_EVENT_SOURCE[context] = EVENT_SOURCE_UFPT; 289 if (reg_UFPT_NB_NEED_UPDATE [context] == 0) 290 { 291 // Change state 292 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * EVENT [%d] <- EVENT_STATE_UPDATE_CONTEXT (decod - miss - no flush ufpt)",context); 293 reg_EVENT_STATE [context] = EVENT_STATE_UPDATE_CONTEXT; 294 // reg_EVENT_SOURCE[context] = EVENT_SOURCE_UFPT; 295 } 296 else 297 { 298 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * EVENT [%d] <- EVENT_STATE_MISS_FLUSH_UFPT (decod - miss - flush ufpt)",context); 299 reg_EVENT_STATE [context] = EVENT_STATE_MISS_FLUSH_UFPT; 300 } 301 302 // Flush UPFT 303 flush_UFPT [context] = true; 304 305 reg_EVENT_IS_BRANCH [context] = true; 306 reg_EVENT_DEPTH [context] = upt_ptr_write; 307 reg_EVENT_ADDRESS_SRC [context] = address_src; // delay_slot is compute in Context_State 308 reg_EVENT_ADDRESS_DEST_VAL[context] = direction; 309 reg_EVENT_ADDRESS_DEST [context] = address_dest; 310 reg_EVENT_CAN_CONTINUE [context] = can_continue; 272 311 } 273 else 274 { 275 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * EVENT [%d] <- EVENT_STATE_MISS_FLUSH_UFPT (decod - miss - flush ufpt)",context); 276 reg_EVENT_STATE [context] = EVENT_STATE_MISS_FLUSH_UFPT; 277 } 278 279 // Flush UPFT 280 flush_UFPT [context] = true; 281 282 reg_EVENT_IS_BRANCH [context] = true; 283 reg_EVENT_DEPTH [context] = upt_ptr_write; 284 reg_EVENT_ADDRESS_SRC [context] = address_src; // delay_slot is compute in Context_State 285 reg_EVENT_ADDRESS_DEST_VAL[context] = last_take; 286 reg_EVENT_ADDRESS_DEST [context] = address_dest; 287 312 288 313 // Push upt (from decod interface) 289 condition = PORT_READ(in_DECOD_BTB_CONDITION [i]);290 is_accurate = PORT_READ(in_DECOD_IS_ACCURATE [i]);291 292 314 reg_UPDATE_PREDICTION_TABLE [context][upt_ptr_write]._condition = condition; 293 315 reg_UPDATE_PREDICTION_TABLE [context][upt_ptr_write]._address_src = address_src ; 294 316 reg_UPDATE_PREDICTION_TABLE [context][upt_ptr_write]._address_dest = address_dest; 295 reg_UPDATE_PREDICTION_TABLE [context][upt_ptr_write]._last_take = last_take;317 reg_UPDATE_PREDICTION_TABLE [context][upt_ptr_write]._last_take = direction ; 296 318 // reg_UPDATE_PREDICTION_TABLE [context][upt_ptr_write]._good_take; 297 319 reg_UPDATE_PREDICTION_TABLE [context][upt_ptr_write]._is_accurate = is_accurate; … … 336 358 reg_UFPT_NB_NEED_UPDATE [context] --; 337 359 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * reg_UFPT_NB_NEED_UPDATE (after) : %d",reg_UFPT_NB_NEED_UPDATE [context]); 338 339 360 } 340 361 } … … 349 370 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * UPT [%d][%d].state <- UPDATE_PREDICTION_STATE_WAIT_END (decod - hit)",context,upt_ptr_write); 350 371 reg_UPDATE_PREDICTION_TABLE [context][upt_ptr_write]._state = UPDATE_PREDICTION_STATE_WAIT_END; 351 reg_UPDATE_PREDICTION_TABLE [context][upt_ptr_write]._retire_ok = false; 372 reg_UPDATE_PREDICTION_TABLE [context][upt_ptr_write]._retire_ok = false; 373 reg_UPDATE_PREDICTION_TABLE [context][upt_ptr_write]._miss_commit = false; 352 374 353 375 // Write new accurate … … 356 378 throw ERRORMORPHEO(FUNCTION,_("Decod : invalid accurate flag.")); 357 379 #endif 380 381 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * is_accurate : %d",is_accurate); 382 358 383 reg_IS_ACCURATE [context] = is_accurate; 359 384 … … 728 753 reg_EVENT_ADDRESS_DEST_VAL[context] = good_take; 729 754 reg_EVENT_ADDRESS_DEST [context] = good_addr; 755 reg_EVENT_CAN_CONTINUE [context] = false; 756 730 757 } 758 reg_UPDATE_PREDICTION_TABLE [context][depth]._miss_commit = true; 731 759 } 732 760 else … … 770 798 771 799 // if different : an other branch is occured 772 if (reg_EVENT_STATE [i] == EVENT_STATE_UPDATE_CONTEXT)800 if (reg_EVENT_STATE [i] == EVENT_STATE_UPDATE_CONTEXT) 773 801 { 774 802 // Change state 775 803 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * EVENT [%d] <- EVENT_STATE_WAIT_END_EVENT (branch_event)",i); 776 777 804 reg_EVENT_STATE [i] = EVENT_STATE_WAIT_END_EVENT; 778 805 } … … 809 836 { 810 837 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * type : EVENT_TYPE_BRANCH_MISS_SPECULATION"); 838 839 // #ifdef DEBUG_TEST 840 // if (reg_EVENT_STATE [i] != EVENT_STATE_WAIT_END_EVENT) 841 // throw ERRORMORPHEO(FUNCTION,_("Event : invalid event state.")); 842 // #endif 843 // Special case : test if event and branch_complete ! 844 if (reg_EVENT_STATE [i] == EVENT_STATE_WAIT_END_EVENT) 845 { 811 846 812 #ifdef DEBUG_TEST 813 if (reg_EVENT_STATE [i] != EVENT_STATE_WAIT_END_EVENT) 814 throw ERRORMORPHEO(FUNCTION,_("Event : invalid event state.")); 815 #endif 816 817 // Change state 818 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * EVENT [%d] <- EVENT_STATE_OK (event)",i); 819 820 reg_EVENT_STATE [i] = EVENT_STATE_OK; 821 reg_IS_ACCURATE [i] = true; 822 823 Tdepth_t depth = reg_EVENT_UPT_PTR [i]; 824 825 if (reg_UPDATE_PREDICTION_TABLE [i][depth]._state == UPDATE_PREDICTION_STATE_END_KO) 826 { 827 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * UPT [%d][%d].state <- UPDATE_PREDICTION_STATE_END (event)",i,depth); 847 // Change state 848 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * EVENT [%d] <- EVENT_STATE_OK (event)",i); 828 849 829 reg_UPDATE_PREDICTION_TABLE [i][depth]._state = UPDATE_PREDICTION_STATE_END; 830 } 831 850 reg_EVENT_STATE [i] = EVENT_STATE_OK; 851 reg_IS_ACCURATE [i] = true; 852 853 Tdepth_t depth = reg_EVENT_UPT_PTR [i]; 854 855 if (reg_UPDATE_PREDICTION_TABLE [i][depth]._state == UPDATE_PREDICTION_STATE_END_KO) 856 { 857 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * UPT [%d][%d].state <- UPDATE_PREDICTION_STATE_END (event)",i,depth); 858 859 reg_UPDATE_PREDICTION_TABLE [i][depth]._state = UPDATE_PREDICTION_STATE_END; 860 } 861 832 862 #ifdef DEBUG_TEST 833 863 // if (reg_UPDATE_PREDICTION_TABLE [i][depth]._state != UPDATE_PREDICTION_STATE_END_KO_WAIT_END) … … 840 870 841 871 // reg_UPDATE_PREDICTION_TABLE [i][depth]._state = UPDATE_PREDICTION_STATE_END_KO; 842 872 } 843 873 break; 844 874 } … … 1191 1221 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * reg_EVENT_ADDRESS_DEST_VAL: %d" ,reg_EVENT_ADDRESS_DEST_VAL[i]); 1192 1222 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * reg_EVENT_ADDRESS_DEST : %.8x (%.8x)",reg_EVENT_ADDRESS_DEST [i],reg_EVENT_ADDRESS_DEST [i]<<2); 1223 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * reg_EVENT_CAN_CONTINUE : %d" ,reg_EVENT_CAN_CONTINUE [i]); 1193 1224 1194 1225 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * Update_Fetch_Prediction_Table [%d]",i);
Note: See TracChangeset
for help on using the changeset viewer.