Ignore:
Timestamp:
Dec 10, 2008, 7:31:39 PM (16 years ago)
Author:
rosiere
Message:

Almost complete design
with Test and test platform

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/Context_State/src/Context_State_transition.cpp

    r83 r88  
    2222  {
    2323    log_begin(Context_State,FUNCTION);
     24    log_function(Context_State,FUNCTION,_name.c_str());
    2425
    2526    if (PORT_READ(in_NRESET) == 0)
    2627      {
    27         for (uint32_t i=0; i<_param->_nb_context; i++)
    28           reg_STATE [i] = CONTEXT_STATE_OK;
     28        for (uint32_t i=0; i<_param->_nb_context; i++)
     29          {
     30            reg_STATE            [i] = CONTEXT_STATE_OK;
     31            reg_INTERRUPT_ENABLE [i] = 0;
     32          }
    2933      }
    3034    else
    3135      {
    32         // -------------------------------------------------------------------
    33         // -----[ DECOD_EVENT ]-----------------------------------------------
    34         // -------------------------------------------------------------------
    35 
    36         for (uint32_t i=0; i<_param->_nb_decod_unit; i++)
    37           if (PORT_READ(in_DECOD_EVENT_VAL [i]) and internal_DECOD_EVENT_ACK [i])
    38             {
    39               Tcontext_t context    = (_param->_have_port_context_id     )?PORT_READ(in_DECOD_EVENT_CONTEXT_ID [i]):0;
    40               Tdepth_t   depth      = (_param->_have_port_max_depth      )?PORT_READ(in_DECOD_EVENT_DEPTH      [i]):0;
    41               Tdepth_t   depth_cur  = reg_EVENT_DEPTH [context];
    42               Tdepth_t   depth_base = (_param->_have_port_depth [context])?PORT_READ(in_DEPTH_TAIL       [context]):0;
    43               Tdepth_t   depth_max  = _param->_size_depth [context];
    44              
    45               Tdepth_t   depth0     = (depth_cur>=depth_base)?(depth_cur-depth_base):((depth_cur+depth_max-depth_base));
    46               Tdepth_t   depth1     = (depth    >=depth_base)?(depth    -depth_base):((depth    +depth_max-depth_base));
    47 
    48               context_state_t state = reg_STATE [context];
    49               Tevent_type_t   type  = PORT_READ(in_DECOD_EVENT_TYPE [i]);
    50              
    51               // miss > excep > spr/sync
    52               uint8_t    priority0  = (state == CONTEXT_STATE_KO_MISS)?2:((state == CONTEXT_STATE_KO_EXCEP)?1:0);
    53               uint8_t    priority1  = (state == EVENT_TYPE_EXCEPTION)?1:0;
    54 
    55               // is_valid = can modify local information
    56               //  if context_state_ok : yes
    57               //  if context_state_ko : test the depth, and the priority of envent
    58 
    59               bool       is_valid   = ((state == CONTEXT_STATE_OK) or
    60                                        (depth1< depth0) or
    61                                        ((depth1==depth0) and (priority1>priority0)));
    62 
    63               if (is_valid)
    64                 {
    65                   // decod :
    66                   // type : csync, psync, msync, spr_access (l.mac, l.maci, l.macrc, l.msb, l.mfspr, l.mtspr), exception (l.sys)
    67                   context_state_t state_next    = state;
    68                   Taddress_t      address       = PORT_READ(in_DECOD_EVENT_ADDRESS       [i]);
    69                   Tcontrol_t      is_delay_slot = PORT_READ(in_DECOD_EVENT_IS_DELAY_SLOT [i]);
    70 
    71                   switch (type)
    72                     {
    73                     case EVENT_TYPE_EXCEPTION          :
    74                       {
    75                         state_next = CONTEXT_STATE_KO_EXCEP;
    76                         break;
    77                       }
    78                     case EVENT_TYPE_SPR_ACCESS         :
    79                       {
    80                         state_next = CONTEXT_STATE_KO_SPR  ;
    81                         address++; // take next address
    82                         if (is_delay_slot)
    83                           throw ERRORMORPHEO(FUNCTION,"SPR access in delay slot, not supported.\n");
    84                         break;
    85                       }
    86                     case EVENT_TYPE_MSYNC              :
    87                       {
    88                         state_next = CONTEXT_STATE_KO_MSYNC;
    89                         address++;  // take next address
    90                         if (is_delay_slot)
    91                           throw ERRORMORPHEO(FUNCTION,"SPR access in delay slot, not supported.\n");
    92                         break;
    93                       }
    94                     case EVENT_TYPE_PSYNC              :
    95                       {
    96                         state_next = CONTEXT_STATE_KO_PSYNC;
    97                         address++;  // take next address
    98                         if (is_delay_slot)
    99                           throw ERRORMORPHEO(FUNCTION,"SPR access in delay slot, not supported.\n");
    100                         break;
    101                       }
    102                     case EVENT_TYPE_CSYNC              :
    103                       {
    104                         state_next = CONTEXT_STATE_KO_CSYNC;
    105                         address++;  // take next address
    106                         if (is_delay_slot)
    107                           throw ERRORMORPHEO(FUNCTION,"SPR access in delay slot, not supported.\n");
    108                         break;
    109                       }               
    110                     case EVENT_TYPE_NONE               :
    111                     case EVENT_TYPE_MISS_SPECULATION   :
    112                     case EVENT_TYPE_BRANCH_NO_ACCURATE :
    113                     default :
    114                       {
    115                         throw ERRORMORPHEO(FUNCTION,toString(_("DECOD_EVENT [%d] : invalid event_type : %s.\n"),i,toString(type).c_str()));
    116                       }
    117                     }
    118 
    119                   reg_STATE                  [context] = state_next;
    120                   reg_EVENT_ADDRESS          [context] = address;
    121                   reg_EVENT_ADDRESS_EPCR     [context] = PORT_READ(in_DECOD_EVENT_ADDRESS_EPCR  [i]);
    122                   reg_EVENT_ADDRESS_EPCR_VAL [context] = 1;
    123                 //reg_EVENT_ADDRESS_EEAR     [context]
    124                   reg_EVENT_ADDRESS_EEAR_VAL [context] = 0;
    125                   reg_EVENT_IS_DELAY_SLOT    [context] = is_delay_slot;
    126                 //reg_EVENT_IS_DS_TAKE       [context] = 0;
    127                   reg_EVENT_DEPTH            [context] = depth;
    128                 }
    129             }
    130 
    131         // -------------------------------------------------------------------
    132         // -----[ COMMIT_EVENT ]----------------------------------------------
    133         // -------------------------------------------------------------------
    134 
    135         for (uint32_t i=0; i<_param->_nb_ooo_engine; i++)
    136           if (PORT_READ(in_COMMIT_EVENT_VAL [i]) and internal_COMMIT_EVENT_ACK [i])
    137             {
    138               Tcontext_t context    = (_param->_have_port_context_id     )?PORT_READ(in_COMMIT_EVENT_CONTEXT_ID [i]):0;
    139               Tdepth_t   depth      = (_param->_have_port_max_depth      )?PORT_READ(in_COMMIT_EVENT_DEPTH      [i]):0;
    140               Tdepth_t   depth_cur  = reg_EVENT_DEPTH [context];
    141               Tdepth_t   depth_base = (_param->_have_port_depth [context])?PORT_READ(in_DEPTH_TAIL        [context]):0;
    142               Tdepth_t   depth_max  = _param->_size_depth [context];
    143              
    144               Tdepth_t   depth0     = (depth_cur>=depth_base)?(depth_cur-depth_base):((depth_cur+depth_max-depth_base));
    145               Tdepth_t   depth1     = (depth    >=depth_base)?(depth    -depth_base):((depth    +depth_max-depth_base));
    146 
    147               context_state_t state = reg_STATE [context];
    148               Tevent_type_t   type  = PORT_READ(in_COMMIT_EVENT_TYPE [i]);
    149              
    150               // miss > excep > spr/sync
    151               uint8_t    priority0  = (state == CONTEXT_STATE_KO_MISS)?2:((state == CONTEXT_STATE_KO_EXCEP)?1:0);
    152               uint8_t    priority1  = 1;
    153 
    154               // is_valid = can modify local information
    155               //  if context_state_ok : yes
    156               //  if context_state_ko : test the depth, and the priority of envent
    157 
    158               bool       is_valid   = ((state == CONTEXT_STATE_OK) or
    159                                        (depth1< depth0) or
    160                                        ((depth1==depth0) and (priority1>priority0)));
    161 
    162               if (is_valid)
    163                 {
    164                   // commit
    165                   // type : exception
    166                   context_state_t state_next = state;
    167                   switch (type)
    168                     {
    169                     case EVENT_TYPE_EXCEPTION          : {state_next = CONTEXT_STATE_KO_EXCEP; break;}
    170                     case EVENT_TYPE_SPR_ACCESS         :
    171                     case EVENT_TYPE_MSYNC              :
    172                     case EVENT_TYPE_PSYNC              :
    173                     case EVENT_TYPE_CSYNC              :
    174                     case EVENT_TYPE_NONE               :
    175                     case EVENT_TYPE_MISS_SPECULATION   :
    176                     case EVENT_TYPE_BRANCH_NO_ACCURATE :
    177                     default :
    178                       {
    179                         throw ERRORMORPHEO(FUNCTION,toString(_("COMMIT_EVENT [%d] : invalid event_type : %s.\n"),i,toString(type).c_str()));
    180                       }
    181                     }
    182                   reg_STATE                  [context] = state_next;
    183                   reg_EVENT_ADDRESS          [context] = PORT_READ(in_COMMIT_EVENT_ADDRESS          [i]);
    184                   reg_EVENT_ADDRESS_EPCR     [context] = PORT_READ(in_COMMIT_EVENT_ADDRESS_EPCR     [i]);
    185                   reg_EVENT_ADDRESS_EPCR_VAL [context] = 1;
    186                   reg_EVENT_ADDRESS_EEAR     [context] = PORT_READ(in_COMMIT_EVENT_ADDRESS_EEAR     [i]);
    187                   reg_EVENT_ADDRESS_EEAR_VAL [context] = PORT_READ(in_COMMIT_EVENT_ADDRESS_EEAR_VAL [i]);
    188                   reg_EVENT_IS_DELAY_SLOT    [context] = PORT_READ(in_COMMIT_EVENT_IS_DELAY_SLOT    [i]);
    189                 //reg_EVENT_IS_DS_TAKE       [context] = 0;
    190                   reg_EVENT_DEPTH            [context] = depth;
    191                 }
    192             }
    193 
    194         // -------------------------------------------------------------------
    195         // -----[ BRANCH_COMPLETE ]-------------------------------------------
    196         // -------------------------------------------------------------------
    197 
    198         for (uint32_t i=0; i<_param->_nb_inst_branch_complete; i++)
    199           if (PORT_READ(in_BRANCH_COMPLETE_VAL [i]) and internal_BRANCH_COMPLETE_ACK [i])
    200             {
    201               if (PORT_READ(in_BRANCH_COMPLETE_MISS_PREDICTION [i]))
    202                 {
    203                   Tcontext_t context    = (_param->_have_port_context_id     )?PORT_READ(in_BRANCH_COMPLETE_CONTEXT_ID [i]):0;
    204                   Tdepth_t   depth      = (_param->_have_port_max_depth      )?PORT_READ(in_BRANCH_COMPLETE_DEPTH      [i]):0;
    205                   Tdepth_t   depth_cur  = reg_EVENT_DEPTH [context];
    206                   Tdepth_t   depth_base = (_param->_have_port_depth [context])?PORT_READ(in_DEPTH_TAIL        [context]):0;
    207                   Tdepth_t   depth_max  = _param->_size_depth [context];
    208                  
    209                   Tdepth_t   depth0     = (depth_cur>=depth_base)?(depth_cur-depth_base):((depth_cur+depth_max-depth_base));
    210                   Tdepth_t   depth1     = (depth    >=depth_base)?(depth    -depth_base):((depth    +depth_max-depth_base));
    211                  
    212                   context_state_t state = reg_STATE [context];
    213                  
    214                   // miss > excep > spr/sync
    215                   uint8_t    priority0  = (state == CONTEXT_STATE_KO_MISS)?2:((state == CONTEXT_STATE_KO_EXCEP)?1:0);
    216                   uint8_t    priority1  = 2;
    217                  
    218                   // is_valid = can modify local information
    219                   //  if context_state_ok : yes
    220                   //  if context_state_ko : test the depth, and the priority of envent
    221                  
    222                   bool       is_valid   = ((state == CONTEXT_STATE_OK) or
    223                                            (depth1< depth0) or
    224                                            ((depth1==depth0) and (priority1>priority0)));
    225                  
    226                   if (is_valid)
    227                     {
    228                       // commit
    229                       Tcontrol_t take = PORT_READ(in_BRANCH_COMPLETE_TAKE [i]);
    230                       reg_STATE                  [context] = CONTEXT_STATE_KO_MISS;
    231                       reg_EVENT_ADDRESS          [context] = PORT_READ(in_BRANCH_COMPLETE_ADDRESS_SRC  [i])+1; //DELAY_SLOT
    232                       reg_EVENT_ADDRESS_EPCR     [context] = PORT_READ(in_BRANCH_COMPLETE_ADDRESS_DEST [i]);
    233                       reg_EVENT_ADDRESS_EPCR_VAL [context] = take; // if not take : in sequence
    234                     //reg_EVENT_ADDRESS_EEAR     [context];
    235                     //reg_EVENT_ADDRESS_EEAR_VAL [context];
    236                       reg_EVENT_IS_DELAY_SLOT    [context] = take;
    237                       reg_EVENT_IS_DS_TAKE       [context] = take;
    238                       reg_EVENT_DEPTH            [context] = depth;
    239                     }
    240                 }
    241             }
    242 
    243         // -------------------------------------------------------------------
    244         // -----[ EVENT ]-----------------------------------------------------
    245         // -------------------------------------------------------------------
    246         for (uint32_t i=0; i<_param->_nb_context; i++)
    247           if (internal_EVENT_VAL [i] and PORT_READ(in_EVENT_ACK [i]))
    248             {
    249               // Write pc
    250               context_state_t state = reg_STATE [i];
    251 
    252               switch (state)
    253                 {
    254                 case CONTEXT_STATE_KO_EXCEP_ADDR :
    255                   {
    256                     reg_STATE [i] = CONTEXT_STATE_KO_EXCEP_SPR;
    257                     break;
    258                   }
    259                 case CONTEXT_STATE_KO_MISS_ADDR  :
    260                 case CONTEXT_STATE_KO_PSYNC_ADDR :
    261                 case CONTEXT_STATE_KO_CSYNC_ADDR :
    262                   {
    263                     reg_STATE [i] = CONTEXT_STATE_OK;
    264                     break;
    265                   }
    266                 default :
    267                   {
     36        // -------------------------------------------------------------------
     37        // -----[ BRANCH_EVENT ]----------------------------------------------
     38        // -------------------------------------------------------------------
     39        for (uint32_t i=0; i<_param->_nb_context; ++i)
     40          if (PORT_READ(in_BRANCH_EVENT_VAL [i]) and internal_BRANCH_EVENT_ACK [i])
     41            {
     42//               throw ERRORMORPHEO(FUNCTION,_("Not yet implemented (Comming Soon).\n"));
     43
     44              context_state_t state = reg_STATE [i];
     45
     46              Tdepth_t   depth      = // (_param->_have_port_depth)?PORT_READ(in_BRANCH_EVENT_DEPTH [i]):
     47                0;
     48              Tdepth_t   depth_cur  = reg_EVENT_DEPTH [i];
     49              Tdepth_t   depth_min  = (_param->_have_port_depth)?PORT_READ(in_DEPTH_MIN [i]):0;
     50              Tdepth_t   depth_max  = _param->_array_size_depth [i];
     51             
     52//               Tdepth_t   depth0     = (depth_cur>=depth_min)?(depth_cur-depth_min):((depth_cur+depth_max-depth_min));
     53//               Tdepth_t   depth1     = (depth    >=depth_min)?(depth    -depth_min):((depth    +depth_max-depth_min));
     54              Tdepth_t   depth0     = (depth_cur>=depth_min)?(depth_cur):((depth_cur+depth_max));
     55              Tdepth_t   depth1     = (depth    >=depth_min)?(depth    ):((depth    +depth_max));
     56
     57              // priority : miss > excep > spr/sync
     58              uint8_t    priority0  = (state == CONTEXT_STATE_KO_MISS)?2:((state == EVENT_TYPE_EXCEPTION)?1:0);
     59              uint8_t    priority1  = 2; // miss
     60
     61              // is_valid = can modify local information
     62              //   if context_state_ok : yes
     63              //   if context_state_ko : test the depth, and the priority of envent
     64
     65              bool       is_valid   = ((state == CONTEXT_STATE_OK) or
     66                                       (depth1< depth0) or
     67                                       ((depth1==depth0) and (priority1>priority0)));
     68
     69              if (is_valid)
     70                {
     71                  reg_STATE                  [i] =  CONTEXT_STATE_KO_MISS;
     72                  reg_EVENT_ADDRESS          [i] =  PORT_READ(in_BRANCH_EVENT_ADDRESS_SRC [i])+1; // address delay slot
     73                  reg_EVENT_ADDRESS_EPCR     [i] =  PORT_READ(in_BRANCH_EVENT_ADDRESS_DEST[i]);   // address_next
     74                  reg_EVENT_ADDRESS_EPCR_VAL [i] =  1; // address_dest is valid
     75                //reg_EVENT_ADDRESS_EEAR     [i] =  0;
     76                  reg_EVENT_ADDRESS_EEAR_VAL [i] =  0;
     77                  reg_EVENT_IS_DELAY_SLOT    [i] =  1;
     78                  reg_EVENT_IS_DS_TAKE       [i] =  0;// ??
     79                  reg_EVENT_DEPTH            [i] =  depth;
     80                }
     81            }
     82       
     83        // -------------------------------------------------------------------
     84        // -----[ DECOD_EVENT ]-----------------------------------------------
     85        // -------------------------------------------------------------------
     86
     87        for (uint32_t i=0; i<_param->_nb_decod_unit; i++)
     88          if (PORT_READ(in_DECOD_EVENT_VAL [i]) and internal_DECOD_EVENT_ACK [i])
     89            {
     90              Tcontext_t context    = (_param->_have_port_context_id )?PORT_READ(in_DECOD_EVENT_CONTEXT_ID [i]):0;
     91              Tdepth_t   depth      = (_param->_have_port_depth      )?PORT_READ(in_DECOD_EVENT_DEPTH      [i]):0;
     92              Tdepth_t   depth_cur  = reg_EVENT_DEPTH [context];
     93              Tdepth_t   depth_min = (_param->_have_port_depth      )?PORT_READ(in_DEPTH_MIN [context]):0;
     94              Tdepth_t   depth_max  = _param->_array_size_depth [context];
     95             
     96//               Tdepth_t   depth0     = (depth_cur>=depth_min)?(depth_cur-depth_min):((depth_cur+depth_max-depth_min));
     97//               Tdepth_t   depth1     = (depth    >=depth_min)?(depth    -depth_min):((depth    +depth_max-depth_min));
     98              Tdepth_t   depth0     = (depth_cur>=depth_min)?(depth_cur):((depth_cur+depth_max));
     99              Tdepth_t   depth1     = (depth    >=depth_min)?(depth    ):((depth    +depth_max));
     100
     101              context_state_t state = reg_STATE [context];
     102              Tevent_type_t   type  = PORT_READ(in_DECOD_EVENT_TYPE [i]);
     103             
     104              // miss > excep > spr/sync
     105              uint8_t    priority0  = (state == CONTEXT_STATE_KO_MISS)?2:((state == CONTEXT_STATE_KO_EXCEP)?1:0);
     106              uint8_t    priority1  = (state == EVENT_TYPE_EXCEPTION)?1:0;
     107
     108              // is_valid = can modify local information
     109              //  if context_state_ok : yes
     110              //  if context_state_ko : test the depth, and the priority of envent
     111
     112              bool       is_valid   = ((state == CONTEXT_STATE_OK) or
     113                                       (depth1< depth0) or
     114                                       ((depth1==depth0) and (priority1>priority0)));
     115
     116              if (is_valid)
     117                {
     118                  // decod :
     119                  // type : csync, psync, msync, spr_access (l.mac, l.maci, l.macrc, l.msb, l.mfspr, l.mtspr), exception (l.sys)
     120                  context_state_t state_next    = state;
     121                  Taddress_t      address       = PORT_READ(in_DECOD_EVENT_ADDRESS       [i]);
     122                  Tcontrol_t      is_delay_slot = PORT_READ(in_DECOD_EVENT_IS_DELAY_SLOT [i]);
     123
     124                  switch (type)
     125                    {
     126                    case EVENT_TYPE_EXCEPTION          :
     127                      {
     128                        state_next = CONTEXT_STATE_KO_EXCEP;
     129
     130                        break;
     131                      }
     132                    case EVENT_TYPE_SPR_ACCESS         :
     133                      {
     134                        state_next = CONTEXT_STATE_KO_SPR  ;
     135                        address++; // take next address
     136                        if (is_delay_slot)
     137                          throw ERRORMORPHEO(FUNCTION,"SPR access in delay slot, not supported.\n");
     138                        break;
     139                      }
     140                    case EVENT_TYPE_MSYNC              :
     141                      {
     142                        state_next = CONTEXT_STATE_KO_MSYNC;
     143                        address++;  // take next address
     144                        if (is_delay_slot)
     145                          throw ERRORMORPHEO(FUNCTION,"SPR access in delay slot, not supported.\n");
     146                        break;
     147                      }
     148                    case EVENT_TYPE_PSYNC              :
     149                      {
     150                        state_next = CONTEXT_STATE_KO_PSYNC;
     151                        address++;  // take next address
     152                        if (is_delay_slot)
     153                          throw ERRORMORPHEO(FUNCTION,"SPR access in delay slot, not supported.\n");
     154                        break;
     155                      }
     156                    case EVENT_TYPE_CSYNC              :
     157                      {
     158                        state_next = CONTEXT_STATE_KO_CSYNC;
     159                        address++;  // take next address
     160                        if (is_delay_slot)
     161                          throw ERRORMORPHEO(FUNCTION,"SPR access in delay slot, not supported.\n");
     162                        break;
     163                      }               
     164                    case EVENT_TYPE_NONE               :
     165                    case EVENT_TYPE_MISS_SPECULATION   :
     166                    case EVENT_TYPE_BRANCH_NO_ACCURATE :
     167                    default :
     168                      {
     169                        throw ERRORMORPHEO(FUNCTION,toString(_("DECOD_EVENT [%d] : invalid event_type : %s.\n"),i,toString(type).c_str()));
     170                      }
     171                    }
     172
     173                  reg_STATE                  [context] = state_next;
     174                  reg_EVENT_ADDRESS          [context] = address;
     175                  reg_EVENT_ADDRESS_EPCR     [context] = PORT_READ(in_DECOD_EVENT_ADDRESS_EPCR  [i]);
     176                  reg_EVENT_ADDRESS_EPCR_VAL [context] = 1;
     177                //reg_EVENT_ADDRESS_EEAR     [context]
     178                  reg_EVENT_ADDRESS_EEAR_VAL [context] = 0;
     179                  reg_EVENT_IS_DELAY_SLOT    [context] = is_delay_slot;
     180                //reg_EVENT_IS_DS_TAKE       [context] = 0;
     181                  reg_EVENT_DEPTH            [context] = depth;
     182                }
     183            }
     184
     185        // -------------------------------------------------------------------
     186        // -----[ COMMIT_EVENT ]----------------------------------------------
     187        // -------------------------------------------------------------------
     188
     189        if (PORT_READ(in_COMMIT_EVENT_VAL ) and internal_COMMIT_EVENT_ACK )
     190          {
     191            Tcontext_t context    = (_param->_have_port_context_id)?PORT_READ(in_COMMIT_EVENT_CONTEXT_ID ):0;
     192            Tdepth_t   depth      = (_param->_have_port_depth     )?PORT_READ(in_COMMIT_EVENT_DEPTH      ):0;
     193            Tdepth_t   depth_cur  = reg_EVENT_DEPTH [context];
     194            Tdepth_t   depth_min = (_param->_have_port_depth     )?PORT_READ(in_DEPTH_MIN [context]):0;
     195            Tdepth_t   depth_max  = _param->_array_size_depth [context];
     196           
     197//             Tdepth_t   depth0     = (depth_cur>=depth_min)?(depth_cur-depth_min):((depth_cur+depth_max-depth_min));
     198//             Tdepth_t   depth1     = (depth    >=depth_min)?(depth    -depth_min):((depth    +depth_max-depth_min));
     199            Tdepth_t   depth0     = (depth_cur>=depth_min)?(depth_cur):((depth_cur+depth_max));
     200            Tdepth_t   depth1     = (depth    >=depth_min)?(depth    ):((depth    +depth_max));
     201
     202            context_state_t state = reg_STATE [context];
     203            Tevent_type_t   type  = PORT_READ(in_COMMIT_EVENT_TYPE );
     204           
     205            // miss > excep > spr/sync
     206            uint8_t    priority0  = (state == CONTEXT_STATE_KO_MISS)?2:((state == CONTEXT_STATE_KO_EXCEP)?1:0);
     207            uint8_t    priority1  = 1; // exception
     208
     209            // is_valid = can modify local information
     210            //  if context_state_ok : yes
     211            //  if context_state_ko : test the depth, and the priority of envent
     212
     213            bool       is_valid   = ((state == CONTEXT_STATE_OK) or
     214                                     (depth1< depth0) or
     215                                     ((depth1==depth0) and (priority1>priority0)));
     216
     217            if (is_valid)
     218              {
     219                // commit
     220                // type : exception
     221                context_state_t state_next = state;
     222                switch (type)
     223                  {
     224                  case EVENT_TYPE_EXCEPTION          : {state_next = CONTEXT_STATE_KO_EXCEP; break;}
     225                  case EVENT_TYPE_SPR_ACCESS         :
     226                  case EVENT_TYPE_MSYNC              :
     227                  case EVENT_TYPE_PSYNC              :
     228                  case EVENT_TYPE_CSYNC              :
     229                  case EVENT_TYPE_NONE               :
     230                  case EVENT_TYPE_MISS_SPECULATION   :
     231                  case EVENT_TYPE_BRANCH_NO_ACCURATE :
     232                  default :
     233                    {
     234                      throw ERRORMORPHEO(FUNCTION,toString(_("COMMIT_EVENT : invalid event_type : %s.\n"),toString(type).c_str()));
     235                    }
     236                  }
     237                reg_STATE                  [context] = state_next;
     238                reg_EVENT_ADDRESS          [context] = PORT_READ(in_COMMIT_EVENT_ADDRESS          );
     239                reg_EVENT_ADDRESS_EPCR     [context] = PORT_READ(in_COMMIT_EVENT_ADDRESS_EPCR     );
     240                reg_EVENT_ADDRESS_EPCR_VAL [context] = 1;
     241                reg_EVENT_ADDRESS_EEAR     [context] = PORT_READ(in_COMMIT_EVENT_ADDRESS_EEAR     );
     242                reg_EVENT_ADDRESS_EEAR_VAL [context] = PORT_READ(in_COMMIT_EVENT_ADDRESS_EEAR_VAL );
     243                reg_EVENT_IS_DELAY_SLOT    [context] = PORT_READ(in_COMMIT_EVENT_IS_DELAY_SLOT    );
     244              //reg_EVENT_IS_DS_TAKE       [context] = 0;
     245                reg_EVENT_DEPTH            [context] = depth;
     246              }
     247          }
     248
     249        // -------------------------------------------------------------------
     250        // -----[ BRANCH_COMPLETE ]-------------------------------------------
     251        // -------------------------------------------------------------------
     252
     253        for (uint32_t i=0; i<_param->_nb_inst_branch_complete; i++)
     254          if (PORT_READ(in_BRANCH_COMPLETE_VAL [i]) and internal_BRANCH_COMPLETE_ACK [i])
     255            {
     256              if (PORT_READ(in_BRANCH_COMPLETE_MISS_PREDICTION [i]))
     257                {
     258                  Tcontext_t context    = (_param->_have_port_context_id)?PORT_READ(in_BRANCH_COMPLETE_CONTEXT_ID [i]):0;
     259                  Tdepth_t   depth      = (_param->_have_port_depth     )?PORT_READ(in_BRANCH_COMPLETE_DEPTH      [i]):0;
     260                  Tdepth_t   depth_cur  = reg_EVENT_DEPTH [context];
     261                  Tdepth_t   depth_min = (_param->_have_port_depth     )?PORT_READ(in_DEPTH_MIN [context]):0;
     262                  Tdepth_t   depth_max  = _param->_array_size_depth [context];
     263                 
     264//                   Tdepth_t   depth0     = (depth_cur>=depth_min)?(depth_cur-depth_min):((depth_cur+depth_max-depth_min));
     265//                   Tdepth_t   depth1     = (depth    >=depth_min)?(depth    -depth_min):((depth    +depth_max-depth_min));
     266                  Tdepth_t   depth0     = (depth_cur>=depth_min)?(depth_cur):((depth_cur+depth_max));
     267                  Tdepth_t   depth1     = (depth    >=depth_min)?(depth    ):((depth    +depth_max));
     268                 
     269                  context_state_t state = reg_STATE [context];
     270                 
     271                  // miss > excep > spr/sync
     272                  uint8_t    priority0  = (state == CONTEXT_STATE_KO_MISS)?2:((state == CONTEXT_STATE_KO_EXCEP)?1:0);
     273                  uint8_t    priority1  = 2; // miss
     274                 
     275                  // is_valid = can modify local information
     276                  //  if context_state_ok : yes
     277                  //  if context_state_ko : test the depth, and the priority of envent
     278                 
     279                  bool       is_valid   = ((state == CONTEXT_STATE_OK) or
     280                                           (depth1< depth0) or
     281                                           ((depth1==depth0) and (priority1>priority0)));
     282                 
     283                  if (is_valid)
     284                    {
     285                      // commit
     286                      Tcontrol_t take = PORT_READ(in_BRANCH_COMPLETE_TAKE [i]);
     287                      reg_STATE                  [context] = CONTEXT_STATE_KO_MISS;
     288                      reg_EVENT_ADDRESS          [context] = PORT_READ(in_BRANCH_COMPLETE_ADDRESS_SRC  [i])+1; //DELAY_SLOT
     289                      reg_EVENT_ADDRESS_EPCR     [context] = PORT_READ(in_BRANCH_COMPLETE_ADDRESS_DEST [i]);
     290                      reg_EVENT_ADDRESS_EPCR_VAL [context] = take; // if not take : in sequence
     291                    //reg_EVENT_ADDRESS_EEAR     [context];
     292                      reg_EVENT_ADDRESS_EEAR_VAL [context] = 0;
     293                      reg_EVENT_IS_DELAY_SLOT    [context] = take;
     294                      reg_EVENT_IS_DS_TAKE       [context] = take;
     295                      reg_EVENT_DEPTH            [context] = depth;
     296                    }
     297                }
     298            }
     299
     300        // -------------------------------------------------------------------
     301        // -----[ EVENT ]-----------------------------------------------------
     302        // -------------------------------------------------------------------
     303        for (uint32_t i=0; i<_param->_nb_context; i++)
     304          if (internal_EVENT_VAL [i] and PORT_READ(in_EVENT_ACK [i]))
     305            {
     306              // Write pc
     307              context_state_t state = reg_STATE [i];
     308
     309              switch (state)
     310                {
     311                case CONTEXT_STATE_KO_EXCEP_ADDR :
     312                  {
     313                    reg_STATE [i] = CONTEXT_STATE_KO_EXCEP_SPR;
     314                    break;
     315                  }
     316                case CONTEXT_STATE_KO_MISS_ADDR  :
     317                case CONTEXT_STATE_KO_PSYNC_ADDR :
     318                case CONTEXT_STATE_KO_CSYNC_ADDR :
     319                  {
     320                    reg_STATE [i] = CONTEXT_STATE_OK;
     321                    break;
     322                  }
     323                default :
     324                  {
    268325#ifdef DEBUG_TEST
    269                     throw ERRORMORPHEO(FUNCTION,toString(_("SPR[%d], Invalid state : %s.\n"),i,toString(state).c_str()));
     326                    throw ERRORMORPHEO(FUNCTION,toString(_("SPR[%d], Invalid state : %s.\n"),i,toString(state).c_str()));
    270327#endif
    271                     break;
    272                   }
    273                 }
    274             }
    275 
    276         // -------------------------------------------------------------------
    277         // -----[ SPR ]-------------------------------------------------------
    278         // -------------------------------------------------------------------
    279         for (uint32_t i=0; i<_param->_nb_context; i++)
    280           if (internal_SPR_VAL [i] and PORT_READ(in_SPR_ACK [i]))
    281             {
    282               // Write spr
     328                    break;
     329                  }
     330                }
     331            }
     332
     333        // -------------------------------------------------------------------
     334        // -----[ SPR_EVENT ]-------------------------------------------------
     335        // -------------------------------------------------------------------
     336        for (uint32_t i=0; i<_param->_nb_context; i++)
     337          if (internal_SPR_EVENT_VAL [i] and PORT_READ(in_SPR_EVENT_ACK [i]))
     338            {
     339              // Write spr
    283340#ifdef DEBUG_TEST
    284               context_state_t state = reg_STATE [i];
    285            
    286               if (state != CONTEXT_STATE_KO_EXCEP_SPR)
    287                 throw ERRORMORPHEO(FUNCTION,toString(_("SPR[%d], Invalid state : %s.\n"),i,toString(state).c_str()));
     341              context_state_t state = reg_STATE [i];
     342           
     343              if (state != CONTEXT_STATE_KO_EXCEP_SPR)
     344                throw ERRORMORPHEO(FUNCTION,toString(_("SPR_EVENT[%d], Invalid state : %s.\n"),i,toString(state).c_str()));
    288345#endif
    289              
    290               reg_STATE [i] = CONTEXT_STATE_OK;
    291             }
    292 
    293         // -------------------------------------------------------------------
    294         // -----[ next state ]------------------------------------------------
    295         // -------------------------------------------------------------------
    296         for (uint32_t i=0; i<_param->_nb_context; i++)
    297           {
    298             uint32_t x = _param->_link_context_to_decod_unit    [i];
    299             uint32_t y = _param->_link_decod_unit_to_ooo_engine [x];
    300 
    301             Tcounter_t inst_all = PORT_READ(in_NB_INST_COMMIT_ALL [y]) + PORT_READ(in_NB_INST_DECOD_ALL [x]);
    302             Tcounter_t inst_mem = PORT_READ(in_NB_INST_COMMIT_MEM [y]) + PORT_READ(in_NB_INST_DECOD_ALL [x]);
    303 
    304             context_state_t state = reg_STATE [i];
    305 
    306             switch (state)
    307               {
    308               case CONTEXT_STATE_OK              :
    309                 {
    310                   // nothing, wait an event
    311                   break;
    312                 }
    313               case CONTEXT_STATE_KO_EXCEP        :
    314                 {
    315                   // Wait end of all instruction
    316                   if (inst_all == 0)
    317                     state = CONTEXT_STATE_KO_EXCEP_ADDR;
    318                   break;
    319                 }
    320               case CONTEXT_STATE_KO_MISS         :
    321                 {
    322                   // Wait end of all instruction
    323                   if (inst_all == 0)
    324                     state = CONTEXT_STATE_KO_MISS_ADDR;
    325                   break;
    326                 }
    327               case CONTEXT_STATE_KO_EXCEP_ADDR   :
    328                 {
    329                   // nothing, wait the update of internal register (pc)
    330                   break;
    331                 }
    332               case CONTEXT_STATE_KO_EXCEP_SPR    :
    333                 {
    334                   // nothing, wait the update of internal register (epcr, eear, sr, esr)
    335                   break;
    336                 }
    337               case CONTEXT_STATE_KO_MISS_ADDR    :
    338                 {
    339                   // nothing, wait the update of internal register (pc)
    340                   break;
    341                 }
    342               case CONTEXT_STATE_KO_PSYNC        :
    343                 {
    344                   // Wait end of all instruction
    345                   if (inst_all == 0)
    346 //                  state = CONTEXT_STATE_KO_PSYNC_FLUSH;
    347                     state = CONTEXT_STATE_KO_PSYNC_ADDR ;
    348                   break;
    349                 }
    350 //            case CONTEXT_STATE_KO_PSYNC_FLUSH  :
    351 //              {
    352 //                // nothing, wait end of flush (ifetch)
    353 //                break;
    354 //              }
    355               case CONTEXT_STATE_KO_PSYNC_ADDR   :
    356                 {
    357                   // nothing, wait the pc write
    358                   break;
    359                 }
    360               case CONTEXT_STATE_KO_CSYNC        :
    361                 {
    362                   // Wait end of all instruction
    363                   if (inst_all == 0)
    364                     state = CONTEXT_STATE_KO_CSYNC_ADDR ;
    365 //                  state = CONTEXT_STATE_KO_CSYNC_FLUSH;
    366                   break;
    367                 }
    368 //            case CONTEXT_STATE_KO_CSYNC_FLUSH  :
    369 //              {
    370 //                // nothing, wait end of flush (all internal structure)
    371 //                break;
    372 //              }
    373               case CONTEXT_STATE_KO_CSYNC_ADDR   :
    374                 {
    375                   // nothing, wait the pc write
    376                   break;
    377                 }
    378               case CONTEXT_STATE_KO_MSYNC        :
    379                 {
    380                   // Wait end of memory instruction
    381                   if (inst_mem == 0)
    382                     state = CONTEXT_STATE_KO_MSYNC_ISSUE;
    383                   break;
    384                 }
    385               case CONTEXT_STATE_KO_MSYNC_ISSUE  :
    386                 {
    387                   // Wait the msync issue
    388                   if (inst_mem != 0)
    389                     state = CONTEXT_STATE_KO_MSYNC_EXEC;
    390                   break;
    391                 }
    392               case CONTEXT_STATE_KO_MSYNC_EXEC   :
    393                 {
    394                   // Wait the end of msync
    395                   if (inst_mem == 0)
    396                     state = CONTEXT_STATE_OK;
    397                   break;
    398                 }
    399               case CONTEXT_STATE_KO_SPR          :
    400                 {
    401                   // Wait end of all instruction
    402                   if (inst_all == 0)
    403                     state = CONTEXT_STATE_KO_SPR_ISSUE;
    404                   break;
    405                 }
    406               case CONTEXT_STATE_KO_SPR_ISSUE    :
    407                 {
    408                   // Wait the spr_access issue
    409                   if (inst_all != 0)
    410                     state = CONTEXT_STATE_KO_SPR_EXEC;
    411                   break;
    412                 }
    413               case CONTEXT_STATE_KO_SPR_EXEC     :
    414                 {
    415                   // Wait the spr_access execution
    416                   if (inst_all == 0)
    417                     state = CONTEXT_STATE_OK;
    418                   break;
    419                 }
    420 
    421               default :
    422                 {
    423                   throw ERRORMORPHEO(FUNCTION,toString(_("Context[%d], Unknow state : %s.\n"),i,toString(state).c_str()));
    424                 }
    425               }
    426             reg_STATE [i] = state;
    427           }
     346             
     347              reg_STATE [i] = CONTEXT_STATE_OK;
     348            }
     349
     350        // -------------------------------------------------------------------
     351        // -----[ next state ]------------------------------------------------
     352        // -------------------------------------------------------------------
     353        for (uint32_t i=0; i<_param->_nb_context; i++)
     354          {
     355//             uint32_t x = _param->_link_context_to_decod_unit    [i];
     356
     357            Tcounter_t inst_all = PORT_READ(in_NB_INST_COMMIT_ALL[i]) + PORT_READ(in_NB_INST_DECOD_ALL [i]);
     358            Tcounter_t inst_mem = PORT_READ(in_NB_INST_COMMIT_MEM[i]) + PORT_READ(in_NB_INST_DECOD_ALL [i]);
     359
     360            context_state_t state = reg_STATE [i];
     361
     362            switch (state)
     363              {
     364              case CONTEXT_STATE_OK              :
     365                {
     366                  // nothing, wait an event
     367                  break;
     368                }
     369              case CONTEXT_STATE_KO_EXCEP        :
     370                {
     371                  // Wait end of all instruction
     372                  if (inst_all == 0)
     373                    state = CONTEXT_STATE_KO_EXCEP_ADDR;
     374                  break;
     375                }
     376              case CONTEXT_STATE_KO_MISS         :
     377                {
     378                  // Wait end of all instruction
     379                  if (inst_all == 0)
     380                    state = CONTEXT_STATE_KO_MISS_ADDR;
     381                  break;
     382                }
     383              case CONTEXT_STATE_KO_EXCEP_ADDR   :
     384                {
     385                  // nothing, wait the update of internal register (pc)
     386                  break;
     387                }
     388              case CONTEXT_STATE_KO_EXCEP_SPR    :
     389                {
     390                  // nothing, wait the update of internal register (epcr, eear, sr, esr)
     391                  break;
     392                }
     393              case CONTEXT_STATE_KO_MISS_ADDR    :
     394                {
     395                  // nothing, wait the update of internal register (pc)
     396                  break;
     397                }
     398              case CONTEXT_STATE_KO_PSYNC        :
     399                {
     400                  // Wait end of all instruction
     401                  if (inst_all == 0)
     402//                  state = CONTEXT_STATE_KO_PSYNC_FLUSH;
     403                    state = CONTEXT_STATE_KO_PSYNC_ADDR ;
     404                  break;
     405                }
     406//            case CONTEXT_STATE_KO_PSYNC_FLUSH  :
     407//              {
     408//                // nothing, wait end of flush (ifetch)
     409//                break;
     410//              }
     411              case CONTEXT_STATE_KO_PSYNC_ADDR   :
     412                {
     413                  // nothing, wait the pc write
     414                  break;
     415                }
     416              case CONTEXT_STATE_KO_CSYNC        :
     417                {
     418                  // Wait end of all instruction
     419                  if (inst_all == 0)
     420                    state = CONTEXT_STATE_KO_CSYNC_ADDR ;
     421//                  state = CONTEXT_STATE_KO_CSYNC_FLUSH;
     422                  break;
     423                }
     424//            case CONTEXT_STATE_KO_CSYNC_FLUSH  :
     425//              {
     426//                // nothing, wait end of flush (all internal structure)
     427//                break;
     428//              }
     429              case CONTEXT_STATE_KO_CSYNC_ADDR   :
     430                {
     431                  // nothing, wait the pc write
     432                  break;
     433                }
     434              case CONTEXT_STATE_KO_MSYNC        :
     435                {
     436                  // Wait end of memory instruction
     437                  if (inst_mem == 0)
     438                    state = CONTEXT_STATE_KO_MSYNC_ISSUE;
     439                  break;
     440                }
     441              case CONTEXT_STATE_KO_MSYNC_ISSUE  :
     442                {
     443                  // Wait the msync issue
     444                  if (inst_mem != 0)
     445                    state = CONTEXT_STATE_KO_MSYNC_EXEC;
     446                  break;
     447                }
     448              case CONTEXT_STATE_KO_MSYNC_EXEC   :
     449                {
     450                  // Wait the end of msync
     451                  if (inst_mem == 0)
     452                    state = CONTEXT_STATE_OK;
     453                  break;
     454                }
     455              case CONTEXT_STATE_KO_SPR          :
     456                {
     457                  // Wait end of all instruction
     458                  if (inst_all == 0)
     459                    state = CONTEXT_STATE_KO_SPR_ISSUE;
     460                  break;
     461                }
     462              case CONTEXT_STATE_KO_SPR_ISSUE    :
     463                {
     464                  // Wait the spr_access issue
     465                  if (inst_all != 0)
     466                    state = CONTEXT_STATE_KO_SPR_EXEC;
     467                  break;
     468                }
     469              case CONTEXT_STATE_KO_SPR_EXEC     :
     470                {
     471                  // Wait the spr_access execution
     472                  if (inst_all == 0)
     473                    state = CONTEXT_STATE_OK;
     474                  break;
     475                }
     476
     477              default :
     478                {
     479                  throw ERRORMORPHEO(FUNCTION,toString(_("Context[%d], Unknow state : %s.\n"),i,toString(state).c_str()));
     480                }
     481              }
     482            reg_STATE [i] = state;
     483          }
     484
     485        for (uint32_t i=0; i<_param->_nb_context; ++i)
     486          {
     487            reg_INTERRUPT_ENABLE [i] = PORT_READ(in_INTERRUPT_ENABLE [i]) and PORT_READ(in_SPR_SR_IEE [i]);
     488
     489            if (reg_INTERRUPT_ENABLE [i])
     490              throw ERRORMORPHEO(FUNCTION,toString(_("Context[%d], Have an interruption, Not yet supported (Comming Soon).\n"),i));
     491          }
    428492      }
    429493
     
    431495    for (uint32_t i=0; i<_param->_nb_context; i++)
    432496      {
    433         log_printf(TRACE,Context_State,FUNCTION,"Context State [%d]",i);
    434         log_printf(TRACE,Context_State,FUNCTION," * reg_STATE                  : %s"  ,toString(reg_STATE [i]).c_str());
    435         log_printf(TRACE,Context_State,FUNCTION," * reg_EVENT_ADDRESS          : 0x%x",reg_EVENT_ADDRESS          [i]);
    436         log_printf(TRACE,Context_State,FUNCTION," * reg_EVENT_ADDRESS_EPCR     : 0x%x",reg_EVENT_ADDRESS_EPCR     [i]);
    437         log_printf(TRACE,Context_State,FUNCTION," * reg_EVENT_ADDRESS_EPCR_VAL : %d"  ,reg_EVENT_ADDRESS_EPCR_VAL [i]);
    438         log_printf(TRACE,Context_State,FUNCTION," * reg_EVENT_ADDRESS_EEAR     : 0x%x",reg_EVENT_ADDRESS_EEAR     [i]);
    439         log_printf(TRACE,Context_State,FUNCTION," * reg_EVENT_ADDRESS_EEAR_VAL : %d"  ,reg_EVENT_ADDRESS_EEAR_VAL [i]);
    440         log_printf(TRACE,Context_State,FUNCTION," * reg_EVENT_IS_DELAY_SLOT    : %d"  ,reg_EVENT_IS_DELAY_SLOT    [i]);
    441         log_printf(TRACE,Context_State,FUNCTION," * reg_EVENT_IS_DS_TAKE       : %d"  ,reg_EVENT_IS_DS_TAKE       [i]);
    442         log_printf(TRACE,Context_State,FUNCTION," * reg_EVENT_DEPTH            : %d"  ,reg_EVENT_DEPTH            [i]);
     497        log_printf(TRACE,Context_State,FUNCTION,"  * Dump Context State [%d]",i);
     498        log_printf(TRACE,Context_State,FUNCTION,"    * reg_STATE                  : %s"         ,toString(reg_STATE [i]).c_str());
     499        log_printf(TRACE,Context_State,FUNCTION,"    * reg_EVENT_ADDRESS          : 0x%x (0x%x)",reg_EVENT_ADDRESS          [i],reg_EVENT_ADDRESS      [i]<<2);
     500        log_printf(TRACE,Context_State,FUNCTION,"    * reg_EVENT_ADDRESS_EPCR     : 0x%x (0x%x)",reg_EVENT_ADDRESS_EPCR     [i],reg_EVENT_ADDRESS_EPCR [i]<<2);
     501        log_printf(TRACE,Context_State,FUNCTION,"    * reg_EVENT_ADDRESS_EPCR_VAL : %d"         ,reg_EVENT_ADDRESS_EPCR_VAL [i]);
     502        log_printf(TRACE,Context_State,FUNCTION,"    * reg_EVENT_ADDRESS_EEAR     : 0x%x (0x%x)",reg_EVENT_ADDRESS_EEAR     [i],reg_EVENT_ADDRESS_EEAR [i]<<2);
     503        log_printf(TRACE,Context_State,FUNCTION,"    * reg_EVENT_ADDRESS_EEAR_VAL : %d"         ,reg_EVENT_ADDRESS_EEAR_VAL [i]);
     504        log_printf(TRACE,Context_State,FUNCTION,"    * reg_EVENT_IS_DELAY_SLOT    : %d"         ,reg_EVENT_IS_DELAY_SLOT    [i]);
     505        log_printf(TRACE,Context_State,FUNCTION,"    * reg_EVENT_IS_DS_TAKE       : %d"         ,reg_EVENT_IS_DS_TAKE       [i]);
     506        log_printf(TRACE,Context_State,FUNCTION,"    * reg_EVENT_DEPTH            : %d"         ,reg_EVENT_DEPTH            [i]);
    443507      }
    444508#endif
Note: See TracChangeset for help on using the changeset viewer.