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

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

Add :

  • Execute_loop (must be test systemC)
  • Prediction
    • Direction : predifined scheme
    • Branch Target Buffer
  • iFetch_unit
    • ifetch_queue
    • pc management
  • Decod_unit
    • coming soon : support for custom operation
  • Rename_unit
    • RAT
    • Free_list
    • Dependence RAW check
    • Load store unit pointer
  • New Environnement (hierarchy_memory will remove in a next version)


Modif :

  • Manage Custom Operation
  • All component in execute_loop to use the new statistics management

Not Finish :

  • Return Address Stack
  • Environnement
File size: 9.6 KB
RevLine 
[2]1/*
2 * $Id$
3 *
4 * [ Description ]
5 *
6 * Test
7 */
8
[78]9#define NB_ITERATION 16
[50]10
[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
[55]35#ifdef STATISTICS
[71]36  morpheo::behavioural::Parameters_Statistics * _param_stat = new morpheo::behavioural::Parameters_Statistics (5,100);
[55]37#endif
[50]38  RegisterFile_Monolithic * registerfile = new RegisterFile_Monolithic (name.c_str()
[2]39#ifdef STATISTICS
[55]40                                                                        ,_param_stat
[2]41#endif
[55]42                                                                        ,_param);
[2]43 
44#ifdef SYSTEMC
45  /*********************************************************************
46   * Déclarations des signaux
47   *********************************************************************/
48  sc_clock                                 CLOCK ("clock", 1.0, 0.5);
[6]49  sc_signal<Tcontrol_t>                    NRESET;
[2]50 
[55]51  sc_signal<Tcontrol_t>                    READ_VAL      [_param->_nb_port_read];
52  sc_signal<Tcontrol_t>                    READ_ACK      [_param->_nb_port_read];
53  sc_signal<Taddress_t>                    READ_ADDRESS  [_param->_nb_port_read];
54  sc_signal<Tdata_t>                       READ_DATA     [_param->_nb_port_read];
[2]55
[55]56  sc_signal<Tcontrol_t>                    WRITE_VAL     [_param->_nb_port_write];
57  sc_signal<Tcontrol_t>                    WRITE_ACK     [_param->_nb_port_write];
58  sc_signal<Taddress_t>                    WRITE_ADDRESS [_param->_nb_port_write];
59  sc_signal<Tdata_t>                       WRITE_DATA    [_param->_nb_port_write];
[2]60
[55]61  sc_signal<Tcontrol_t>                    READ_WRITE_VAL     [_param->_nb_port_read_write];
62  sc_signal<Tcontrol_t>                    READ_WRITE_ACK     [_param->_nb_port_read_write];
63  sc_signal<Tcontrol_t>                    READ_WRITE_RW      [_param->_nb_port_read_write];
64  sc_signal<Taddress_t>                    READ_WRITE_ADDRESS [_param->_nb_port_read_write];
65  sc_signal<Tdata_t>                       READ_WRITE_RDATA   [_param->_nb_port_read_write];
66  sc_signal<Tdata_t>                       READ_WRITE_WDATA   [_param->_nb_port_read_write];
67
[2]68  /********************************************************
69   * Instanciation
70   ********************************************************/
71 
[15]72  cout << "<" << name << "> Instanciation of registerfile" << endl;
[2]73 
74  (*(registerfile->in_CLOCK))        (CLOCK);
[6]75  (*(registerfile->in_NRESET))       (NRESET);
[2]76
[55]77  for (uint32_t i=0; i<_param->_nb_port_read; i++)
[2]78    {
[6]79      (*(registerfile-> in_READ_VAL      [i]))        (READ_VAL      [i]);
80      (*(registerfile->out_READ_ACK      [i]))        (READ_ACK      [i]);
[62]81      if (_param->_have_port_address)
[2]82      (*(registerfile-> in_READ_ADDRESS  [i]))        (READ_ADDRESS  [i]);
83      (*(registerfile->out_READ_DATA     [i]))        (READ_DATA     [i]);
84    }
[55]85  for (uint32_t i=0; i<_param->_nb_port_write; i++)
[2]86    {
[6]87      (*(registerfile-> in_WRITE_VAL     [i]))        (WRITE_VAL     [i]);
88      (*(registerfile->out_WRITE_ACK     [i]))        (WRITE_ACK     [i]);
[62]89      if (_param->_have_port_address)
[2]90      (*(registerfile-> in_WRITE_ADDRESS [i]))        (WRITE_ADDRESS [i]);
91      (*(registerfile-> in_WRITE_DATA    [i]))        (WRITE_DATA    [i]);
92    }
[55]93  for (uint32_t i=0; i<_param->_nb_port_read_write; i++)
94    {
95      (*(registerfile-> in_READ_WRITE_VAL     [i])) (READ_WRITE_VAL      [i]);
96      (*(registerfile->out_READ_WRITE_ACK     [i])) (READ_WRITE_ACK      [i]);
97      (*(registerfile-> in_READ_WRITE_RW      [i])) (READ_WRITE_RW       [i]);
[62]98      if (_param->_have_port_address)
[55]99      (*(registerfile-> in_READ_WRITE_ADDRESS [i])) (READ_WRITE_ADDRESS  [i]);
100      (*(registerfile-> in_READ_WRITE_WDATA   [i])) (READ_WRITE_WDATA    [i]);
101      (*(registerfile->out_READ_WRITE_RDATA   [i])) (READ_WRITE_RDATA    [i]);
102    }
[2]103 
[50]104  cout << "<" << name << "> Start Simulation ............" << endl;
105  Time * _time = new Time();
106
[2]107  /********************************************************
108   * Simulation - Begin
109   ********************************************************/
110
111  // Initialisation
112
113  sc_start(0);
114 
[55]115  for (uint32_t i=0; i<_param->_nb_port_write; i++)
[6]116    WRITE_VAL [i] .write (0);
[55]117  for (uint32_t i=0; i<_param->_nb_port_read; i++)
[6]118    READ_VAL  [i] .write (0);
[55]119  for (uint32_t i=0; i<_param->_nb_port_read_write; i++)
120    READ_WRITE_VAL  [i] .write (0);
[2]121
[42]122  NRESET.write(0);
123
[2]124  sc_start(5);
125
[42]126  NRESET.write(1);
127
[2]128
[50]129  for (uint32_t nb_iteration=0; nb_iteration < NB_ITERATION; nb_iteration ++)
130    {
131      cout << "<" << name << "> 1) Write the RegisterFile (no read)" << endl;
[2]132
[50]133      // random init
134      uint32_t grain = 0;
135      //uint32_t grain = static_cast<uint32_t>(time(NULL));
[2]136     
[50]137      srand(grain);
[2]138
[55]139      Tdata_t tab [_param->_nb_word];
[50]140     
[55]141      for (uint32_t i=0; i<_param->_nb_word; i++)
142        tab[i]= rand()%(1<<(_param->_size_word-1));
[50]143     
144      Taddress_t address_next = 0;
145      Taddress_t nb_ack = 0;
146     
[55]147      while (nb_ack < _param->_nb_word)
[2]148        {
[50]149          cout << "cycle : " << static_cast<uint32_t> (sc_simulation_time()) << 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
168          for (uint32_t num_port=0; num_port < _param->_nb_port_read_write; num_port ++)
169            {
170              if ((address_next < _param->_nb_word) and
171                  (READ_WRITE_VAL [num_port].read() == 0))
172                {
173                  cout << "(" << num_port << ") [" << address_next << "] <= " << tab[address_next] << endl;
174                 
175                  READ_WRITE_VAL     [num_port] .write(1);
176                  READ_WRITE_RW      [num_port] .write(RW_WRITE);
177                  READ_WRITE_WDATA   [num_port] .write(tab[address_next]);
178                  READ_WRITE_ADDRESS [num_port] .write(address_next++);
179                 
180                  // Address can be not a multiple of nb_port_write
181                  if (address_next >= _param->_nb_word)
182                    break;
183                }
184            }
[50]185         
186          sc_start(1);
[2]187
[50]188          // reset write_val port
[55]189          for (uint32_t num_port=0; num_port < _param->_nb_port_write; num_port ++)
[50]190            {
191              if ((WRITE_ACK [num_port].read() == 1) and
192                  (WRITE_VAL [num_port].read() == 1))
193                {
194                  WRITE_VAL  [num_port] .write(0);
195                  nb_ack ++;
196                }
197            }
[55]198          // reset write_val port
199          for (uint32_t num_port=0; num_port < _param->_nb_port_read_write; num_port ++)
200            {
201              if ((READ_WRITE_ACK [num_port].read() == 1) and
202                  (READ_WRITE_VAL [num_port].read() == 1))
203                {
204                  READ_WRITE_VAL  [num_port] .write(0);
205                  nb_ack ++;
206                }
207            }
[2]208
[50]209          sc_start(0);
[2]210        }
[50]211     
212      address_next = 0;
213      nb_ack       = 0;
[2]214
[50]215      cout << "<" << name << "> 2) Read the RegisterFile (no write)" << endl;
216     
[55]217      Tdata_t read_address       [_param->_nb_port_read];
218      Tdata_t read_write_address [_param->_nb_port_read_write];
[2]219
[55]220      while (nb_ack < _param->_nb_word)
[50]221        {
222          cout << "cycle : " << static_cast<uint32_t> (sc_simulation_time()) << endl;
223         
[55]224          for (uint32_t num_port=0; num_port < _param->_nb_port_read; num_port ++)
[50]225            {
[55]226              if ((address_next < _param->_nb_word) and
[50]227                  (READ_VAL [num_port].read() == 0))
228                {
229                  read_address [num_port] = address_next++;
[2]230
[50]231                  READ_VAL     [num_port].write(1);
232                  READ_ADDRESS [num_port].write(read_address [num_port]);
[2]233
[55]234                  if (address_next >= _param->_nb_word)
[50]235                    break;
236                }
237            }
[2]238
[55]239          for (uint32_t num_port=0; num_port < _param->_nb_port_read_write; num_port ++)
240            {
241              if ((address_next < _param->_nb_word) and
242                  (READ_WRITE_VAL [num_port].read() == 0))
243                {
244                  read_write_address [num_port] = address_next++;
245
246                  READ_WRITE_VAL     [num_port].write(1);
247                  READ_WRITE_RW      [num_port].write(RW_READ);
248                  READ_WRITE_ADDRESS [num_port].write(read_write_address [num_port]);
249
250                  if (address_next >= _param->_nb_word)
251                    break;
252                }
253            }
254
255
[50]256          sc_start(1);
[2]257
[50]258          // reset write_val port
[55]259          for (uint32_t num_port=0; num_port < _param->_nb_port_read; num_port ++)
[50]260            {
261              if ((READ_ACK [num_port].read() == 1) and
262                  (READ_VAL [num_port].read() == 1))
263                {
264                  READ_VAL  [num_port] .write(0);
[2]265
[50]266                  cout << "(" << num_port << ") [" << read_address [num_port] << "] => " << READ_DATA [num_port].read() << endl;
[2]267
[50]268                  TEST(Tdata_t,READ_DATA [num_port].read(), tab[read_address [num_port]]);
269                  nb_ack ++;
270                }
271            }
[2]272
[55]273          for (uint32_t num_port=0; num_port < _param->_nb_port_read_write; num_port ++)
274            {
275              if ((READ_WRITE_ACK [num_port].read() == 1) and
276                  (READ_WRITE_VAL [num_port].read() == 1))
277                {
278                  READ_WRITE_VAL  [num_port] .write(0);
279
280                  cout << "(" << num_port << ") [" << read_write_address [num_port] << "] => " << READ_WRITE_RDATA [num_port].read() << endl;
281
282                  TEST(Tdata_t,READ_WRITE_RDATA [num_port].read(), tab[read_write_address [num_port]]);
283                  nb_ack ++;
284                }
285            }
286
[50]287          sc_start(0);
[2]288        }
289    }
290
291  /********************************************************
292   * Simulation - End
293   ********************************************************/
294
[50]295  TEST_STR(bool,true,true, "End of Simulation");
296  delete _time;
[2]297  cout << "<" << name << "> ............ Stop Simulation" << endl;
298
299#endif
300
301  delete registerfile;
302}
Note: See TracBrowser for help on using the repository browser.