Changeset 111 for trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Ifetch_unit/Address_management/src/Address_management_transition.cpp
- Timestamp:
- Feb 27, 2009, 7:37:40 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Ifetch_unit/Address_management/src/Address_management_transition.cpp
r107 r111 53 53 if (PORT_READ(in_PREDICT_ACK) and internal_PREDICT_VAL) 54 54 { 55 log_printf(TRACE,Address_management,FUNCTION," * PREDICT"); 56 55 57 bool branch_is_current = reg_PC_NEXT_IS_DS_TAKE; 56 58 if (branch_is_current) … … 90 92 if (internal_ADDRESS_VAL and PORT_READ(in_ADDRESS_ACK)) 91 93 { 94 92 95 reg_PC_ACCESS_VAL = 0; 93 96 #ifdef STATISTICS … … 102 105 #endif 103 106 } 107 108 // ========================================= 109 // ===== Shift Register ==================== 110 // ========================================= 104 111 105 112 // Shift register 106 107 if (not reg_PC_ACCESS_VAL and reg_PC_CURRENT_VAL and reg_PC_NEXT_VAL and reg_PC_NEXT_NEXT_VAL) 108 { 113 if (reg_PC_NEXT_NEXT_VAL and reg_PC_NEXT_VAL and reg_PC_CURRENT_VAL and not reg_PC_ACCESS_VAL) 114 { 115 log_printf(TRACE,Address_management,FUNCTION," * New PC_ACCESS"); 116 109 117 reg_PC_ACCESS_VAL = 1; // new request 110 118 reg_PC_CURRENT_VAL = 0; // invalid current … … 120 128 } 121 129 122 if (not reg_PC_CURRENT_VAL) 123 { 124 bool val = reg_PC_NEXT_VAL; 125 reg_PC_CURRENT_VAL = val; // new PC_CURRENT if PC_NEXT is valid 126 reg_PC_NEXT_VAL = 0; // invalid next 127 128 if (val) 129 { 130 reg_PC_CURRENT = reg_PC_NEXT ; 131 reg_PC_CURRENT_IS_DS_TAKE = reg_PC_NEXT_IS_DS_TAKE ; 132 reg_PC_CURRENT_INST_IFETCH_PTR = reg_PC_NEXT_INST_IFETCH_PTR ; 133 reg_PC_CURRENT_BRANCH_STATE = reg_PC_NEXT_BRANCH_STATE ; 134 reg_PC_CURRENT_BRANCH_UPDATE_PREDICTION_ID = reg_PC_NEXT_BRANCH_UPDATE_PREDICTION_ID; 135 136 for (uint32_t i=0; i<_param->_nb_instruction; i++) 137 reg_PC_CURRENT_INSTRUCTION_ENABLE [i] = reg_PC_NEXT_INSTRUCTION_ENABLE [i]; 138 } 139 } 140 141 if (not reg_PC_NEXT_VAL) 142 { 143 bool val = reg_PC_NEXT_NEXT_VAL; 144 reg_PC_NEXT_VAL = val; // new PC_NEXT if PC_NEXT_NEXT is valid 145 reg_PC_NEXT_NEXT_VAL = 0; // invalid next_next 146 147 if (val) 148 { 149 reg_PC_NEXT = reg_PC_NEXT_NEXT ; 150 reg_PC_NEXT_IS_DS_TAKE = reg_PC_NEXT_NEXT_IS_DS_TAKE ; 151 // reg_PC_NEXT_INST_IFETCH_PTR = reg_PC_NEXT_NEXT_INST_IFETCH_PTR ; 152 // reg_PC_NEXT_BRANCH_STATE = reg_PC_NEXT_NEXT_BRANCH_STATE ; 153 // reg_PC_NEXT_BRANCH_UPDATE_PREDICTION_ID = reg_PC_NEXT_NEXT_BRANCH_UPDATE_PREDICTION_ID; 154 155 // for (uint32_t i=0; i<_param->_nb_instruction; i++) 156 // reg_PC_NEXT_INSTRUCTION_ENABLE [i] = reg_PC_NEXT_NEXT_INSTRUCTION_ENABLE [i]; 157 } 130 // if (not reg_PC_CURRENT_VAL and reg_PC_NEXT_VAL) 131 if (reg_PC_NEXT_NEXT_VAL and reg_PC_NEXT_VAL and not reg_PC_CURRENT_VAL) 132 { 133 log_printf(TRACE,Address_management,FUNCTION," * New PC_CURRENT"); 134 135 reg_PC_CURRENT_VAL = 1; // new PC_CURRENT if PC_NEXT is valid 136 reg_PC_NEXT_VAL = 0; // invalid next 137 138 reg_PC_CURRENT = reg_PC_NEXT ; 139 reg_PC_CURRENT_IS_DS_TAKE = reg_PC_NEXT_IS_DS_TAKE ; 140 reg_PC_CURRENT_INST_IFETCH_PTR = reg_PC_NEXT_INST_IFETCH_PTR ; 141 reg_PC_CURRENT_BRANCH_STATE = reg_PC_NEXT_BRANCH_STATE ; 142 reg_PC_CURRENT_BRANCH_UPDATE_PREDICTION_ID = reg_PC_NEXT_BRANCH_UPDATE_PREDICTION_ID; 143 144 for (uint32_t i=0; i<_param->_nb_instruction; i++) 145 reg_PC_CURRENT_INSTRUCTION_ENABLE [i] = reg_PC_NEXT_INSTRUCTION_ENABLE [i]; 146 } 147 148 // if (not reg_PC_NEXT_VAL and reg_PC_NEXT_NEXT_VAL) 149 if (reg_PC_NEXT_NEXT_VAL and not reg_PC_NEXT_VAL) 150 { 151 log_printf(TRACE,Address_management,FUNCTION," * New PC_NEXT"); 152 153 reg_PC_NEXT_VAL = 1; // new PC_NEXT if PC_NEXT_NEXT is valid 154 reg_PC_NEXT_NEXT_VAL = 0; // invalid next_next 155 156 reg_PC_NEXT = reg_PC_NEXT_NEXT ; 157 reg_PC_NEXT_IS_DS_TAKE = reg_PC_NEXT_NEXT_IS_DS_TAKE ; 158 // reg_PC_NEXT_INST_IFETCH_PTR = reg_PC_NEXT_NEXT_INST_IFETCH_PTR ; 159 // reg_PC_NEXT_BRANCH_STATE = reg_PC_NEXT_NEXT_BRANCH_STATE ; 160 // reg_PC_NEXT_BRANCH_UPDATE_PREDICTION_ID = reg_PC_NEXT_NEXT_BRANCH_UPDATE_PREDICTION_ID; 161 162 // for (uint32_t i=0; i<_param->_nb_instruction; i++) 163 // reg_PC_NEXT_INSTRUCTION_ENABLE [i] = reg_PC_NEXT_NEXT_INSTRUCTION_ENABLE [i]; 158 164 } 159 165 … … 161 167 // ===== EVENT ============================= 162 168 // ========================================= 169 170 // Event is after shift register : because, it's to write in pc_next and in not pc_current 171 163 172 if (PORT_READ(in_EVENT_VAL) and internal_EVENT_ACK) 164 173 {
Note: See TracChangeset
for help on using the changeset viewer.