Ignore:
Timestamp:
Dec 31, 2008, 11:18:08 AM (16 years ago)
Author:
rosiere
Message:

1) Fix bug (read unit, RAT -> write in R0, SPR desallocation ...)
2) Change VHDL Execute_queue -> use Generic/Queue?
3) Complete document on VHDL generation
4) Add soc test

Location:
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Special_Register_unit
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Special_Register_unit/include/SPR.h

    r88 r98  
    3434  public : Tspr_t read  (void  )
    3535    {
    36       return x=0;
     36      return x;
    3737    };
    3838  public : void   write (Tspr_t x)
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Special_Register_unit/src/Special_Register_unit_allocation.cpp

    r88 r98  
    148148                {
    149149                  _spr [i][j][k] = new SPR * [NB_REG_GROUP[k]];
    150 
     150                 
     151                  for (uint32_t l=0; l<NB_REG_GROUP[k]; l++)
     152                    _spr [i][j][k][l] = NULL;
     153                 
    151154                  switch (k)
    152155                    {
     
    218221                    default :
    219222                      {
    220                         for (uint32_t l=0; l<NB_REG_GROUP[k]; l++)
    221                           _spr [i][j][k][l] = NULL;
    222223                      }
    223224                    }
     
    232233        for (uint32_t k=0; k<NB_GROUP; k++)
    233234          if (_param->_implement_group [i][j][k])
    234             for (uint32_t l=0; l<NB_REG_GROUP[k]; l++)
    235               if (_spr [i][j][k][l] == NULL)
    236                 _spr_access_mode [i][j]->invalid_register (k,l);
     235            {
     236              for (uint32_t l=0; l<NB_REG_GROUP[k]; l++)
     237                if (_spr [i][j][k][l] == NULL)
     238                  _spr_access_mode [i][j]->invalid_register (k,l);
     239            }
     240          else
     241            {
     242              for (uint32_t l=0; l<NB_REG_GROUP[k]; l++)
     243                _spr_access_mode [i][j]->invalid_register (k,l);
     244            }
    237245
    238246#ifdef POSITION
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Special_Register_unit/src/Special_Register_unit_deallocation.cpp

    r88 r98  
    7777            for (uint32_t k=0; k<NB_GROUP; k++)
    7878              {
    79                 if (_param->_implement_group [i][j][k])
     79                if (_spr [i][j][k] != NULL)
    8080                  {
    8181                    for (uint32_t l=0; l<NB_REG_GROUP[k]; l++)
    82                       if (_spr [i][j][k] != NULL)
     82                      if (_spr [i][j][k][l] != NULL)
    8383                        delete _spr [i][j][k][l];
    8484                    delete [] _spr [i][j][k];
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Special_Register_unit/src/Special_Register_unit_genMealy_spr_access.cpp

    r88 r98  
    2222  {
    2323    log_begin(Special_Register_unit,FUNCTION);
    24 
     24    log_function(Special_Register_unit,FUNCTION,_name.c_str());
    2525
    2626    // ===================================================================
     
    2828    // ===================================================================
    2929    for (uint32_t i=0; i<_param->_nb_inst_reexecute; i++)
    30 //       if (PORT_READ(in_SPR_ACCESS_VAL [i]) and not PORT_READ(in_SPR_ACCESS_WEN [i]))
     30      // not necessery if have not read enable
     31      if (PORT_READ(in_SPR_ACCESS_VAL [i]))
    3132        {
     33          log_printf(TRACE,Special_Register_unit,FUNCTION,"  * SPR_ACCESS [%d]",i);
     34
    3235          Tcontext_t     front_end_id = (_param->_have_port_front_end_id)?PORT_READ(in_SPR_ACCESS_FRONT_END_ID [i]):0;
    3336          Tcontext_t     context_id   = (_param->_have_port_context_id  )?PORT_READ(in_SPR_ACCESS_CONTEXT_ID   [i]):0;
     
    3538          Tspr_address_t num_reg      = PORT_READ(in_SPR_ACCESS_NUM_REG   [i]);
    3639         
     40          log_printf(TRACE,Special_Register_unit,FUNCTION,"    * front_end_id : %d",front_end_id);
     41          log_printf(TRACE,Special_Register_unit,FUNCTION,"    * context_id   : %d",context_id  );
     42          log_printf(TRACE,Special_Register_unit,FUNCTION,"    * num_group    : %d",num_group   );
     43          log_printf(TRACE,Special_Register_unit,FUNCTION,"    * num_reg      : %d",num_reg     );
     44         
     45#ifdef DEBUG_TEST
     46          if (not _spr_access_mode [front_end_id][context_id]->exist(num_group,num_reg))
     47            msgWarning("Access at an invalid special register (group %d, register %d)\n",num_group,num_reg);
     48#endif
     49
    3750          SR * sr = static_cast<SR*>(_spr [front_end_id][context_id][GROUP_SYSTEM_AND_CONTROL][SPR_SR]);
    3851         
     
    4356                                                                               sm,
    4457                                                                               sumra);
    45          
    46           PORT_WRITE(out_SPR_ACCESS_RDATA   [i], (valid)?_spr[front_end_id][context_id][num_group][num_reg]->read():0);
    47           PORT_WRITE(out_SPR_ACCESS_INVALID [i], not valid);
     58
     59          log_printf(TRACE,Special_Register_unit,FUNCTION,"    * SM           : %d",sm);
     60          log_printf(TRACE,Special_Register_unit,FUNCTION,"    * SUMRA        : %d",sumra);
     61          log_printf(TRACE,Special_Register_unit,FUNCTION,"    * valid        : %d",valid);
     62
     63          // ISA OpenRISC : no action/exception if unauthorised spr access. Also, read 0.
     64//           if (not PORT_READ(in_SPR_ACCESS_WEN [i]))
     65//             {
     66          Tspr_t rdata = (valid)?(_spr[front_end_id][context_id][num_group][num_reg]->read()):0;
     67
     68          log_printf(TRACE,Special_Register_unit,FUNCTION,"    * rdata        : %.8x",rdata);
     69
     70          PORT_WRITE(out_SPR_ACCESS_RDATA   [i], rdata);
     71//             }
     72          PORT_WRITE(out_SPR_ACCESS_INVALID [i], not valid);
    4873        }
    4974   
    50 #if defined(STATISTICS) or defined(VHDL_TESTBENCH)
    51     end_cycle ();
    52 #endif
    53 
    5475    log_end(Special_Register_unit,FUNCTION);
    5576  };
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Special_Register_unit/src/Special_Register_unit_genMoore.cpp

    r88 r98  
    2222  {
    2323    log_begin(Special_Register_unit,FUNCTION);
     24    log_function(Special_Register_unit,FUNCTION,_name.c_str());
    2425
    2526    // ===================================================================
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Special_Register_unit/src/Special_Register_unit_transition.cpp

    r97 r98  
    2222  {
    2323    log_begin(Special_Register_unit,FUNCTION);
     24    log_function(Special_Register_unit,FUNCTION,_name.c_str());
    2425
    2526    if (PORT_READ(in_NRESET) == 0)
     
    3839                        throw ERRORMORPHEO(FUNCTION,toString(_("Register [%d][%d] is not implemented.\n"),k,l));
    3940#endif
    40                       log_printf(TRACE,Special_Register_unit,FUNCTION,"Reset SPR [%d][%d][%d][%d]",i,j,k,l);
     41                      log_printf(TRACE,Special_Register_unit,FUNCTION,"  * Reset SPR [%d][%d][%d][%d]",i,j,k,l);
    4142                      _spr [i][j][k][l]->reset();
    4243                    }
     
    5253            if (PORT_READ(in_SPR_ACCESS_WEN [i]))
    5354              {
     55                log_printf(TRACE,Special_Register_unit,FUNCTION,"  * SPR_ACCESS [%d]",i);
     56
    5457                Tcontext_t     front_end_id = (_param->_have_port_front_end_id)?PORT_READ(in_SPR_ACCESS_FRONT_END_ID [i]):0;
    5558                Tcontext_t     context_id   = (_param->_have_port_context_id  )?PORT_READ(in_SPR_ACCESS_CONTEXT_ID   [i]):0;
     
    5760                Tspr_address_t num_reg      = PORT_READ(in_SPR_ACCESS_NUM_REG   [i]);
    5861
     62                log_printf(TRACE,Special_Register_unit,FUNCTION,"    * front_end_id : %d",front_end_id);
     63                log_printf(TRACE,Special_Register_unit,FUNCTION,"    * context_id   : %d",context_id  );
     64                log_printf(TRACE,Special_Register_unit,FUNCTION,"    * num_group    : %d",num_group   );
     65                log_printf(TRACE,Special_Register_unit,FUNCTION,"    * num_reg      : %d",num_reg     );
     66
    5967                SR * sr = static_cast<SR*>(_spr [front_end_id][context_id][GROUP_SYSTEM_AND_CONTROL][SPR_SR]);
    6068
    6169                Tcontrol_t sm    = sr->sm   ;
    6270                Tcontrol_t sumra = sr->sumra;
     71                Tcontrol_t valid = _spr_access_mode [front_end_id][context_id]->write(spr_address_t(num_group,num_reg),
     72                                                                                      sm,
     73                                                                                      sumra);   
     74                log_printf(TRACE,Special_Register_unit,FUNCTION,"    * SM           : %d",sm);
     75                log_printf(TRACE,Special_Register_unit,FUNCTION,"    * SUMRA        : %d",sumra);
     76                log_printf(TRACE,Special_Register_unit,FUNCTION,"    * valid        : %d",valid);
    6377
    64                 if (_spr_access_mode [front_end_id][context_id]->write(spr_address_t(num_group,num_reg),
    65                                                                        sm,
    66                                                                        sumra))
    67                   _spr[front_end_id][context_id][num_group][num_reg]->write(PORT_READ(in_SPR_ACCESS_WDATA [i]));
     78                if (valid)
     79                  {
     80                    Tspr_t wdata = PORT_READ(in_SPR_ACCESS_WDATA [i]);
     81
     82                    log_printf(TRACE,Special_Register_unit,FUNCTION,"    * wdata        : %.8x",wdata);
     83
     84                    _spr[front_end_id][context_id][num_group][num_reg]->write(wdata);
     85                  }
    6886               
    6987              }
Note: See TracChangeset for help on using the changeset viewer.