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

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

1) Stat_list : fix retire old and new register bug
2) Stat_list : remove read_counter and valid flag, because validation of destination is in retire step (not in commit step)
3) Model : add class Model (cf Morpheo.sim)
4) Allocation : alloc_interface_begin and alloc_interface_end to delete temporary array.
5) Script : add distexe.sh
6) Add Comparator, Multiplier, Divider. But this component are not implemented
7) Software : add Dhrystone

  • Property svn:keywords set to Id
File size: 11.2 KB
Line 
1/*
2 * $Id: Special_Register_unit_allocation.cpp 112 2009-03-18 22:36:26Z 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_BEGIN("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      ALLOC1_INTERFACE_END(_param->_nb_inst_reexecute);
74    }
75
76    // ~~~~~[ Interface : "spr_read" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
77    {
78      ALLOC2_INTERFACE_BEGIN("spr_read",OUT,WEST, _("Output for a spr bit field."), _param->_nb_front_end, _param->_nb_context[it1]);
79
80      _ALLOC2_SIGNAL_OUT(out_SPR_READ_SR             ,"sr",Tspr_t,_param->_size_spr, _param->_nb_front_end, _param->_nb_context[it1]);
81
82      ALLOC2_INTERFACE_END(_param->_nb_front_end, _param->_nb_context[it1]);
83    }
84
85    // ~~~~~[ Interface : "spr_commit" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
86    {
87      ALLOC2_INTERFACE_BEGIN("spr_commit",IN,WEST, _("Commit instruction to change SR's flags."), _param->_nb_front_end, _param->_nb_context[it1]);
88
89      _ALLOC2_VALACK_IN ( in_SPR_COMMIT_VAL           ,VAL,_param->_nb_front_end, _param->_nb_context[it1]);
90      _ALLOC2_VALACK_OUT(out_SPR_COMMIT_ACK           ,ACK,_param->_nb_front_end, _param->_nb_context[it1]);
91      _ALLOC2_SIGNAL_IN ( in_SPR_COMMIT_SR_F_VAL      ,"sr_f_val"     ,Tcontrol_t         ,1,_param->_nb_front_end, _param->_nb_context[it1]);
92      _ALLOC2_SIGNAL_IN ( in_SPR_COMMIT_SR_F          ,"sr_f"         ,Tcontrol_t         ,1,_param->_nb_front_end, _param->_nb_context[it1]);
93      _ALLOC2_SIGNAL_IN ( in_SPR_COMMIT_SR_CY_VAL     ,"sr_cy_val"    ,Tcontrol_t         ,1,_param->_nb_front_end, _param->_nb_context[it1]);
94      _ALLOC2_SIGNAL_IN ( in_SPR_COMMIT_SR_CY         ,"sr_cy"        ,Tcontrol_t         ,1,_param->_nb_front_end, _param->_nb_context[it1]);
95      _ALLOC2_SIGNAL_IN ( in_SPR_COMMIT_SR_OV_VAL     ,"sr_ov_val"    ,Tcontrol_t         ,1,_param->_nb_front_end, _param->_nb_context[it1]);
96      _ALLOC2_SIGNAL_IN ( in_SPR_COMMIT_SR_OV         ,"sr_ov"        ,Tcontrol_t         ,1,_param->_nb_front_end, _param->_nb_context[it1]);
97
98      ALLOC2_INTERFACE_END(_param->_nb_front_end, _param->_nb_context[it1]);
99    }
100
101    // ~~~~~[ Interface "spr_event" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
102    {
103      ALLOC2_INTERFACE_BEGIN("spr_event",IN,WEST, _("Event change a lot of exception."), _param->_nb_front_end, _param->_nb_context[it1]);
104
105      _ALLOC2_VALACK_IN ( in_SPR_EVENT_VAL            ,VAL,_param->_nb_front_end, _param->_nb_context[it1]);
106      _ALLOC2_VALACK_OUT(out_SPR_EVENT_ACK            ,ACK,_param->_nb_front_end, _param->_nb_context[it1]);
107      _ALLOC2_SIGNAL_IN ( in_SPR_EVENT_EPCR          ,"EPCR"          ,Tspr_t            ,_param->_size_spr,_param->_nb_front_end, _param->_nb_context[it1]);
108      _ALLOC2_SIGNAL_IN ( in_SPR_EVENT_EEAR_WEN      ,"EEAR_WEN"      ,Tcontrol_t        ,1                ,_param->_nb_front_end, _param->_nb_context[it1]);
109      _ALLOC2_SIGNAL_IN ( in_SPR_EVENT_EEAR          ,"EEAR"          ,Tspr_t            ,_param->_size_spr,_param->_nb_front_end, _param->_nb_context[it1]);
110      _ALLOC2_SIGNAL_IN ( in_SPR_EVENT_SR_DSX        ,"SR_DSX"        ,Tcontrol_t        ,1                ,_param->_nb_front_end, _param->_nb_context[it1]);
111      _ALLOC2_SIGNAL_IN ( in_SPR_EVENT_SR_TO_ESR     ,"SR_TO_ESR"     ,Tcontrol_t        ,1                ,_param->_nb_front_end, _param->_nb_context[it1]);
112
113      ALLOC2_INTERFACE_END(_param->_nb_front_end, _param->_nb_context[it1]);
114    }
115
116    if (usage_is_set(_usage,USE_SYSTEMC))
117      {
118    // ~~~~~[ Internal ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
119    ALLOC1(internal_SPR_ACCESS_ACK ,Tcontrol_t,_param->_nb_inst_reexecute);
120    ALLOC2(internal_SPR_COMMIT_ACK ,Tcontrol_t,_param->_nb_front_end,_param->_nb_context [it1]);
121    ALLOC2(internal_SPR_EVENT_ACK  ,Tcontrol_t,_param->_nb_front_end,_param->_nb_context [it1]);
122      }
123
124    // ~~~~~[ Component ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
125    _spr_access_mode = new SPR_access_mode ** [_param->_nb_front_end];
126    for (uint32_t i=0; i<_param->_nb_front_end; i++)
127      {
128        _spr_access_mode [i] = new SPR_access_mode * [_param->_nb_context[i]];
129
130        for (uint32_t j=0; j<_param->_nb_context[i]; j++)
131          {
132            _spr_access_mode [i][j] = new SPR_access_mode;
133
134            for (uint32_t k=0; k<NB_GROUP; k++)
135              if (_param->_implement_group [i][j][k])
136                _spr_access_mode [i][j]->implement_group(k);
137          }
138      }
139
140    _spr = new SPR **** [_param->_nb_front_end];
141    for (uint32_t i=0; i<_param->_nb_front_end; i++)
142      {
143        _spr [i] = new SPR *** [_param->_nb_context[i]];
144
145        for (uint32_t j=0; j<_param->_nb_context[i]; j++)
146          {
147            _spr [i][j] = new SPR ** [NB_GROUP];
148
149            for (uint32_t k=0; k<NB_GROUP; k++)
150              if (_param->_implement_group [i][j][k])
151                {
152                  _spr [i][j][k] = new SPR * [NB_REG_GROUP[k]];
153                 
154                  for (uint32_t l=0; l<NB_REG_GROUP[k]; l++)
155                    _spr [i][j][k][l] = NULL;
156                 
157                  switch (k)
158                    {
159                    case GROUP_SYSTEM_AND_CONTROL  :
160                      {
161                        _spr [i][j][k][SPR_VR          ] = new VR          (i,j,_param);
162                        _spr [i][j][k][SPR_UPR         ] = new UPR         (i,j,_param);
163                        _spr [i][j][k][SPR_CPUCFGR     ] = new CPUCFGR     (i,j,_param);
164                        _spr [i][j][k][SPR_DMMUCFGR    ] = new DMMUCFGR    (i,j,_param);
165                        _spr [i][j][k][SPR_IMMUCFGR    ] = new IMMUCFGR    (i,j,_param);
166                        _spr [i][j][k][SPR_DCCFGR      ] = new DCCFGR      (i,j,_param);
167                        _spr [i][j][k][SPR_ICCFGR      ] = new ICCFGR      (i,j,_param);
168                        _spr [i][j][k][SPR_DCFGR       ] = new DCFGR       (i,j,_param);
169                        _spr [i][j][k][SPR_PCCFGR      ] = new PCCFGR      (i,j,_param);
170                        _spr [i][j][k][SPR_NPC         ] = new NPC         (i,j,_param);
171                        _spr [i][j][k][SPR_SR          ] = new SR          (i,j,_param);
172                        _spr [i][j][k][SPR_PPC         ] = new PPC         (i,j,_param);
173                        _spr [i][j][k][SPR_FPCSR       ] = new FPCSR       (i,j,_param);
174                        _spr [i][j][k][SPR_CID         ] = new CID         (i,j,_param);
175                        _spr [i][j][k][SPR_TID         ] = new TID         (i,j,_param);
176                        _spr [i][j][k][SPR_TSR         ] = new TSR         (i,j,_param);
177                        _spr [i][j][k][SPR_EPCR        ] = new EPCR        (i,j,_param);
178                        _spr [i][j][k][SPR_EEAR        ] = new EEAR        (i,j,_param);
179                        _spr [i][j][k][SPR_ESR         ] = new ESR         (i,j,_param);
180//                      _spr [i][j][k][SPR_GPR         ] = new GPR         (i,j,_param);
181                       
182                        break;
183                      }
184                    case GROUP_DCACHE              :
185                      {
186                        _spr [i][j][k][SPR_DCCR        ] = new DCCR        (i,j,_param);
187                        _spr [i][j][k][SPR_DCBPR       ] = new DCBPR       (i,j,_param);
188                        _spr [i][j][k][SPR_DCBFR       ] = new DCBFR       (i,j,_param);
189                        _spr [i][j][k][SPR_DCBIR       ] = new DCBIR       (i,j,_param);
190                        _spr [i][j][k][SPR_DCBWR       ] = new DCBWR       (i,j,_param);
191                        _spr [i][j][k][SPR_DCBLR       ] = new DCBLR       (i,j,_param);
192
193                        break;
194                      }
195                    case GROUP_DMMU                :
196                    case GROUP_IMMU                :
197                    case GROUP_ICACHE              :
198                    case GROUP_DEBUG               :
199                    case GROUP_PERFORMANCE_COUNTER :
200                    case GROUP_POWER_MANAGEMENT    :
201                    case GROUP_PIC                 :
202                    case GROUP_TICK_TIMER          :
203                    case GROUP_FLOATING_POINT      :
204                    case GROUP_MAC                 :
205                    case GROUP_RESERVED_1          :
206                    case GROUP_RESERVED_2          :
207                    case GROUP_RESERVED_3          :
208                    case GROUP_RESERVED_4          :
209                    case GROUP_RESERVED_5          :
210                    case GROUP_RESERVED_6          :
211                    case GROUP_RESERVED_7          :
212                    case GROUP_RESERVED_8          :
213                    case GROUP_RESERVED_9          :
214                    case GROUP_RESERVED_10         :
215                    case GROUP_RESERVED_11         :
216                    case GROUP_RESERVED_12         :
217                    case GROUP_CUSTOM_1            :
218                    case GROUP_CUSTOM_2            :
219                    case GROUP_CUSTOM_3            :
220                    case GROUP_CUSTOM_4            :
221                    case GROUP_CUSTOM_5            :
222                    case GROUP_CUSTOM_6            :
223                    case GROUP_CUSTOM_7            :
224                    case GROUP_CUSTOM_8            :
225                    default :
226                      {
227                      }
228                    }
229                }
230              else
231                _spr [i][j][k] = NULL;
232          }
233      }
234   
235    for (uint32_t i=0; i<_param->_nb_front_end; i++)
236      for (uint32_t j=0; j<_param->_nb_context[i]; j++)
237        for (uint32_t k=0; k<NB_GROUP; k++)
238          if (_param->_implement_group [i][j][k])
239            {
240              for (uint32_t l=0; l<NB_REG_GROUP[k]; l++)
241                if (_spr [i][j][k][l] == NULL)
242                  _spr_access_mode [i][j]->invalid_register (k,l);
243            }
244          else
245            {
246              for (uint32_t l=0; l<NB_REG_GROUP[k]; l++)
247                _spr_access_mode [i][j]->invalid_register (k,l);
248            }
249
250#ifdef POSITION
251    if (usage_is_set(_usage,USE_POSITION))
252      _component->generate_file();
253#endif
254
255    log_end(Special_Register_unit,FUNCTION);
256  };
257
258}; // end namespace special_register_unit
259}; // end namespace ooo_engine
260}; // end namespace multi_ooo_engine
261}; // end namespace core
262
263}; // end namespace behavioural
264}; // end namespace morpheo             
Note: See TracBrowser for help on using the repository browser.