source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Network/Read_unit_to_Execution_unit/SelfTest/src/test.cpp @ 77

Last change on this file since 77 was 77, checked in by rosiere, 16 years ago
  • Add two component :
    • network between read unit and execute unit
    • network between execute unit and write unit
  • remove parameters "nb_operation" and "nb_type"
  • in write_queue add the special case : load_speculative
File size: 26.8 KB
Line 
1/*
2 * $Id$
3 *
4 * [ Description ]
5 *
6 * Test
7 */
8
9#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Network/Read_unit_to_Execution_unit/SelfTest/include/test.h"
10#include "Common/include/Test.h"
11#include "Common/include/BitManipulation.h"
12#include "Behavioural/include/Allocation.h"
13#include <list>
14#include <set>
15
16#define NB_ITERATION  1
17#define CYCLE_MAX     (128*NB_ITERATION)
18
19#define LABEL(str...)                                                   \
20  {                                                                     \
21    msg (_("{%d} "),static_cast<uint32_t>(sc_simulation_time()));       \
22    msg (str);                                                          \
23    msg (_("\n"));                                                      \
24  } while(0)
25
26#define SC_START(cycle_offset)                                                       \
27  do                                                                                 \
28    {                                                                                \
29      /*cout << "SC_START (begin)" << endl;*/                                        \
30                                                                                     \
31      uint32_t cycle_current = static_cast<uint32_t>(sc_simulation_time());          \
32      if (cycle_offset != 0)                                                         \
33        {                                                                            \
34          cout << "##########[ cycle "<< cycle_current+cycle_offset << " ]" << endl; \
35        }                                                                            \
36                                                                                     \
37      if (cycle_current > CYCLE_MAX)                                                 \
38        {                                                                            \
39          TEST_KO("Maximal cycles Reached");                                         \
40        }                                                                            \
41                                                                                     \
42      sc_start(cycle_offset);                                                        \
43                                                                                     \
44      /*cout << "SC_START (end  )" << endl;*/                                        \
45    } while(0)
46
47
48class entry_t 
49{
50public : Tcontext_t         _context_id           ;
51public : Tcontext_t         _front_end_id         ;
52public : Tcontext_t         _ooo_engine_id        ;
53public : Tpacket_t          _packet_id            ;
54public : Toperation_t       _operation            ;
55public : Ttype_t            _type                 ;
56public : Tlsq_ptr_t         _store_queue_ptr_write;
57public : Tlsq_ptr_t         _load_queue_ptr_write ;
58public : Tcontrol_t         _has_immediat         ;
59public : Tgeneral_data_t    _immediat             ;
60public : Tgeneral_data_t    _data_ra              ;
61public : Tgeneral_data_t    _data_rb              ;
62public : Tspecial_data_t    _data_rc              ;
63public : Tcontrol_t         _write_rd             ;
64public : Tgeneral_address_t _num_reg_rd           ;
65public : Tcontrol_t         _write_re             ;
66public : Tspecial_address_t _num_reg_re           ;
67
68public : entry_t (Tcontext_t         context_id           ,
69                  Tcontext_t         front_end_id         ,
70                  Tcontext_t         ooo_engine_id        ,
71                  Tpacket_t          packet_id            ,
72                  Toperation_t       operation            ,
73                  Ttype_t            type                 ,
74                  Tlsq_ptr_t         store_queue_ptr_write,
75                  Tlsq_ptr_t         load_queue_ptr_write ,
76                  Tcontrol_t         has_immediat         ,
77                  Tgeneral_data_t    immediat             ,
78                  Tgeneral_data_t    data_ra              ,
79                  Tgeneral_data_t    data_rb              ,
80                  Tspecial_data_t    data_rc              ,
81                  Tcontrol_t         write_rd             ,
82                  Tgeneral_address_t num_reg_rd           ,
83                  Tcontrol_t         write_re             ,
84                  Tspecial_address_t num_reg_re           )
85  {
86    _context_id            = context_id           ;
87    _front_end_id          = front_end_id         ;
88    _ooo_engine_id         = ooo_engine_id        ;
89    _packet_id             = packet_id            ;
90    _operation             = operation            ;
91    _type                  = type                 ;
92    _store_queue_ptr_write = store_queue_ptr_write;
93    _load_queue_ptr_write  = load_queue_ptr_write ;
94    _has_immediat          = has_immediat         ;
95    _immediat              = immediat             ;
96    _data_ra               = data_ra              ;
97    _data_rb               = data_rb              ;
98    _data_rc               = data_rc              ;
99    _write_rd              = write_rd             ;
100    _num_reg_rd            = num_reg_rd           ;
101    _write_re              = write_re             ;
102    _num_reg_re            = num_reg_re           ;
103  }
104};
105
106void test (string name,
107           morpheo::behavioural::core::multi_execute_loop::execute_loop::network::read_unit_to_execution_unit::Parameters * _param)
108{
109  msg(_("<%s> : Simulation SystemC.\n"),name.c_str());
110
111#ifdef STATISTICS
112  morpheo::behavioural::Parameters_Statistics * _parameters_statistics = new morpheo::behavioural::Parameters_Statistics (5,50);
113#endif
114
115  Read_unit_to_Execution_unit * _Read_unit_to_Execution_unit = new Read_unit_to_Execution_unit (name.c_str(),
116#ifdef STATISTICS
117                                             _parameters_statistics,
118#endif
119                                             _param);
120 
121#ifdef SYSTEMC
122  /*********************************************************************
123   * Déclarations des signaux
124   *********************************************************************/
125  string rename;
126
127  sc_clock              *  in_CLOCK  = new sc_clock ("clock", 1.0, 0.5);         
128  sc_signal<Tcontrol_t> *  in_NRESET = new sc_signal<Tcontrol_t> ("NRESET");
129
130  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_VAL                  ," in_READ_UNIT_OUT_VAL"                  ,Tcontrol_t        ,_param->_nb_read_unit);
131  ALLOC1_SC_SIGNAL(out_READ_UNIT_OUT_ACK                  ,"out_READ_UNIT_OUT_ACK"                  ,Tcontrol_t        ,_param->_nb_read_unit);
132  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_CONTEXT_ID           ," in_READ_UNIT_OUT_CONTEXT_ID"           ,Tcontext_t        ,_param->_nb_read_unit);
133  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_FRONT_END_ID         ," in_READ_UNIT_OUT_FRONT_END_ID"         ,Tcontext_t        ,_param->_nb_read_unit);
134  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_OOO_ENGINE_ID        ," in_READ_UNIT_OUT_OOO_ENGINE_ID"        ,Tcontext_t        ,_param->_nb_read_unit);
135  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_PACKET_ID            ," in_READ_UNIT_OUT_PACKET_ID"            ,Tpacket_t         ,_param->_nb_read_unit);
136  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_OPERATION            ," in_READ_UNIT_OUT_OPERATION"            ,Toperation_t      ,_param->_nb_read_unit);
137  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_TYPE                 ," in_READ_UNIT_OUT_TYPE"                 ,Ttype_t           ,_param->_nb_read_unit);
138  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_STORE_QUEUE_PTR_WRITE," in_READ_UNIT_OUT_STORE_QUEUE_PTR_WRITE",Tlsq_ptr_t        ,_param->_nb_read_unit);
139  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_LOAD_QUEUE_PTR_WRITE ," in_READ_UNIT_OUT_LOAD_QUEUE_PTR_WRITE" ,Tlsq_ptr_t        ,_param->_nb_read_unit);
140  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_HAS_IMMEDIAT         ," in_READ_UNIT_OUT_HAS_IMMEDIAT"         ,Tcontrol_t        ,_param->_nb_read_unit);
141  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_IMMEDIAT             ," in_READ_UNIT_OUT_IMMEDIAT"             ,Tgeneral_data_t   ,_param->_nb_read_unit);
142  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_DATA_RA              ," in_READ_UNIT_OUT_DATA_RA"              ,Tgeneral_data_t   ,_param->_nb_read_unit);
143  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_DATA_RB              ," in_READ_UNIT_OUT_DATA_RB"              ,Tgeneral_data_t   ,_param->_nb_read_unit);
144  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_DATA_RC              ," in_READ_UNIT_OUT_DATA_RC"              ,Tspecial_data_t   ,_param->_nb_read_unit);
145  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_WRITE_RD             ," in_READ_UNIT_OUT_WRITE_RD"             ,Tcontrol_t        ,_param->_nb_read_unit);
146  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_NUM_REG_RD           ," in_READ_UNIT_OUT_NUM_REG_RD"           ,Tgeneral_address_t,_param->_nb_read_unit);
147  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_WRITE_RE             ," in_READ_UNIT_OUT_WRITE_RE"             ,Tcontrol_t        ,_param->_nb_read_unit);
148  ALLOC1_SC_SIGNAL( in_READ_UNIT_OUT_NUM_REG_RE           ," in_READ_UNIT_OUT_NUM_REG_RE"           ,Tspecial_address_t,_param->_nb_read_unit);
149  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_VAL                  ,"out_EXECUTE_UNIT_IN_VAL"                  ,Tcontrol_t        ,_param->_nb_execute_unit);
150  ALLOC1_SC_SIGNAL( in_EXECUTE_UNIT_IN_ACK                  ," in_EXECUTE_UNIT_IN_ACK"                  ,Tcontrol_t        ,_param->_nb_execute_unit);
151  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_CONTEXT_ID           ,"out_EXECUTE_UNIT_IN_CONTEXT_ID"           ,Tcontext_t        ,_param->_nb_execute_unit);
152  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_FRONT_END_ID         ,"out_EXECUTE_UNIT_IN_FRONT_END_ID"         ,Tcontext_t        ,_param->_nb_execute_unit);
153  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_OOO_ENGINE_ID        ,"out_EXECUTE_UNIT_IN_OOO_ENGINE_ID"        ,Tcontext_t        ,_param->_nb_execute_unit);
154  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_PACKET_ID            ,"out_EXECUTE_UNIT_IN_PACKET_ID"            ,Tpacket_t         ,_param->_nb_execute_unit);
155  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_OPERATION            ,"out_EXECUTE_UNIT_IN_OPERATION"            ,Toperation_t      ,_param->_nb_execute_unit);
156  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_TYPE                 ,"out_EXECUTE_UNIT_IN_TYPE"                 ,Ttype_t           ,_param->_nb_execute_unit);
157  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_STORE_QUEUE_PTR_WRITE,"out_EXECUTE_UNIT_IN_STORE_QUEUE_PTR_WRITE",Tlsq_ptr_t        ,_param->_nb_execute_unit);
158  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_LOAD_QUEUE_PTR_WRITE ,"out_EXECUTE_UNIT_IN_LOAD_QUEUE_PTR_WRITE" ,Tlsq_ptr_t        ,_param->_nb_execute_unit);
159  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_HAS_IMMEDIAT         ,"out_EXECUTE_UNIT_IN_HAS_IMMEDIAT"         ,Tcontrol_t        ,_param->_nb_execute_unit);
160  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_IMMEDIAT             ,"out_EXECUTE_UNIT_IN_IMMEDIAT"             ,Tgeneral_data_t   ,_param->_nb_execute_unit);
161  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_DATA_RA              ,"out_EXECUTE_UNIT_IN_DATA_RA"              ,Tgeneral_data_t   ,_param->_nb_execute_unit);
162  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_DATA_RB              ,"out_EXECUTE_UNIT_IN_DATA_RB"              ,Tgeneral_data_t   ,_param->_nb_execute_unit);
163  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_DATA_RC              ,"out_EXECUTE_UNIT_IN_DATA_RC"              ,Tspecial_data_t   ,_param->_nb_execute_unit);
164  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_WRITE_RD             ,"out_EXECUTE_UNIT_IN_WRITE_RD"             ,Tcontrol_t        ,_param->_nb_execute_unit);
165  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_NUM_REG_RD           ,"out_EXECUTE_UNIT_IN_NUM_REG_RD"           ,Tgeneral_address_t,_param->_nb_execute_unit);
166  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_WRITE_RE             ,"out_EXECUTE_UNIT_IN_WRITE_RE"             ,Tcontrol_t        ,_param->_nb_execute_unit);
167  ALLOC1_SC_SIGNAL(out_EXECUTE_UNIT_IN_NUM_REG_RE           ,"out_EXECUTE_UNIT_IN_NUM_REG_RE"           ,Tspecial_address_t,_param->_nb_execute_unit);
168 
169 
170  /********************************************************
171   * Instanciation
172   ********************************************************/
173 
174  msg(_("<%s> : Instanciation of _Read_unit_to_Execution_unit.\n"),name.c_str());
175
176  (*(_Read_unit_to_Execution_unit->in_CLOCK))        (*(in_CLOCK));
177  (*(_Read_unit_to_Execution_unit->in_NRESET))       (*(in_NRESET));
178
179  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_VAL                  ,_param->_nb_read_unit);
180  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_READ_UNIT_OUT_ACK                  ,_param->_nb_read_unit);
181  if (_param->_have_port_context_id)
182  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_CONTEXT_ID           ,_param->_nb_read_unit);
183  if (_param->_have_port_front_end_id)
184  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_FRONT_END_ID         ,_param->_nb_read_unit);
185  if (_param->_have_port_ooo_engine_id)
186  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_OOO_ENGINE_ID        ,_param->_nb_read_unit);
187  if (_param->_have_port_packet_id)
188  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_PACKET_ID            ,_param->_nb_read_unit);
189  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_OPERATION            ,_param->_nb_read_unit);
190  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_TYPE                 ,_param->_nb_read_unit);
191  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_STORE_QUEUE_PTR_WRITE,_param->_nb_read_unit);
192  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_LOAD_QUEUE_PTR_WRITE ,_param->_nb_read_unit);
193  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_HAS_IMMEDIAT         ,_param->_nb_read_unit);
194  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_IMMEDIAT             ,_param->_nb_read_unit);
195  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_DATA_RA              ,_param->_nb_read_unit);
196  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_DATA_RB              ,_param->_nb_read_unit);
197  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_DATA_RC              ,_param->_nb_read_unit);
198  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_WRITE_RD             ,_param->_nb_read_unit);
199  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_NUM_REG_RD           ,_param->_nb_read_unit);
200  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_WRITE_RE             ,_param->_nb_read_unit);
201  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_READ_UNIT_OUT_NUM_REG_RE           ,_param->_nb_read_unit);
202
203  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_VAL                  ,_param->_nb_execute_unit);
204  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit, in_EXECUTE_UNIT_IN_ACK                  ,_param->_nb_execute_unit);
205  if (_param->_have_port_context_id)
206  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_CONTEXT_ID           ,_param->_nb_execute_unit);
207  if (_param->_have_port_front_end_id)
208  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_FRONT_END_ID         ,_param->_nb_execute_unit);
209  if (_param->_have_port_ooo_engine_id)
210  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_OOO_ENGINE_ID        ,_param->_nb_execute_unit);
211  if (_param->_have_port_packet_id)
212  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_PACKET_ID            ,_param->_nb_execute_unit);
213  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_OPERATION            ,_param->_nb_execute_unit);
214  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_TYPE                 ,_param->_nb_execute_unit);
215  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_STORE_QUEUE_PTR_WRITE,_param->_nb_execute_unit);
216  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_LOAD_QUEUE_PTR_WRITE ,_param->_nb_execute_unit);
217  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_HAS_IMMEDIAT         ,_param->_nb_execute_unit);
218  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_IMMEDIAT             ,_param->_nb_execute_unit);
219  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_DATA_RA              ,_param->_nb_execute_unit);
220  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_DATA_RB              ,_param->_nb_execute_unit);
221  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_DATA_RC              ,_param->_nb_execute_unit);
222  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_WRITE_RD             ,_param->_nb_execute_unit);
223  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_NUM_REG_RD           ,_param->_nb_execute_unit);
224  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_WRITE_RE             ,_param->_nb_execute_unit);
225  INSTANCE1_SC_SIGNAL(_Read_unit_to_Execution_unit,out_EXECUTE_UNIT_IN_NUM_REG_RE           ,_param->_nb_execute_unit);
226
227  msg(_("<%s> : Start Simulation ............\n"),name.c_str());
228   
229  Time * _time = new Time();
230
231  /********************************************************
232   * Simulation - Begin
233   ********************************************************/
234
235  // Initialisation
236
237  const uint32_t seed = 0;
238// const uint32_t seed = static_cast<uint32_t>(time(NULL));
239
240  srand(seed);
241
242  const  int32_t percent_transaction_in  = 75;
243  const  int32_t percent_transaction_out = 75;
244
245  set<Tcontext_t> read_unit_thread [_param->_nb_read_unit];
246  set<Ttype_t   > read_unit_type   [_param->_nb_read_unit][_param->_nb_thread];
247 
248  for (uint32_t i=0; i<_param->_nb_read_unit; i++)
249    for (uint32_t j=0; j<_param->_nb_execute_unit; j++)
250      if (_param->_table_routing[i][j])
251        for (uint32_t k=0; k<_param->_nb_thread; k++)
252          if (_param->_table_execute_thread[j][k])
253            {
254              read_unit_thread [i].insert(k);
255             
256              for (uint32_t l=0; l<_param->_nb_type; l++)
257                if (_param->_table_execute_type[j][l])
258                  read_unit_type [i][k].insert(l);
259            }
260  //bool ** _table_routing       ; //array [nb_read_unit][nb_execute_unit]
261  //bool ** _table_execute_type  ; //array [nb_execute_unit][nb_type]
262  //bool ** _table_execute_thread; //array [nb_execute_unit][nb_thread]
263 
264  SC_START(0);
265  LABEL("Initialisation");
266
267  LABEL("Reset");
268  in_NRESET->write(0);
269  SC_START(5);
270  in_NRESET->write(1); 
271
272  LABEL("Loop of Test");
273
274  for (uint32_t iteration=0; iteration<NB_ITERATION; iteration ++)
275    {
276      LABEL("Iteration %d",iteration);
277
278      list<entry_t> request [_param->_nb_read_unit];
279
280      uint32_t nb_request_in;
281      for (nb_request_in=0; nb_request_in < _param->_nb_packet; )
282        for (uint32_t i=0; i<_param->_nb_read_unit; i++)
283          {
284            if (nb_request_in >= _param->_nb_packet)
285              break;
286
287            Tcontext_t context_id   ;
288            Tcontext_t front_end_id ;
289            Tcontext_t ooo_engine_id;
290            Tcontext_t num_thread   ;
291
292            // Find compatible thread
293            do
294              {
295                context_id    = range<Tcontext_t> (rand(), _param->_size_context_id   );
296                front_end_id  = range<Tcontext_t> (rand(), _param->_size_front_end_id );
297                ooo_engine_id = range<Tcontext_t> (rand(), _param->_size_ooo_engine_id);
298                num_thread    = get_num_thread (context_id   , _param->_size_context_id   ,
299                                                front_end_id , _param->_size_front_end_id ,
300                                                ooo_engine_id, _param->_size_ooo_engine_id);
301              }
302            while (read_unit_thread[i].find(num_thread) == read_unit_thread[i].end());
303
304            Ttype_t    type;
305           
306            // Find a compatible type
307            do
308              {
309                type = range<Ttype_t> (rand(), _param->_size_type);
310              }
311            while (read_unit_type[i][num_thread].find(type) == read_unit_type[i][num_thread].end());
312
313            request[i].push_back(entry_t (context_id   ,
314                                          front_end_id ,
315                                          ooo_engine_id,
316                                          nb_request_in,
317                                          range<Toperation_t      > (rand(), _param->_size_operation       ),
318                                          type,
319                                          range<Tlsq_ptr_t        > (rand(), _param->_size_store_queue     ),
320                                          range<Tlsq_ptr_t        > (rand(), _param->_size_load_queue      ),
321                                          range<Tcontrol_t        > (rand(), 2                             ),
322                                          range<Tgeneral_data_t   > (rand(), _param->_size_general_data    ),
323                                          range<Tgeneral_data_t   > (rand(), _param->_size_general_data    ),
324                                          range<Tgeneral_data_t   > (rand(), _param->_size_general_data    ),
325                                          range<Tspecial_data_t   > (rand(), _param->_size_special_data    ),
326                                          range<Tcontrol_t        > (rand(), 2                             ),
327                                          range<Tgeneral_address_t> (rand(), _param->_size_general_register),
328                                          range<Tcontrol_t        > (rand(), 2                             ),
329                                          range<Tspecial_address_t> (rand(), _param->_size_special_register)
330                                          ));
331
332            nb_request_in++;
333          }
334
335      uint32_t   nb_request_out = 0;
336
337      while (nb_request_out < nb_request_in)
338        {
339          for (uint32_t i=0; i<_param->_nb_read_unit; i++)
340            {
341              bool val = not request[i].empty() and ((rand()%100) < percent_transaction_in);
342               
343              in_READ_UNIT_OUT_VAL [i]->write(val);
344
345              if (val)
346                {
347                  in_READ_UNIT_OUT_CONTEXT_ID           [i] ->write(request[i].front()._context_id           );
348                  in_READ_UNIT_OUT_FRONT_END_ID         [i] ->write(request[i].front()._front_end_id         );
349                  in_READ_UNIT_OUT_OOO_ENGINE_ID        [i] ->write(request[i].front()._ooo_engine_id        );
350                  in_READ_UNIT_OUT_PACKET_ID            [i] ->write(request[i].front()._packet_id            );
351                  in_READ_UNIT_OUT_OPERATION            [i] ->write(request[i].front()._operation            );
352                  in_READ_UNIT_OUT_TYPE                 [i] ->write(request[i].front()._type                 );
353                  in_READ_UNIT_OUT_STORE_QUEUE_PTR_WRITE[i] ->write(request[i].front()._store_queue_ptr_write);
354                  in_READ_UNIT_OUT_LOAD_QUEUE_PTR_WRITE [i] ->write(request[i].front()._load_queue_ptr_write );
355                  in_READ_UNIT_OUT_HAS_IMMEDIAT         [i] ->write(request[i].front()._has_immediat         );
356                  in_READ_UNIT_OUT_IMMEDIAT             [i] ->write(request[i].front()._immediat             );
357                  in_READ_UNIT_OUT_DATA_RA              [i] ->write(request[i].front()._data_ra              );
358                  in_READ_UNIT_OUT_DATA_RB              [i] ->write(request[i].front()._data_rb              );
359                  in_READ_UNIT_OUT_DATA_RC              [i] ->write(request[i].front()._data_rc              );
360                  in_READ_UNIT_OUT_WRITE_RD             [i] ->write(request[i].front()._write_rd             );
361                  in_READ_UNIT_OUT_NUM_REG_RD           [i] ->write(request[i].front()._num_reg_rd           );
362                  in_READ_UNIT_OUT_WRITE_RE             [i] ->write(request[i].front()._write_re             );
363                  in_READ_UNIT_OUT_NUM_REG_RE           [i] ->write(request[i].front()._num_reg_re           );
364                }
365            }
366
367          for (uint32_t i=0; i<_param->_nb_execute_unit; i++)
368            in_EXECUTE_UNIT_IN_ACK [i]->write((rand()%100) < percent_transaction_out);
369
370          SC_START(0);
371
372          for (uint32_t i=0; i<_param->_nb_read_unit; i++)
373            if (in_READ_UNIT_OUT_VAL [i]->read() and out_READ_UNIT_OUT_ACK [i]->read())
374              {
375                LABEL("READ_UNIT_OUT   [%d] - Transaction accepted",i);
376              }
377
378          for (uint32_t i=0; i<_param->_nb_execute_unit; i++)
379            if (out_EXECUTE_UNIT_IN_VAL [i]->read() and in_EXECUTE_UNIT_IN_ACK [i]->read())
380              {
381                LABEL("EXECUTE_UNIT_IN [%d] - Transaction accepted (%d)",i,nb_request_out);
382                nb_request_out ++;
383               
384                Tpacket_t packet = (_param->_have_port_packet_id)?out_EXECUTE_UNIT_IN_PACKET_ID[i]->read():0;
385                LABEL("  * packet           : %d",packet);             
386                uint32_t read_unit;
387
388                // find read_unit
389                for (read_unit=0; read_unit<_param->_nb_read_unit; read_unit++)
390                  if (packet == ((_param->_have_port_packet_id)?request[read_unit].front()._packet_id:0))
391                    break;
392
393                LABEL("  * read_unit source : %d",read_unit);
394
395                if (_param->_have_port_packet_id)
396                TEST(Tcontext_t        ,out_EXECUTE_UNIT_IN_PACKET_ID            [i]->read(), request[read_unit].front()._packet_id            );
397
398                // Authorised link ? read_unit -> execute_unit
399                TEST(bool, _param->_table_routing[read_unit][i], true);
400
401                if (_param->_have_port_context_id)
402                TEST(Tcontext_t        ,out_EXECUTE_UNIT_IN_CONTEXT_ID           [i]->read(), request[read_unit].front()._context_id           );
403                if (_param->_have_port_front_end_id)
404                TEST(Tcontext_t        ,out_EXECUTE_UNIT_IN_FRONT_END_ID         [i]->read(), request[read_unit].front()._front_end_id         );
405                if (_param->_have_port_ooo_engine_id)
406                TEST(Tcontext_t        ,out_EXECUTE_UNIT_IN_OOO_ENGINE_ID        [i]->read(), request[read_unit].front()._ooo_engine_id        );
407                TEST(Toperation_t      ,out_EXECUTE_UNIT_IN_OPERATION            [i]->read(), request[read_unit].front()._operation            );
408                TEST(Ttype_t           ,out_EXECUTE_UNIT_IN_TYPE                 [i]->read(), request[read_unit].front()._type                 );
409                TEST(Tlsq_ptr_t        ,out_EXECUTE_UNIT_IN_STORE_QUEUE_PTR_WRITE[i]->read(), request[read_unit].front()._store_queue_ptr_write);
410                TEST(Tlsq_ptr_t        ,out_EXECUTE_UNIT_IN_LOAD_QUEUE_PTR_WRITE [i]->read(), request[read_unit].front()._load_queue_ptr_write );
411                TEST(Tcontrol_t        ,out_EXECUTE_UNIT_IN_HAS_IMMEDIAT         [i]->read(), request[read_unit].front()._has_immediat         );
412                TEST(Tgeneral_data_t   ,out_EXECUTE_UNIT_IN_IMMEDIAT             [i]->read(), request[read_unit].front()._immediat             );
413                TEST(Tgeneral_data_t   ,out_EXECUTE_UNIT_IN_DATA_RA              [i]->read(), request[read_unit].front()._data_ra              );
414                TEST(Tgeneral_data_t   ,out_EXECUTE_UNIT_IN_DATA_RB              [i]->read(), request[read_unit].front()._data_rb              );
415                TEST(Tspecial_data_t   ,out_EXECUTE_UNIT_IN_DATA_RC              [i]->read(), request[read_unit].front()._data_rc              );
416                TEST(Tcontrol_t        ,out_EXECUTE_UNIT_IN_WRITE_RD             [i]->read(), request[read_unit].front()._write_rd             );
417                TEST(Tgeneral_address_t,out_EXECUTE_UNIT_IN_NUM_REG_RD           [i]->read(), request[read_unit].front()._num_reg_rd           );
418                TEST(Tcontrol_t        ,out_EXECUTE_UNIT_IN_WRITE_RE             [i]->read(), request[read_unit].front()._write_re             );
419                TEST(Tspecial_address_t,out_EXECUTE_UNIT_IN_NUM_REG_RE           [i]->read(), request[read_unit].front()._num_reg_re           );
420               
421                request[read_unit].pop_front();
422              }
423          SC_START(1);
424        }
425
426    }
427
428  /********************************************************
429   * Simulation - End
430   ********************************************************/
431
432  TEST_OK ("End of Simulation");
433  delete _time;
434
435  msg(_("<%s> : ............ Stop Simulation\n"),name.c_str());
436
437  delete in_CLOCK;
438  delete in_NRESET;
439 
440  delete []  in_READ_UNIT_OUT_VAL                  ;
441  delete [] out_READ_UNIT_OUT_ACK                  ;
442  delete []  in_READ_UNIT_OUT_CONTEXT_ID           ;
443  delete []  in_READ_UNIT_OUT_FRONT_END_ID         ;
444  delete []  in_READ_UNIT_OUT_OOO_ENGINE_ID        ;
445  delete []  in_READ_UNIT_OUT_PACKET_ID            ;
446  delete []  in_READ_UNIT_OUT_OPERATION            ;
447  delete []  in_READ_UNIT_OUT_TYPE                 ;
448  delete []  in_READ_UNIT_OUT_STORE_QUEUE_PTR_WRITE;
449  delete []  in_READ_UNIT_OUT_LOAD_QUEUE_PTR_WRITE ;
450  delete []  in_READ_UNIT_OUT_HAS_IMMEDIAT         ;
451  delete []  in_READ_UNIT_OUT_IMMEDIAT             ;
452  delete []  in_READ_UNIT_OUT_DATA_RA              ;
453  delete []  in_READ_UNIT_OUT_DATA_RB              ;
454  delete []  in_READ_UNIT_OUT_DATA_RC              ;
455  delete []  in_READ_UNIT_OUT_WRITE_RD             ;
456  delete []  in_READ_UNIT_OUT_NUM_REG_RD           ;
457  delete []  in_READ_UNIT_OUT_WRITE_RE             ;
458  delete []  in_READ_UNIT_OUT_NUM_REG_RE           ;
459
460  delete [] out_EXECUTE_UNIT_IN_VAL                  ;
461  delete []  in_EXECUTE_UNIT_IN_ACK                  ;
462  delete [] out_EXECUTE_UNIT_IN_CONTEXT_ID           ;
463  delete [] out_EXECUTE_UNIT_IN_FRONT_END_ID         ;
464  delete [] out_EXECUTE_UNIT_IN_OOO_ENGINE_ID        ;
465  delete [] out_EXECUTE_UNIT_IN_PACKET_ID            ;
466  delete [] out_EXECUTE_UNIT_IN_OPERATION            ;
467  delete [] out_EXECUTE_UNIT_IN_TYPE                 ;
468  delete [] out_EXECUTE_UNIT_IN_STORE_QUEUE_PTR_WRITE;
469  delete [] out_EXECUTE_UNIT_IN_LOAD_QUEUE_PTR_WRITE ;
470  delete [] out_EXECUTE_UNIT_IN_HAS_IMMEDIAT         ;
471  delete [] out_EXECUTE_UNIT_IN_IMMEDIAT             ;
472  delete [] out_EXECUTE_UNIT_IN_DATA_RA              ;
473  delete [] out_EXECUTE_UNIT_IN_DATA_RB              ;
474  delete [] out_EXECUTE_UNIT_IN_DATA_RC              ;
475  delete [] out_EXECUTE_UNIT_IN_WRITE_RD             ;
476  delete [] out_EXECUTE_UNIT_IN_NUM_REG_RD           ;
477  delete [] out_EXECUTE_UNIT_IN_WRITE_RE             ;
478  delete [] out_EXECUTE_UNIT_IN_NUM_REG_RE           ;
479
480#endif
481
482  delete _Read_unit_to_Execution_unit;
483#ifdef STATISTICS
484  delete _parameters_statistics;
485#endif
486}
Note: See TracBrowser for help on using the repository browser.