Changeset 106 for trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table
- Timestamp:
- Feb 9, 2009, 11:55:26 PM (15 years ago)
- Location:
- trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/SelfTest/src/test.cpp
r105 r106 1424 1424 (upt_top [context] != out_DEPTH_MAX [context]->read())) 1425 1425 SC_START(1); 1426 1427 1426 } 1428 1427 } -
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/include/Types.h
r105 r106 47 47 UPDATE_PREDICTION_STATE_KO , // this branch is a miss prediction 48 48 UPDATE_PREDICTION_STATE_EVENT , // previous branch is a miss prediction 49 UPDATE_PREDICTION_STATE_END_OK , // branch is updated, update pointer 50 UPDATE_PREDICTION_STATE_END_KO_WAIT_END , // branch is updated, don't update pointer 49 UPDATE_PREDICTION_STATE_END , // update pointer 50 // UPDATE_PREDICTION_STATE_END_OK , // branch is updated, update pointer 51 // UPDATE_PREDICTION_STATE_END_KO_WAIT_END , // branch is updated, don't update pointer 51 52 UPDATE_PREDICTION_STATE_END_KO // branch is updated, don't update pointer 52 53 } upt_state_t; … … 153 154 case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_KO : return "ko" ; break; 154 155 case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_EVENT : return "event" ; break; 155 case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_END_OK : return "end_ok" ; break; 156 case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_END_KO_WAIT_END: return "end_ko_wait_end" ; break; 156 case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_END : return "end" ; break; 157 // case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_END_OK : return "end_ok" ; break; 158 // case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_END_KO_WAIT_END: return "end_ko_wait_end" ; break; 157 159 case morpheo::behavioural::core::multi_front_end::front_end::prediction_unit::update_prediction_table::UPDATE_PREDICTION_STATE_END_KO : return "end_ko" ; break; 158 160 default : return "" ; break; -
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/include/Update_Prediction_Table.h
r105 r106 168 168 private : uint32_t * reg_UFPT_UPDATE ; //[nb_context] 169 169 private : uint32_t * reg_UFPT_NB_NEED_UPDATE ; //[nb_context] 170 private : uint32_t * reg_UFPT_NB_UPDATE ; //[nb_context] 170 171 171 172 private : upt_entry_t ** reg_UPDATE_PREDICTION_TABLE ; //[nb_context][size_upt_queue] -
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_allocation.cpp
r105 r106 197 197 ALLOC1(reg_UFPT_UPDATE ,uint32_t ,_param->_nb_context); 198 198 ALLOC1(reg_UFPT_NB_NEED_UPDATE ,uint32_t ,_param->_nb_context); 199 ALLOC1(reg_UFPT_NB_UPDATE ,uint32_t ,_param->_nb_context); 199 200 200 201 ALLOC2(reg_UPDATE_PREDICTION_TABLE ,upt_entry_t ,_param->_nb_context,_param->_size_upt_queue[it1]); -
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_deallocation.cpp
r105 r106 150 150 DELETE1(reg_UFPT_UPDATE ,_param->_nb_context); 151 151 DELETE1(reg_UFPT_NB_NEED_UPDATE ,_param->_nb_context); 152 DELETE1(reg_UFPT_NB_UPDATE ,_param->_nb_context); 152 153 153 154 DELETE2(reg_UPDATE_PREDICTION_TABLE ,_param->_nb_context,_param->_size_upt_queue[it1]); -
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_genMoore.cpp
r105 r106 61 61 bool retire_ras_from_ufpt [_param->_nb_context]; // event ufpt -> restore RAS, else update upt 62 62 bool retire_ras_from_upt [_param->_nb_context]; // event upt -> restore RAS, else restore others structure 63 // 63 // bool have_event [_param->_nb_context]; 64 64 bool ufpt_update [_param->_nb_context]; 65 65 bool upt_update [_param->_nb_context]; -
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_transition.cpp
r105 r106 39 39 reg_UFPT_UPDATE [i] = 0; 40 40 reg_UFPT_NB_NEED_UPDATE [i] = 0; 41 reg_UFPT_NB_UPDATE [i] = 0; 41 42 42 43 for (uint32_t j=0; j<_param->_size_upt_queue[i]; ++j) … … 92 93 { 93 94 uint32_t bottom = reg_UPT_BOTTOM [i]; 94 bool end_ok = (reg_UPDATE_PREDICTION_TABLE [i][bottom]._state == UPDATE_PREDICTION_STATE_END_OK); 95 bool end_ko = (reg_UPDATE_PREDICTION_TABLE [i][bottom]._state == UPDATE_PREDICTION_STATE_END_KO); 95 bool end = (reg_UPDATE_PREDICTION_TABLE [i][bottom]._state == UPDATE_PREDICTION_STATE_END); 96 // bool end_ok = (reg_UPDATE_PREDICTION_TABLE [i][bottom]._state == UPDATE_PREDICTION_STATE_END_OK); 97 // bool end_ko = (reg_UPDATE_PREDICTION_TABLE [i][bottom]._state == UPDATE_PREDICTION_STATE_END_KO); 96 98 // event_state_t event_state = reg_EVENT_STATE [i]; 97 99 98 100 // Test if state is end 99 // if ((end_ok or end_ko) and 100 // ((event_state != EVENT_STATE_UPDATE_CONTEXT) and 101 // (event_state != EVENT_STATE_WAIT_END_EVENT))) 102 if (end_ok or end_ko) 101 // if (end_ok or end_ko) 102 if (end) 103 103 { 104 104 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * UPT [%d][%d]",i,bottom); 105 105 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * UPT [%d][%d]._state = UPDATE_PREDICTION_STATE_EMPTY",i,bottom); 106 107 106 // Free slot 108 107 reg_UPDATE_PREDICTION_TABLE [i][bottom]._state = UPDATE_PREDICTION_STATE_EMPTY; … … 110 109 // Update pointer 111 110 reg_UPT_BOTTOM [i] = (bottom+1)%_param->_size_upt_queue[i]; 112 111 113 112 if (reg_UPT_BOTTOM [i] == reg_UPT_TOP [i]) 114 113 reg_UPT_EMPTY [i] = true; // free a slot … … 118 117 119 118 if (reg_EVENT_VAL [i] and (reg_EVENT_UPT_PTR [i] == bottom)) 120 // if (end_ko) // free121 119 { 122 120 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * END EVENT"); … … 129 127 reg_UPT_EMPTY [i] = false; 130 128 } 129 131 130 } 132 131 } 133 132 } 133 134 134 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * GARBAGE COLLECTOR (END)"); 135 135 … … 450 450 // if free a slot, also all queue is updated 451 451 // Last slot ? 452 if (reg_UFPT_UPDATE [context] == reg_UFPT_BOTTOM [context]) 452 // if (reg_UFPT_UPDATE [context] == reg_UFPT_BOTTOM [context]) 453 if ((--reg_UFPT_NB_UPDATE [context])==0) 453 454 switch (reg_EVENT_STATE [context]) 454 455 { … … 472 473 473 474 reg_UPDATE_FETCH_PREDICTION_TABLE [context][depth]._state = UPDATE_FETCH_PREDICTION_STATE_END; 474 475 475 476 476 // Update pointer 477 477 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * reg_UFPT_UPDATE (before) : %d",reg_UFPT_UPDATE [context]); … … 531 531 else 532 532 { 533 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * UPT [%d][%d].state <- UPDATE_PREDICTION_STATE_END_OK (update)",context,depth); 534 535 reg_UPDATE_PREDICTION_TABLE [context][depth]._state = UPDATE_PREDICTION_STATE_END_OK; 536 533 // log_printf(TRACE,Update_Prediction_Table,FUNCTION," * UPT [%d][%d].state <- UPDATE_PREDICTION_STATE_END_OK (update)",context,depth); 534 // reg_UPDATE_PREDICTION_TABLE [context][depth]._state = UPDATE_PREDICTION_STATE_END_OK; 535 536 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * UPT [%d][%d].state <- UPDATE_PREDICTION_STATE_END (update)",context,depth); 537 reg_UPDATE_PREDICTION_TABLE [context][depth]._state = UPDATE_PREDICTION_STATE_END; 537 538 538 539 #ifdef STATISTICS … … 650 651 reg_EVENT_STATE [i] = EVENT_STATE_OK; 651 652 reg_IS_ACCURATE [i] = true; 652 653 // Tdepth_t depth = reg_UPT_TOP [i]; 654 655 #ifdef DEBUG_TEST 656 // if (reg_UPDATE_PREDICTION_TABLE [i][depth]._state != UPDATE_PREDICTION_STATE_END_KO_WAIT_END) 657 // throw ERRORMORPHEO(FUNCTION,_("Event : invalid upt event state.")); 653 654 Tdepth_t depth = reg_EVENT_UPT_PTR [i]; 655 656 if (reg_UPDATE_PREDICTION_TABLE [i][depth]._state == UPDATE_PREDICTION_STATE_END_KO) 657 { 658 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * UPT [%d][%d].state <- UPDATE_PREDICTION_STATE_END (event)",i,depth); 659 660 reg_UPDATE_PREDICTION_TABLE [i][depth]._state = UPDATE_PREDICTION_STATE_END; 661 } 662 663 #ifdef DEBUG_TEST 664 // if (reg_UPDATE_PREDICTION_TABLE [i][depth]._state != UPDATE_PREDICTION_STATE_END_KO_WAIT_END) 665 // throw ERRORMORPHEO(FUNCTION,_("Event : invalid upt event state.")); 658 666 // if (reg_UPDATE_PREDICTION_TABLE [i][depth]._state != UPDATE_PREDICTION_STATE_END_KO) 659 667 // throw ERRORMORPHEO(FUNCTION,_("Event : invalid upt event state.")); 660 668 #endif 661 662 // log_printf(TRACE,Update_Prediction_Table,FUNCTION," * UPT [%d][%d].state <- UPDATE_PREDICTION_STATE_END_KO (update)",i,depth);663 664 // reg_UPDATE_PREDICTION_TABLE [i][depth]._state = UPDATE_PREDICTION_STATE_END_KO;665 669 670 // log_printf(TRACE,Update_Prediction_Table,FUNCTION," * UPT [%d][%d].state <- UPDATE_PREDICTION_STATE_END_KO (update)",i,depth); 671 672 // reg_UPDATE_PREDICTION_TABLE [i][depth]._state = UPDATE_PREDICTION_STATE_END_KO; 673 666 674 break; 667 675 } … … 685 693 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * new_update : %d",new_update); 686 694 687 688 #ifdef DEBUG_TEST 689 if (reg_UPDATE_PREDICTION_TABLE [i][depth]._state != UPDATE_PREDICTION_STATE_WAIT_END)690 throw ERRORMORPHEO(FUNCTION,_("Branch complete : invalid upt state.")); 691 #endif 692 693 // flush all slot after the event 694 for (uint32_t j=depth;695 j!=top; 696 j=(j+1)%_param->_size_upt_queue[i])697 reg_UPDATE_PREDICTION_TABLE [i][j]._state = UPDATE_PREDICTION_STATE_EVENT;698 699 // test full :700 if (full)701 reg_UPDATE_PREDICTION_TABLE [i][depth]._state = UPDATE_PREDICTION_STATE_EVENT;695 // Test empty 696 if (not reg_UPT_EMPTY [i]) 697 { 698 #ifdef DEBUG_TEST 699 if (reg_UPDATE_PREDICTION_TABLE [i][depth]._state != UPDATE_PREDICTION_STATE_WAIT_END) 700 throw ERRORMORPHEO(FUNCTION,_("Branch complete : invalid upt state.")); 701 #endif 702 reg_UPDATE_PREDICTION_TABLE [i][depth]._state = UPDATE_PREDICTION_STATE_EVENT; 703 704 // flush all slot after the event 705 for (uint32_t j=(depth+1)%_param->_size_upt_queue[i]; 706 j!=top; 707 j=(j+1)%_param->_size_upt_queue[i]) 708 reg_UPDATE_PREDICTION_TABLE [i][j]._state = UPDATE_PREDICTION_STATE_EVENT; 709 } 702 710 703 711 // reg_UPT_BOTTOM [i]; … … 802 810 { 803 811 for (uint32_t j=0; j<_param->_size_ufpt_queue[i]; ++j) 804 reg_UPDATE_FETCH_PREDICTION_TABLE [i][j]._state = UPDATE_FETCH_PREDICTION_STATE_EVENT; 805 812 { 813 reg_UFPT_NB_UPDATE [i] ++; 814 reg_UPDATE_FETCH_PREDICTION_TABLE [i][j]._state = UPDATE_FETCH_PREDICTION_STATE_EVENT; 815 } 816 806 817 // TOP is next write slot : last slot is TOP-1 807 818 uint32_t top = reg_UFPT_TOP [i]; 808 reg_UFPT_UPDATE [i] = ((top==0)?_param->_size_ufpt_queue[i]:top)-1;809 810 // reg_UFPT_BOTTOM [i];811 // reg_UFPT_TOP [i];819 reg_UFPT_UPDATE [i] = ((top==0)?_param->_size_ufpt_queue[i]:top)-1; 820 821 // reg_UFPT_BOTTOM [i]; 822 // reg_UFPT_TOP [i]; 812 823 } 813 824 … … 853 864 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * reg_UFPT_UPDATE : %d",reg_UFPT_UPDATE [i]); 854 865 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * reg_UFPT_NB_NEED_UPDATE : %d",reg_UFPT_NB_NEED_UPDATE [i]); 866 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * reg_UFPT_NB_UPDATE : %d",reg_UFPT_NB_UPDATE [i]); 855 867 for (uint32_t j=0; j<_param->_size_ufpt_queue[i]; j++) 856 868 log_printf(TRACE,Update_Prediction_Table,FUNCTION," [%d] %.4d, %.8x %.8x, %.1d %.1d, %.8d %.8x %.4d - %s",
Note: See TracChangeset
for help on using the changeset viewer.