Ignore:
Timestamp:
Feb 12, 2009, 12:55:06 PM (15 years ago)
Author:
rosiere
Message:

1) decod_queue : add reg_LAST_SLOT.
2) Commit : insert on event -> to pop decod_queue. Head test : add information (speculative or not)
3) Context State / UPT : Branch miss and Load miss in same cycle.
4) Free List : Bank is on LSB not MSB.
5) Platforms : move data

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

    r106 r108  
    3535    if (not reg_QUEUE->empty())
    3636      for (uint32_t i=0; i<_param->_nb_inst_decod; i++)
    37         if (reg_QUEUE->front()->_val [i])
    38           {
    39             log_printf(TRACE,Decod_queue,FUNCTION,_("  * Queue is not empty, slot [%d] is valid."),i);
     37        {
     38          uint32_t index = reg_LAST_SLOT + i;
    4039
    41             Tcontext_t context         = reg_QUEUE->front()->_context_id    [i];
    42             Tdepth_t   depth           = reg_QUEUE->front()->_depth         [i];
    43             Tdepth_t   depth_min       = (_param->_have_port_depth)?PORT_READ(in_DEPTH_MIN [context]):0;
    44             Tdepth_t   depth_max       = (_param->_have_port_depth)?PORT_READ(in_DEPTH_MAX [context]):0;
    45             Tcontrol_t depth_full      = PORT_READ(in_DEPTH_FULL[context]);
     40          // Stop
     41          if (index >= _param->_nb_inst_decod)
     42            break;
    4643
    47             // is a valid instruction ?
    48             // If DEPTH_CURRENT :
    49             // equal at     DEPTH_MIN            -> not speculative
    50             // not include ]DEPTH_MIN:DEPTH_MAX] -> previous branch miss
    51             //     include ]DEPTH_MIN:DEPTH_MAX] -> speculative
     44          if (reg_QUEUE->front()->_val [index])
     45            {
     46              log_printf(TRACE,Decod_queue,FUNCTION,_("  * Queue is not empty, slot [%d] is valid."),i);
     47             
     48              Tcontext_t context         = reg_QUEUE->front()->_context_id    [index];
     49              Tdepth_t   depth           = reg_QUEUE->front()->_depth         [index];
     50              Tdepth_t   depth_min       = (_param->_have_port_depth)?PORT_READ(in_DEPTH_MIN [context]):0;
     51              Tdepth_t   depth_max       = (_param->_have_port_depth)?PORT_READ(in_DEPTH_MAX [context]):0;
     52              Tcontrol_t depth_full      = PORT_READ(in_DEPTH_FULL[context]);
    5253
    53             // All case
    54             // ....... min ...X... max ....... OK
    55             // ....... min ....... max ...X... KO
    56             // ...X... min ....... max ....... KO
    57             // ....... max ....... min ...X... OK
    58             // ...X... max ....... min ....... OK
    59             // ....... max ...X... min ....... KO
     54              // is a valid instruction ?
     55              // If DEPTH_CURRENT :
     56              // equal at     DEPTH_MIN            -> not speculative
     57              // not include ]DEPTH_MIN:DEPTH_MAX] -> previous branch miss
     58              //     include ]DEPTH_MIN:DEPTH_MAX] -> speculative
     59             
     60              // All case
     61              // ....... min ...X... max ....... OK
     62              // ....... min ....... max ...X... KO
     63              // ...X... min ....... max ....... KO
     64              // ....... max ....... min ...X... OK
     65              // ...X... max ....... min ....... OK
     66              // ....... max ...X... min ....... KO
     67             
     68              Tcontrol_t   is_valid      = ((depth == depth_min) or
     69                                            depth_full or
     70                                            ((depth_min <= depth_max)?
     71                                             ((depth >= depth_min) and (depth <=depth_max)):
     72                                             ((depth >= depth_min) or  (depth <=depth_max))));
     73              //Tcontrol_t is_valid        = ((depth == depth_min) or
     74              //                              ((depth_min < depth_max)?
     75              //                               (depth<=depth_max):
     76              //                               ((depth > depth_min) or (depth <= depth_max))));
     77              //Tcontrol_t is_valid        = depth <= depth_max;
    6078
    61             Tcontrol_t   is_valid      = ((depth == depth_min) or
    62                                           depth_full or
    63                                           ((depth_min <= depth_max)?
    64                                            ((depth >= depth_min) and (depth <=depth_max)):
    65                                            ((depth >= depth_min) or  (depth <=depth_max))));
    66 //          Tcontrol_t is_valid        = ((depth == depth_min) or
    67 //                                           ((depth_min < depth_max)?
    68 //                                            (depth<=depth_max):
    69 //                                            ((depth > depth_min) or (depth <= depth_max))));
    70 //          Tcontrol_t is_valid        = depth <= depth_max;
    71 
    72             log_printf(TRACE,Decod_queue,FUNCTION,"    * is_valid : %d",is_valid);
    73             log_printf(TRACE,Decod_queue,FUNCTION,"      * context      : %d",context);
    74             log_printf(TRACE,Decod_queue,FUNCTION,"      * depth        : %d",depth);
    75             log_printf(TRACE,Decod_queue,FUNCTION,"      * depth_min    : %d",depth_min);
    76             log_printf(TRACE,Decod_queue,FUNCTION,"      * depth_max    : %d",depth_max);
    77             log_printf(TRACE,Decod_queue,FUNCTION,"      * depth_full   : %d",depth_full);
    78             log_printf(TRACE,Decod_queue,FUNCTION,"      * address_next : 0x%x (0x%x)",reg_QUEUE->front()->_address_next[i],reg_QUEUE->front()->_address_next[i]<<2);
    79             internal_DECOD_OUT_VAL [i] = 1; // in all case, val is set (entry is not empty, and instruction is valid)
    80             if (is_valid)
    81               {
    82                 val                    [i] = 1;
    83                 internal_DECOD_OUT_ACK [i] = PORT_READ(in_DECOD_OUT_ACK [i]);
    84               }
    85             else
    86               {
    87                 // Consume the instruction (to erase)
    88                 internal_DECOD_OUT_ACK [i] = 1;
    89               }
    90           }
     79              log_printf(TRACE,Decod_queue,FUNCTION,"    * is_valid : %d",is_valid);
     80              log_printf(TRACE,Decod_queue,FUNCTION,"      * context      : %d",context);
     81              log_printf(TRACE,Decod_queue,FUNCTION,"      * depth        : %d",depth);
     82              log_printf(TRACE,Decod_queue,FUNCTION,"      * depth_min    : %d",depth_min);
     83              log_printf(TRACE,Decod_queue,FUNCTION,"      * depth_max    : %d",depth_max);
     84              log_printf(TRACE,Decod_queue,FUNCTION,"      * depth_full   : %d",depth_full);
     85#ifdef DEBUG
     86              log_printf(TRACE,Decod_queue,FUNCTION,"      * address      : 0x%x (0x%x)",reg_QUEUE->front()->_address     [index],reg_QUEUE->front()->_address     [index]<<2);
     87#endif
     88              log_printf(TRACE,Decod_queue,FUNCTION,"      * address_next : 0x%x (0x%x)",reg_QUEUE->front()->_address_next[index],reg_QUEUE->front()->_address_next[index]<<2);
     89              internal_DECOD_OUT_VAL [index] = 1; // in all case, val is set (entry is not empty, and instruction is valid)
     90              if (is_valid)
     91                {
     92                  val                    [i]     = 1;
     93                  internal_DECOD_OUT_ACK [index] = PORT_READ(in_DECOD_OUT_ACK [i]);
     94                }
     95              else
     96                {
     97                  // Consume the instruction (to erase)
     98                  internal_DECOD_OUT_ACK [index] = 1;
     99                }
     100            }
     101      }
    91102
    92103    for (uint32_t i=0; i<_param->_nb_inst_decod; i++)
    93104      {
    94105        log_printf(TRACE,Decod_queue,FUNCTION,"  * DECOD_OUT_VAL : %d",val [i]);
    95 
    96         PORT_WRITE(out_DECOD_OUT_VAL [i],val [i]);
     106       
     107        PORT_WRITE(out_DECOD_OUT_VAL [i],val [i]);
    97108      }
    98109
Note: See TracChangeset for help on using the changeset viewer.