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

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

1) Add soc test
2) fix bug (Pc management, Decod and execute, Update prediction ...)

  • Property svn:keywords set to Id
File size: 11.0 KB
Line 
1/*
2 * $Id: Special_Register_unit_allocation.cpp 101 2009-01-15 17:19:08Z rosiere $
3 *
4 * [ Description ]
5 *
6 */
7
8#include "Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Special_Register_unit/include/Special_Register_unit.h"
9#include "Behavioural/include/Allocation.h"
10#include "Common/include/Max.h"
11
12namespace morpheo                    {
13namespace behavioural {
14namespace core {
15namespace multi_ooo_engine {
16namespace ooo_engine {
17namespace special_register_unit {
18
19
20
21#undef  FUNCTION
22#define FUNCTION "Special_Register_unit::allocation"
23  void Special_Register_unit::allocation (
24#ifdef STATISTICS
25                               morpheo::behavioural::Parameters_Statistics * param_statistics
26#else
27                               void
28#endif
29                               )
30  {
31    log_begin(Special_Register_unit,FUNCTION);
32
33    _component   = new Component (_usage);
34
35    Entity * entity = _component->set_entity (_name       
36                                              ,"Special_Register_unit"
37#ifdef POSITION
38                                              ,COMBINATORY
39#endif
40                                              );
41
42    _interfaces = entity->set_interfaces();
43
44    // ~~~~~[ Interface : "" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
45    {
46      Interface * interface = _interfaces->set_interface(""
47#ifdef POSITION
48                                                         ,IN
49                                                         ,SOUTH,
50                                                         _("Generalist interface")
51#endif
52                                                         );
53     
54      in_CLOCK        = interface->set_signal_clk              ("clock" ,1, CLOCK_VHDL_YES);
55      in_NRESET       = interface->set_signal_in  <Tcontrol_t> ("nreset",1, RESET_VHDL_YES);
56    }
57
58    // ~~~~~[ Interface : "spr_access" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
59    {
60      ALLOC1_INTERFACE("spr_access",IN,WEST, _("Access from reexecute_unit"), _param->_nb_inst_reexecute);
61
62      ALLOC1_VALACK_IN ( in_SPR_ACCESS_VAL           ,VAL);
63      ALLOC1_VALACK_OUT(out_SPR_ACCESS_ACK           ,ACK);
64      ALLOC1_SIGNAL_IN ( in_SPR_ACCESS_WEN           ,"wen"         ,Tcontrol_t         ,1);
65      ALLOC1_SIGNAL_IN ( in_SPR_ACCESS_CONTEXT_ID    ,"context_id"  ,Tcontext_t         ,_param->_size_context_id  );
66      ALLOC1_SIGNAL_IN ( in_SPR_ACCESS_FRONT_END_ID  ,"front_end_id",Tcontext_t         ,_param->_size_front_end_id);
67      ALLOC1_SIGNAL_IN ( in_SPR_ACCESS_NUM_GROUP     ,"num_group"   ,Tspr_address_t     ,_param->_size_special_address_group   );
68      ALLOC1_SIGNAL_IN ( in_SPR_ACCESS_NUM_REG       ,"num_reg"     ,Tspr_address_t     ,_param->_size_special_address_register);
69      ALLOC1_SIGNAL_IN ( in_SPR_ACCESS_WDATA         ,"wdata"       ,Tspr_t             ,_param->_size_spr);
70      ALLOC1_SIGNAL_OUT(out_SPR_ACCESS_RDATA         ,"rdata"       ,Tspr_t             ,_param->_size_spr);
71      ALLOC1_SIGNAL_OUT(out_SPR_ACCESS_INVALID       ,"invalid"     ,Tcontrol_t         ,1);
72    }
73
74    // ~~~~~[ Interface : "spr_read" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
75    {
76      ALLOC2_INTERFACE("spr_read",OUT,WEST, _("Output for a spr bit field."), _param->_nb_front_end, _param->_nb_context[it1]);
77
78      _ALLOC2_SIGNAL_OUT(out_SPR_READ_SR             ,"sr",Tspr_t,_param->_size_spr, _param->_nb_front_end, _param->_nb_context[it1]);
79    }
80
81    // ~~~~~[ Interface : "spr_commit" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
82    {
83      ALLOC2_INTERFACE("spr_commit",IN,WEST, _("Commit instruction to change SR's flags."), _param->_nb_front_end, _param->_nb_context[it1]);
84
85      _ALLOC2_VALACK_IN ( in_SPR_COMMIT_VAL           ,VAL,_param->_nb_front_end, _param->_nb_context[it1]);
86      _ALLOC2_VALACK_OUT(out_SPR_COMMIT_ACK           ,ACK,_param->_nb_front_end, _param->_nb_context[it1]);
87      _ALLOC2_SIGNAL_IN ( in_SPR_COMMIT_SR_F_VAL      ,"sr_f_val"     ,Tcontrol_t         ,1,_param->_nb_front_end, _param->_nb_context[it1]);
88      _ALLOC2_SIGNAL_IN ( in_SPR_COMMIT_SR_F          ,"sr_f"         ,Tcontrol_t         ,1,_param->_nb_front_end, _param->_nb_context[it1]);
89      _ALLOC2_SIGNAL_IN ( in_SPR_COMMIT_SR_CY_VAL     ,"sr_cy_val"    ,Tcontrol_t         ,1,_param->_nb_front_end, _param->_nb_context[it1]);
90      _ALLOC2_SIGNAL_IN ( in_SPR_COMMIT_SR_CY         ,"sr_cy"        ,Tcontrol_t         ,1,_param->_nb_front_end, _param->_nb_context[it1]);
91      _ALLOC2_SIGNAL_IN ( in_SPR_COMMIT_SR_OV_VAL     ,"sr_ov_val"    ,Tcontrol_t         ,1,_param->_nb_front_end, _param->_nb_context[it1]);
92      _ALLOC2_SIGNAL_IN ( in_SPR_COMMIT_SR_OV         ,"sr_ov"        ,Tcontrol_t         ,1,_param->_nb_front_end, _param->_nb_context[it1]);
93    }
94
95    // ~~~~~[ Interface "spr_event" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
96    {
97      ALLOC2_INTERFACE("spr_event",IN,WEST, _("Event change a lot of exception."), _param->_nb_front_end, _param->_nb_context[it1]);
98
99      _ALLOC2_VALACK_IN ( in_SPR_EVENT_VAL            ,VAL,_param->_nb_front_end, _param->_nb_context[it1]);
100      _ALLOC2_VALACK_OUT(out_SPR_EVENT_ACK            ,ACK,_param->_nb_front_end, _param->_nb_context[it1]);
101      _ALLOC2_SIGNAL_IN ( in_SPR_EVENT_EPCR          ,"EPCR"          ,Tspr_t            ,_param->_size_spr,_param->_nb_front_end, _param->_nb_context[it1]);
102      _ALLOC2_SIGNAL_IN ( in_SPR_EVENT_EEAR_WEN      ,"EEAR_WEN"      ,Tcontrol_t        ,1                ,_param->_nb_front_end, _param->_nb_context[it1]);
103      _ALLOC2_SIGNAL_IN ( in_SPR_EVENT_EEAR          ,"EEAR"          ,Tspr_t            ,_param->_size_spr,_param->_nb_front_end, _param->_nb_context[it1]);
104      _ALLOC2_SIGNAL_IN ( in_SPR_EVENT_SR_DSX        ,"SR_DSX"        ,Tcontrol_t        ,1                ,_param->_nb_front_end, _param->_nb_context[it1]);
105      _ALLOC2_SIGNAL_IN ( in_SPR_EVENT_SR_TO_ESR     ,"SR_TO_ESR"     ,Tcontrol_t        ,1                ,_param->_nb_front_end, _param->_nb_context[it1]);
106    }
107
108    if (usage_is_set(_usage,USE_SYSTEMC))
109      {
110    // ~~~~~[ Internal ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
111    internal_SPR_ACCESS_ACK = new Tcontrol_t   [_param->_nb_inst_reexecute];
112    internal_SPR_COMMIT_ACK = new Tcontrol_t * [_param->_nb_front_end];
113    internal_SPR_EVENT_ACK  = new Tcontrol_t * [_param->_nb_front_end];
114    for (uint32_t i=0; i<_param->_nb_front_end; i++)
115      {
116        internal_SPR_COMMIT_ACK [i]  = new Tcontrol_t [_param->_nb_context [i]];
117        internal_SPR_EVENT_ACK  [i]  = new Tcontrol_t [_param->_nb_context [i]];
118      }
119      }
120
121    // ~~~~~[ Component ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
122    _spr_access_mode = new SPR_access_mode ** [_param->_nb_front_end];
123    for (uint32_t i=0; i<_param->_nb_front_end; i++)
124      {
125        _spr_access_mode [i] = new SPR_access_mode * [_param->_nb_context[i]];
126
127        for (uint32_t j=0; j<_param->_nb_context[i]; j++)
128          {
129            _spr_access_mode [i][j] = new SPR_access_mode;
130
131            for (uint32_t k=0; k<NB_GROUP; k++)
132              if (_param->_implement_group [i][j][k])
133                _spr_access_mode [i][j]->implement_group(k);
134          }
135      }
136
137    _spr = new SPR **** [_param->_nb_front_end];
138    for (uint32_t i=0; i<_param->_nb_front_end; i++)
139      {
140        _spr [i] = new SPR *** [_param->_nb_context[i]];
141
142        for (uint32_t j=0; j<_param->_nb_context[i]; j++)
143          {
144            _spr [i][j] = new SPR ** [NB_GROUP];
145
146            for (uint32_t k=0; k<NB_GROUP; k++)
147              if (_param->_implement_group [i][j][k])
148                {
149                  _spr [i][j][k] = new SPR * [NB_REG_GROUP[k]];
150                 
151                  for (uint32_t l=0; l<NB_REG_GROUP[k]; l++)
152                    _spr [i][j][k][l] = NULL;
153                 
154                  switch (k)
155                    {
156                    case GROUP_SYSTEM_AND_CONTROL  :
157                      {
158                        _spr [i][j][k][SPR_VR          ] = new VR          (i,j,_param);
159                        _spr [i][j][k][SPR_UPR         ] = new UPR         (i,j,_param);
160                        _spr [i][j][k][SPR_CPUCFGR     ] = new CPUCFGR     (i,j,_param);
161                        _spr [i][j][k][SPR_DMMUCFGR    ] = new DMMUCFGR    (i,j,_param);
162                        _spr [i][j][k][SPR_IMMUCFGR    ] = new IMMUCFGR    (i,j,_param);
163                        _spr [i][j][k][SPR_DCCFGR      ] = new DCCFGR      (i,j,_param);
164                        _spr [i][j][k][SPR_ICCFGR      ] = new ICCFGR      (i,j,_param);
165                        _spr [i][j][k][SPR_DCFGR       ] = new DCFGR       (i,j,_param);
166                        _spr [i][j][k][SPR_PCCFGR      ] = new PCCFGR      (i,j,_param);
167                        _spr [i][j][k][SPR_NPC         ] = new NPC         (i,j,_param);
168                        _spr [i][j][k][SPR_SR          ] = new SR          (i,j,_param);
169                        _spr [i][j][k][SPR_PPC         ] = new PPC         (i,j,_param);
170                        _spr [i][j][k][SPR_FPCSR       ] = new FPCSR       (i,j,_param);
171                        _spr [i][j][k][SPR_CID         ] = new CID         (i,j,_param);
172                        _spr [i][j][k][SPR_TID         ] = new TID         (i,j,_param);
173                        _spr [i][j][k][SPR_TSR         ] = new TSR         (i,j,_param);
174                        _spr [i][j][k][SPR_EPCR        ] = new EPCR        (i,j,_param);
175                        _spr [i][j][k][SPR_EEAR        ] = new EEAR        (i,j,_param);
176                        _spr [i][j][k][SPR_ESR         ] = new ESR         (i,j,_param);
177//                      _spr [i][j][k][SPR_GPR         ] = new GPR         (i,j,_param);
178                       
179                        break;
180                      }
181                    case GROUP_DCACHE              :
182                      {
183                        _spr [i][j][k][SPR_DCCR        ] = new DCCR        (i,j,_param);
184                        _spr [i][j][k][SPR_DCBPR       ] = new DCBPR       (i,j,_param);
185                        _spr [i][j][k][SPR_DCBFR       ] = new DCBFR       (i,j,_param);
186                        _spr [i][j][k][SPR_DCBIR       ] = new DCBIR       (i,j,_param);
187                        _spr [i][j][k][SPR_DCBWR       ] = new DCBWR       (i,j,_param);
188                        _spr [i][j][k][SPR_DCBLR       ] = new DCBLR       (i,j,_param);
189
190                        break;
191                      }
192                    case GROUP_DMMU                :
193                    case GROUP_IMMU                :
194                    case GROUP_ICACHE              :
195                    case GROUP_DEBUG               :
196                    case GROUP_PERFORMANCE_COUNTER :
197                    case GROUP_POWER_MANAGEMENT    :
198                    case GROUP_PIC                 :
199                    case GROUP_TICK_TIMER          :
200                    case GROUP_FLOATING_POINT      :
201                    case GROUP_MAC                 :
202                    case GROUP_RESERVED_1          :
203                    case GROUP_RESERVED_2          :
204                    case GROUP_RESERVED_3          :
205                    case GROUP_RESERVED_4          :
206                    case GROUP_RESERVED_5          :
207                    case GROUP_RESERVED_6          :
208                    case GROUP_RESERVED_7          :
209                    case GROUP_RESERVED_8          :
210                    case GROUP_RESERVED_9          :
211                    case GROUP_RESERVED_10         :
212                    case GROUP_RESERVED_11         :
213                    case GROUP_RESERVED_12         :
214                    case GROUP_CUSTOM_1            :
215                    case GROUP_CUSTOM_2            :
216                    case GROUP_CUSTOM_3            :
217                    case GROUP_CUSTOM_4            :
218                    case GROUP_CUSTOM_5            :
219                    case GROUP_CUSTOM_6            :
220                    case GROUP_CUSTOM_7            :
221                    case GROUP_CUSTOM_8            :
222                    default :
223                      {
224                      }
225                    }
226                }
227              else
228                _spr [i][j][k] = NULL;
229          }
230      }
231   
232    for (uint32_t i=0; i<_param->_nb_front_end; i++)
233      for (uint32_t j=0; j<_param->_nb_context[i]; j++)
234        for (uint32_t k=0; k<NB_GROUP; k++)
235          if (_param->_implement_group [i][j][k])
236            {
237              for (uint32_t l=0; l<NB_REG_GROUP[k]; l++)
238                if (_spr [i][j][k][l] == NULL)
239                  _spr_access_mode [i][j]->invalid_register (k,l);
240            }
241          else
242            {
243              for (uint32_t l=0; l<NB_REG_GROUP[k]; l++)
244                _spr_access_mode [i][j]->invalid_register (k,l);
245            }
246
247#ifdef POSITION
248    if (usage_is_set(_usage,USE_POSITION))
249      _component->generate_file();
250#endif
251
252    log_end(Special_Register_unit,FUNCTION);
253  };
254
255}; // end namespace special_register_unit
256}; // end namespace ooo_engine
257}; // end namespace multi_ooo_engine
258}; // end namespace core
259
260}; // end namespace behavioural
261}; // end namespace morpheo             
Note: See TracBrowser for help on using the repository browser.