Changeset 123 for trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src
- Timestamp:
- Jun 8, 2009, 10:43:30 PM (15 years ago)
- Location:
- trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src
- Files:
-
- 6 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.cpp
r111 r123 40 40 usage_environment(_usage); 41 41 42 #if DEBUG_Update_Prediction_Table == true43 log_printf(INFO,Update_Prediction_Table,FUNCTION,_("<%s> Parameters"),_name.c_str());44 45 std::cout << *param << std::endl;46 #endif42 // #if DEBUG_Update_Prediction_Table == true 43 // log_printf(INFO,Update_Prediction_Table,FUNCTION,_("<%s> Parameters"),_name.c_str()); 44 45 // std::cout << *param << std::endl; 46 // #endif 47 47 48 48 log_printf(INFO,Update_Prediction_Table,FUNCTION,"Allocation"); -
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_genMealy_branch_complete.cpp
r122 r123 24 24 log_begin(Update_Prediction_Table,FUNCTION); 25 25 log_function(Update_Prediction_Table,FUNCTION,_name.c_str()); 26 26 27 if (PORT_READ(in_NRESET)) 28 { 27 29 for (uint32_t i=0; i<_param->_nb_inst_branch_complete; i++) 28 30 #ifdef DEBUG_TEST … … 129 131 // PORT_WRITE(out_BRANCH_COMPLETE_ADDRESS_DEST [i], internal_BRANCH_COMPLETE_ADDRESS_DEST [i]); 130 132 } 131 133 } 132 134 log_end(Update_Prediction_Table,FUNCTION); 133 135 }; -
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_genMealy_decod.cpp
r122 r123 68 68 } 69 69 } 70 else 71 { 72 // RESET 73 for (uint32_t i=0; i<_param->_nb_inst_decod; i++) 74 PORT_WRITE(out_DECOD_ACK [i], 0); 75 } 76 70 77 log_end(Update_Prediction_Table,FUNCTION); 71 78 }; -
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_genMealy_predict.cpp
r122 r123 57 57 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * ACK : %d",internal_PREDICT_ACK [i]); 58 58 59 PORT_WRITE(out_PREDICT_ACK [i], internal_PREDICT_ACK [i]);60 59 if (_param->_have_port_depth) 61 60 PORT_WRITE(out_PREDICT_UPDATE_PREDICTION_ID [i], internal_PREDICT_UPDATE_PREDICTION_ID [i]); … … 63 62 64 63 }//don't reset 64 else 65 { 66 for (uint32_t i=0; i<_param->_nb_inst_predict; i++) 67 { 68 internal_PREDICT_ACK [i] = 0; 69 // internal_PREDICT_UPDATE_PREDICTION_ID [i] = top; 70 } 71 } 72 73 for (uint32_t i=0; i<_param->_nb_inst_predict; i++) 74 PORT_WRITE(out_PREDICT_ACK [i], internal_PREDICT_ACK [i]); 65 75 66 76 log_end(Update_Prediction_Table,FUNCTION); -
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_genMoore.cpp
r122 r123 248 248 internal_UPDATE_CONTEXT_ID [i] = context; 249 249 250 PORT_WRITE(out_UPDATE_VAL [i],internal_UPDATE_VAL [i]);251 250 if (val) 252 251 { … … 282 281 Tcontrol_t val = ((reg_UPT_EVENT_STATE [i] == UPT_EVENT_STATE_KO_DECODE_UPDATE_CONTEXT) or 283 282 (reg_UPT_EVENT_STATE [i] == UPT_EVENT_STATE_KO_COMMIT_UPDATE_CONTEXT)); 284 PORT_WRITE(out_BRANCH_EVENT_VAL [i],val);285 283 if (_param->_have_port_depth) 286 284 PORT_WRITE(out_BRANCH_EVENT_DEPTH [i],reg_EVENT_DEPTH [i]); … … 301 299 internal_UPDATE_VAL [i] = 0; 302 300 internal_UPDATE_VAL_WITHOUT_ACK [i] = 0; 301 internal_UPDATE_CONTEXT_ID [i] = 0; 302 303 303 } 304 304 for (uint32_t i=0; i<_param->_nb_context; i++) … … 308 308 } 309 309 310 // Write output 311 for (uint32_t i=0; i<_param->_nb_inst_update; i++) 312 PORT_WRITE(out_UPDATE_VAL [i],internal_UPDATE_VAL [i]); 313 for (uint32_t i=0; i<_param->_nb_context; i++) 314 PORT_WRITE(out_BRANCH_EVENT_VAL [i],internal_BRANCH_EVENT_VAL [i]); 310 315 311 316 log_end(Update_Prediction_Table,FUNCTION); -
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_transition.cpp
r122 r123 545 545 } 546 546 547 // Test if freeing the branch with no accurate ? 548 if ((reg_UPDATE_PREDICTION_TABLE [context][depth]._is_accurate == false) and not ko) 549 reg_IS_ACCURATE [context] = true; 550 547 551 // Update pointer 548 552 // * if update RAS : update pointer is decreaste until it equal at top pointer … … 577 581 } 578 582 579 reg_UPT_EVENT_STATE [context] = upt_event_state;580 583 } 581 584 else … … 593 596 } 594 597 595 // Test if freeing the branch with no accurate ? 596 if ((reg_UPDATE_PREDICTION_TABLE [context][depth]._is_accurate == false) and not ko) 597 reg_IS_ACCURATE [context] = true; 598 // special case : 599 if ((upt_event_state == UPT_EVENT_STATE_KO_COMMIT_WAIT_END_UPDATE) and 600 (reg_UPT_UPDATE [context] == reg_EVENT_UPT_PTR [context])) 601 { 602 reg_UPT_TOP [context] = reg_UPT_TOP_EVENT [context]; 603 reg_UPT_UPDATE [context] = reg_UPT_TOP_EVENT [context]; 604 reg_IS_ACCURATE [context] = true; 605 606 upt_event_state = UPT_EVENT_STATE_OK; 607 } 608 609 reg_UPT_EVENT_STATE [context] = upt_event_state; 598 610 599 611 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * reg_UPT_UPDATE (after ) : %d",reg_UPT_UPDATE[context]); … … 654 666 655 667 Taddress_t address_src = reg_UPDATE_PREDICTION_TABLE [context][depth]._address_src; 656 upt_state_t event_top= reg_UPDATE_PREDICTION_TABLE [context][top]._state;668 upt_state_t top_state = reg_UPDATE_PREDICTION_TABLE [context][top]._state; 657 669 658 670 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * upt_event_state : %s",toString(upt_event_state).c_str()); 659 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * event_top : %s",toString(event_top).c_str());671 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * top_state : %s",toString(top_state).c_str()); 660 672 661 673 bool previous_ufpt_event = (reg_UFPT_EVENT_STATE [i] == UFPT_EVENT_STATE_KO_FLUSH); … … 667 679 or (upt_event_state == UPT_EVENT_STATE_KO_EVENT_WAIT_UFPT) 668 680 or (upt_event_state == UPT_EVENT_STATE_KO_EVENT_FLUSH_UPT) 669 or (event_top == UPDATE_PREDICTION_STATE_END_KO ) 670 or (event_top == UPDATE_PREDICTION_STATE_KO ) 681 or (upt_event_state == UPT_EVENT_STATE_KO_COMMIT_WAIT_END_UPDATE) 682 or (top_state == UPDATE_PREDICTION_STATE_END_KO ) 683 or (top_state == UPDATE_PREDICTION_STATE_KO ) 671 684 ); 672 685 … … 706 719 reg_UPDATE_PREDICTION_TABLE [context][top]._retire_ok = false; 707 720 708 switch ( event_top)721 switch (top_state) 709 722 { 710 723 case UPDATE_PREDICTION_STATE_END_KO : 724 case UPDATE_PREDICTION_STATE_END : 711 725 { 712 726 // Have already update predictor … … 867 881 case UPT_EVENT_STATE_KO_COMMIT_WAIT_END_EVENT : 868 882 { 869 Tdepth_t depth = reg_EVENT_UPT_PTR [i]; 883 Tdepth_t depth = reg_EVENT_UPT_PTR [i]; 884 Tdepth_t update = reg_UPT_UPDATE [i]; 870 885 871 886 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * depth : %d",depth); … … 878 893 } 879 894 880 reg_UPT_TOP [i] = reg_UPT_TOP_EVENT [i]; 881 reg_UPT_UPDATE [i] = reg_UPT_TOP_EVENT [i]; 882 883 // break; continue 895 // Special case : branch_complete a speculative branch and the context_state signal the end of this event before the complete of previous branch 896 if (depth != update) 897 { 898 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * EVENT [%d] <- EVENT_STATE_COMMIT_WAIT_END_UPDATE (event)",i); 899 upt_event_state = UPT_EVENT_STATE_KO_COMMIT_WAIT_END_UPDATE; 900 901 break; // stop here 902 } 903 904 reg_UPT_TOP [i] = reg_UPT_TOP_EVENT [i]; 905 reg_UPT_UPDATE [i] = reg_UPT_TOP_EVENT [i]; 906 907 // break; continue 884 908 } 885 909 case UPT_EVENT_STATE_KO_DECODE_WAIT_END_EVENT : … … 906 930 // Flush UPFT 907 931 flush_UFPT [i] = true; 932 933 if (upt_event_state == UPT_EVENT_STATE_KO_COMMIT_WAIT_END_UPDATE) 934 { 935 reg_UPT_TOP [i] = reg_UPT_TOP_EVENT [i]; 936 reg_UPT_UPDATE [i] = reg_UPT_TOP_EVENT [i]; 937 reg_IS_ACCURATE [i] = true; 938 939 upt_event_state = UPT_EVENT_STATE_OK; 940 } 908 941 909 942 // Flush UPT … … 978 1011 reg_EVENT_UPT_PTR [i] = top; 979 1012 reg_EVENT_UPT_FULL [i] = (not empty and (bottom == reg_UPT_TOP [i])); 1013 // reg_EVENT_DEPTH [i] = PORT_READ(in_EVENT_DEPTH [i]);//(top+1)%_param->_size_upt_queue[i]; 980 1014 reg_EVENT_DEPTH [i] = top; 1015 981 1016 // reg_EVENT_ADDRESS_SRC [i] = address_src; // delay_slot is compute in I_State 982 1017 // reg_EVENT_ADDRESS_DEST_VAL[i] = good_take;
Note: See TracChangeset
for help on using the changeset viewer.