source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Special_Register_unit/src/Special_Register_unit_transition.cpp @ 97

Last change on this file since 97 was 97, checked in by rosiere, 15 years ago

1) Update Prediction Table : statistics
2) Size instruction address on 30 bits
3) Change Log File
4) Add debug_level in simulation configuration file

  • Property svn:keywords set to Id
File size: 4.4 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id: Special_Register_unit_transition.cpp 97 2008-12-19 15:34:00Z rosiere $
4 *
5 * [ Description ]
6 *
7 */
8
9#include "Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Special_Register_unit/include/Special_Register_unit.h"
10
11namespace morpheo                    {
12namespace behavioural {
13namespace core {
14namespace multi_ooo_engine {
15namespace ooo_engine {
16namespace special_register_unit {
17
18
19#undef  FUNCTION
20#define FUNCTION "Special_Register_unit::transition"
21  void Special_Register_unit::transition (void)
22  {
23    log_begin(Special_Register_unit,FUNCTION);
24
25    if (PORT_READ(in_NRESET) == 0)
26      {
27        for (uint32_t i=0; i<_param->_nb_front_end; i++)
28          for (uint32_t j=0; j<_param->_nb_context[i]; j++)
29            for (uint32_t k=0; k<NB_GROUP; k++)
30              if (_param->_implement_group [i][j][k])
31                for (uint32_t l=0; l<NB_REG_GROUP[k]; l++)
32                  if (_spr_access_mode [i][j]->exist(k,l))
33                    {
34#ifdef DEBUG_TEST
35                      if (_spr [i][j][k]    == NULL)
36                        throw ERRORMORPHEO(FUNCTION,toString(_("Group [%d] is not implemented.\n"),k));
37                      if (_spr [i][j][k][l] == NULL)
38                        throw ERRORMORPHEO(FUNCTION,toString(_("Register [%d][%d] is not implemented.\n"),k,l));
39#endif
40                      log_printf(TRACE,Special_Register_unit,FUNCTION,"Reset SPR [%d][%d][%d][%d]",i,j,k,l);
41                      _spr [i][j][k][l]->reset();
42                    }
43
44      }
45    else
46      {
47        // ===================================================================
48        // =====[ SPR_ACCESS ]================================================
49        // ===================================================================
50        for (uint32_t i=0; i<_param->_nb_inst_reexecute; i++)
51          if (PORT_READ(in_SPR_ACCESS_VAL [i]) and internal_SPR_ACCESS_ACK [i])
52            if (PORT_READ(in_SPR_ACCESS_WEN [i]))
53              {
54                Tcontext_t     front_end_id = (_param->_have_port_front_end_id)?PORT_READ(in_SPR_ACCESS_FRONT_END_ID [i]):0;
55                Tcontext_t     context_id   = (_param->_have_port_context_id  )?PORT_READ(in_SPR_ACCESS_CONTEXT_ID   [i]):0;
56                Tspr_address_t num_group    = PORT_READ(in_SPR_ACCESS_NUM_GROUP [i]);
57                Tspr_address_t num_reg      = PORT_READ(in_SPR_ACCESS_NUM_REG   [i]);
58
59                SR * sr = static_cast<SR*>(_spr [front_end_id][context_id][GROUP_SYSTEM_AND_CONTROL][SPR_SR]);
60
61                Tcontrol_t sm    = sr->sm   ;
62                Tcontrol_t sumra = sr->sumra;
63
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]));
68               
69              }
70       
71        // ===================================================================
72        // =====[ SPR_COMMIT ]-===============================================
73        // ===================================================================
74        for (uint32_t i=0; i<_param->_nb_front_end; i++)
75          for (uint32_t j=0; j<_param->_nb_context[i]; j++)
76            {
77              if (PORT_READ(in_SPR_COMMIT_VAL [i][j])) // out_SPR_COMMIT_ACK [i][j]
78                {
79                  SR * sr = static_cast<SR*>(_spr [i][j][GROUP_SYSTEM_AND_CONTROL][SPR_SR]);
80
81                  if (PORT_READ(in_SPR_COMMIT_SR_F_VAL  [i][j]))
82                    sr->= PORT_READ(in_SPR_COMMIT_SR_F  [i][j]);
83                 
84                  if (PORT_READ(in_SPR_COMMIT_SR_CY_VAL [i][j]))
85                    sr->cy = PORT_READ(in_SPR_COMMIT_SR_CY [i][j]);
86                 
87                  if (PORT_READ(in_SPR_COMMIT_SR_OV_VAL [i][j]))
88                    sr->ov = PORT_READ(in_SPR_COMMIT_SR_OV [i][j]);
89                }
90
91              if (PORT_READ(in_SPR_EVENT_VAL [i][j])) // out_SPR_EVENT_ACK [i][j]
92                {
93                  SR * sr = static_cast<SR*>(_spr [i][j][GROUP_SYSTEM_AND_CONTROL][SPR_SR]);
94                  sr->dsx = PORT_READ(in_SPR_EVENT_SR_DSX [i][j]);
95
96                  _spr [i][j][GROUP_SYSTEM_AND_CONTROL][SPR_EPCR]->write(PORT_READ(in_SPR_EVENT_EPCR [i][j]));
97                  if (PORT_READ(in_SPR_EVENT_EEAR_WEN [i][j]))
98                  _spr [i][j][GROUP_SYSTEM_AND_CONTROL][SPR_EEAR]->write(PORT_READ(in_SPR_EVENT_EEAR [i][j]));
99                  if (PORT_READ(in_SPR_EVENT_SR_TO_ESR [i][j]))
100                  _spr [i][j][GROUP_SYSTEM_AND_CONTROL][SPR_ESR ]->write(sr->read());
101                }
102            }
103      }
104
105#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
106    end_cycle ();
107#endif
108
109    log_end(Special_Register_unit,FUNCTION);
110  };
111
112}; // end namespace special_register_unit
113}; // end namespace ooo_engine
114}; // end namespace multi_ooo_engine
115}; // end namespace core
116
117}; // end namespace behavioural
118}; // end namespace morpheo             
119#endif
Note: See TracBrowser for help on using the repository browser.