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

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

Almost complete design
with Test and test platform

  • Property svn:keywords set to Id
File size: 10.6 KB
Line 
1/*
2 * $Id: Special_Register_unit_allocation.cpp 88 2008-12-10 18:31:39Z 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                  switch (k)
152                    {
153                    case GROUP_SYSTEM_AND_CONTROL  :
154                      {
155                        _spr [i][j][k][SPR_VR          ] = new VR          (i,j,_param);
156                        _spr [i][j][k][SPR_UPR         ] = new UPR         (i,j,_param);
157                        _spr [i][j][k][SPR_CPUCFGR     ] = new CPUCFGR     (i,j,_param);
158                        _spr [i][j][k][SPR_DMMUCFGR    ] = new DMMUCFGR    (i,j,_param);
159                        _spr [i][j][k][SPR_IMMUCFGR    ] = new IMMUCFGR    (i,j,_param);
160                        _spr [i][j][k][SPR_DCCFGR      ] = new DCCFGR      (i,j,_param);
161                        _spr [i][j][k][SPR_ICCFGR      ] = new ICCFGR      (i,j,_param);
162                        _spr [i][j][k][SPR_DCFGR       ] = new DCFGR       (i,j,_param);
163                        _spr [i][j][k][SPR_PCCFGR      ] = new PCCFGR      (i,j,_param);
164                        _spr [i][j][k][SPR_NPC         ] = new NPC         (i,j,_param);
165                        _spr [i][j][k][SPR_SR          ] = new SR          (i,j,_param);
166                        _spr [i][j][k][SPR_PPC         ] = new PPC         (i,j,_param);
167                        _spr [i][j][k][SPR_CID         ] = new CID         (i,j,_param);
168                        _spr [i][j][k][SPR_FPCSR       ] = new FPCSR       (i,j,_param);
169                        _spr [i][j][k][SPR_EPCR        ] = new EPCR        (i,j,_param);
170                        _spr [i][j][k][SPR_EEAR        ] = new EEAR        (i,j,_param);
171                        _spr [i][j][k][SPR_ESR         ] = new ESR         (i,j,_param);
172//                      _spr [i][j][k][SPR_GPR         ] = new GPR         (i,j,_param);
173                       
174                        break;
175                      }
176                    case GROUP_DCACHE              :
177                      {
178                        _spr [i][j][k][SPR_DCCR        ] = new DCCR        (i,j,_param);
179                        _spr [i][j][k][SPR_DCBPR       ] = new DCBPR       (i,j,_param);
180                        _spr [i][j][k][SPR_DCBFR       ] = new DCBFR       (i,j,_param);
181                        _spr [i][j][k][SPR_DCBIR       ] = new DCBIR       (i,j,_param);
182                        _spr [i][j][k][SPR_DCBWR       ] = new DCBWR       (i,j,_param);
183                        _spr [i][j][k][SPR_DCBLR       ] = new DCBLR       (i,j,_param);
184
185                        break;
186                      }
187                    case GROUP_DMMU                :
188                    case GROUP_IMMU                :
189                    case GROUP_ICACHE              :
190                    case GROUP_DEBUG               :
191                    case GROUP_PERFORMANCE_COUNTER :
192                    case GROUP_POWER_MANAGEMENT    :
193                    case GROUP_PIC                 :
194                    case GROUP_TICK_TIMER          :
195                    case GROUP_FLOATING_POINT      :
196
197                    case GROUP_MAC                 :
198                    case GROUP_RESERVED_1          :
199                    case GROUP_RESERVED_2          :
200                    case GROUP_RESERVED_3          :
201                    case GROUP_RESERVED_4          :
202                    case GROUP_RESERVED_5          :
203                    case GROUP_RESERVED_6          :
204                    case GROUP_RESERVED_7          :
205                    case GROUP_RESERVED_8          :
206                    case GROUP_RESERVED_9          :
207                    case GROUP_RESERVED_10         :
208                    case GROUP_RESERVED_11         :
209                    case GROUP_RESERVED_12         :
210                    case GROUP_CUSTOM_1            :
211                    case GROUP_CUSTOM_2            :
212                    case GROUP_CUSTOM_3            :
213                    case GROUP_CUSTOM_4            :
214                    case GROUP_CUSTOM_5            :
215                    case GROUP_CUSTOM_6            :
216                    case GROUP_CUSTOM_7            :
217                    case GROUP_CUSTOM_8            :
218                    default :
219                      {
220                        for (uint32_t l=0; l<NB_REG_GROUP[k]; l++)
221                          _spr [i][j][k][l] = NULL;
222                      }
223                    }
224                }
225              else
226                _spr [i][j][k] = NULL;
227          }
228      }
229   
230    for (uint32_t i=0; i<_param->_nb_front_end; i++)
231      for (uint32_t j=0; j<_param->_nb_context[i]; j++)
232        for (uint32_t k=0; k<NB_GROUP; k++)
233          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);
237
238#ifdef POSITION
239    if (usage_is_set(_usage,USE_POSITION))
240      _component->generate_file();
241#endif
242
243    log_end(Special_Register_unit,FUNCTION);
244  };
245
246}; // end namespace special_register_unit
247}; // end namespace ooo_engine
248}; // end namespace multi_ooo_engine
249}; // end namespace core
250
251}; // end namespace behavioural
252}; // end namespace morpheo             
Note: See TracBrowser for help on using the repository browser.