Changeset 88 for trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Prediction_unit_Glue/src/Prediction_unit_Glue_genMealy_decod.cpp
- Timestamp:
- Dec 10, 2008, 7:31:39 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Prediction_unit/Prediction_unit_Glue/src/Prediction_unit_Glue_genMealy_decod.cpp
r82 r88 22 22 void Prediction_unit_Glue::genMealy_decod (void) 23 23 { 24 log_printf(FUNC,Prediction_unit_Glue,FUNCTION,"Begin"); 25 24 log_begin(Prediction_unit_Glue,FUNCTION); 25 log_function(Prediction_unit_Glue,FUNCTION,_name.c_str()); 26 27 // Init 26 28 uint32_t decod_unit = reg_DECOD_PRIORITY; 27 29 28 30 log_printf(TRACE,Prediction_unit_Glue,FUNCTION," * decod_unit : %d",decod_unit); 29 31 … … 49 51 if ((port>=_param->_nb_inst_branch_decod) or 50 52 (PORT_READ(in_DECOD_VAL [decod_unit][i]) == 0)) 51 {53 { 52 54 log_printf(TRACE,Prediction_unit_Glue,FUNCTION," * DECOD[%d][%d] : not valid",decod_unit,i); 53 55 ack [i] = false; … … 55 57 else 56 58 { 57 Tcontext_t context = (_param->_have_port_context_id)?PORT_READ(in_DECOD_CONTEXT_ID [decod_unit][i]):0; 58 Tbranch_state_t branch_state = PORT_READ(in_DECOD_BRANCH_STATE [decod_unit][i]); 59 Tcontrol_t match_inst_ifetch_ptr = PORT_READ(in_DECOD_MATCH_INST_IFETCH_PTR [decod_unit][i]); 60 Tprediction_ptr_t depth = (_param->_have_port_max_depth)?PORT_READ(in_DECOD_BRANCH_UPDATE_PREDICTION_ID [decod_unit][i]):0; 61 Tcontrol_t use_btb = false; 62 Tcontrol_t use_ras = false; 63 Tcontrol_t use_upt = true ; 64 Tcontrol_t miss_ifetch = ( (branch_state == BRANCH_STATE_NONE) or // branch not detected 65 ((branch_state != BRANCH_STATE_NONE) and (match_inst_ifetch_ptr == 0))); // branch detected, but it's not the good 66 Tcontrol_t miss_decod; 59 Tcontext_t context = (_param->_have_port_context_id)?PORT_READ(in_DECOD_CONTEXT_ID [decod_unit][i]):0; 60 Tbranch_state_t branch_state = PORT_READ(in_DECOD_BRANCH_STATE [decod_unit][i]); 61 Tcontrol_t match_inst_ifetch_ptr = PORT_READ(in_DECOD_MATCH_INST_IFETCH_PTR [decod_unit][i]); 62 Tprediction_ptr_t depth = (_param->_have_port_depth)?PORT_READ(in_DECOD_BRANCH_UPDATE_PREDICTION_ID [decod_unit][i]):0; 63 Tcontrol_t use_btb = false; 64 Tcontrol_t use_ras = false; 65 Tcontrol_t use_upt = true ; // always update upt. 66 67 // Ifetch stage made an miss if : 68 // * branch is previously predict, but it's not the good 69 Tcontrol_t miss_ifetch = ((branch_state != BRANCH_STATE_NONE) and (match_inst_ifetch_ptr == 0)); 70 // Decod stage made an miss if : 71 // * branch was not detected 72 Tcontrol_t miss_decod = (branch_state == BRANCH_STATE_NONE); 67 73 68 74 log_printf(TRACE,Prediction_unit_Glue,FUNCTION," * DECOD[%d][%d] : valid",decod_unit,i); 69 log_printf(TRACE,Prediction_unit_Glue,FUNCTION," * depth [%d] : %d",i ,depth); 75 log_printf(TRACE,Prediction_unit_Glue,FUNCTION," * branch_state : %d",branch_state); 76 log_printf(TRACE,Prediction_unit_Glue,FUNCTION," * match_inst_ifetch_ptr : %d",match_inst_ifetch_ptr); 77 log_printf(TRACE,Prediction_unit_Glue,FUNCTION," * depth : [%d] %d",i,depth); 78 log_printf(TRACE,Prediction_unit_Glue,FUNCTION," * miss_ifetch : %d",miss_ifetch); 79 log_printf(TRACE,Prediction_unit_Glue,FUNCTION," * miss_decod : %d",miss_decod); 70 80 71 81 // Test if ifetch have detecte a branch is the packet 72 if (miss_ifetch )82 if (miss_ifetch or miss_decod) 73 83 { 74 log_printf(TRACE,Prediction_unit_Glue,FUNCTION," * miss_ifetch"); 75 log_printf(TRACE,Prediction_unit_Glue,FUNCTION," * state : %d",branch_state); 76 log_printf(TRACE,Prediction_unit_Glue,FUNCTION," * match : %d",match_inst_ifetch_ptr); 77 Tbranch_condition_t condition = PORT_READ(in_DECOD_BRANCH_CONDITION [decod_unit][i]); 78 Tcontrol_t direction = PORT_READ(in_DECOD_BRANCH_DIRECTION [decod_unit][i]); 79 Taddress_t address_src = PORT_READ(in_DECOD_ADDRESS_SRC [decod_unit][i]); 80 Taddress_t address_dest = PORT_READ(in_DECOD_ADDRESS_DEST [decod_unit][i]); 84 Tbranch_condition_t condition = PORT_READ(in_DECOD_BRANCH_CONDITION [decod_unit][i]); 85 Tcontrol_t direction = PORT_READ(in_DECOD_BRANCH_DIRECTION [decod_unit][i]); 86 Taddress_t address_src = PORT_READ(in_DECOD_ADDRESS_SRC [decod_unit][i]); 87 Taddress_t address_dest = PORT_READ(in_DECOD_ADDRESS_DEST [decod_unit][i]); 81 88 Tcontrol_t is_accurate; 82 89 … … 88 95 case BRANCH_CONDITION_NONE_WITH_WRITE_STACK : 89 96 { 90 // Write stack 97 // l.jal 98 log_printf(TRACE,Prediction_unit_Glue,FUNCTION," * BRANCH_CONDITION_NONE_WITH_WRITE_STACK"); 99 100 is_accurate = true ;//PORT_READ(in_DECOD_RAS_HIT [port]); 101 use_ras = true ; 102 103 PORT_WRITE(out_DECOD_RAS_PUSH [port],1); 104 PORT_WRITE(out_DECOD_RAS_ADDRESS_PUSH [port],address_src+2); 105 106 break; 107 } 108 109 case BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK : 110 { 111 // l.jalr 112 log_printf(TRACE,Prediction_unit_Glue,FUNCTION," * BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK"); 113 114 is_accurate = false; // address unknow : in a register 115 use_ras = true; 116 117 PORT_WRITE(out_DECOD_RAS_PUSH [port],1); 118 PORT_WRITE(out_DECOD_RAS_ADDRESS_PUSH [port],address_src+2); 119 120 break; 121 } 122 case BRANCH_CONDITION_READ_STACK : 123 { 124 // l.jr with rb=r9 125 log_printf(TRACE,Prediction_unit_Glue,FUNCTION," * BRANCH_CONDITION_READ_STACK"); 126 91 127 is_accurate = PORT_READ(in_DECOD_RAS_HIT [port]); 92 miss_decod = false;93 128 use_ras = true; 94 129 95 PORT_WRITE(out_DECOD_RAS_PUSH [port],1); 96 PORT_WRITE(out_DECOD_RAS_ADDRESS_PUSH [port],address_dest); 97 98 break; 99 } 100 101 case BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK : 102 { 103 // Write stack 104 is_accurate = false; 105 miss_decod = false; 106 use_ras = true; 107 108 PORT_WRITE(out_DECOD_RAS_PUSH [port],1); 109 PORT_WRITE(out_DECOD_RAS_ADDRESS_PUSH [port],address_dest); 110 111 break; 112 } 113 case BRANCH_CONDITION_READ_STACK : 114 { 115 // Read stack 116 is_accurate = PORT_READ(in_DECOD_RAS_HIT [port]); 117 miss_decod = false; 118 use_ras = true; 119 120 PORT_WRITE(out_DECOD_RAS_PUSH [port],0); 130 PORT_WRITE(out_DECOD_RAS_PUSH [port],0); // POP 121 131 address_dest = PORT_READ(in_DECOD_RAS_ADDRESS_POP [port]); 122 132 … … 125 135 case BRANCH_CONDITION_READ_REGISTER_WITHOUT_WRITE_STACK : 126 136 { 137 // l.jr with rb!=r9 138 log_printf(TRACE,Prediction_unit_Glue,FUNCTION," * BRANCH_CONDITION_READ_REGISTER_WITHOUT_WRITE_STACK"); 139 127 140 // * READ_REGISTER_WITHOUT_WRITE_STACK : Take but destination is unknow - don't continue 128 is_accurate = PORT_READ(in_DECOD_RAS_HIT [port]); 129 miss_decod = true; 141 is_accurate = false; // address unknow : in a register 130 142 131 143 break; … … 135 147 case BRANCH_CONDITION_FLAG_SET : 136 148 { 137 // No access at the flag149 // l.bf, l.bnf 138 150 // * FLAG : static direction and destination is know 139 is_accurate = PORT_READ(in_DECOD_RAS_HIT [port]); 140 miss_decod = false; 151 log_printf(TRACE,Prediction_unit_Glue,FUNCTION," * BRANCH_CONDITION_FLAG"); 152 153 is_accurate = true; // address dest is know 141 154 142 155 break; … … 145 158 case BRANCH_CONDITION_NONE_WITHOUT_WRITE_STACK : 146 159 { 147 // No access at the flag 148 // * NONE_WITHOUT_WRITE_STACK : take and destination is know 149 is_accurate = false; 150 miss_decod = false; 151 use_ras = true; 152 153 PORT_WRITE(out_DECOD_RAS_PUSH [port],1); 154 PORT_WRITE(out_DECOD_RAS_ADDRESS_PUSH [port],address_dest); 155 156 break; 157 } 158 160 // l.j 161 log_printf(TRACE,Prediction_unit_Glue,FUNCTION," * BRANCH_CONDITION_NONE_WITHOUT_WRITE_STACK"); 162 163 is_accurate = true; 164 165 break; 166 } 159 167 } 160 168 … … 180 188 if (use_upt) 181 189 { 182 PORT_WRITE(out_DECOD_UPT_BTB_ADDRESS_SRC [port],address_src); 183 PORT_WRITE(out_DECOD_UPT_BTB_ADDRESS_DEST [port],address_dest); 184 PORT_WRITE(out_DECOD_UPT_BTB_CONDITION [port],condition); 185 PORT_WRITE(out_DECOD_UPT_BTB_LAST_TAKE [port],direction); 186 PORT_WRITE(out_DECOD_UPT_RAS_ADDRESS [port],PORT_READ(in_DECOD_RAS_ADDRESS_POP [port])); 190 PORT_WRITE(out_DECOD_UPT_BTB_ADDRESS_SRC [port],address_src); 191 PORT_WRITE(out_DECOD_UPT_BTB_ADDRESS_DEST[port],address_dest); 192 PORT_WRITE(out_DECOD_UPT_BTB_CONDITION [port],condition); 193 PORT_WRITE(out_DECOD_UPT_BTB_LAST_TAKE [port],direction); 194 PORT_WRITE(out_DECOD_UPT_RAS_ADDRESS [port],PORT_READ(in_DECOD_RAS_ADDRESS_POP [port])); 195 PORT_WRITE(out_DECOD_UPT_IS_ACCURATE [port],is_accurate); 187 196 } 188 197 } 189 else 190 { 191 log_printf(TRACE,Prediction_unit_Glue,FUNCTION," * hit"); 192 193 miss_decod = false; 194 // Hit speculation 195 } 196 198 // else 199 // { 200 // log_printf(TRACE,Prediction_unit_Glue,FUNCTION," * hit"); 201 202 // miss_decod = false; 203 // // Hit speculation 204 // } 205 206 197 207 // in all case 198 208 log_printf(TRACE,Prediction_unit_Glue,FUNCTION," * use_btb : %d",use_btb); … … 231 241 PORT_WRITE(out_DECOD_UPT_MISS_IFETCH [port],miss_ifetch); 232 242 PORT_WRITE(out_DECOD_UPT_MISS_DECOD [port],miss_decod ); 233 if (_param->_have_port_ max_depth)243 if (_param->_have_port_depth) 234 244 PORT_WRITE(out_DECOD_UPT_UPDATE_PREDICTION_ID [port],depth); 235 245 … … 237 247 } 238 248 249 // Write output 250 239 251 for (uint32_t i=0; i<_param->_nb_inst_branch_decod; i++) 240 252 { … … 251 263 PORT_WRITE(out_DECOD_ACK [i][j], ack[j]); 252 264 253 log_ printf(FUNC,Prediction_unit_Glue,FUNCTION,"End");265 log_end(Prediction_unit_Glue,FUNCTION); 254 266 }; 255 267
Note: See TracChangeset
for help on using the changeset viewer.