Changeset 81 for trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src
- Timestamp:
- Apr 15, 2008, 8:40:01 PM (16 years ago)
- Location:
- trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src
- Files:
-
- 4 added
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Parameters.cpp
-
Property
svn:keywords
set to
Id
r78 r81 7 7 8 8 #include "Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/include/Parameters.h" 9 #include "Common/include/Max.h" 9 10 10 11 namespace morpheo { … … 19 20 #undef FUNCTION 20 21 #define FUNCTION "Update_Prediction_Table::Parameters" 21 Parameters::Parameters () 22 Parameters::Parameters (uint32_t nb_context , 23 uint32_t * size_queue , 24 uint32_t size_address , 25 uint32_t nb_inst_predict , 26 uint32_t nb_inst_decod , 27 uint32_t nb_inst_branch_complete, 28 uint32_t nb_inst_update , 29 uint32_t size_history , 30 uint32_t * size_ras_index ) 22 31 { 23 32 log_printf(FUNC,Update_Prediction_Table,FUNCTION,"Begin"); 33 34 _nb_context = nb_context ; 35 _size_queue = size_queue ; 36 _size_address = size_address ; 37 _nb_inst_predict = nb_inst_predict ; 38 _nb_inst_decod = nb_inst_decod ; 39 _nb_inst_branch_complete = nb_inst_branch_complete; 40 _nb_inst_update = nb_inst_update ; 41 _size_history = size_history ; 42 _size_ras_index = size_ras_index ; 43 44 _size_context_id = log2(nb_context); 45 _size_depth = log2(max<uint32_t>(size_queue,nb_context)); 46 _max_size_ras_index = max<uint32_t>(_size_ras_index,nb_context); 47 48 _have_port_context_id = _size_context_id> 0; 49 _have_port_depth = _size_depth > 0; 50 _have_port_history = _size_history > 0; 51 24 52 test(); 25 53 log_printf(FUNC,Update_Prediction_Table,FUNCTION,"End"); -
Property
svn:keywords
set to
-
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Parameters_msg_error.cpp
-
Property
svn:keywords
set to
Id
r78 r81 27 27 Parameters_test test ("Update_Prediction_Table"); 28 28 29 if (morpheo::behavioural::test<Tdepth_t>(_size_depth) == false) 30 test.error("type \"Tdepth_t\" is too small."); 31 29 32 log_printf(FUNC,Update_Prediction_Table,FUNCTION,"End"); 30 33 -
Property
svn:keywords
set to
-
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Parameters_print.cpp
-
Property
svn:keywords
set to
Id
r78 r81 27 27 28 28 xml.balise_open("update_prediction_table"); 29 // xml.singleton_begin(""); xml.attribut("value",toString(_)); xml.singleton_end(); 29 xml.singleton_begin("nb_context "); xml.attribut("value",toString(_nb_context )); xml.singleton_end(); 30 xml.singleton_begin("size_address "); xml.attribut("value",toString(_size_address )); xml.singleton_end(); 31 xml.singleton_begin("nb_inst_predict "); xml.attribut("value",toString(_nb_inst_predict )); xml.singleton_end(); 32 xml.singleton_begin("nb_inst_decod "); xml.attribut("value",toString(_nb_inst_decod )); xml.singleton_end(); 33 xml.singleton_begin("nb_inst_branch_complete"); xml.attribut("value",toString(_nb_inst_branch_complete)); xml.singleton_end(); 34 xml.singleton_begin("nb_inst_update "); xml.attribut("value",toString(_nb_inst_update )); xml.singleton_end(); 35 xml.singleton_begin("size_history "); xml.attribut("value",toString(_size_history )); xml.singleton_end(); 36 for (uint32_t i=0;i<_nb_context; i++) 37 { 38 xml. balise_open_begin("component"); 39 xml. attribut("type","context"); 40 xml. attribut("id" ,toString(i)); 41 xml. balise_open_end(); 42 xml. singleton_begin("size_queue "); xml.attribut("value",toString(_size_queue [i])); xml.singleton_end(); 43 xml. singleton_begin("size_ras_index "); xml.attribut("value",toString(_size_ras_index [i])); xml.singleton_end(); 44 xml. balise_close(); 45 } 30 46 xml.balise_close(); 31 47 -
Property
svn:keywords
set to
-
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table.cpp
-
Property
svn:keywords
set to
Id
r78 r81 38 38 log_printf(FUNC,Update_Prediction_Table,FUNCTION,"Begin"); 39 39 40 usage_environment(_usage); 41 40 42 log_printf(INFO,Update_Prediction_Table,FUNCTION,"Allocation"); 41 43 … … 68 70 if (_usage & USE_SYSTEMC) 69 71 { 72 73 for (uint32_t i=0; i<_param->_nb_inst_branch_complete; i++) 74 { 75 internal_BRANCH_COMPLETE_ACK [i] = 1; 76 PORT_WRITE(out_BRANCH_COMPLETE_ACK [i], internal_BRANCH_COMPLETE_ACK [i]); 77 } 78 70 79 log_printf(INFO,Update_Prediction_Table,FUNCTION,"Method - transition"); 71 80 … … 76 85 # ifdef SYSTEMCASS_SPECIFIC 77 86 // List dependency information 87 # endif 88 89 log_printf(INFO,Update_Prediction_Table,FUNCTION,"Method - genMoore"); 90 91 SC_METHOD (genMoore); 92 dont_initialize (); 93 sensitive << (*(in_CLOCK)).neg(); 94 95 # ifdef SYSTEMCASS_SPECIFIC 96 // List dependency information 97 # endif 98 99 log_printf(INFO,Update_Prediction_Table,FUNCTION,"Method - genMealy_predict"); 100 101 SC_METHOD (genMealy_predict); 102 dont_initialize (); 103 sensitive << (*(in_CLOCK)).neg(); // use internal register 104 for (uint32_t i=0; i<_param->_nb_inst_predict; i++) 105 { 106 if (_param->_have_port_context_id) 107 sensitive << (*(in_PREDICT_CONTEXT_ID [i])); 108 sensitive << (*(in_PREDICT_BTB_IS_ACCURATE [i])); 109 } 110 111 # ifdef SYSTEMCASS_SPECIFIC 112 // List dependency information 113 for (uint32_t i=0; i<_param->_nb_inst_predict; i++) 114 { 115 (*(out_PREDICT_ACK [i])) (*(in_PREDICT_BTB_IS_ACCURATE [i])); 116 if (_param->_have_port_context_id) 117 (*(out_PREDICT_ACK [i])) (*(in_PREDICT_CONTEXT_ID [i])); 118 } 119 # endif 120 121 log_printf(INFO,Update_Prediction_Table,FUNCTION,"Method - genMealy_decod"); 122 123 SC_METHOD (genMealy_decod); 124 dont_initialize (); 125 sensitive << (*(in_CLOCK)).neg(); // use internal register 126 for (uint32_t i=0; i<_param->_nb_inst_decod; i++) 127 { 128 if (_param->_have_port_context_id) 129 sensitive << (*(in_DECOD_CONTEXT_ID [i])); 130 sensitive << (*(in_DECOD_MISS_PREDICTION [i])); 131 } 132 133 # ifdef SYSTEMCASS_SPECIFIC 134 // List dependency information 135 for (uint32_t i=0; i<_param->_nb_inst_decod; i++) 136 { 137 (*(out_DECOD_ACK [i])) (*(in_DECOD_MISS_PREDICTION [i])); 138 if (_param->_have_port_context_id) 139 (*(out_DECOD_ACK [i])) (*(in_DECOD_CONTEXT_ID [i])); 140 } 141 # endif 142 143 log_printf(INFO,Update_Prediction_Table,FUNCTION,"Method - genMealy_branch_complete"); 144 145 SC_METHOD (genMealy_branch_complete); 146 dont_initialize (); 147 sensitive << (*(in_CLOCK)).neg(); // use internal register 148 for (uint32_t i=0; i<_param->_nb_inst_branch_complete; i++) 149 { 150 if (_param->_have_port_context_id) 151 sensitive << (*(in_BRANCH_COMPLETE_CONTEXT_ID [i])); 152 if (_param->_have_port_depth) 153 sensitive << (*(in_BRANCH_COMPLETE_DEPTH [i])); 154 sensitive << (*(in_BRANCH_COMPLETE_FLAG [i])) 155 << (*(in_BRANCH_COMPLETE_ADDRESS [i])); 156 } 157 158 # ifdef SYSTEMCASS_SPECIFIC 159 // List dependency information 160 for (uint32_t i=0; i<_param->_nb_inst_branch_complete; i++) 161 { 162 if (_param->_have_port_context_id) 163 (*(out_BRANCH_COMPLETE_MISS_PREDICTION [i])) (*(in_BRANCH_COMPLETE_CONTEXT_ID [i])); 164 if (_param->_have_port_depth) 165 (*(out_BRANCH_COMPLETE_MISS_PREDICTION [i])) (*(in_BRANCH_COMPLETE_DEPTH [i])); 166 (*(out_BRANCH_COMPLETE_MISS_PREDICTION [i])) (*(in_BRANCH_COMPLETE_FLAG [i])); 167 (*(out_BRANCH_COMPLETE_MISS_PREDICTION [i])) (*(in_BRANCH_COMPLETE_ADDRESS [i])); 168 169 if (_param->_have_port_context_id) 170 (*(out_BRANCH_COMPLETE_TAKE [i])) (*(in_BRANCH_COMPLETE_CONTEXT_ID [i])); 171 if (_param->_have_port_depth) 172 (*(out_BRANCH_COMPLETE_TAKE [i])) (*(in_BRANCH_COMPLETE_DEPTH [i])); 173 (*(out_BRANCH_COMPLETE_TAKE [i])) (*(in_BRANCH_COMPLETE_FLAG [i])); 174 175 if (_param->_have_port_context_id) 176 (*(out_BRANCH_COMPLETE_ADDRESS_SRC [i])) (*(in_BRANCH_COMPLETE_CONTEXT_ID [i])); 177 if (_param->_have_port_depth) 178 (*(out_BRANCH_COMPLETE_ADDRESS_SRC [i])) (*(in_BRANCH_COMPLETE_DEPTH [i])); 179 180 if (_param->_have_port_context_id) 181 (*(out_BRANCH_COMPLETE_ADDRESS_DEST [i])) (*(in_BRANCH_COMPLETE_CONTEXT_ID [i])); 182 if (_param->_have_port_depth) 183 (*(out_BRANCH_COMPLETE_ADDRESS_DEST [i])) (*(in_BRANCH_COMPLETE_DEPTH [i])); 184 (*(out_BRANCH_COMPLETE_ADDRESS_DEST [i])) (*(in_BRANCH_COMPLETE_ADDRESS [i])); 185 } 78 186 # endif 79 187 -
Property
svn:keywords
set to
-
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_allocation.cpp
-
Property
svn:keywords
set to
Id
r78 r81 55 55 in_NRESET = interface->set_signal_in <Tcontrol_t> ("nreset",1, RESET_VHDL_YES); 56 56 } 57 58 // ~~~~~[ Interface : "predict" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 59 { 60 ALLOC1_INTERFACE("predict", IN,SOUTH, "predict", _param->_nb_inst_predict); 61 62 ALLOC1_VALACK_IN ( in_PREDICT_VAL ,VAL); 63 ALLOC1_VALACK_OUT(out_PREDICT_ACK ,ACK); 64 ALLOC1_SIGNAL_IN ( in_PREDICT_CONTEXT_ID ,"context_id" ,Tcontext_t ,_param->_size_context_id); 65 ALLOC1_SIGNAL_IN ( in_PREDICT_BTB_ADDRESS_SRC ,"btb_address_src" ,Taddress_t ,_param->_size_address); 66 ALLOC1_SIGNAL_IN ( in_PREDICT_BTB_ADDRESS_DEST ,"btb_address_dest" ,Taddress_t ,_param->_size_address); 67 ALLOC1_SIGNAL_IN ( in_PREDICT_BTB_CONDITION ,"btb_condition" ,Tbranch_condition_t,_param->_size_branch_condition); 68 ALLOC1_SIGNAL_IN ( in_PREDICT_BTB_LAST_TAKE ,"btb_last_take" ,Tcontrol_t ,1); 69 ALLOC1_SIGNAL_IN ( in_PREDICT_BTB_IS_ACCURATE ,"btb_is_accurate" ,Tcontrol_t ,1); 70 ALLOC1_SIGNAL_IN ( in_PREDICT_DIR_HISTORY ,"dir_history" ,Thistory_t ,_param->_size_history); 71 ALLOC1_SIGNAL_IN ( in_PREDICT_RAS_ADDRESS ,"ras_address" ,Taddress_t ,_param->_size_address); 72 ALLOC1_SIGNAL_IN ( in_PREDICT_RAS_INDEX ,"ras_index" ,Tptr_t ,_param->_max_size_ras_index); 73 // ALLOC1_SIGNAL_OUT(out_PREDICT_UPDATE_PREDICTION_ID,"update_prediction_id",Tprediction_ptr_t ,_param->_size_depth); 74 } 75 76 // ~~~~~[ Interface : "decod" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 77 { 78 ALLOC1_INTERFACE("predict", IN,SOUTH, "predict", _param->_nb_inst_predict); 79 80 ALLOC1_VALACK_IN ( in_DECOD_VAL ,VAL); 81 ALLOC1_VALACK_OUT(out_DECOD_ACK ,ACK); 82 ALLOC1_SIGNAL_IN ( in_DECOD_CONTEXT_ID ,"context_id" ,Tcontext_t ,_param->_size_context_id); 83 ALLOC1_SIGNAL_IN ( in_DECOD_BTB_ADDRESS_SRC ,"btb_address_src" ,Taddress_t ,_param->_size_address); 84 ALLOC1_SIGNAL_IN ( in_DECOD_BTB_ADDRESS_DEST ,"btb_address_dest" ,Taddress_t ,_param->_size_address); 85 ALLOC1_SIGNAL_IN ( in_DECOD_BTB_CONDITION ,"btb_condition" ,Tbranch_condition_t,_param->_size_branch_condition); 86 ALLOC1_SIGNAL_IN ( in_DECOD_BTB_LAST_TAKE ,"btb_last_take" ,Tcontrol_t ,1); 87 ALLOC1_SIGNAL_IN ( in_DECOD_RAS_ADDRESS ,"ras_address" ,Taddress_t ,_param->_size_address); 88 ALLOC1_SIGNAL_IN ( in_DECOD_RAS_INDEX ,"ras_index" ,Tptr_t ,_param->_max_size_ras_index); 89 ALLOC1_SIGNAL_IN ( in_DECOD_MISS_PREDICTION ,"miss_prediction" ,Tcontrol_t ,1); 90 ALLOC1_SIGNAL_IN ( in_DECOD_UPDATE_PREDICTION_ID,"update_prediction_id",Tprediction_ptr_t ,_param->_size_depth); 91 // ALLOC1_SIGNAL_OUT(out_DECOD_DEPTH ,"depth" ,Tdepth_t ,_param->_size_depth); 92 } 93 94 // ~~~~~[ Interface : "branch_complete" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 { 96 ALLOC1_INTERFACE("branch_complete", IN,SOUTH, "branch_complete", _param->_nb_inst_branch_complete); 97 98 99 ALLOC1_VALACK_IN ( in_BRANCH_COMPLETE_VAL ,VAL); 100 ALLOC1_VALACK_OUT(out_BRANCH_COMPLETE_ACK ,ACK); 101 ALLOC1_SIGNAL_IN ( in_BRANCH_COMPLETE_CONTEXT_ID ,"context_id" ,Tcontext_t,_param->_size_context_id); 102 ALLOC1_SIGNAL_IN ( in_BRANCH_COMPLETE_DEPTH ,"depth" ,Tdepth_t ,_param->_size_depth); 103 ALLOC1_SIGNAL_IN ( in_BRANCH_COMPLETE_ADDRESS ,"address" ,Taddress_t,_param->_size_address); 104 ALLOC1_SIGNAL_IN ( in_BRANCH_COMPLETE_FLAG ,"flag" ,Tcontrol_t,1); 105 ALLOC1_SIGNAL_OUT(out_BRANCH_COMPLETE_MISS_PREDICTION,"miss_prediction",Tcontrol_t,1); 106 ALLOC1_SIGNAL_OUT(out_BRANCH_COMPLETE_TAKE ,"take" ,Tcontrol_t,1); 107 ALLOC1_SIGNAL_OUT(out_BRANCH_COMPLETE_ADDRESS_SRC ,"address_src" ,Taddress_t,_param->_size_address); 108 ALLOC1_SIGNAL_OUT(out_BRANCH_COMPLETE_ADDRESS_DEST ,"address_dest" ,Taddress_t,_param->_size_address); 109 } 110 111 // ~~~~~[ Interface : "update" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 112 { 113 ALLOC1_INTERFACE("update",OUT,SOUTH, "update", _param->_nb_inst_update); 114 115 ALLOC1_VALACK_OUT(out_UPDATE_VAL ,VAL); 116 ALLOC1_VALACK_IN ( in_UPDATE_ACK ,ACK); 117 ALLOC1_SIGNAL_OUT(out_UPDATE_CONTEXT_ID ,"context_id" ,Tcontext_t ,_param->_size_context_id); 118 ALLOC1_SIGNAL_OUT(out_UPDATE_MISS_PREDICTION ,"miss_prediction" ,Tcontrol_t ,1); 119 ALLOC1_SIGNAL_OUT(out_UPDATE_DIRECTION_GOOD ,"direction_good" ,Tcontrol_t ,1); 120 ALLOC1_SIGNAL_OUT(out_UPDATE_BTB_VAL ,"btb_val" ,Tcontrol_t ,1); 121 ALLOC1_SIGNAL_OUT(out_UPDATE_BTB_ADDRESS_SRC ,"btb_address_src" ,Taddress_t ,_param->_size_address); 122 ALLOC1_SIGNAL_OUT(out_UPDATE_BTB_ADDRESS_DEST ,"btb_address_dest" ,Taddress_t ,_param->_size_address); 123 ALLOC1_SIGNAL_OUT(out_UPDATE_BTB_CONDITION ,"btb_condition" ,Tbranch_condition_t,_param->_size_branch_condition); 124 ALLOC1_SIGNAL_OUT(out_UPDATE_DIR_VAL ,"dir_val" ,Tcontrol_t ,1); 125 ALLOC1_SIGNAL_OUT(out_UPDATE_DIR_HISTORY ,"dir_history" ,Thistory_t ,_param->_size_history); 126 ALLOC1_SIGNAL_OUT(out_UPDATE_RAS_VAL ,"ras_val" ,Tcontrol_t ,1); 127 ALLOC1_SIGNAL_OUT(out_UPDATE_RAS_ADDRESS ,"ras_address" ,Taddress_t ,_param->_size_address); 128 ALLOC1_SIGNAL_OUT(out_UPDATE_RAS_INDEX ,"ras_index" ,Tptr_t ,_param->_max_size_ras_index); 129 ALLOC1_SIGNAL_OUT(out_UPDATE_RAS_PREDICTION_IFETCH,"ras_prediction_ifetch",Tcontrol_t ,1); 130 } 131 132 // ~~~~~[ Interface : "depth" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 { 134 ALLOC1_INTERFACE("depth",OUT,SOUTH, "depth", _param->_nb_context); 135 136 ALLOC1_SIGNAL_OUT(out_DEPTH_NB_BRANCH,"NB_BRANCH",Tdepth_t,_param->_size_depth); 137 ALLOC1_SIGNAL_OUT(out_DEPTH_TAIL,"TAIL",Tdepth_t,_param->_size_depth); 138 } 139 140 // ~~~~~[ Internal ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 internal_PREDICT_ACK = new Tcontrol_t [_param->_nb_inst_predict]; 142 internal_DECOD_ACK = new Tcontrol_t [_param->_nb_inst_decod]; 143 internal_BRANCH_COMPLETE_ACK = new Tcontrol_t [_param->_nb_inst_branch_complete]; 144 internal_BRANCH_COMPLETE_MISS_PREDICTION = new Tcontrol_t [_param->_nb_inst_branch_complete]; 145 internal_BRANCH_COMPLETE_TAKE = new Tcontrol_t [_param->_nb_inst_branch_complete]; 146 internal_BRANCH_COMPLETE_ADDRESS_DEST = new Taddress_t [_param->_nb_inst_branch_complete]; 147 internal_UPDATE_VAL = new Tcontrol_t [_param->_nb_inst_update]; 148 internal_UPDATE_CONTEXT_ID = new Tcontext_t [_param->_nb_inst_update]; 149 internal_UPDATE_DEPTH = new Tdepth_t [_param->_nb_inst_update]; 150 151 // ~~~~~[ Register ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 reg_TOP = new uint32_t [_param->_nb_context]; 153 reg_BOTTOM = new uint32_t [_param->_nb_context]; 154 reg_NB_ELT = new uint32_t [_param->_nb_context]; 155 reg_NB_ELT_NEED_UPDATE = new uint32_t [_param->_nb_context]; 156 reg_UPDATE_PREDICTION_TABLE = new entry_t * [_param->_nb_context]; 157 for (uint32_t i=0; i<_param->_nb_context; i++) 158 { 159 #ifndef NO_INIT 160 reg_TOP [i] = 0; 161 #endif 162 reg_UPDATE_PREDICTION_TABLE [i] = new entry_t [_param->_size_queue[i]]; 163 } 57 164 // ~~~~~[ Component ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 165 -
Property
svn:keywords
set to
-
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_deallocation.cpp
-
Property
svn:keywords
set to
Id
r78 r81 27 27 delete in_CLOCK ; 28 28 delete in_NRESET; 29 30 // ~~~~~[ Interface : "predict" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 31 delete [] in_PREDICT_VAL ; 32 delete [] out_PREDICT_ACK ; 33 if (_param->_have_port_context_id) 34 delete [] in_PREDICT_CONTEXT_ID ; 35 delete [] in_PREDICT_BTB_ADDRESS_SRC ; 36 delete [] in_PREDICT_BTB_ADDRESS_DEST ; 37 delete [] in_PREDICT_BTB_CONDITION ; 38 delete [] in_PREDICT_BTB_LAST_TAKE ; 39 delete [] in_PREDICT_BTB_IS_ACCURATE ; 40 if (_param->_have_port_history) 41 delete [] in_PREDICT_DIR_HISTORY ; 42 delete [] in_PREDICT_RAS_ADDRESS ; 43 delete [] in_PREDICT_RAS_INDEX ; 44 // if (_param->_have_port_depth) 45 // delete [] out_PREDICT_UPDATE_PREDICTION_ID; 46 47 // ~~~~~[ Interface : "decod" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 48 delete [] in_DECOD_VAL ; 49 delete [] out_DECOD_ACK ; 50 if (_param->_have_port_context_id) 51 delete [] in_DECOD_CONTEXT_ID ; 52 delete [] in_DECOD_BTB_ADDRESS_SRC ; 53 delete [] in_DECOD_BTB_ADDRESS_DEST ; 54 delete [] in_DECOD_BTB_CONDITION ; 55 delete [] in_DECOD_BTB_LAST_TAKE ; 56 delete [] in_DECOD_RAS_ADDRESS ; 57 delete [] in_DECOD_RAS_INDEX ; 58 delete [] in_DECOD_MISS_PREDICTION ; 59 if (_param->_have_port_depth) 60 delete [] in_DECOD_UPDATE_PREDICTION_ID ; 61 // if (_param->_have_port_depth) 62 // delete [] out_DECOD_DEPTH ; 63 64 // ~~~~~[ Interface : "branch_complete" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 delete [] in_BRANCH_COMPLETE_VAL ; 66 delete [] out_BRANCH_COMPLETE_ACK ; 67 if (_param->_have_port_context_id) 68 delete [] in_BRANCH_COMPLETE_CONTEXT_ID ; 69 if (_param->_have_port_depth) 70 delete [] in_BRANCH_COMPLETE_DEPTH ; 71 delete [] in_BRANCH_COMPLETE_ADDRESS ; 72 delete [] in_BRANCH_COMPLETE_FLAG ; 73 delete [] out_BRANCH_COMPLETE_MISS_PREDICTION; 74 delete [] out_BRANCH_COMPLETE_TAKE ; 75 delete [] out_BRANCH_COMPLETE_ADDRESS_SRC ; 76 delete [] out_BRANCH_COMPLETE_ADDRESS_DEST ; 77 78 // ~~~~~[ Interface : "update" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 delete [] out_UPDATE_VAL ; 80 delete [] in_UPDATE_ACK ; 81 if (_param->_have_port_context_id) 82 delete [] out_UPDATE_CONTEXT_ID ; 83 delete [] out_UPDATE_MISS_PREDICTION ; 84 delete [] out_UPDATE_DIRECTION_GOOD ; 85 delete [] out_UPDATE_BTB_VAL ; 86 delete [] out_UPDATE_BTB_ADDRESS_SRC ; 87 delete [] out_UPDATE_BTB_ADDRESS_DEST ; 88 delete [] out_UPDATE_BTB_CONDITION ; 89 delete [] out_UPDATE_DIR_VAL ; 90 if (_param->_have_port_history) 91 delete [] out_UPDATE_DIR_HISTORY ; 92 delete [] out_UPDATE_RAS_VAL ; 93 delete [] out_UPDATE_RAS_ADDRESS ; 94 delete [] out_UPDATE_RAS_INDEX ; 95 delete [] out_UPDATE_RAS_PREDICTION_IFETCH; 96 97 // ~~~~~[ Interface : "depth" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 98 if (_param->_have_port_depth) 99 { 100 delete [] out_DEPTH_NB_BRANCH; 101 delete [] out_DEPTH_TAIL; 102 } 29 103 } 104 105 // ~~~~~[ Internal ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 delete [] internal_PREDICT_ACK ; 107 delete [] internal_DECOD_ACK ; 108 delete [] internal_BRANCH_COMPLETE_ACK ; 109 delete [] internal_BRANCH_COMPLETE_MISS_PREDICTION ; 110 delete [] internal_BRANCH_COMPLETE_TAKE ; 111 delete [] internal_BRANCH_COMPLETE_ADDRESS_DEST ; 112 delete [] internal_UPDATE_VAL ; 113 delete [] internal_UPDATE_CONTEXT_ID ; 114 delete [] internal_UPDATE_DEPTH ; 115 116 // ~~~~~[ Register ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 delete [] reg_TOP; 118 delete [] reg_BOTTOM; 119 delete [] reg_NB_ELT; 120 delete [] reg_NB_ELT_NEED_UPDATE; 121 for (uint32_t i=0; i<_param->_nb_context; i++) 122 delete [] reg_UPDATE_PREDICTION_TABLE [i]; 123 delete [] reg_UPDATE_PREDICTION_TABLE; 124 30 125 // ~~~~~[ Component ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 31 126 -
Property
svn:keywords
set to
-
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_end_cycle.cpp
-
Property
svn:keywords
set to
Id
-
Property
svn:keywords
set to
-
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_statistics_allocation.cpp
-
Property
svn:keywords
set to
Id
-
Property
svn:keywords
set to
-
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_statistics_deallocation.cpp
-
Property
svn:keywords
set to
Id
-
Property
svn:keywords
set to
-
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_transition.cpp
-
Property
svn:keywords
set to
Id
r78 r81 24 24 log_printf(FUNC,Update_Prediction_Table,FUNCTION,"Begin"); 25 25 26 if (PORT_READ(in_NRESET) == 0) 27 { 28 for (uint32_t i=0; i<_param->_nb_context; i++) 29 { 30 reg_TOP [i] = 0; 31 reg_BOTTOM [i] = 0; 32 reg_NB_ELT [i] = 0; 33 reg_NB_ELT_NEED_UPDATE [i] = 0; 34 for (uint32_t j=0; j<_param->_size_queue[i]; j++) 35 reg_UPDATE_PREDICTION_TABLE [i][j]._state = UPDATE_PREDICTION_STATE_EMPTY; 36 } 37 reg_UPDATE_PRIORITY = 0; 38 } 39 else 40 { 41 // =================================================================== 42 // =====[ PREDICT ]=================================================== 43 // =================================================================== 44 for (uint32_t i=0; i<_param->_nb_inst_predict; i++) 45 if (PORT_READ(in_PREDICT_VAL[i]) and internal_PREDICT_ACK [i]) 46 { 47 Tcontext_t context = (_param->_have_port_context_id)?PORT_READ(in_PREDICT_CONTEXT_ID [i]):0; 48 uint32_t top = reg_TOP [context]; 49 50 log_printf(TRACE,Update_Prediction_Table,FUNCTION,"PREDICT[%d] - Accepted",i); 51 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * context : %d",context); 52 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * top : %d",top); 53 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * nb_elt : %d",reg_NB_ELT[context]); 54 55 reg_UPDATE_PREDICTION_TABLE [context][top]._state = UPDATE_PREDICTION_STATE_WAIT_DECOD; 56 reg_UPDATE_PREDICTION_TABLE [context][top]._ifetch_prediction = true; 57 reg_UPDATE_PREDICTION_TABLE [context][top]._condition = PORT_READ(in_PREDICT_BTB_CONDITION [i]); 58 reg_UPDATE_PREDICTION_TABLE [context][top]._address_src = PORT_READ(in_PREDICT_BTB_ADDRESS_SRC [i]); 59 reg_UPDATE_PREDICTION_TABLE [context][top]._address_dest = PORT_READ(in_PREDICT_BTB_ADDRESS_DEST [i]); 60 reg_UPDATE_PREDICTION_TABLE [context][top]._last_take = PORT_READ(in_PREDICT_BTB_LAST_TAKE [i]); 61 //reg_UPDATE_PREDICTION_TABLE [context][top]._good_take 62 reg_UPDATE_PREDICTION_TABLE [context][top]._history = (_param->_have_port_history)?PORT_READ(in_PREDICT_DIR_HISTORY [i]):0; 63 reg_UPDATE_PREDICTION_TABLE [context][top]._address_ras = PORT_READ(in_PREDICT_RAS_ADDRESS [i]); 64 reg_UPDATE_PREDICTION_TABLE [context][top]._index_ras = PORT_READ(in_PREDICT_RAS_INDEX [i]); 65 66 reg_TOP [context] = (top+1)%_param->_size_queue [context]; 67 reg_NB_ELT [context] ++; 68 } 69 70 // =================================================================== 71 // =====[ DECOD ]===================================================== 72 // =================================================================== 73 for (uint32_t i=0; i<_param->_nb_inst_decod; i++) 74 if (PORT_READ(in_DECOD_VAL[i]) and internal_DECOD_ACK [i]) 75 { 76 Tcontext_t context = (_param->_have_port_context_id)?PORT_READ(in_DECOD_CONTEXT_ID [i]):0; 77 Tcontrol_t miss = PORT_READ(in_DECOD_MISS_PREDICTION [i]); 78 79 log_printf(TRACE,Update_Prediction_Table,FUNCTION,"DECOD[%d] - Accepted",i); 80 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * context : %d",context); 81 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * miss : %d",miss); 82 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * nb_elt : %d",reg_NB_ELT[context]); 83 84 // Test if miss ifetch 85 // miss ifetch = decod a branch and the predict unit have not predict this branch ... gloup :P 86 if (miss) 87 { 88 Tdepth_t depth = (_param->_have_port_depth)?PORT_READ(in_DECOD_UPDATE_PREDICTION_ID [i]):0; 89 Tdepth_t top = reg_TOP [context]; 90 91 reg_UPDATE_PREDICTION_TABLE [context][top]._state = UPDATE_PREDICTION_STATE_WAITEND; 92 reg_UPDATE_PREDICTION_TABLE [context][top]._ifetch_prediction = false; // static prediction 93 reg_UPDATE_PREDICTION_TABLE [context][top]._condition = PORT_READ(in_DECOD_BTB_CONDITION [i]); 94 reg_UPDATE_PREDICTION_TABLE [context][top]._address_src = PORT_READ(in_DECOD_BTB_ADDRESS_SRC [i]); 95 reg_UPDATE_PREDICTION_TABLE [context][top]._address_dest = PORT_READ(in_DECOD_BTB_ADDRESS_DEST [i]); 96 reg_UPDATE_PREDICTION_TABLE [context][top]._last_take = PORT_READ(in_DECOD_BTB_LAST_TAKE [i]); 97 //reg_UPDATE_PREDICTION_TABLE [context][top]._good_take 98 //reg_UPDATE_PREDICTION_TABLE [context][top]._history 99 reg_UPDATE_PREDICTION_TABLE [context][top]._address_ras = PORT_READ(in_DECOD_RAS_ADDRESS [i]); 100 reg_UPDATE_PREDICTION_TABLE [context][top]._index_ras = PORT_READ(in_DECOD_RAS_INDEX [i]); 101 102 // Invalid all previous "ifetch" prediction 103 // (ifetch prediction = prediction make in fetch stage and not again comming in decod stage) 104 uint32_t nb_elt_miss = ((top> depth)?top:(top+_param->_size_queue[context]))-depth; 105 uint32_t nb_elt_need_update = 0; 106 for (uint32_t j=0; j<nb_elt_miss; j++) 107 { 108 uint32_t k=(depth+j)%_param->_size_queue[context]; 109 110 // Ifetch have make a prediction and it's a miss 111 // When ifetch predict : 112 // * btb is not change -> needn't update 113 // * direction is not change -> needn't update 114 // * ras have change -> need update 115 116 Tbranch_condition_t cond = reg_UPDATE_PREDICTION_TABLE [context][k]._condition; 117 if ((cond == BRANCH_CONDITION_NONE_WITH_WRITE_STACK) or 118 (cond == BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK) or 119 (cond == BRANCH_CONDITION_READ_STACK)) 120 { 121 nb_elt_need_update ++; 122 reg_UPDATE_PREDICTION_TABLE [context][k]._state = UPDATE_PREDICTION_STATE_KO; 123 } 124 else 125 { 126 reg_UPDATE_PREDICTION_TABLE [context][k]._state = UPDATE_PREDICTION_STATE_END; 127 } 128 } 129 130 reg_TOP [context] = (depth+1)%_param->_size_queue [context]; 131 reg_NB_ELT_NEED_UPDATE [context] += nb_elt_need_update; 132 reg_NB_ELT [context] ++; 133 } 134 else 135 { 136 // Normal case : branch is previous predicated, change state of branch 137 Tdepth_t depth = (_param->_have_port_depth)?PORT_READ(in_DECOD_UPDATE_PREDICTION_ID [i]):0; 138 139 reg_UPDATE_PREDICTION_TABLE [context][depth]._state = UPDATE_PREDICTION_STATE_WAITEND; 140 } 141 } 142 143 // =================================================================== 144 // =====[ BRANCH_COMPLETE ]=========================================== 145 // =================================================================== 146 for (uint32_t i=0; i<_param->_nb_inst_branch_complete; i++) 147 if (PORT_READ(in_BRANCH_COMPLETE_VAL[i]) and internal_BRANCH_COMPLETE_ACK [i]) 148 { 149 Tcontext_t context = (_param->_have_port_context_id)?PORT_READ(in_BRANCH_COMPLETE_CONTEXT_ID [i]):0; 150 Tdepth_t depth = (_param->_have_port_depth )?PORT_READ(in_BRANCH_COMPLETE_DEPTH [i]):0; 151 152 log_printf(TRACE,Update_Prediction_Table,FUNCTION,"BRANCH_COMPLETE[%d] - Accepted",i); 153 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * context : %d",context); 154 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * depth : %d",depth); 155 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * nb_elt : %d",reg_NB_ELT[context]); 156 157 if (internal_BRANCH_COMPLETE_MISS_PREDICTION [i]) 158 { 159 // Miss case 160 reg_UPDATE_PREDICTION_TABLE [context][depth]._state = UPDATE_PREDICTION_STATE_KO; 161 162 // Another prediction (prediction with depth higer) 163 Tdepth_t top = reg_TOP [context]; 164 uint32_t nb_elt_miss = ((top> depth)?top:(top+_param->_size_queue[context]))-depth; 165 uint32_t nb_elt_need_update = 1; 166 for (uint32_t j=1; j<nb_elt_miss; j++) 167 { 168 uint32_t k=(depth+j)%_param->_size_queue[context]; 169 170 // Ifetch have make a prediction and it's a miss 171 // When ifetch predict : 172 // * btb is not change -> needn't update 173 // * direction is not change -> needn't update 174 // * ras have change -> need update 175 176 Tbranch_condition_t cond = reg_UPDATE_PREDICTION_TABLE [context][k]._condition; 177 if ((cond == BRANCH_CONDITION_NONE_WITH_WRITE_STACK) or 178 (cond == BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK) or 179 (cond == BRANCH_CONDITION_READ_STACK)) 180 { 181 nb_elt_need_update ++; 182 reg_UPDATE_PREDICTION_TABLE [context][k]._state = UPDATE_PREDICTION_STATE_KO; 183 } 184 else 185 { 186 reg_UPDATE_PREDICTION_TABLE [context][k]._state = UPDATE_PREDICTION_STATE_END; 187 } 188 } 189 reg_NB_ELT_NEED_UPDATE [context] += nb_elt_need_update; 190 191 // Update pointer : 192 reg_TOP [context] = depth; 193 reg_NB_ELT [context] -= nb_elt_miss; 194 } 195 else 196 { 197 // Hit case 198 #ifdef DEBUG_TEST 199 if (reg_UPDATE_PREDICTION_TABLE [context][depth]._state != UPDATE_PREDICTION_STATE_WAITEND) 200 ERRORMORPHEO(FUNCTION,"Branche complete : invalid state"); 201 #endif 202 reg_UPDATE_PREDICTION_TABLE [context][depth]._state = UPDATE_PREDICTION_STATE_OK; 203 } 204 205 // In all case : update good_take and address_destination 206 reg_UPDATE_PREDICTION_TABLE [context][depth]._good_take = internal_BRANCH_COMPLETE_TAKE [i]; 207 reg_UPDATE_PREDICTION_TABLE [context][depth]._address_dest = internal_BRANCH_COMPLETE_ADDRESS_DEST [i]; 208 } 209 210 // =================================================================== 211 // =====[ UPDATE ]==================================================== 212 // =================================================================== 213 for (uint32_t i=0; i<_param->_nb_inst_update; i++) 214 if (internal_UPDATE_VAL[i] and PORT_READ(in_UPDATE_ACK [i])) 215 { 216 Tcontext_t context = internal_UPDATE_CONTEXT_ID [i]; 217 Tdepth_t depth = internal_UPDATE_DEPTH [i]; 218 219 log_printf(TRACE,Update_Prediction_Table,FUNCTION,"UPDATE[%d] - Accepted",i); 220 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * context : %d",context); 221 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * depth : %d",depth); 222 223 if (reg_UPDATE_PREDICTION_TABLE [context][depth]._state == UPDATE_PREDICTION_STATE_KO) 224 reg_NB_ELT_NEED_UPDATE [context] --; 225 226 reg_UPDATE_PREDICTION_TABLE [context][depth]._state = UPDATE_PREDICTION_STATE_END; 227 } 228 229 // Round robin 230 reg_UPDATE_PRIORITY = (reg_UPDATE_PRIORITY+1)%_param->_nb_context; 231 232 // =================================================================== 233 // =====[ GARBAGE COLLECTOR ]========================================= 234 // =================================================================== 235 236 for (uint32_t i=0; i<_param->_nb_context; i++) 237 { 238 uint32_t bottom = reg_BOTTOM [i]; 239 240 // Test if the tail of queue is finish (ok or ko and update) 241 if (reg_UPDATE_PREDICTION_TABLE [i][bottom]._state == UPDATE_PREDICTION_STATE_END) 242 { 243 log_printf(TRACE,Update_Prediction_Table,FUNCTION,"GARBAGE_COLLECTOR"); 244 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * context : %d",i); 245 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * bottom : %d",bottom); 246 247 reg_UPDATE_PREDICTION_TABLE [i][bottom]._state = UPDATE_PREDICTION_STATE_EMPTY; 248 reg_BOTTOM [i] = (bottom+1)%_param->_size_queue [i]; 249 if (reg_NB_ELT [i]>0) 250 reg_NB_ELT [i] --; 251 } 252 } 253 } 254 255 // #if (DEBUG >= DEBUG_TRACE) 256 log_printf(TRACE,Update_Prediction_Table,FUNCTION,"Dump Update_Prediction_Table"); 257 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * reg_UPDATE_PRIORITY : %d",reg_UPDATE_PRIORITY); 258 for (uint32_t i=0; i<_param->_nb_context; i++) 259 { 260 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * Update_Prediction_Table [%d]",i); 261 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * reg_TOP : %d",reg_TOP [i]); 262 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * reg_BOTTOM : %d",reg_BOTTOM [i]); 263 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * reg_NB_ELT : %d",reg_NB_ELT [i]); 264 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * reg_NB_ELT_NEED_UPDATE : %d",reg_NB_ELT_NEED_UPDATE [i]); 265 for (uint32_t j=0; j<_param->_size_queue[i]; j++) 266 log_printf(TRACE,Update_Prediction_Table,FUNCTION," [%d] %s %x",j,toString(reg_UPDATE_PREDICTION_TABLE [i][j]._state).c_str(),reg_UPDATE_PREDICTION_TABLE [i][j]._address_src); 267 } 268 // #endif 269 270 26 271 #if defined(STATISTICS) or defined(VHDL_TESTBENCH) 27 272 end_cycle (); -
Property
svn:keywords
set to
-
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_vhdl.cpp
-
Property
svn:keywords
set to
Id
-
Property
svn:keywords
set to
-
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_vhdl_body.cpp
-
Property
svn:keywords
set to
Id
-
Property
svn:keywords
set to
-
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Update_Prediction_Table/src/Update_Prediction_Table_vhdl_declaration.cpp
-
Property
svn:keywords
set to
Id
-
Property
svn:keywords
set to
Note: See TracChangeset
for help on using the changeset viewer.