source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/SelfTest/src/main.cpp @ 117

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

1) Platforms : add new organization for test
2) Load_Store_Unit : add array to count nb_check in store_queue
3) Issue_queue and Core_Glue : rewrite the issue network
4) Special_Register_Unit : add reset value to register CID
5) Softwares : add multicontext test
6) Softwares : add SPECINT
7) Softwares : add MiBench?
7) Read_queue : inhib access for r0
8) Change Core_Glue (network) - dont yet support priority and load balancing scheme

  • Property svn:keywords set to Id
File size: 21.5 KB
Line 
1/*
2 * $Id: main.cpp 117 2009-05-16 14:42:39Z rosiere $
3 *
4 * [ Description ]
5 *
6 */
7
8#include "Behavioural/Core/Multi_OOO_Engine/OOO_Engine/SelfTest/include/test.h"
9#include "Behavioural/include/Allocation.h"
10
11#define NB_PARAMS 23
12
13void usage (int argc, char * argv[])
14{
15  err (_("<Usage> %s name_instance list_params.\n"),argv[0]);
16  err (_("list_params is :\n"));
17  err (_(" * nb_front_end                                                            (uint32_t             )\n"));
18  err (_(" * nb_context                        [nb_front_end]                        (uint32_t             )\n"));
19  err (_(" * nb_rename_unit                                                          (uint32_t             )\n"));
20  err (_(" * nb_execute_loop                                                         (uint32_t             )\n"));
21  err (_(" * nb_inst_decod                     [nb_front_end]                        (uint32_t             )\n"));
22  err (_(" * nb_inst_insert                    [nb_rename_unit]                      (uint32_t             )\n"));
23  err (_(" * nb_inst_retire                    [nb_rename_unit]                      (uint32_t             )\n"));
24//err (_(" * nb_inst_issue                                                           (uint32_t             )\n"));
25  err (_(" * nb_inst_execute                   [nb_execute_loop]                     (uint32_t             )\n"));
26  err (_(" * nb_inst_reexecute                                                       (uint32_t             )\n"));
27  err (_(" * nb_inst_commit                                                          (uint32_t             )\n"));
28  err (_(" * nb_inst_branch_complete                                                 (uint32_t             )\n"));
29  err (_(" * nb_branch_speculated              [nb_front_end][nb_context]            (uint32_t             )\n"));
30  err (_(" * size_nb_inst_decod                                                      (uint32_t             )\n"));
31  err (_(" * nb_rename_unit_select                                                   (uint32_t             )\n"));
32  err (_(" * nb_execute_loop_select                                                  (uint32_t             )\n"));
33  err (_(" * size_general_data                                                       (uint32_t             )\n"));
34  err (_(" * size_special_data                                                       (uint32_t             )\n"));
35  err (_(" * link_rename_unit_with_front_end   [nb_front_end]                        (uint32_t             )\n"));
36  err (_(" * size_re_order_buffer                                                    (uint32_t             )\n"));
37  err (_(" * nb_re_order_buffer_bank                                                 (uint32_t             )\n"));
38  err (_(" * commit_priority                                                         (Tpriority_t          )\n"));
39  err (_(" * commit_load_balancing                                                   (Tload_balancing_t    )\n"));
40  err (_(" * size_issue_queue                                                        (uint32_t             )\n"));
41  err (_(" * issue_queue_scheme                                                      (Tissue_queue_scheme_t)\n"));
42  err (_(" * nb_issue_queue_bank                                                     (uint32_t             )\n"));
43  err (_(" * issue_priority                                                          (Tpriority_t          )\n"));
44  err (_(" * issue_load_balancing                                                    (Tload_balancing_t    )\n"));
45//   err (_(" * table_routing                     [nb_rename_unit][nb_inst_issue]       (bool                 )\n"));
46//   err (_(" * table_issue_type                  [nb_inst_issue][nb_type]              (bool                 )\n"));
47//   err (_("   * TYPE_ALU    \n"));
48//   err (_("   * TYPE_SHIFT  \n"));
49//   err (_("   * TYPE_MOVE   \n"));
50//   err (_("   * TYPE_TEST   \n"));
51//   err (_("   * TYPE_MUL    \n"));
52//   err (_("   * TYPE_DIV    \n"));
53//   err (_("   * TYPE_EXTEND \n"));
54//   err (_("   * TYPE_FIND   \n"));
55//   err (_("   * TYPE_SPECIAL\n"));
56//   err (_("   * TYPE_CUSTOM \n"));
57//   err (_("   * TYPE_BRANCH \n"));
58//   err (_("   * TYPE_MEMORY \n"));
59  err (_(" * size_reexecute_queue                                                    (uint32_t         )\n"));
60  err (_(" * reexecute_priority                                                      (Tpriority_t      )\n"));
61  err (_(" * reexecute_load_balancing                                                (Tload_balancing_t)\n"));
62  err (_(" * rename_select_priority            [nb_rename_unit]                      (Tpriority_t      )\n"));
63  err (_(" * rename_select_load_balancing      [nb_rename_unit]                      (Tload_balancing_t)\n"));
64  err (_(" * rename_select_nb_front_end_select [nb_rename_unit]                      (uint32_t         )\n"));
65  err (_(" * nb_general_register               [nb_rename_unit]                      (uint32_t         )\n"));
66  err (_(" * nb_special_register               [nb_rename_unit]                      (uint32_t         )\n"));
67  err (_(" * nb_reg_free                       [nb_rename_unit]                      (uint32_t         )\n"));
68  err (_(" * nb_rename_unit_bank               [nb_rename_unit]                      (uint32_t         )\n"));
69//   err (_(" * size_read_counter                 [nb_rename_unit]                      (uint32_t         )\n"));
70  err (_(" * nb_load_store_queue               [nb_rename_unit]                      (uint32_t         )\n"));
71  err (_(" * size_store_queue                  [nb_rename_unit][nb_load_store_queue] (uint32_t         )\n"));
72  err (_(" * size_load_queue                   [nb_rename_unit][nb_load_store_queue] (uint32_t         )\n"));
73  err (_(" * nb_inst_memory                    [nb_rename_unit][nb_load_store_queue] (uint32_t         )\n"));
74  err (_(" * link_load_store_unit_with_thread  [nb_front_end][nb_context]            (uint32_t         )\n"));
75
76  exit (1);
77}
78
79#ifndef SYSTEMC
80int main    (int argc, char * argv[])
81#else
82int sc_main (int argc, char * argv[])
83#endif
84{
85  if (argc <= static_cast<int>(2+NB_PARAMS))
86    usage (argc, argv);
87
88  uint32_t _sum_nb_context          = 0;
89  uint32_t _sum_nb_load_store_queue = 0;
90
91  uint32_t x = 1;
92
93  string name = argv[x++];
94
95  uint32_t              _nb_front_end                      = fromString<uint32_t         >(argv[x++]);
96
97  if (argc <= static_cast<int>(2+NB_PARAMS+3*_nb_front_end))
98    usage (argc, argv);
99
100  uint32_t            * _nb_context                        = new uint32_t [_nb_front_end];
101  for (uint32_t i=0; i<_nb_front_end; i++)
102    {
103      _nb_context [i] = fromString<uint32_t>(argv[x++]);
104      _sum_nb_context += _nb_context [i];
105    }
106  uint32_t              _nb_rename_unit                    = fromString<uint32_t         >(argv[x++]);
107  uint32_t              _nb_execute_loop                   = fromString<uint32_t         >(argv[x++]);
108  uint32_t            * _nb_inst_decod                     = new uint32_t [_nb_front_end];
109  for (uint32_t i=0; i<_nb_front_end; i++)
110    _nb_inst_decod [i] = fromString<uint32_t>(argv[x++]);
111
112  if (argc <= static_cast<int>(2+NB_PARAMS+3*_nb_front_end+2*_sum_nb_context+10*_nb_rename_unit+_nb_execute_loop))
113    usage (argc, argv);
114
115  uint32_t            * _nb_inst_insert                    = new uint32_t [_nb_rename_unit];
116  uint32_t            * _nb_inst_retire                    = new uint32_t [_nb_rename_unit];
117  for (uint32_t i=0; i<_nb_rename_unit; i++)
118    _nb_inst_insert [i] = fromString<uint32_t>(argv[x++]);
119  for (uint32_t i=0; i<_nb_rename_unit; i++)
120    _nb_inst_retire [i] = fromString<uint32_t>(argv[x++]);
121
122//uint32_t              _nb_inst_issue                     = fromString<uint32_t         >(argv[x++]);
123  uint32_t            * _nb_inst_execute                   = new uint32_t [_nb_execute_loop];
124  for (uint32_t i=0; i<_nb_execute_loop; i++)
125    _nb_inst_execute [i] = fromString<uint32_t>(argv[x++]);
126  uint32_t              _nb_inst_reexecute                 = fromString<uint32_t         >(argv[x++]);
127  uint32_t              _nb_inst_commit                    = fromString<uint32_t         >(argv[x++]);
128  uint32_t              _nb_inst_branch_complete           = fromString<uint32_t         >(argv[x++]);
129  uint32_t           ** _nb_branch_speculated              = new uint32_t * [_nb_front_end];
130  for (uint32_t i=0; i<_nb_front_end; i++)
131    {
132      _nb_branch_speculated [i] = new uint32_t [_nb_context[i]];
133      for (uint32_t j=0; j<_nb_context[i]; j++)
134        _nb_branch_speculated [i][j] = fromString<uint32_t>(argv[x++]);
135    }
136  uint32_t              _size_nb_inst_decod                = fromString<uint32_t         >(argv[x++]);
137  uint32_t              _nb_rename_unit_select             = fromString<uint32_t         >(argv[x++]);
138  uint32_t              _nb_execute_loop_select            = fromString<uint32_t         >(argv[x++]);
139  uint32_t              _size_general_data                 = fromString<uint32_t         >(argv[x++]);
140  uint32_t              _size_special_data                 = fromString<uint32_t         >(argv[x++]);
141  uint32_t            * _link_rename_unit_with_front_end   = new uint32_t [_nb_front_end];
142  for (uint32_t i=0; i<_nb_front_end; i++)
143    _link_rename_unit_with_front_end [i] = fromString<uint32_t>(argv[x++]);
144  uint32_t              _size_re_order_buffer              = fromString<uint32_t         >(argv[x++]);
145  uint32_t              _nb_re_order_buffer_bank           = fromString<uint32_t         >(argv[x++]);
146  Tpriority_t           _commit_priority                   = fromString<Tpriority_t      >(argv[x++]);
147  Tload_balancing_t     _commit_load_balancing             = fromString<Tload_balancing_t>(argv[x++]);
148  uint32_t              _size_issue_queue                  = fromString<uint32_t         >(argv[x++]);
149  issue_queue::Tissue_queue_scheme_t
150                        _issue_queue_scheme                = fromString<issue_queue::Tissue_queue_scheme_t>(argv[x++]);
151  uint32_t              _nb_issue_queue_bank               = fromString<uint32_t         >(argv[x++]);
152  Tpriority_t           _issue_priority                    = fromString<Tpriority_t      >(argv[x++]);
153  Tload_balancing_t     _issue_load_balancing              = fromString<Tload_balancing_t>(argv[x++]);
154//   bool               ** _table_routing                     = new bool * [_nb_rename_unit];
155//   for (uint32_t i=0; i<_nb_rename_unit; i++)
156//     {
157//       _table_routing [i] = new bool [_nb_inst_issue];
158//       for (uint32_t j=0; j<_nb_inst_issue; j++)
159//         _table_routing [i][j] = fromString<bool>(argv[x++]);
160//     }
161
162  if (argc <= static_cast<int>(2+NB_PARAMS+3*_nb_front_end+2*_sum_nb_context+10*_nb_rename_unit+_nb_execute_loop//+_nb_rename_unit*_nb_inst_issue+12*_nb_inst_issue
163                               ))
164    usage (argc, argv);
165 
166//   bool               ** _table_issue_type                  = new bool * [_nb_inst_issue];
167//   for (uint32_t i=0; i<_nb_inst_issue; i++)   
168//     {
169//       _table_issue_type [i] = new bool [MAX_TYPE];
170//       for (uint32_t j=0; j<MAX_TYPE; j++)
171//         _table_issue_type [i][j] = false;
172
173//       _table_issue_type [i][TYPE_ALU    ] = fromString<bool>(argv[x++]);
174//       _table_issue_type [i][TYPE_SHIFT  ] = fromString<bool>(argv[x++]);
175//       _table_issue_type [i][TYPE_MOVE   ] = fromString<bool>(argv[x++]);
176//       _table_issue_type [i][TYPE_TEST   ] = fromString<bool>(argv[x++]);
177//       _table_issue_type [i][TYPE_MUL    ] = fromString<bool>(argv[x++]);
178//       _table_issue_type [i][TYPE_DIV    ] = fromString<bool>(argv[x++]);
179//       _table_issue_type [i][TYPE_EXTEND ] = fromString<bool>(argv[x++]);
180//       _table_issue_type [i][TYPE_FIND   ] = fromString<bool>(argv[x++]);
181//       _table_issue_type [i][TYPE_SPECIAL] = fromString<bool>(argv[x++]);
182//       _table_issue_type [i][TYPE_CUSTOM ] = fromString<bool>(argv[x++]);
183//       _table_issue_type [i][TYPE_BRANCH ] = fromString<bool>(argv[x++]);
184//       _table_issue_type [i][TYPE_MEMORY ] = fromString<bool>(argv[x++]);
185//     }
186 
187  uint32_t              _size_reexecute_queue              = fromString<uint32_t         >(argv[x++]);
188  Tpriority_t           _reexecute_priority                = fromString<Tpriority_t      >(argv[x++]);
189  Tload_balancing_t     _reexecute_load_balancing          = fromString<Tload_balancing_t>(argv[x++]);
190
191  Tpriority_t         * _rename_select_priority            = new Tpriority_t       [_nb_rename_unit];
192  Tload_balancing_t   * _rename_select_load_balancing      = new Tload_balancing_t [_nb_rename_unit];
193  uint32_t            * _rename_select_nb_front_end_select = new uint32_t          [_nb_rename_unit];
194  uint32_t            * _nb_general_register               = new uint32_t          [_nb_rename_unit];
195  uint32_t            * _nb_special_register               = new uint32_t          [_nb_rename_unit];
196  uint32_t            * _nb_reg_free                       = new uint32_t          [_nb_rename_unit];
197  uint32_t            * _nb_rename_unit_bank               = new uint32_t          [_nb_rename_unit];
198//   uint32_t            * _size_read_counter                 = new uint32_t          [_nb_rename_unit];
199  uint32_t            * _nb_load_store_queue               = new uint32_t          [_nb_rename_unit];
200
201  for (uint32_t i=0; i<_nb_rename_unit; i++)
202    _rename_select_priority            [i] = fromString<Tpriority_t      >(argv[x++]);
203  for (uint32_t i=0; i<_nb_rename_unit; i++)
204    _rename_select_load_balancing      [i] = fromString<Tload_balancing_t>(argv[x++]);
205  for (uint32_t i=0; i<_nb_rename_unit; i++)
206    _rename_select_nb_front_end_select [i] = fromString<uint32_t         >(argv[x++]);
207  for (uint32_t i=0; i<_nb_rename_unit; i++)
208    _nb_general_register               [i] = fromString<uint32_t         >(argv[x++]);
209  for (uint32_t i=0; i<_nb_rename_unit; i++)
210    _nb_special_register               [i] = fromString<uint32_t         >(argv[x++]);
211  for (uint32_t i=0; i<_nb_rename_unit; i++)
212    _nb_reg_free                       [i] = fromString<uint32_t         >(argv[x++]);
213  for (uint32_t i=0; i<_nb_rename_unit; i++)
214    _nb_rename_unit_bank               [i] = fromString<uint32_t         >(argv[x++]);
215//   for (uint32_t i=0; i<_nb_rename_unit; i++)
216//     _size_read_counter                 [i] = fromString<uint32_t         >(argv[x++]);
217  for (uint32_t i=0; i<_nb_rename_unit; i++)
218    {
219    _nb_load_store_queue               [i] = fromString<uint32_t         >(argv[x++]);
220    _sum_nb_load_store_queue += _nb_load_store_queue [i];
221    }
222
223  if (argc != static_cast<int>(2+NB_PARAMS+3*_nb_front_end+2*_sum_nb_context+10*_nb_rename_unit+_nb_execute_loop+// _nb_rename_unit*_nb_inst_issue+12*_nb_inst_issue
224                               3*_sum_nb_load_store_queue))
225    usage (argc, argv);
226
227
228  uint32_t           ** _size_store_queue                  = new uint32_t * [_nb_rename_unit];
229  for (uint32_t i=0; i<_nb_rename_unit; i++)
230    {
231      _size_store_queue [i] = new uint32_t [_nb_load_store_queue[i]];
232      for (uint32_t j=0; j<_nb_load_store_queue[i]; j++)
233        _size_store_queue [i][j] = fromString<uint32_t>(argv[x++]);
234    }
235
236  uint32_t           ** _size_load_queue                  = new uint32_t * [_nb_rename_unit];
237  for (uint32_t i=0; i<_nb_rename_unit; i++)
238    {
239      _size_load_queue [i] = new uint32_t [_nb_load_store_queue[i]];
240      for (uint32_t j=0; j<_nb_load_store_queue[i]; j++)
241        _size_load_queue [i][j] = fromString<uint32_t>(argv[x++]);
242    }
243
244  uint32_t           ** _nb_inst_memory                   = new uint32_t * [_nb_rename_unit];
245  for (uint32_t i=0; i<_nb_rename_unit; i++)
246    {
247      _nb_inst_memory  [i] = new uint32_t [_nb_load_store_queue[i]];
248      for (uint32_t j=0; j<_nb_load_store_queue[i]; j++)
249        _nb_inst_memory  [i][j] = fromString<uint32_t>(argv[x++]);
250    }
251
252  uint32_t           ** _link_load_store_unit_with_thread  = new uint32_t * [_nb_front_end];
253  for (uint32_t i=0; i<_nb_front_end; i++)
254    {
255      _link_load_store_unit_with_thread [i] = new uint32_t [_nb_context[i]];
256      for (uint32_t j=0; j<_nb_context[i]; j++)
257        _link_load_store_unit_with_thread [i][j] = fromString<uint32_t>(argv[x++]);
258    }
259
260  bool     *** _implement_group       = new bool ** [_nb_front_end];
261  for (uint32_t i=0; i<_nb_front_end; i++)
262    {
263      _implement_group [i] = new bool * [_nb_context[i]];
264      for (uint32_t j=0; j<_nb_context[i]; j++)
265        {
266          _implement_group [i][j] = new bool [NB_GROUP];
267
268          for (uint32_t k=0; k<NB_GROUP; k++)
269            _implement_group [i][j][k] = false;
270
271          _implement_group [i][j][GROUP_SYSTEM_AND_CONTROL] = true;
272          _implement_group [i][j][GROUP_DCACHE            ] = true;
273        }
274    }
275
276  uint32_t          _nb_thread                          ;
277  uint32_t       ** _translate_num_context_to_num_thread; //[nb_front_end][nb_context]
278
279  ALLOC2(_translate_num_context_to_num_thread,uint32_t,_nb_front_end,_nb_context[it1]);
280
281  _nb_thread = 0;
282  for (uint32_t i=0; i<_nb_front_end; i++)
283    for (uint32_t j=0; j<_nb_context [i]; j++)
284      _translate_num_context_to_num_thread [i][j] = _nb_thread ++;
285
286  int _return = EXIT_SUCCESS;
287  try 
288    {
289      morpheo::behavioural::core::multi_ooo_engine::ooo_engine::Parameters * param = new morpheo::behavioural::core::multi_ooo_engine::ooo_engine::Parameters
290        (
291         _nb_front_end                     ,
292         _nb_context                       ,
293         _nb_rename_unit                   ,
294         _nb_execute_loop                  ,
295         _nb_inst_decod                    ,
296         _nb_inst_insert                   ,
297         _nb_inst_retire                   ,
298//       _nb_inst_issue                    ,
299         _nb_inst_execute                  ,
300         _nb_inst_reexecute                ,
301         _nb_inst_commit                   ,
302         _nb_inst_branch_complete          ,
303         _nb_branch_speculated             ,
304         _size_nb_inst_decod               ,
305         _nb_rename_unit_select            ,
306         _nb_execute_loop_select           ,
307         _size_general_data                ,
308         _size_special_data                ,
309         _link_rename_unit_with_front_end  ,
310         _size_re_order_buffer             ,
311         _nb_re_order_buffer_bank          ,
312         _commit_priority                  ,
313         _commit_load_balancing            ,
314         _size_issue_queue                 ,
315         _issue_queue_scheme               ,
316         _nb_issue_queue_bank              ,
317         _issue_priority                   ,
318         _issue_load_balancing             ,
319//          _table_routing                    ,
320//          _table_issue_type                 ,
321         _size_reexecute_queue             ,
322         _reexecute_priority               ,
323         _reexecute_load_balancing         ,
324         _rename_select_priority           ,
325         _rename_select_load_balancing     ,
326         _rename_select_nb_front_end_select,
327         _nb_general_register              ,
328         _nb_special_register              ,
329         _nb_reg_free                      ,
330         _nb_rename_unit_bank              ,
331//          _size_read_counter                ,
332         _nb_load_store_queue              ,
333         _size_store_queue                 ,
334         _size_load_queue                  ,
335         _nb_inst_memory                   ,
336         _link_load_store_unit_with_thread ,
337         _implement_group                  ,
338         _nb_thread                          ,
339         _translate_num_context_to_num_thread,
340         true //is_toplevel
341         );
342     
343      msg(_("%s"),param->print(0).c_str());
344     
345      test (name,param);
346
347      delete param;
348    }
349  catch (morpheo::ErrorMorpheo & error)
350    {
351      msg (_("<%s> :\n%s"),name.c_str(), error.what ());
352      _return = EXIT_FAILURE;
353    }
354
355  try 
356    {
357      if (_return == EXIT_SUCCESS)
358        TEST_OK("OOO_Engine : no error");
359      else
360        TEST_KO("OOO_Engine : a lot of error");
361    }
362  catch (morpheo::ErrorMorpheo & error)
363    {
364//       msg (_("<%s> :\n%s"),name.c_str(), error.what ());
365      _return = EXIT_FAILURE;
366    }
367
368  DELETE2(_translate_num_context_to_num_thread,_nb_front_end,_nb_context[it1]);
369
370  for (uint32_t i=0; i<_nb_front_end; i++)
371    {
372      for (uint32_t j=0; j<_nb_context[i]; j++)
373        delete [] _implement_group [i][j];
374      delete [] _implement_group [i];
375    }
376  delete [] _implement_group;
377
378  for (uint32_t i=0; i<_nb_front_end; i++)
379    delete [] _link_load_store_unit_with_thread [i];
380  delete [] _link_load_store_unit_with_thread;
381
382  for (uint32_t i=0; i<_nb_rename_unit; i++)
383    delete [] _nb_inst_memory  [i];
384  delete [] _nb_inst_memory ;
385
386  for (uint32_t i=0; i<_nb_rename_unit; i++)
387    delete [] _size_load_queue [i];
388  delete [] _size_load_queue;
389
390  for (uint32_t i=0; i<_nb_rename_unit; i++)
391    delete []_size_store_queue [i];
392  delete []_size_store_queue;
393
394  delete [] _nb_load_store_queue               ;
395//   delete [] _size_read_counter                 ;
396  delete [] _nb_rename_unit_bank               ;
397  delete [] _nb_reg_free                       ;
398  delete [] _nb_special_register               ;
399  delete [] _nb_general_register               ;
400  delete [] _rename_select_nb_front_end_select ;
401  delete [] _rename_select_load_balancing      ;
402  delete [] _rename_select_priority            ;
403
404//   for (uint32_t i=0; i<_nb_inst_issue; i++)   
405//     delete [] _table_issue_type [i];
406//   delete [] _table_issue_type; 
407
408//   for (uint32_t i=0; i<_nb_rename_unit; i++)
409//     delete [] _table_routing [i];
410//   delete [] _table_routing;
411
412  delete [] _link_rename_unit_with_front_end;
413
414  for (uint32_t i=0; i<_nb_front_end; i++)
415    delete [] _nb_branch_speculated [i];
416  delete [] _nb_branch_speculated;
417 
418  delete [] _nb_inst_execute;
419  delete [] _nb_inst_retire ;
420  delete [] _nb_inst_insert ;
421  delete [] _nb_inst_decod  ;
422  delete [] _nb_context     ;
423
424  return (_return);
425}
Note: See TracBrowser for help on using the repository browser.