source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/RegisterFile/RegisterFile_Monolithic/SelfTest/src/test.cpp @ 146

Last change on this file since 146 was 146, checked in by rosiere, 13 years ago

1) Integration of RegisterFile_Internal_Banked in RegisterFile?
2) Erase "read_write" interface in RegisterFile_Monolithic component
3) Add smith predictor parameters in Load_store_pointer_unit.
4) Fix not statistics flags

  • Property svn:keywords set to Id
File size: 7.2 KB
RevLine 
[2]1/*
2 * $Id: test.cpp 146 2011-02-01 20:57:54Z rosiere $
3 *
[94]4 * [ Description ]
[2]5 *
6 * Test
7 */
8
[94]9#define NB_ITERATION 1
10#define CYCLE_MAX    100000*NB_ITERATION
[15]11#include "Behavioural/Generic/RegisterFile/RegisterFile_Monolithic/SelfTest/include/test.h"
[44]12#include "Common/include/Test.h"
[2]13
14void test (string name,
[55]15           morpheo::behavioural::generic::registerfile::registerfile_monolithic::Parameters * _param)
[2]16{
17  cout << "<" << name << "> : Simulation SystemC" << endl;
18
19  try 
20    {
[55]21      cout << _param->print(1);
22      _param->test();
[2]23    }
24  catch (morpheo::ErrorMorpheo & error)
25    {
26      cout << "<" << name << "> : " <<  error.what ();
27      return;
28    }
29  catch (...)
30    {
31      cerr << "<" << name << "> : This test must generate a error" << endl;
32      exit (EXIT_FAILURE);
33    }
34
[131]35  _model.set_model(MODEL_SYSTEMC,true);
36
[88]37  Tusage_t _usage = USE_ALL;
38
39//   _usage = usage_unset(_usage,USE_SYSTEMC              );
40//   _usage = usage_unset(_usage,USE_VHDL                 );
41//   _usage = usage_unset(_usage,USE_VHDL_TESTBENCH       );
42//   _usage = usage_unset(_usage,USE_VHDL_TESTBENCH_ASSERT);
43//   _usage = usage_unset(_usage,USE_POSITION             );
44//   _usage = usage_unset(_usage,USE_STATISTICS           );
45//   _usage = usage_unset(_usage,USE_INFORMATION          );
46
[55]47#ifdef STATISTICS
[71]48  morpheo::behavioural::Parameters_Statistics * _param_stat = new morpheo::behavioural::Parameters_Statistics (5,100);
[55]49#endif
[82]50  RegisterFile_Monolithic * registerfile = new RegisterFile_Monolithic
51    (name.c_str()
[2]52#ifdef STATISTICS
[82]53     ,_param_stat
[2]54#endif
[82]55     ,_param
[88]56     ,_usage);
[2]57 
58#ifdef SYSTEMC
59  /*********************************************************************
60   * Déclarations des signaux
61   *********************************************************************/
62  sc_clock                                 CLOCK ("clock", 1.0, 0.5);
[6]63  sc_signal<Tcontrol_t>                    NRESET;
[2]64 
[55]65  sc_signal<Tcontrol_t>                    READ_VAL      [_param->_nb_port_read];
66  sc_signal<Tcontrol_t>                    READ_ACK      [_param->_nb_port_read];
67  sc_signal<Taddress_t>                    READ_ADDRESS  [_param->_nb_port_read];
68  sc_signal<Tdata_t>                       READ_DATA     [_param->_nb_port_read];
[2]69
[55]70  sc_signal<Tcontrol_t>                    WRITE_VAL     [_param->_nb_port_write];
71  sc_signal<Tcontrol_t>                    WRITE_ACK     [_param->_nb_port_write];
72  sc_signal<Taddress_t>                    WRITE_ADDRESS [_param->_nb_port_write];
73  sc_signal<Tdata_t>                       WRITE_DATA    [_param->_nb_port_write];
[2]74
75  /********************************************************
76   * Instanciation
77   ********************************************************/
78 
[15]79  cout << "<" << name << "> Instanciation of registerfile" << endl;
[2]80 
81  (*(registerfile->in_CLOCK))        (CLOCK);
[6]82  (*(registerfile->in_NRESET))       (NRESET);
[2]83
[55]84  for (uint32_t i=0; i<_param->_nb_port_read; i++)
[2]85    {
[6]86      (*(registerfile-> in_READ_VAL      [i]))        (READ_VAL      [i]);
87      (*(registerfile->out_READ_ACK      [i]))        (READ_ACK      [i]);
[62]88      if (_param->_have_port_address)
[2]89      (*(registerfile-> in_READ_ADDRESS  [i]))        (READ_ADDRESS  [i]);
90      (*(registerfile->out_READ_DATA     [i]))        (READ_DATA     [i]);
91    }
[55]92  for (uint32_t i=0; i<_param->_nb_port_write; i++)
[2]93    {
[6]94      (*(registerfile-> in_WRITE_VAL     [i]))        (WRITE_VAL     [i]);
95      (*(registerfile->out_WRITE_ACK     [i]))        (WRITE_ACK     [i]);
[62]96      if (_param->_have_port_address)
[2]97      (*(registerfile-> in_WRITE_ADDRESS [i]))        (WRITE_ADDRESS [i]);
98      (*(registerfile-> in_WRITE_DATA    [i]))        (WRITE_DATA    [i]);
99    }
100 
[50]101  cout << "<" << name << "> Start Simulation ............" << endl;
102  Time * _time = new Time();
103
[2]104  /********************************************************
105   * Simulation - Begin
106   ********************************************************/
107
108  // Initialisation
109
[131]110  SC_START(0);
[2]111 
[55]112  for (uint32_t i=0; i<_param->_nb_port_write; i++)
[6]113    WRITE_VAL [i] .write (0);
[55]114  for (uint32_t i=0; i<_param->_nb_port_read; i++)
[6]115    READ_VAL  [i] .write (0);
[2]116
[42]117  NRESET.write(0);
118
[131]119  SC_START(5);
[2]120
[42]121  NRESET.write(1);
122
[131]123  for (uint32_t i=0; i<_param->_nb_port_write; i++)
124    TEST(Tcontrol_t,WRITE_ACK [i],1);
125  for (uint32_t i=0; i<_param->_nb_port_read; i++)
126    TEST(Tcontrol_t,READ_ACK  [i],1);
[2]127
[50]128  for (uint32_t nb_iteration=0; nb_iteration < NB_ITERATION; nb_iteration ++)
129    {
130      cout << "<" << name << "> 1) Write the RegisterFile (no read)" << endl;
[2]131
[50]132      // random init
133      uint32_t grain = 0;
134      //uint32_t grain = static_cast<uint32_t>(time(NULL));
[2]135     
[50]136      srand(grain);
[2]137
[55]138      Tdata_t tab [_param->_nb_word];
[50]139     
[55]140      for (uint32_t i=0; i<_param->_nb_word; i++)
141        tab[i]= rand()%(1<<(_param->_size_word-1));
[50]142     
143      Taddress_t address_next = 0;
144      Taddress_t nb_ack = 0;
145     
[55]146      while (nb_ack < _param->_nb_word)
[2]147        {
[131]148         
[113]149          cout << "cycle : " << static_cast<uint32_t> (simulation_cycle()) << endl;
[2]150
[55]151          for (uint32_t num_port=0; num_port < _param->_nb_port_write; num_port ++)
[50]152            {
[55]153              if ((address_next < _param->_nb_word) and
[50]154                  (WRITE_VAL [num_port].read() == 0))
155                {
156                  cout << "(" << num_port << ") [" << address_next << "] <= " << tab[address_next] << endl;
157                 
158                  WRITE_VAL     [num_port] .write(1);
159                  WRITE_DATA    [num_port] .write(tab[address_next]);
160                  WRITE_ADDRESS [num_port] .write(address_next++);
161                 
162                  // Address can be not a multiple of nb_port_write
[55]163                  if (address_next >= _param->_nb_word)
[50]164                    break;
165                }
166            }
[55]167
[131]168          SC_START(1);
[2]169
[50]170          // reset write_val port
[55]171          for (uint32_t num_port=0; num_port < _param->_nb_port_write; num_port ++)
[50]172            {
173              if ((WRITE_ACK [num_port].read() == 1) and
174                  (WRITE_VAL [num_port].read() == 1))
175                {
176                  WRITE_VAL  [num_port] .write(0);
177                  nb_ack ++;
178                }
179            }
[2]180
[131]181//        SC_START(0);
[2]182        }
[50]183     
184      address_next = 0;
185      nb_ack       = 0;
[2]186
[50]187      cout << "<" << name << "> 2) Read the RegisterFile (no write)" << endl;
188     
[55]189      Tdata_t read_address       [_param->_nb_port_read];
[2]190
[55]191      while (nb_ack < _param->_nb_word)
[50]192        {
[113]193          cout << "cycle : " << static_cast<uint32_t> (simulation_cycle()) << endl;
[50]194         
[55]195          for (uint32_t num_port=0; num_port < _param->_nb_port_read; num_port ++)
[50]196            {
[55]197              if ((address_next < _param->_nb_word) and
[50]198                  (READ_VAL [num_port].read() == 0))
199                {
200                  read_address [num_port] = address_next++;
[2]201
[50]202                  READ_VAL     [num_port].write(1);
203                  READ_ADDRESS [num_port].write(read_address [num_port]);
[2]204
[55]205                  if (address_next >= _param->_nb_word)
[50]206                    break;
207                }
208            }
[2]209
[55]210
[131]211          SC_START(1);
[2]212
[50]213          // reset write_val port
[55]214          for (uint32_t num_port=0; num_port < _param->_nb_port_read; num_port ++)
[50]215            {
216              if ((READ_ACK [num_port].read() == 1) and
217                  (READ_VAL [num_port].read() == 1))
218                {
219                  READ_VAL  [num_port] .write(0);
[2]220
[50]221                  cout << "(" << num_port << ") [" << read_address [num_port] << "] => " << READ_DATA [num_port].read() << endl;
[2]222
[50]223                  TEST(Tdata_t,READ_DATA [num_port].read(), tab[read_address [num_port]]);
224                  nb_ack ++;
225                }
226            }
[2]227
[131]228//        SC_START(0);
[2]229        }
230    }
231
232  /********************************************************
233   * Simulation - End
234   ********************************************************/
235
[50]236  TEST_STR(bool,true,true, "End of Simulation");
237  delete _time;
[2]238  cout << "<" << name << "> ............ Stop Simulation" << endl;
239
240#endif
241
242  delete registerfile;
243}
Note: See TracBrowser for help on using the repository browser.