source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Commit_unit/src/Commit_unit.cpp @ 131

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

1) add constant method
2) test with systemc 2.2.0

  • Property svn:keywords set to Id
File size: 10.8 KB
Line 
1/*
2 * $Id: Commit_unit.cpp 131 2009-07-08 18:40:08Z rosiere $
3 *
4 * [ Description ]
5 *
6 */
7
8#include "Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Commit_unit/include/Commit_unit.h"
9#include "Behavioural/include/Simulation.h"
10
11namespace morpheo                    {
12namespace behavioural {
13namespace core {
14namespace multi_ooo_engine {
15namespace ooo_engine {
16namespace commit_unit {
17
18
19#undef  FUNCTION
20#define FUNCTION "Commit_unit::Commit_unit"
21  Commit_unit::Commit_unit
22  (
23#ifdef SYSTEMC
24   sc_module_name name,
25#else
26   string name,
27#endif
28#ifdef STATISTICS
29   morpheo::behavioural::Parameters_Statistics * param_statistics,
30#endif
31   morpheo::behavioural::core::multi_ooo_engine::ooo_engine::commit_unit::Parameters * param,
32   morpheo::behavioural::Tusage_t usage
33   ):
34    _name              (name)
35    ,_param            (param)
36    ,_usage            (usage)
37  {
38    log_begin(Commit_unit,FUNCTION);
39
40    usage_environment(_usage);
41
42// #if DEBUG_Commit_unit == true
43//     log_printf(TRACE,Commit_unit,FUNCTION,_("<%s> Parameters"),_name.c_str());
44
45//     std::cout << *param << std::endl;
46// #endif
47
48    log_printf(INFO,Commit_unit,FUNCTION,_("<%s> Allocation"),_name.c_str());
49
50    allocation (
51#ifdef STATISTICS
52                param_statistics
53#endif
54                );
55
56#ifdef STATISTICS
57    if (usage_is_set(_usage,USE_STATISTICS))
58      { 
59        log_printf(INFO,Commit_unit,FUNCTION,_("<%s> Allocation of statistics"),_name.c_str());
60
61        statistics_allocation(param_statistics);
62      }
63#endif
64
65#ifdef VHDL
66    if (usage_is_set(_usage,USE_VHDL))
67      {
68        // generate the vhdl
69        log_printf(INFO,Commit_unit,FUNCTION,_("<%s> Generate the vhdl"),_name.c_str());
70       
71        vhdl();
72      }
73#endif
74
75#ifdef SYSTEMC
76    if (usage_is_set(_usage,USE_SYSTEMC))
77      {
78#ifdef SYSTEMCASS_SPECIFIC
79        constant();
80#else
81        log_printf(INFO,Commit_unit,FUNCTION,_("<%s> Method - constant"),_name.c_str());
82
83        SC_METHOD (constant);
84//      dont_initialize ();
85       
86# ifdef SYSTEMCASS_SPECIFIC
87        // List dependency information
88# endif   
89#endif
90
91        log_printf(INFO,Commit_unit,FUNCTION,_("<%s> Method - transition"),_name.c_str());
92
93        SC_METHOD (transition);
94        dont_initialize ();
95        sensitive << (*(in_CLOCK)).pos();
96       
97# ifdef SYSTEMCASS_SPECIFIC
98        // List dependency information
99# endif   
100
101        log_printf(INFO,Commit_unit,FUNCTION,_("<%s> Method - genMoore"),_name.c_str());
102
103        SC_METHOD (genMoore);
104        dont_initialize ();
105        sensitive << (*(in_CLOCK)).neg(); // need internal register
106       
107# ifdef SYSTEMCASS_SPECIFIC
108        // List dependency information
109# endif   
110
111        log_printf(INFO,Commit_unit,FUNCTION,_("<%s> Method - genMealy_insert"),_name.c_str());
112
113        SC_METHOD (genMealy_insert);
114        dont_initialize ();
115        sensitive << (*(in_CLOCK)).neg(); // need internal register
116//      for (uint32_t i=0; i<_param->_nb_rename_unit; i++)
117//        for (uint32_t j=0; j<_param->_nb_inst_insert[i]; j++)
118//          sensitive << (*(in_INSERT_VAL [i][j]));
119
120# ifdef SYSTEMCASS_SPECIFIC
121        // List dependency information
122//      for (uint32_t i=0; i<_param->_nb_rename_unit; i++)
123//        for (uint32_t j=0; j<_param->_nb_inst_insert[i]; j++)
124//          for (uint32_t x=0; x<_param->_nb_rename_unit; x++)
125//            for (uint32_t y=0; y<_param->_nb_inst_insert[x]; y++)
126//              {
127//                (*(out_INSERT_ACK       [i][j])) (*(in_INSERT_VAL [x][y]));
128//                if (_param->_have_port_rob_ptr)
129//                (*(out_INSERT_PACKET_ID [i][j])) (*(in_INSERT_VAL [x][y]));
130//              }
131# endif   
132
133        log_printf(INFO,Commit_unit,FUNCTION,_("<%s> Method - genMealy_retire"),_name.c_str());
134
135        SC_METHOD (genMealy_retire);
136        dont_initialize ();
137        sensitive << (*(in_CLOCK)).neg(); // need internal register
138        for (uint32_t i=0; i<_param->_nb_rename_unit; i++)
139          for (uint32_t j=0; j<_param->_nb_inst_retire[i]; j++)
140            sensitive << (*(in_RETIRE_ACK [i][j]));
141
142        for (uint32_t i=0; i<_param->_nb_front_end; ++i)
143          for (uint32_t j=0; j<_param->_nb_context[i]; ++j)
144            sensitive << (*(in_SPR_WRITE_ACK [i][j]));
145
146# ifdef SYSTEMCASS_SPECIFIC
147        // List dependency information
148        for (uint32_t i=0; i<_param->_nb_rename_unit; i++)
149          for (uint32_t j=0; j<_param->_nb_inst_retire[i]; j++)
150            {
151              for (uint32_t x=0; x<_param->_nb_rename_unit; x++)
152                for (uint32_t y=0; y<_param->_nb_inst_retire[x]; y++)
153                  {
154                    (*(out_RETIRE_VAL                   [i][j])) (*(in_RETIRE_ACK [x][y]));
155                    if (_param->_have_port_front_end_id)
156                    (*(out_RETIRE_FRONT_END_ID          [i][j])) (*(in_RETIRE_ACK [x][y]));
157                    if (_param->_have_port_context_id)
158                    (*(out_RETIRE_CONTEXT_ID            [i][j])) (*(in_RETIRE_ACK [x][y]));
159//                  (*(out_RETIRE_RENAME_UNIT_ID        [i][j])) (*(in_RETIRE_ACK [x][y]));
160                    (*(out_RETIRE_USE_STORE_QUEUE       [i][j])) (*(in_RETIRE_ACK [x][y]));
161                    (*(out_RETIRE_USE_LOAD_QUEUE        [i][j])) (*(in_RETIRE_ACK [x][y]));
162                    (*(out_RETIRE_STORE_QUEUE_PTR_WRITE [i][j])) (*(in_RETIRE_ACK [x][y]));
163                    if (_param->_have_port_load_queue_ptr)
164                    (*(out_RETIRE_LOAD_QUEUE_PTR_WRITE  [i][j])) (*(in_RETIRE_ACK [x][y]));
165//                  (*(out_RETIRE_READ_RA               [i][j])) (*(in_RETIRE_ACK [x][y]));
166//                  (*(out_RETIRE_NUM_REG_RA_PHY        [i][j])) (*(in_RETIRE_ACK [x][y]));
167//                  (*(out_RETIRE_READ_RB               [i][j])) (*(in_RETIRE_ACK [x][y]));
168//                  (*(out_RETIRE_NUM_REG_RB_PHY        [i][j])) (*(in_RETIRE_ACK [x][y]));
169//                  (*(out_RETIRE_READ_RC               [i][j])) (*(in_RETIRE_ACK [x][y]));
170//                  (*(out_RETIRE_NUM_REG_RC_PHY        [i][j])) (*(in_RETIRE_ACK [x][y]));
171                    (*(out_RETIRE_WRITE_RD              [i][j])) (*(in_RETIRE_ACK [x][y]));
172                    (*(out_RETIRE_NUM_REG_RD_LOG        [i][j])) (*(in_RETIRE_ACK [x][y]));
173                    (*(out_RETIRE_NUM_REG_RD_PHY_OLD    [i][j])) (*(in_RETIRE_ACK [x][y]));
174                    (*(out_RETIRE_NUM_REG_RD_PHY_NEW    [i][j])) (*(in_RETIRE_ACK [x][y]));
175                    (*(out_RETIRE_WRITE_RE              [i][j])) (*(in_RETIRE_ACK [x][y]));
176                    (*(out_RETIRE_NUM_REG_RE_LOG        [i][j])) (*(in_RETIRE_ACK [x][y]));
177                    (*(out_RETIRE_NUM_REG_RE_PHY_OLD    [i][j])) (*(in_RETIRE_ACK [x][y]));
178                    (*(out_RETIRE_NUM_REG_RE_PHY_NEW    [i][j])) (*(in_RETIRE_ACK [x][y]));
179                  }
180
181              for (uint32_t x=0; x<_param->_nb_front_end; ++x)
182                for (uint32_t y=0; y<_param->_nb_context[x]; ++y)
183                  {
184                    (*(out_RETIRE_VAL                   [i][j])) (*(in_SPR_WRITE_ACK [x][y]));
185                    if (_param->_have_port_front_end_id)
186                    (*(out_RETIRE_FRONT_END_ID          [i][j])) (*(in_SPR_WRITE_ACK [x][y]));
187                    if (_param->_have_port_context_id)
188                    (*(out_RETIRE_CONTEXT_ID            [i][j])) (*(in_SPR_WRITE_ACK [x][y]));
189//                  (*(out_RETIRE_RENAME_UNIT_ID        [i][j])) (*(in_SPR_WRITE_ACK [x][y]));
190                    (*(out_RETIRE_USE_STORE_QUEUE       [i][j])) (*(in_SPR_WRITE_ACK [x][y]));
191                    (*(out_RETIRE_USE_LOAD_QUEUE        [i][j])) (*(in_SPR_WRITE_ACK [x][y]));
192                    (*(out_RETIRE_STORE_QUEUE_PTR_WRITE [i][j])) (*(in_SPR_WRITE_ACK [x][y]));
193                    if (_param->_have_port_load_queue_ptr)
194                    (*(out_RETIRE_LOAD_QUEUE_PTR_WRITE  [i][j])) (*(in_SPR_WRITE_ACK [x][y]));
195//                  (*(out_RETIRE_READ_RA               [i][j])) (*(in_SPR_WRITE_ACK [x][y]));
196//                  (*(out_RETIRE_NUM_REG_RA_PHY        [i][j])) (*(in_SPR_WRITE_ACK [x][y]));
197//                  (*(out_RETIRE_READ_RB               [i][j])) (*(in_SPR_WRITE_ACK [x][y]));
198//                  (*(out_RETIRE_NUM_REG_RB_PHY        [i][j])) (*(in_SPR_WRITE_ACK [x][y]));
199//                  (*(out_RETIRE_READ_RC               [i][j])) (*(in_SPR_WRITE_ACK [x][y]));
200//                  (*(out_RETIRE_NUM_REG_RC_PHY        [i][j])) (*(in_SPR_WRITE_ACK [x][y]));
201                    (*(out_RETIRE_WRITE_RD              [i][j])) (*(in_SPR_WRITE_ACK [x][y]));
202                    (*(out_RETIRE_NUM_REG_RD_LOG        [i][j])) (*(in_SPR_WRITE_ACK [x][y]));
203                    (*(out_RETIRE_NUM_REG_RD_PHY_OLD    [i][j])) (*(in_SPR_WRITE_ACK [x][y]));
204                    (*(out_RETIRE_NUM_REG_RD_PHY_NEW    [i][j])) (*(in_SPR_WRITE_ACK [x][y]));
205                    (*(out_RETIRE_WRITE_RE              [i][j])) (*(in_SPR_WRITE_ACK [x][y]));
206                    (*(out_RETIRE_NUM_REG_RE_LOG        [i][j])) (*(in_SPR_WRITE_ACK [x][y]));
207                    (*(out_RETIRE_NUM_REG_RE_PHY_OLD    [i][j])) (*(in_SPR_WRITE_ACK [x][y]));
208                    (*(out_RETIRE_NUM_REG_RE_PHY_NEW    [i][j])) (*(in_SPR_WRITE_ACK [x][y]));
209                  }
210            }
211
212        for (uint32_t i=0; i<_param->_nb_front_end; ++i)
213          for (uint32_t j=0; j<_param->_nb_context[i]; ++j)
214            {
215              for (uint32_t x=0; x<_param->_nb_rename_unit; x++)
216                for (uint32_t y=0; y<_param->_nb_inst_retire[x]; y++)
217                  {
218                    (*(out_SPR_WRITE_VAL       [i][j])) (*(in_RETIRE_ACK [x][y]));
219                    (*(out_SPR_WRITE_SR_F_VAL  [i][j])) (*(in_RETIRE_ACK [x][y]));
220                    (*(out_SPR_WRITE_SR_F      [i][j])) (*(in_RETIRE_ACK [x][y]));
221                    (*(out_SPR_WRITE_SR_CY_VAL [i][j])) (*(in_RETIRE_ACK [x][y]));
222                    (*(out_SPR_WRITE_SR_CY     [i][j])) (*(in_RETIRE_ACK [x][y]));
223                    (*(out_SPR_WRITE_SR_OV_VAL [i][j])) (*(in_RETIRE_ACK [x][y]));
224                    (*(out_SPR_WRITE_SR_OV     [i][j])) (*(in_RETIRE_ACK [x][y]));
225                  }
226
227              for (uint32_t x=0; x<_param->_nb_front_end; ++x)
228                for (uint32_t y=0; y<_param->_nb_context[x]; ++y)
229                  {
230                    (*(out_SPR_WRITE_VAL       [i][j])) (*(in_SPR_WRITE_ACK [x][y]));
231                    (*(out_SPR_WRITE_SR_F_VAL  [i][j])) (*(in_SPR_WRITE_ACK [x][y]));
232                    (*(out_SPR_WRITE_SR_F      [i][j])) (*(in_SPR_WRITE_ACK [x][y]));
233                    (*(out_SPR_WRITE_SR_CY_VAL [i][j])) (*(in_SPR_WRITE_ACK [x][y]));
234                    (*(out_SPR_WRITE_SR_CY     [i][j])) (*(in_SPR_WRITE_ACK [x][y]));
235                    (*(out_SPR_WRITE_SR_OV_VAL [i][j])) (*(in_SPR_WRITE_ACK [x][y]));
236                    (*(out_SPR_WRITE_SR_OV     [i][j])) (*(in_SPR_WRITE_ACK [x][y]));
237                  }
238            }
239# endif   
240
241        log_printf(INFO,Commit_unit,FUNCTION,_("<%s> Method - genMealy_commit"),_name.c_str());
242
243        SC_METHOD (genMealy_commit);
244        dont_initialize ();
245        sensitive << (*(in_CLOCK)).neg(); // need internal register
246        for (uint32_t j=0; j<_param->_nb_inst_commit; j++)
247          {
248            sensitive << (*(in_COMMIT_VAL [j]));
249            if (_param->_have_port_rob_ptr)
250              sensitive << (*(in_COMMIT_PACKET_ID [j]));
251          }
252
253# ifdef SYSTEMCASS_SPECIFIC
254        // List dependency information
255        for (uint32_t j=0; j<_param->_nb_inst_commit; j++)
256          for (uint32_t y=0; y<_param->_nb_inst_commit; y++)
257            {
258              (*(out_COMMIT_ACK [j])) (*(in_COMMIT_VAL       [y]));
259              if (_param->_have_port_rob_ptr)
260                (*(out_COMMIT_ACK [j])) (*(in_COMMIT_PACKET_ID [y]));
261            }
262# endif   
263       
264#endif
265
266        // Init stop condition
267        while (_simulation_nb_instruction_commited.size() < _param->_nb_thread)
268          _simulation_nb_instruction_commited.push_back(0);
269      }
270    log_end(Commit_unit,FUNCTION);
271  };
272   
273#undef  FUNCTION
274#define FUNCTION "Commit_unit::~Commit_unit"
275  Commit_unit::~Commit_unit (void)
276  {
277    log_begin(Commit_unit,FUNCTION);
278
279#ifdef STATISTICS
280    if (usage_is_set(_usage,USE_STATISTICS))
281      {
282        statistics_deallocation();
283      }
284#endif
285
286    log_printf(INFO,Commit_unit,FUNCTION,_("<%s> Deallocation"),_name.c_str());
287    deallocation ();
288
289    log_end(Commit_unit,FUNCTION);
290  };
291
292}; // end namespace commit_unit
293}; // end namespace ooo_engine
294}; // end namespace multi_ooo_engine
295}; // end namespace core
296
297}; // end namespace behavioural
298}; // end namespace morpheo             
Note: See TracBrowser for help on using the repository browser.