Changeset 110 for trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Load_Store_pointer_unit/src/Load_Store_pointer_unit_genMealy_insert.cpp
- Timestamp:
- Feb 19, 2009, 5:31:47 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Load_Store_pointer_unit/src/Load_Store_pointer_unit_genMealy_insert.cpp
r81 r110 22 22 void Load_Store_pointer_unit::genMealy_insert (void) 23 23 { 24 log_printf(FUNC,Load_Store_pointer_unit,FUNCTION,"Begin"); 24 log_begin(Load_Store_pointer_unit,FUNCTION); 25 log_function(Load_Store_pointer_unit,FUNCTION,_name.c_str()); 25 26 26 bool use_lsq [_param->_nb_load_store_queue]; 27 // TODO : limité à nb_inst_memory le nombre d'accès par lsq !!! 28 29 uint32_t nb_use_lsq [_param->_nb_load_store_queue]; 30 Tlsq_ptr_t STORE_QUEUE_PTR_WRITE [_param->_nb_load_store_queue]; 31 bool STORE_QUEUE_USE [_param->_nb_load_store_queue][_param->_max_size_store_queue]; 32 Tlsq_ptr_t STORE_QUEUE_NB_USE [_param->_nb_load_store_queue]; 33 Tlsq_ptr_t LOAD_QUEUE_PTR_WRITE [_param->_nb_load_store_queue]; 34 bool LOAD_QUEUE_USE [_param->_nb_load_store_queue][_param->_max_size_load_queue]; 35 27 36 for (uint32_t i=0; i<_param->_nb_load_store_queue; i++) 28 use_lsq [i] = false; 37 { 38 nb_use_lsq [i] = _param->_nb_inst_memory[i]; 39 40 STORE_QUEUE_PTR_WRITE [i] = reg_STORE_QUEUE_PTR_WRITE [i]; 41 STORE_QUEUE_NB_USE [i] = reg_STORE_QUEUE_NB_USE [i]; 42 LOAD_QUEUE_PTR_WRITE [i] = reg_LOAD_QUEUE_PTR_WRITE [i]; 43 44 for (uint32_t j=0; j<_param->_size_store_queue[i]; j++) 45 STORE_QUEUE_USE [i][j] = reg_STORE_QUEUE_USE [i][j]; 46 for (uint32_t j=0; j<_param->_size_load_queue[i]; j++) 47 LOAD_QUEUE_USE [i][j] = reg_LOAD_QUEUE_USE [i][j]; 48 } 29 49 30 50 for (uint32_t i=0; i<_param->_nb_inst_insert; i++) 31 51 { 52 log_printf(TRACE,Load_Store_pointer_unit,FUNCTION," * INSERT [%d]",i); 53 32 54 Tcontrol_t ack = false; 33 Tlsq_ptr_t store_queue_ptr_write = 0;34 Tlsq_ptr_t load_queue_ptr_write = 0;35 55 36 56 if ( (PORT_READ(in_INSERT_VAL [i]) == true ) and 37 57 (PORT_READ(in_INSERT_TYPE [i]) == TYPE_MEMORY)) 38 58 { 59 log_printf(TRACE,Load_Store_pointer_unit,FUNCTION," * type is memory"); 60 39 61 Tcontext_t front_end_id = (_param->_have_port_front_end_id)?PORT_READ(in_INSERT_FRONT_END_ID [i]):0; 40 62 Tcontext_t context_id = (_param->_have_port_context_id )?PORT_READ(in_INSERT_CONTEXT_ID [i]):0; 41 42 63 uint32_t lsq = _param->_link_load_store_unit_with_thread[front_end_id][context_id]; 64 65 log_printf(TRACE,Load_Store_pointer_unit,FUNCTION," * front_end_id : %d",front_end_id); 66 log_printf(TRACE,Load_Store_pointer_unit,FUNCTION," * context_id : %d",context_id ); 67 log_printf(TRACE,Load_Store_pointer_unit,FUNCTION," * lsq : %d",lsq ); 43 68 44 69 // Test if a previous instruction use the same lsq 45 70 // Authorize once memory access by load store unit 46 if ( use_lsq [lsq] == false)71 if (nb_use_lsq [lsq] > 0) 47 72 { 48 use_lsq [lsq] = true;73 nb_use_lsq [lsq] --; 49 74 50 75 uint32_t ptr; 51 52 store_queue_ptr_write = reg_STORE_QUEUE_PTR_WRITE [lsq]; 53 load_queue_ptr_write = reg_LOAD_QUEUE_PTR_WRITE [lsq]; 76 77 PORT_WRITE(out_INSERT_STORE_QUEUE_PTR_WRITE [i], STORE_QUEUE_PTR_WRITE [lsq]); 78 if (_param->_have_port_load_queue_ptr) 79 PORT_WRITE(out_INSERT_LOAD_QUEUE_PTR_WRITE [i], LOAD_QUEUE_PTR_WRITE [lsq]); 80 81 log_printf(TRACE,Load_Store_pointer_unit,FUNCTION," * sq_ptr_write : %d",STORE_QUEUE_PTR_WRITE [lsq]); 82 log_printf(TRACE,Load_Store_pointer_unit,FUNCTION," * lq_ptr_write : %d",LOAD_QUEUE_PTR_WRITE [lsq]); 54 83 55 84 // operation became of decod_stage. Also operation is != store_head_ok and store_head_ko 56 85 if (is_operation_memory_store(PORT_READ(in_INSERT_OPERATION [i]))) 57 86 { 87 log_printf(TRACE,Load_Store_pointer_unit,FUNCTION," * USE_STORE_QUEUE"); 88 58 89 internal_INSERT_OPERATION_USE [i] = OPERATION_USE_STORE_QUEUE; 59 90 60 ptr = reg_STORE_QUEUE_PTR_WRITE [lsq]; 91 ptr = STORE_QUEUE_PTR_WRITE [lsq]; 92 ack = not STORE_QUEUE_USE [lsq][ptr] and (static_cast<uint32_t>(STORE_QUEUE_NB_USE [lsq]+1) < _param->_size_store_queue[lsq]); 61 93 62 ack = not reg_STORE_QUEUE_USE [lsq][ptr] and (static_cast<uint32_t>(reg_STORE_QUEUE_NB_USE [lsq]+1) < _param->_size_store_queue[lsq]); 94 if (ack) 95 { 96 STORE_QUEUE_PTR_WRITE [lsq] = (ptr+1)%_param->_size_store_queue[lsq]; 97 STORE_QUEUE_NB_USE [lsq] ++; 98 STORE_QUEUE_USE [lsq][ptr] = true; 99 } 63 100 } 64 101 else 65 102 { 103 log_printf(TRACE,Load_Store_pointer_unit,FUNCTION," * USE_LOAD_QUEUE"); 104 66 105 internal_INSERT_OPERATION_USE [i] = OPERATION_USE_LOAD_QUEUE; 67 106 68 ptr = reg_LOAD_QUEUE_PTR_WRITE [lsq]; 107 ptr = LOAD_QUEUE_PTR_WRITE [lsq]; 108 ack = (not LOAD_QUEUE_USE [lsq][ptr]); 69 109 70 ack = (not reg_LOAD_QUEUE_USE [lsq][ptr]); 110 if (ack) 111 { 112 LOAD_QUEUE_PTR_WRITE [lsq] = (ptr+1)%_param->_size_load_queue[lsq]; 113 LOAD_QUEUE_USE [lsq][ptr] = true; 114 } 71 115 } 116 117 log_printf(TRACE,Load_Store_pointer_unit,FUNCTION," * ptr : %d",ptr ); 118 log_printf(TRACE,Load_Store_pointer_unit,FUNCTION," * ack : %d",ack ); 72 119 73 120 internal_INSERT_LSQ [i] = lsq; … … 85 132 internal_INSERT_ACK [i] = ack; 86 133 PORT_WRITE(out_INSERT_ACK [i], ack); 87 PORT_WRITE(out_INSERT_STORE_QUEUE_PTR_WRITE [i], store_queue_ptr_write);88 if (_param->_have_port_load_queue_ptr)89 PORT_WRITE(out_INSERT_LOAD_QUEUE_PTR_WRITE [i], load_queue_ptr_write );90 134 } 91 135 92 log_ printf(FUNC,Load_Store_pointer_unit,FUNCTION,"End");136 log_end(Load_Store_pointer_unit,FUNCTION); 93 137 }; 94 138
Note: See TracChangeset
for help on using the changeset viewer.