source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Write_unit/Write_unit/Execute_queue/SelfTest/src/test.cpp @ 88

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

Almost complete design
with Test and test platform

  • Property svn:keywords set to Id
File size: 16.4 KB
Line 
1/*
2 * $Id: test.cpp 88 2008-12-10 18:31:39Z rosiere $
3 *
4 * [ Description ]
5 *
6 * Test
7 */
8
9#define NB_ITERATION  16
10#define CYCLE_MAX     (128*NB_ITERATION)
11
12#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Write_unit/Write_unit/Execute_queue/SelfTest/include/test.h"
13#include "Common/include/Test.h"
14#include "Behavioural/include/Allocation.h"
15#include "Common/include/BitManipulation.h"
16
17  class entry_t
18  {
19  public  : Tcontext_t         _context_id   ;
20  public  : Tcontext_t         _front_end_id ;
21  public  : Tcontext_t         _ooo_engine_id;
22  public  : Tpacket_t          _packet_id    ;
23//public  : Toperation_t       _operation    ;
24//public  : Ttype_t            _type         ;
25  public  : Tspecial_data_t    _flags        ;
26  public  : Texception_t       _exception    ;
27  public  : Tcontrol_t         _no_sequence  ;
28  public  : Tgeneral_data_t    _address      ;
29  public  : Tgeneral_data_t    _data         ;
30   
31  public  : entry_t (Tcontext_t         context_id   ,
32                     Tcontext_t         front_end_id ,
33                     Tcontext_t         ooo_engine_id,
34                     Tpacket_t          packet_id    ,
35                     //Toperation_t       operation    ,
36                     //Ttype_t            type         ,
37                     Tspecial_data_t    flags        ,
38                     Texception_t       exception    ,
39                     Tcontrol_t         no_sequence  ,
40                     Tgeneral_data_t    address      ,
41                     Tgeneral_data_t    data         )
42    {
43      _context_id    = context_id   ;
44      _front_end_id  = front_end_id ;
45      _ooo_engine_id = ooo_engine_id;
46      _packet_id     = packet_id    ;
47    //_operation     = operation    ;
48    //_type          = type         ;
49      _flags         = flags        ;
50      _exception     = exception    ;
51      _no_sequence   = no_sequence  ;
52      _address       = address      ;
53      _data          = data         ;
54    };
55
56    friend std::ostream& operator<< (std::ostream& output_stream,
57                                     entry_t & x)
58    {
59      output_stream << " * _context_id    : " << toString(x._context_id   ) << std::endl
60                    << " * _front_end_id  : " << toString(x._front_end_id ) << std::endl
61                    << " * _ooo_engine_id : " << toString(x._ooo_engine_id) << std::endl
62                    << " * _packet_id     : " << toString(x._packet_id    ) << std::endl
63                  //<< " * _operation     : " << toString(x._operation    ) << std::endl
64                  //<< " * _type          : " << toString(x._type         ) << std::endl
65                    << " * _flags         : " << toString(x._flags        ) << std::endl
66                    << " * _exception     : " << toString(x._exception    ) << std::endl
67                    << " * _no_sequence   : " << toString(x._no_sequence  ) << std::endl
68                    << " * _address       : " << toString(x._address      ) << std::endl
69                    << " * _data          : " << toString(x._data         ) << std::endl;
70
71      return output_stream;
72    }
73  };
74
75
76
77
78void test (string name,
79           morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_write_unit::write_unit::execute_queue::Parameters * _param)
80{
81  msg(_("<%s> : Simulation SystemC.\n"),name.c_str());
82
83#ifdef STATISTICS
84  morpheo::behavioural::Parameters_Statistics * _parameters_statistics = new morpheo::behavioural::Parameters_Statistics (5,50);
85#endif
86
87  Tusage_t _usage = USE_ALL;
88
89//   _usage = usage_unset(_usage,USE_SYSTEMC              );
90//   _usage = usage_unset(_usage,USE_VHDL                 );
91//   _usage = usage_unset(_usage,USE_VHDL_TESTBENCH       );
92//   _usage = usage_unset(_usage,USE_VHDL_TESTBENCH_ASSERT);
93//   _usage = usage_unset(_usage,USE_POSITION             );
94//   _usage = usage_unset(_usage,USE_STATISTICS           );
95//   _usage = usage_unset(_usage,USE_INFORMATION          );
96
97  Execute_queue * _Execute_queue = new Execute_queue
98    (name.c_str(),
99#ifdef STATISTICS
100     _parameters_statistics,
101#endif
102     _param,
103     _usage);
104 
105#ifdef SYSTEMC
106  /*********************************************************************
107   * Déclarations des signaux
108   *********************************************************************/
109  string rename;
110
111  sc_clock              *  in_CLOCK  = new sc_clock ("clock", 1.0, 0.5);         
112  sc_signal<Tcontrol_t> *  in_NRESET = new sc_signal<Tcontrol_t> ("NRESET");
113
114  ALLOC_SC_SIGNAL ( in_EXECUTE_QUEUE_IN_VAL           ," in_EXECUTE_QUEUE_IN_VAL"           , Tcontrol_t        );
115  ALLOC_SC_SIGNAL (out_EXECUTE_QUEUE_IN_ACK           ,"out_EXECUTE_QUEUE_IN_ACK"           , Tcontrol_t        );
116  ALLOC_SC_SIGNAL ( in_EXECUTE_QUEUE_IN_CONTEXT_ID    ," in_EXECUTE_QUEUE_IN_CONTEXT_ID"    , Tcontext_t        );
117  ALLOC_SC_SIGNAL ( in_EXECUTE_QUEUE_IN_FRONT_END_ID  ," in_EXECUTE_QUEUE_IN_FRONT_END_ID"  , Tcontext_t        );
118  ALLOC_SC_SIGNAL ( in_EXECUTE_QUEUE_IN_OOO_ENGINE_ID ," in_EXECUTE_QUEUE_IN_OOO_ENGINE_ID" , Tcontext_t        );
119  ALLOC_SC_SIGNAL ( in_EXECUTE_QUEUE_IN_PACKET_ID     ," in_EXECUTE_QUEUE_IN_PACKET_ID"     , Tpacket_t         );
120//ALLOC_SC_SIGNAL ( in_EXECUTE_QUEUE_IN_OPERATION     ," in_EXECUTE_QUEUE_IN_OPERATION"     , Toperation_t      );
121//ALLOC_SC_SIGNAL ( in_EXECUTE_QUEUE_IN_TYPE          ," in_EXECUTE_QUEUE_IN_TYPE"          , Ttype_t           );
122  ALLOC_SC_SIGNAL ( in_EXECUTE_QUEUE_IN_FLAGS         ," in_EXECUTE_QUEUE_IN_FLAGS"         , Tspecial_data_t   );
123  ALLOC_SC_SIGNAL ( in_EXECUTE_QUEUE_IN_EXCEPTION     ," in_EXECUTE_QUEUE_IN_EXCEPTION"     , Texception_t      );
124  ALLOC_SC_SIGNAL ( in_EXECUTE_QUEUE_IN_NO_SEQUENCE   ," in_EXECUTE_QUEUE_IN_NO_SEQUENCE"   , Tcontrol_t        );
125  ALLOC_SC_SIGNAL ( in_EXECUTE_QUEUE_IN_ADDRESS       ," in_EXECUTE_QUEUE_IN_ADDRESS"       , Tgeneral_data_t   );
126  ALLOC_SC_SIGNAL ( in_EXECUTE_QUEUE_IN_DATA          ," in_EXECUTE_QUEUE_IN_DATA"          , Tgeneral_data_t   );
127  ALLOC_SC_SIGNAL (out_EXECUTE_QUEUE_OUT_VAL          ,"out_EXECUTE_QUEUE_OUT_VAL"          , Tcontrol_t        );
128  ALLOC_SC_SIGNAL ( in_EXECUTE_QUEUE_OUT_ACK          ," in_EXECUTE_QUEUE_OUT_ACK"          , Tcontrol_t        );
129  ALLOC_SC_SIGNAL (out_EXECUTE_QUEUE_OUT_CONTEXT_ID   ,"out_EXECUTE_QUEUE_OUT_CONTEXT_ID"   , Tcontext_t        );
130  ALLOC_SC_SIGNAL (out_EXECUTE_QUEUE_OUT_FRONT_END_ID ,"out_EXECUTE_QUEUE_OUT_FRONT_END_ID" , Tcontext_t        );
131  ALLOC_SC_SIGNAL (out_EXECUTE_QUEUE_OUT_OOO_ENGINE_ID,"out_EXECUTE_QUEUE_OUT_OOO_ENGINE_ID", Tcontext_t        );
132  ALLOC_SC_SIGNAL (out_EXECUTE_QUEUE_OUT_PACKET_ID    ,"out_EXECUTE_QUEUE_OUT_PACKET_ID"    , Tpacket_t         );
133//ALLOC_SC_SIGNAL (out_EXECUTE_QUEUE_OUT_OPERATION    ,"out_EXECUTE_QUEUE_OUT_OPERATION"    , Toperation_t      );
134//ALLOC_SC_SIGNAL (out_EXECUTE_QUEUE_OUT_TYPE         ,"out_EXECUTE_QUEUE_OUT_TYPE"         , Ttype_t           );
135  ALLOC_SC_SIGNAL (out_EXECUTE_QUEUE_OUT_FLAGS        ,"out_EXECUTE_QUEUE_OUT_FLAGS"        , Tspecial_data_t   );
136  ALLOC_SC_SIGNAL (out_EXECUTE_QUEUE_OUT_EXCEPTION    ,"out_EXECUTE_QUEUE_OUT_EXCEPTION"    , Texception_t      );
137  ALLOC_SC_SIGNAL (out_EXECUTE_QUEUE_OUT_NO_SEQUENCE  ,"out_EXECUTE_QUEUE_OUT_NO_SEQUENCE"  , Tcontrol_t        );
138  ALLOC_SC_SIGNAL (out_EXECUTE_QUEUE_OUT_ADDRESS      ,"out_EXECUTE_QUEUE_OUT_ADDRESS"      , Tgeneral_data_t   );
139  ALLOC_SC_SIGNAL (out_EXECUTE_QUEUE_OUT_DATA         ,"out_EXECUTE_QUEUE_OUT_DATA"         , Tgeneral_data_t   );
140
141 
142  /********************************************************
143   * Instanciation
144   ********************************************************/
145 
146  msg(_("<%s> : Instanciation of _Execute_queue.\n"),name.c_str());
147
148  (*(_Execute_queue->in_CLOCK))        (*(in_CLOCK));
149  (*(_Execute_queue->in_NRESET))       (*(in_NRESET));
150
151  INSTANCE_SC_SIGNAL (_Execute_queue,  in_EXECUTE_QUEUE_IN_VAL           );
152  INSTANCE_SC_SIGNAL (_Execute_queue, out_EXECUTE_QUEUE_IN_ACK           );
153  if (_param->_have_port_context_id)
154  INSTANCE_SC_SIGNAL (_Execute_queue,  in_EXECUTE_QUEUE_IN_CONTEXT_ID    );
155  if (_param->_have_port_front_end_id)
156  INSTANCE_SC_SIGNAL (_Execute_queue,  in_EXECUTE_QUEUE_IN_FRONT_END_ID  );
157  if (_param->_have_port_ooo_engine_id)
158  INSTANCE_SC_SIGNAL (_Execute_queue,  in_EXECUTE_QUEUE_IN_OOO_ENGINE_ID );
159  if (_param->_have_port_rob_ptr)
160  INSTANCE_SC_SIGNAL (_Execute_queue,  in_EXECUTE_QUEUE_IN_PACKET_ID     );
161//INSTANCE_SC_SIGNAL (_Execute_queue,  in_EXECUTE_QUEUE_IN_OPERATION     );
162//INSTANCE_SC_SIGNAL (_Execute_queue,  in_EXECUTE_QUEUE_IN_TYPE          );
163  INSTANCE_SC_SIGNAL (_Execute_queue,  in_EXECUTE_QUEUE_IN_FLAGS         );
164  INSTANCE_SC_SIGNAL (_Execute_queue,  in_EXECUTE_QUEUE_IN_EXCEPTION     );
165  INSTANCE_SC_SIGNAL (_Execute_queue,  in_EXECUTE_QUEUE_IN_NO_SEQUENCE   );
166  INSTANCE_SC_SIGNAL (_Execute_queue,  in_EXECUTE_QUEUE_IN_ADDRESS       );
167  INSTANCE_SC_SIGNAL (_Execute_queue,  in_EXECUTE_QUEUE_IN_DATA          );
168
169  INSTANCE_SC_SIGNAL (_Execute_queue, out_EXECUTE_QUEUE_OUT_VAL          );
170  INSTANCE_SC_SIGNAL (_Execute_queue,  in_EXECUTE_QUEUE_OUT_ACK          );
171  if (_param->_have_port_context_id)
172  INSTANCE_SC_SIGNAL (_Execute_queue, out_EXECUTE_QUEUE_OUT_CONTEXT_ID   );
173  if (_param->_have_port_front_end_id)
174  INSTANCE_SC_SIGNAL (_Execute_queue, out_EXECUTE_QUEUE_OUT_FRONT_END_ID );
175  if (_param->_have_port_ooo_engine_id)
176  INSTANCE_SC_SIGNAL (_Execute_queue, out_EXECUTE_QUEUE_OUT_OOO_ENGINE_ID);
177  if (_param->_have_port_rob_ptr)
178  INSTANCE_SC_SIGNAL (_Execute_queue, out_EXECUTE_QUEUE_OUT_PACKET_ID    );
179//INSTANCE_SC_SIGNAL (_Execute_queue, out_EXECUTE_QUEUE_OUT_OPERATION    );
180//INSTANCE_SC_SIGNAL (_Execute_queue, out_EXECUTE_QUEUE_OUT_TYPE         );
181  INSTANCE_SC_SIGNAL (_Execute_queue, out_EXECUTE_QUEUE_OUT_FLAGS        );
182  INSTANCE_SC_SIGNAL (_Execute_queue, out_EXECUTE_QUEUE_OUT_EXCEPTION    );
183  INSTANCE_SC_SIGNAL (_Execute_queue, out_EXECUTE_QUEUE_OUT_NO_SEQUENCE  );
184  INSTANCE_SC_SIGNAL (_Execute_queue, out_EXECUTE_QUEUE_OUT_ADDRESS      );
185  INSTANCE_SC_SIGNAL (_Execute_queue, out_EXECUTE_QUEUE_OUT_DATA         );
186
187  msg(_("<%s> : Start Simulation ............\n"),name.c_str());
188   
189  Time * _time = new Time();
190
191  /********************************************************
192   * Simulation - Begin
193   ********************************************************/
194
195  // Initialisation
196
197  const uint32_t seed = 0;
198//const uint32_t seed = static_cast<uint32_t>(time(NULL));
199
200  const  int32_t percent_transaction_execute_queue_in  = 75;
201  const  int32_t percent_transaction_execute_queue_out = 75;
202
203  entry_t *       request [_param->_nb_packet];
204
205  srand(seed);
206
207  SC_START(0);
208  LABEL("Initialisation");
209
210  LABEL("Reset");
211  in_NRESET->write(0);
212  SC_START(5);
213  in_NRESET->write(1); 
214
215  LABEL("Loop of Test");
216
217  for (uint32_t iteration=0; iteration<NB_ITERATION; iteration ++)
218    {
219      LABEL("Iteration %d",iteration);
220
221      for (uint32_t i=0; i<_param->_nb_packet; i++)
222        {
223          request [i] = new entry_t (range<Tcontext_t        >(rand(),_param->_size_context_id      ),
224                                     range<Tcontext_t        >(rand(),_param->_size_front_end_id    ),
225                                     range<Tcontext_t        >(rand(),_param->_size_ooo_engine_id   ),
226                                     i,
227                                   //range<Toperation_t      >(rand(),_param->_size_operation       ),
228                                   //range<Ttype_t           >(rand(),_param->_size_type            ),
229                                     range<Tspecial_data_t   >(rand(),_param->_size_special_data    ),
230                                     range<Texception_t      >(rand(),_param->_size_exception       ),
231                                     range<Tcontrol_t        >(rand(),1                             ),
232                                     range<Tgeneral_data_t   >(rand(),_param->_size_general_data    ),
233                                     range<Tgeneral_data_t   >(rand(),_param->_size_general_data    ));
234        }
235
236            uint32_t nb_request_in  = 0;
237      uint32_t nb_request_out = 0;
238     
239      while (nb_request_out < _param->_nb_packet)
240      {
241        bool val = (((rand()%100)<percent_transaction_execute_queue_in) and
242                    (nb_request_in < _param->_nb_packet));
243       
244        in_EXECUTE_QUEUE_IN_VAL          ->write(val);
245        if (val)
246          {
247            in_EXECUTE_QUEUE_IN_CONTEXT_ID   ->write(request [nb_request_in]->_context_id   );
248            in_EXECUTE_QUEUE_IN_FRONT_END_ID ->write(request [nb_request_in]->_front_end_id );
249            in_EXECUTE_QUEUE_IN_OOO_ENGINE_ID->write(request [nb_request_in]->_ooo_engine_id);
250            in_EXECUTE_QUEUE_IN_PACKET_ID    ->write(request [nb_request_in]->_packet_id    );
251          //in_EXECUTE_QUEUE_IN_OPERATION    ->write(request [nb_request_in]->_operation    );
252          //in_EXECUTE_QUEUE_IN_TYPE         ->write(request [nb_request_in]->_type         );
253            in_EXECUTE_QUEUE_IN_FLAGS        ->write(request [nb_request_in]->_flags        );
254            in_EXECUTE_QUEUE_IN_EXCEPTION    ->write(request [nb_request_in]->_exception    );
255            in_EXECUTE_QUEUE_IN_NO_SEQUENCE  ->write(request [nb_request_in]->_no_sequence  );
256            in_EXECUTE_QUEUE_IN_ADDRESS      ->write(request [nb_request_in]->_address      );
257            in_EXECUTE_QUEUE_IN_DATA         ->write(request [nb_request_in]->_data         );
258          }
259        in_EXECUTE_QUEUE_OUT_ACK         ->write((rand()%100)<percent_transaction_execute_queue_out);
260           
261        SC_START(0);
262
263       
264        // ======================================================================
265        // ======================================================================
266        // ======================================================================
267        if ( in_EXECUTE_QUEUE_IN_VAL->read() and
268            out_EXECUTE_QUEUE_IN_ACK->read())
269          {
270            LABEL(" * Accepted EXECUTE_QUEUE_IN  [%d]",nb_request_in);
271//          std::cout << *request [nb_request_in] << std::endl;
272
273            nb_request_in ++;
274          }
275       
276        // ======================================================================
277        // ======================================================================
278        // ======================================================================
279        if (out_EXECUTE_QUEUE_OUT_VAL->read() and
280             in_EXECUTE_QUEUE_OUT_ACK->read())
281          {
282            Tcontext_t packet;
283            if (_param->_have_port_rob_ptr)
284              packet = out_EXECUTE_QUEUE_OUT_PACKET_ID->read();
285            else
286              packet = 0;
287
288            LABEL(" * Accepted EXECUTE_QUEUE_OUT [%d]",packet);
289//          std::cout << *request [packet] << std::endl;
290
291            if (_param->_have_port_context_id)
292            TEST(Tcontext_t     , out_EXECUTE_QUEUE_OUT_CONTEXT_ID   ->read(), request [packet]->_context_id   );
293            if (_param->_have_port_front_end_id)
294            TEST(Tcontext_t     , out_EXECUTE_QUEUE_OUT_FRONT_END_ID ->read(), request [packet]->_front_end_id );
295            if (_param->_have_port_ooo_engine_id)
296            TEST(Tcontext_t     , out_EXECUTE_QUEUE_OUT_OOO_ENGINE_ID->read(), request [packet]->_ooo_engine_id);
297          //TEST(Toperation_t   , out_EXECUTE_QUEUE_OUT_OPERATION    ->read(), request [packet]->_operation    );
298          //TEST(Ttype_t        , out_EXECUTE_QUEUE_OUT_TYPE         ->read(), request [packet]->_type         );
299            TEST(Tcontrol_t     , out_EXECUTE_QUEUE_OUT_FLAGS        ->read(), request [packet]->_flags        );
300            TEST(Texception_t   , out_EXECUTE_QUEUE_OUT_EXCEPTION    ->read(), request [packet]->_exception    );
301            TEST(Tcontrol_t     , out_EXECUTE_QUEUE_OUT_NO_SEQUENCE  ->read(), request [packet]->_no_sequence  );
302            TEST(Tgeneral_data_t, out_EXECUTE_QUEUE_OUT_ADDRESS      ->read(), request [packet]->_address      );
303            TEST(Tgeneral_data_t, out_EXECUTE_QUEUE_OUT_DATA         ->read(), request [packet]->_data         );
304
305            nb_request_out ++;
306          }
307
308        SC_START(1);
309      }
310    }
311
312  /********************************************************
313   * Simulation - End
314   ********************************************************/
315
316  TEST_OK ("End of Simulation");
317  delete _time;
318
319  msg(_("<%s> : ............ Stop Simulation\n"),name.c_str());
320
321  delete in_CLOCK;
322  delete in_NRESET;
323
324  delete     in_EXECUTE_QUEUE_IN_VAL           ;
325  delete    out_EXECUTE_QUEUE_IN_ACK           ;
326  delete     in_EXECUTE_QUEUE_IN_CONTEXT_ID    ;
327  delete     in_EXECUTE_QUEUE_IN_FRONT_END_ID  ;
328  delete     in_EXECUTE_QUEUE_IN_OOO_ENGINE_ID ;
329  delete     in_EXECUTE_QUEUE_IN_PACKET_ID     ;
330//delete     in_EXECUTE_QUEUE_IN_OPERATION     ;
331//delete     in_EXECUTE_QUEUE_IN_TYPE          ;
332  delete     in_EXECUTE_QUEUE_IN_FLAGS         ;
333  delete     in_EXECUTE_QUEUE_IN_EXCEPTION     ;
334  delete     in_EXECUTE_QUEUE_IN_NO_SEQUENCE   ;
335  delete     in_EXECUTE_QUEUE_IN_ADDRESS       ;
336  delete     in_EXECUTE_QUEUE_IN_DATA          ;
337
338  delete    out_EXECUTE_QUEUE_OUT_VAL          ;
339  delete     in_EXECUTE_QUEUE_OUT_ACK          ;
340  delete    out_EXECUTE_QUEUE_OUT_CONTEXT_ID   ;
341  delete    out_EXECUTE_QUEUE_OUT_FRONT_END_ID ;
342  delete    out_EXECUTE_QUEUE_OUT_OOO_ENGINE_ID;
343  delete    out_EXECUTE_QUEUE_OUT_PACKET_ID    ;
344//delete    out_EXECUTE_QUEUE_OUT_OPERATION    ;
345//delete    out_EXECUTE_QUEUE_OUT_TYPE         ;
346  delete    out_EXECUTE_QUEUE_OUT_FLAGS        ;
347  delete    out_EXECUTE_QUEUE_OUT_EXCEPTION    ;
348  delete    out_EXECUTE_QUEUE_OUT_NO_SEQUENCE  ;
349  delete    out_EXECUTE_QUEUE_OUT_ADDRESS      ;
350  delete    out_EXECUTE_QUEUE_OUT_DATA         ;
351#endif
352
353  delete _Execute_queue;
354#ifdef STATISTICS
355  delete _parameters_statistics;
356#endif
357}
Note: See TracBrowser for help on using the repository browser.