Ignore:
Timestamp:
Feb 19, 2009, 5:31:47 PM (15 years ago)
Author:
rosiere
Message:

1) OOO_egine : add stat to depiste low perf source
2) Commit : add stat
3) LSU_Pointer : retire - always ack (else combinatory loop). insert - max nb_inst_memory
4) TopLevel? : add debug_idle_time to stop combinatory loop.
5) Issue_queue : add reexecute_queue, new implementation (routage after issue_queue)
6) Decod / Predictor : add "can_continue"

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  
    2222  void Load_Store_pointer_unit::genMealy_insert (void)
    2323  {
    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());
    2526
    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   
    2736    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      }
    2949
    3050    for (uint32_t i=0; i<_param->_nb_inst_insert; i++)
    3151      {
     52        log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"  * INSERT [%d]",i);
     53
    3254        Tcontrol_t ack                   = false;
    33         Tlsq_ptr_t store_queue_ptr_write = 0;
    34         Tlsq_ptr_t load_queue_ptr_write  = 0;
    3555
    3656        if ( (PORT_READ(in_INSERT_VAL  [i]) == true       ) and
    3757             (PORT_READ(in_INSERT_TYPE [i]) == TYPE_MEMORY))
    3858          {
     59            log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"    * type is memory");
     60
    3961            Tcontext_t front_end_id = (_param->_have_port_front_end_id)?PORT_READ(in_INSERT_FRONT_END_ID [i]):0;
    4062            Tcontext_t context_id   = (_param->_have_port_context_id  )?PORT_READ(in_INSERT_CONTEXT_ID   [i]):0;
    41            
    4263            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         );
    4368
    4469            // Test if a previous instruction use the same lsq
    4570            // Authorize once memory access by load store unit
    46             if (use_lsq [lsq] == false)
     71            if (nb_use_lsq [lsq] > 0)
    4772              {
    48                 use_lsq [lsq] = true;
     73                nb_use_lsq [lsq] --;
    4974
    5075                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]);
    5483               
    5584                // operation became of decod_stage. Also operation is != store_head_ok and store_head_ko
    5685                if (is_operation_memory_store(PORT_READ(in_INSERT_OPERATION [i])))
    5786                  {
     87                    log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"    * USE_STORE_QUEUE");
     88               
    5889                    internal_INSERT_OPERATION_USE [i] = OPERATION_USE_STORE_QUEUE;
    5990                   
    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]);
    6193
    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                      }
    63100                  }
    64101                else
    65102                  {
     103                    log_printf(TRACE,Load_Store_pointer_unit,FUNCTION,"    * USE_LOAD_QUEUE");
     104
    66105                    internal_INSERT_OPERATION_USE [i] = OPERATION_USE_LOAD_QUEUE;
    67106                   
    68                     ptr = reg_LOAD_QUEUE_PTR_WRITE [lsq];
     107                    ptr = LOAD_QUEUE_PTR_WRITE [lsq];
     108                    ack = (not LOAD_QUEUE_USE [lsq][ptr]);
    69109
    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                      }
    71115                  }
     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         );
    72119               
    73120                internal_INSERT_LSQ [i] = lsq;
     
    85132        internal_INSERT_ACK [i] = ack;
    86133        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 );
    90134      }
    91135
    92     log_printf(FUNC,Load_Store_pointer_unit,FUNCTION,"End");
     136    log_end(Load_Store_pointer_unit,FUNCTION);
    93137  };
    94138
Note: See TracChangeset for help on using the changeset viewer.