Changeset 111 for trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Decod_unit/Decod_queue/src/Decod_queue_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/Decod_unit/Decod_queue/src/Decod_queue_transition.cpp
r110 r111 25 25 log_function(Decod_queue,FUNCTION,_name.c_str()); 26 26 27 if (PORT_READ(in_NRESET) == 0) 28 { 29 reg_QUEUE->clear(); 30 31 for (uint32_t i=0; i<_param->_nb_context; i++) 32 reg_NB_INST [i]=0; 33 34 reg_LAST_SLOT = 0; 35 } 36 else 37 { 38 //-------------------------------------------------------------------- 39 //-----[ DECOD_IN ]--------------------------------------------------- 40 //-------------------------------------------------------------------- 41 decod_queue_entry_t * entry = NULL; 42 for (uint32_t i=0; i<_param->_nb_inst_decod; i++) 43 { 44 if (PORT_READ(in_DECOD_IN_VAL [i]) and internal_DECOD_IN_ACK[i]) 45 { 46 log_printf(TRACE,Decod_queue,FUNCTION,_(" * DECOD_IN [%d]"),i); 47 48 if (entry == NULL) 49 { 50 // Once creation and insert in queue 51 entry = new decod_queue_entry_t (_param->_nb_inst_decod); 52 reg_QUEUE->push_back(entry); 53 54 #ifdef STATISTICS 55 if (usage_is_set(_usage,USE_STATISTICS)) 56 (*_stat_sum_transaction_decod_in) ++; 57 #endif 58 } 59 60 #ifdef STATISTICS 61 if (usage_is_set(_usage,USE_STATISTICS)) 62 (*_stat_sum_inst_enable) ++; 63 #endif 64 65 Tcontext_t context = (_param->_have_port_context_id)?PORT_READ(in_DECOD_IN_CONTEXT_ID [i]):0; 66 67 log_printf(TRACE,Decod_queue,FUNCTION,_(" * context : %d"),context); 68 69 entry->_val [i] = 1; 70 entry->_context_id [i] = context; 71 entry->_depth [i] = (_param->_have_port_depth)?PORT_READ(in_DECOD_IN_DEPTH [i]):0; 72 entry->_type [i] = PORT_READ(in_DECOD_IN_TYPE [i]); 73 entry->_operation [i] = PORT_READ(in_DECOD_IN_OPERATION [i]); 74 entry->_no_execute [i] = PORT_READ(in_DECOD_IN_NO_EXECUTE [i]); 75 entry->_is_delay_slot [i] = PORT_READ(in_DECOD_IN_IS_DELAY_SLOT [i]); 76 #ifdef DEBUG 77 entry->_address [i] = PORT_READ(in_DECOD_IN_ADDRESS [i]); 78 #endif 79 entry->_address_next [i] = PORT_READ(in_DECOD_IN_ADDRESS_NEXT [i]); 80 entry->_has_immediat [i] = PORT_READ(in_DECOD_IN_HAS_IMMEDIAT [i]); 81 entry->_immediat [i] = PORT_READ(in_DECOD_IN_IMMEDIAT [i]); 82 entry->_read_ra [i] = PORT_READ(in_DECOD_IN_READ_RA [i]); 83 entry->_num_reg_ra [i] = PORT_READ(in_DECOD_IN_NUM_REG_RA [i]); 84 entry->_read_rb [i] = PORT_READ(in_DECOD_IN_READ_RB [i]); 85 entry->_num_reg_rb [i] = PORT_READ(in_DECOD_IN_NUM_REG_RB [i]); 86 entry->_read_rc [i] = PORT_READ(in_DECOD_IN_READ_RC [i]); 87 entry->_num_reg_rc [i] = PORT_READ(in_DECOD_IN_NUM_REG_RC [i]); 88 entry->_write_rd [i] = PORT_READ(in_DECOD_IN_WRITE_RD [i]); 89 entry->_num_reg_rd [i] = PORT_READ(in_DECOD_IN_NUM_REG_RD [i]); 90 entry->_write_re [i] = PORT_READ(in_DECOD_IN_WRITE_RE [i]); 91 entry->_num_reg_re [i] = PORT_READ(in_DECOD_IN_NUM_REG_RE [i]); 92 entry->_exception_use [i] = PORT_READ(in_DECOD_IN_EXCEPTION_USE [i]); 93 entry->_exception [i] = PORT_READ(in_DECOD_IN_EXCEPTION [i]); 94 95 reg_NB_INST [context] ++; 96 97 log_printf(TRACE,Decod_queue,FUNCTION,_(" * nb_inst : %d"),reg_NB_INST [context]); 98 log_printf(TRACE,Decod_queue,FUNCTION,_(" * PUSH queue")); 99 } 100 } 101 102 //-------------------------------------------------------------------- 103 //-----[ DECOD_OUT ]-------------------------------------------------- 104 //-------------------------------------------------------------------- 105 if (not reg_QUEUE->empty()) 106 { 107 bool find = false; 108 109 for (uint32_t i=0; i<_param->_nb_inst_decod; i++) 110 { 111 // Test transaction : if ok then invalid slot 112 // In order by rename logic 113 if (internal_DECOD_OUT_VAL [i] and internal_DECOD_OUT_ACK[i]) 114 { 115 log_printf(TRACE,Decod_queue,FUNCTION,_(" * DECOD_OUT [%d]"),i); 116 117 #ifdef DEBUG_TEST 118 if (reg_LAST_SLOT != i) 119 throw ERRORMORPHEO(FUNCTION,toString(_("reg_LAST_SLOT (%d) is different at decod_out port (%d)."),reg_LAST_SLOT,i)); 120 #endif 121 reg_LAST_SLOT ++; 122 123 reg_QUEUE->front()->_val [i] = 0; 124 125 Tcontext_t context = reg_QUEUE->front()->_context_id [i]; 126 log_printf(TRACE,Decod_queue,FUNCTION,_(" * context : %d"),context); 127 128 reg_NB_INST [context] --; 129 log_printf(TRACE,Decod_queue,FUNCTION,_(" * nb_inst : %d"),reg_NB_INST [context]); 130 } 131 // Test if slot is (again) valid, if yes, then have less one instruction in the entry 132 find |= reg_QUEUE->front()->_val [i]; 133 } 134 135 // test if can free the entry : test if have consume all entry 136 if (not find) // no valid instruction in current slot 137 { 138 log_printf(TRACE,Decod_queue,FUNCTION,_(" * POP queue")); 139 140 // can pop the slot 141 delete reg_QUEUE->front(); 142 reg_QUEUE->pop_front(); 143 144 reg_LAST_SLOT = 0; 145 } 146 } 147 } 148 149 #if defined(DEBUG) and defined(DEBUG_Decod_queue) and (DEBUG >= DEBUG_TRACE) 150 log_printf(TRACE,Decod_queue,FUNCTION," * Dump decod_queue"); 151 log_printf(TRACE,Decod_queue,FUNCTION," * reg_LAST_SLOT : %d",reg_LAST_SLOT); 152 uint32_t x=0; 153 for (std::list<decod_queue_entry_t*>::iterator it=reg_QUEUE->begin(); 154 it!=reg_QUEUE->end(); 155 it++) 156 { 157 for (uint32_t i=0; i<_param->_nb_inst_decod; i++) 158 { 159 if ((*it)->_val [i]) 160 log_printf(TRACE,Decod_queue,FUNCTION," * [%.4d][%.4d] %.1d, %.3d %.2d, %.2d %.3d %.1d %.1d, 0x%.8x (0x%.8x), %.1d 0x%.8x, %.1d %.2d, %.1d %.2d, %.1d %.2d, %.1d %.2d, %.1d %.2d, %.1d %.2d" 161 ,x 162 ,i 163 ,(*it)->_val [i] 164 ,(*it)->_context_id [i] 165 ,(*it)->_depth [i] 166 ,(*it)->_type [i] 167 ,(*it)->_operation [i] 168 ,(*it)->_no_execute [i] 169 ,(*it)->_is_delay_slot [i] 170 ,(*it)->_address [i] 171 ,(*it)->_address [i]<<2 172 ,(*it)->_has_immediat [i] 173 ,(*it)->_immediat [i] 174 ,(*it)->_read_ra [i] 175 ,(*it)->_num_reg_ra [i] 176 ,(*it)->_read_rb [i] 177 ,(*it)->_num_reg_rb [i] 178 ,(*it)->_read_rc [i] 179 ,(*it)->_num_reg_rc [i] 180 ,(*it)->_write_rd [i] 181 ,(*it)->_num_reg_rd [i] 182 ,(*it)->_write_re [i] 183 ,(*it)->_num_reg_re [i] 184 ,(*it)->_exception_use [i] 185 ,(*it)->_exception [i] 186 ); 187 else 188 log_printf(TRACE,Decod_queue,FUNCTION," * [%.4d][%.4d] %d" 189 ,x 190 ,i 191 ,(*it)->_val [i] 192 ); 193 194 } 195 x++; 196 } 197 #endif 198 199 #ifdef STATISTICS 200 if (usage_is_set(_usage,USE_STATISTICS)) 201 { 202 *(_stat_use_queue) += reg_QUEUE->size(); 203 for (uint32_t i=0; i<_param->_nb_context; i++) 204 *(_stat_nb_inst [i]) += reg_NB_INST [i]; 205 } 206 #endif 27 (this->*function_transition) (); 207 28 208 29 #if defined(STATISTICS) or defined(VHDL_TESTBENCH)
Note: See TracChangeset
for help on using the changeset viewer.