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

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