Ignore:
Timestamp:
Feb 27, 2009, 7:37:40 PM (15 years ago)
Author:
rosiere
Message:

1) Decod_queue : multi implementation (one_fifo, multi_fifo)
2) Issue_queue : multi implementation (in_order, out_of_order)
3) Direction : Add Meta predictor
4) Context_State : re add Branch_complete, More priority to Load miss (is not speculative)
5) Return_Address_Stack : update reg_PREDICT pointer on decod miss prediction
6) UPT : Fix bug in multi event
7) Prediction_glue : in read_stack case, insert in UPT pc_next
8) Rename select : when rob have an event (need flush), read_r{a,b,c} and write_r{d,e} is set at 0

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  
    2525    log_function(Decod_queue,FUNCTION,_name.c_str());
    2626
    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) ();
    20728
    20829#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
Note: See TracChangeset for help on using the changeset viewer.