Ignore:
Timestamp:
Jun 3, 2009, 10:15:51 AM (15 years ago)
Author:
rosiere
Message:

Modif for performance :
1) Load Store Unit : store send request to valid exeception
2) Commit_unit : retire can bypass store
3) Commit_unit : add stat to manage store instruction
4) Load Store Unit and Load Store Pointer Manager : add store_queue_ptr_read
5) Fix lot of bug

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_transition.cpp

    r110 r122  
    3838              reg_LOAD_QUEUE_USE  [i][j] = false;
    3939          }
     40        for (uint32_t i=0; i<_param->_nb_front_end; ++i)
     41          for (uint32_t j=0; j<_param->_nb_context[i]; ++j)
     42            {
     43              reg_STORE_QUEUE_PTR_READ  [i][j] = 0;
     44              reg_STORE_QUEUE_EMPTY     [i][j] = true;
     45            }
    4046      }
    4147    else
     
    5662                    log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"    * use STORE_QUEUE");
    5763
     64                    Tcontext_t front_end_id = (_param->_have_port_front_end_id)?PORT_READ(in_INSERT_FRONT_END_ID [i]):0;
     65                    Tcontext_t context_id   = (_param->_have_port_context_id  )?PORT_READ(in_INSERT_CONTEXT_ID   [i]):0;
    5866                    uint32_t   lsq = internal_INSERT_LSQ [i];
    5967                    Tlsq_ptr_t ptr = internal_INSERT_PTR [i];
     
    6270                    log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"    * ptr : %d",ptr);
    6371
     72                    reg_STORE_QUEUE_EMPTY     [front_end_id][context_id] = false; // new element
    6473                    reg_STORE_QUEUE_PTR_WRITE [lsq]      = (ptr+1)%_param->_size_store_queue[lsq];
    6574                    reg_STORE_QUEUE_NB_USE    [lsq]      ++;
     
    109118                    log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"    * lsq : %d",lsq);
    110119                    log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"    * ptr : %d",ptr);
    111                    
     120       
     121                    // TODO : if ROB retire ooo context, can retire store ooo.
     122
    112123//                  reg_STORE_QUEUE_PTR_WRITE [lsq]      = ((ptr==0)?_param->_size_store_queue[lsq]:ptr)-1;
    113124                    reg_STORE_QUEUE_NB_USE    [lsq]      --;
     
    137148                }       
    138149            }
     150       
     151        for (uint32_t i=0; i<_param->_nb_front_end; ++i)
     152          for (uint32_t j=0; j<_param->_nb_context[i]; ++j)
     153            {
     154              uint32_t lsq = _param->_link_load_store_unit_with_thread[i][j];
     155                   
     156              if (PORT_READ(in_RETIRE_EVENT_STATE [i][j]) == EVENT_STATE_NO_EVENT)
     157                {
     158                  uint32_t ptr_old =  reg_STORE_QUEUE_PTR_READ[i][j];
     159                  uint32_t ptr_new = (reg_STORE_QUEUE_PTR_READ[i][j]+1)%_param->_size_store_queue[lsq];
     160
     161                  if ((reg_STORE_QUEUE_USE [lsq][ptr_old] == false) and
     162                      (reg_STORE_QUEUE_EMPTY    [i][j] == false))
     163                    {
     164                      reg_STORE_QUEUE_PTR_READ [i][j] = ptr_new;
     165                      if (ptr_new == reg_STORE_QUEUE_PTR_WRITE [lsq])
     166                      reg_STORE_QUEUE_EMPTY    [i][j] = true;
     167                    }
     168                }
     169             
     170              if (PORT_READ(in_RETIRE_EVENT_VAL[i][j]) and internal_RETIRE_EVENT_ACK [i][j])
     171                if (PORT_READ(in_RETIRE_EVENT_STATE [i][j]) == EVENT_STATE_EVENT)
     172                  {
     173                    log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"  * EVENT [%d][%d]",i,j);
     174
     175                    // reset ptr_read
     176                    reg_STORE_QUEUE_PTR_READ [i][j] = reg_STORE_QUEUE_PTR_WRITE [lsq];
     177                    reg_STORE_QUEUE_EMPTY    [i][j] = true;
     178                  }
     179            }
    139180      }
    140 
     181   
    141182    // ===================================================================
    142183    // =====[ OTHER ]=====================================================
     
    150191        {
    151192          log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"    * Load_Store_unit [%d]",i);
     193          log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"      * reg_LOAD_QUEUE_PTR_WRITE  : %d", reg_LOAD_QUEUE_PTR_WRITE [i]);
     194          log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"      * reg_LOAD_QUEUE_USE        :");
     195          for (uint32_t j=0; j<_param->_size_load_queue [i]; ++j)
     196          log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"        [%d] %d",j,reg_LOAD_QUEUE_USE [i][j]);
    152197          log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"      * reg_STORE_QUEUE_NB_USE    : %d", reg_STORE_QUEUE_NB_USE   [i]);
    153198          log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"      * reg_STORE_QUEUE_PTR_WRITE : %d", reg_STORE_QUEUE_PTR_WRITE[i]);
     
    155200          for (uint32_t j=0; j<_param->_size_store_queue [i]; ++j)
    156201          log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"        [%d] %d",j,reg_STORE_QUEUE_USE [i][j]);
    157           log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"      * reg_LOAD_QUEUE_PTR_WRITE  : %d", reg_LOAD_QUEUE_PTR_WRITE [i]);
    158           log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"      * reg_LOAD_QUEUE_USE        :");
    159           for (uint32_t j=0; j<_param->_size_load_queue [i]; ++j)
    160           log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"        [%d] %d",j,reg_LOAD_QUEUE_USE [i][j]);
    161202        }
     203      for (uint32_t i=0; i<_param->_nb_front_end; ++i)
     204        for (uint32_t j=0; j<_param->_nb_context[i]; ++j)
     205          {
     206          log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"      * reg_STORE_QUEUE_PTR_READ [%d][%d] : %d",i,j,reg_STORE_QUEUE_PTR_READ [i][j]);
     207          log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"      * reg_STORE_QUEUE_EMPTY    [%d][%d] : %d",i,j,reg_STORE_QUEUE_EMPTY    [i][j]);
     208          }
    162209    }
    163210#endif
Note: See TracChangeset for help on using the changeset viewer.