Changeset 88 for 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
- 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/Update_Prediction_Table/src/Update_Prediction_Table_genMealy_branch_complete.cpp
r82 r88 22 22 void Update_Prediction_Table::genMealy_branch_complete (void) 23 23 { 24 log_printf(FUNC,Update_Prediction_Table,FUNCTION,"Begin"); 24 log_begin(Update_Prediction_Table,FUNCTION); 25 log_function(Update_Prediction_Table,FUNCTION,_name.c_str()); 25 26 26 27 for (uint32_t i=0; i<_param->_nb_inst_branch_complete; i++) 28 #ifdef DEBUG_TEST 29 // just to don't have exception in not transaction 30 if (PORT_READ(in_BRANCH_COMPLETE_VAL [i])) 31 #endif 27 32 { 33 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * BRANCH_COMPLETE [%d]",i); 34 28 35 Tcontext_t context = (_param->_have_port_context_id)?PORT_READ(in_BRANCH_COMPLETE_CONTEXT_ID [i]):0; 29 Tdepth_t depth = (_param->_have_port_ max_depth)?PORT_READ(in_BRANCH_COMPLETE_DEPTH [i]):0;36 Tdepth_t depth = (_param->_have_port_depth )?PORT_READ(in_BRANCH_COMPLETE_DEPTH [i]):0; 30 37 Tcontrol_t miss = false; 31 38 Tcontrol_t take = reg_UPDATE_PREDICTION_TABLE [context][depth]._last_take ; 32 39 Taddress_t addr_dest = reg_UPDATE_PREDICTION_TABLE [context][depth]._address_dest; 33 40 Tbranch_condition_t condition = reg_UPDATE_PREDICTION_TABLE [context][depth]._condition ; 41 42 Tcontrol_t flag = PORT_READ(in_BRANCH_COMPLETE_FLAG [i]); 43 Taddress_t addr_good = PORT_READ(in_BRANCH_COMPLETE_ADDRESS [i]); 44 45 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * context : %d",context); 46 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * depth : %d",depth ); 47 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * condition : %s",toString(condition).c_str()); 48 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * flag : %d",flag); 49 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * address_good : %.8x",addr_good); 50 51 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * (before)"); 52 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * miss : %d",miss); 53 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * take : %d",take); 54 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * address_dest : %.8x",addr_dest); 34 55 35 56 switch (condition) … … 39 60 { 40 61 //miss : always hit 41 //addr_dest : know in decod stage 62 //addr_dest : compute in decod stage 63 64 #ifdef DEBUG_TEST 65 if (take != 1) 66 throw ERRORMORPHEO(FUNCTION,toString("Branch_complete[%d] (condition %s) : bad direction.",i,toString(condition).c_str())); 67 if (addr_dest != addr_good) 68 throw ERRORMORPHEO(FUNCTION,toString("Branch_complete[%d] (condition %s) : bad destination address.",i,toString(condition).c_str())); 69 #endif 70 42 71 break; 43 72 } 44 73 case BRANCH_CONDITION_FLAG_UNSET : // l.bnf 45 74 { 46 Tcontrol_t take_good = PORT_READ(in_BRANCH_COMPLETE_FLAG [i]) == 0; 75 //addr_dest : compute in decod stage 76 //miss if the direction is bad 77 Tcontrol_t take_good = not flag; // flag set = not take 78 47 79 miss = (take != take_good); 48 80 take = take_good; 49 //addr_dest : know in decod stage 81 82 #ifdef DEBUG_TEST 83 if (addr_dest != addr_good) 84 throw ERRORMORPHEO(FUNCTION,toString("Branch_complete[%d] (condition %s) : bad destination address.",i,toString(condition).c_str())); 85 #endif 86 50 87 break; 51 88 } 52 89 case BRANCH_CONDITION_FLAG_SET : // l.bf 53 90 { 54 // log_printf(TRACE,Update_Prediction_Table,FUNCTION," * BRANCH_CONDITION_FLAG_SET"); 55 56 Tcontrol_t take_good = PORT_READ(in_BRANCH_COMPLETE_FLAG [i]) == 1; 91 //addr_dest : compute in decod stage 92 //miss if the direction is bad 93 Tcontrol_t take_good = flag; // flag set = take 94 57 95 miss = (take != take_good); 58 96 take = take_good; 59 97 60 // log_printf(TRACE,Update_Prediction_Table,FUNCTION," * flag : %d",PORT_READ(in_BRANCH_COMPLETE_FLAG [i])); 61 // log_printf(TRACE,Update_Prediction_Table,FUNCTION," * take_good : %d",take_good); 62 // log_printf(TRACE,Update_Prediction_Table,FUNCTION," * miss : %d",miss);63 64 //addr_dest : know in decod stage 98 #ifdef DEBUG_TEST 99 if (addr_dest != addr_good) 100 throw ERRORMORPHEO(FUNCTION,toString("Branch_complete[%d] (condition %s) : bad destination address.",i,toString(condition).c_str())); 101 #endif 102 65 103 break; 66 104 } … … 69 107 case BRANCH_CONDITION_READ_STACK : // l.jr (rb==r9) 70 108 { 71 Taddress_t addr_good = PORT_READ(in_BRANCH_COMPLETE_ADDRESS [i]); 72 miss = ((take == 1) and 73 (addr_dest = addr_good)); 74 take = 1; 109 // miss if destination address is bad 110 miss = (addr_dest != addr_good); 75 111 addr_dest = addr_good; 112 113 #ifdef DEBUG_TEST 114 if (take != 1) 115 throw ERRORMORPHEO(FUNCTION,toString("Branch_complete[%d] (condition %s) : bad direction.",i,toString(condition).c_str())); 116 #endif 117 76 118 break; 77 119 } 78 120 } 79 121 80 // log_printf(TRACE,Update_Prediction_Table,FUNCTION," * miss : %d",miss); 81 // log_printf(TRACE,Update_Prediction_Table,FUNCTION," * take : %d",take); 82 // log_printf(TRACE,Update_Prediction_Table,FUNCTION," * address : %x",addr_dest); 83 122 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * (after)"); 123 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * miss : %d",miss); 124 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * take : %d",take); 125 log_printf(TRACE,Update_Prediction_Table,FUNCTION," * address_dest : %.8x",addr_dest); 126 84 127 internal_BRANCH_COMPLETE_MISS_PREDICTION [i] = miss ; 85 128 internal_BRANCH_COMPLETE_TAKE [i] = take ; 86 129 internal_BRANCH_COMPLETE_ADDRESS_DEST [i] = addr_dest; 87 130 88 131 PORT_WRITE(out_BRANCH_COMPLETE_MISS_PREDICTION [i], internal_BRANCH_COMPLETE_MISS_PREDICTION [i]); 89 132 PORT_WRITE(out_BRANCH_COMPLETE_TAKE [i], internal_BRANCH_COMPLETE_TAKE [i]); … … 92 135 } 93 136 94 log_ printf(FUNC,Update_Prediction_Table,FUNCTION,"End");137 log_end(Update_Prediction_Table,FUNCTION); 95 138 }; 96 139
Note: See TracChangeset
for help on using the changeset viewer.