Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/RegisterFile/RegisterFile_Multi_Banked/RegisterFile_Multi_Banked_Glue/SelfTest/src/test.cpp

    r23 r15  
    99#define NB_ITERATION 16
    1010
    11 #define TEXT(str)  do {cout << "<" << name << "> : " << str << endl;} while (0)
    1211#define LABEL(str) do {cout << "{"+toString(static_cast<uint32_t>(sc_simulation_time()))+"} " << str << endl; _RegisterFile_Multi_Banked_Glue->vhdl_testbench_label(str);} while (0)
    1312
     
    1918           morpheo::behavioural::generic::registerfile::registerfile_multi_banked::registerfile_multi_banked_glue::Parameters _param)
    2019{
    21   TEXT("Simulation SystemC");
     20  cout << "<" << name << "> : Simulation SystemC" << endl;
    2221
    2322  RegisterFile_Multi_Banked_Glue * _RegisterFile_Multi_Banked_Glue = new RegisterFile_Multi_Banked_Glue (name.c_str(),
     
    193192   ********************************************************/
    194193 
    195    TEXT("Instanciation of _RegisterFile_Multi_Banked_Glue");
     194  cout << "<" << name << "> Instanciation of _RegisterFile_Multi_Banked_Glue" << endl;
    196195 
    197196  (*(_RegisterFile_Multi_Banked_Glue->in_CLOCK))        (*(CLOCK));
     
    248247
    249248
    250    TEXT("Start Simulation ............");
     249  cout << "<" << name << "> Start Simulation ............" << endl;
    251250 
    252251  /********************************************************
     
    266265
    267266  uint32_t   read_in_num_bank [_param._nb_port_read]; // Number of bank
    268   Tcontrol_t read_is_busy     [_param._nb_port_read];
    269   bool       read_out_find    [_param._nb_bank][_param._nb_port_read_by_bank]; 
    270   uint32_t   read_out_port    [_param._nb_bank][_param._nb_port_read_by_bank]; 
    271 
     267//Tcontrol_t read_in_valid    [_param._nb_port_read];
    272268  Tcontrol_t read_in_ack      [_param._nb_port_read]; // to test
    273269  Tdata_t    read_in_data     [_param._nb_port_read]; // to test
    274270  Tcontrol_t read_out_val     [_param._nb_bank][_param._nb_port_read_by_bank]; 
     271  Tcontrol_t read_out_ack     [_param._nb_bank][_param._nb_port_read_by_bank]; 
    275272  Taddress_t read_out_address [_param._nb_bank][_param._nb_port_read_by_bank]; 
    276   Tcontrol_t read_select_val  [_param._nb_bank][_param._nb_port_read_by_bank][_param._nb_port_read];
     273  Tcontrol_t read_is_busy     [_param._nb_port_read];
     274  Tcontrol_t read_select_val  [_param._nb_bank][_param._nb_port_read        ];
     275  Tcontrol_t read_select_ack  [_param._nb_bank][_param._nb_port_read        ];
    277276
    278277  LABEL("Loop of Test");
     
    282281      LABEL("Iteration "+toString(iteration));
    283282     
    284       //LABEL("Test read_in");
     283      LABEL("Test read_in");
    285284     
    286285      // Write in interface "read_in"
     
    288287        {
    289288          read_in_num_bank  [i] =  rand() % _param._nb_bank;
    290           Tcontrol_t read_in_val = (rand() % 2) != 0;
     289          Tcontrol_t read_in_valid = (rand() % 2) != 0;
    291290
    292291          Taddress_t address    = (read_in_num_bank[i] << _param._shift_address) | (gen_mask<Taddress_t>(_param._size_address-_param._shift_address) & i);
    293292
    294           read_is_busy      [i] = (read_in_val == 0);   // invalid = busy
    295           read_in_ack       [i] = 0;                    // init
    296           read_in_data      [i] = 0;                    // init
    297           READ_IN_VAL       [i]->write(read_in_val);    // write signal
    298           READ_IN_ADDRESS   [i]->write(address);        // write signal
     293          read_is_busy      [i] = (read_in_valid == 0);
     294          read_in_ack       [i] = 0;
     295          read_in_data      [i] = 0;
     296          READ_IN_VAL       [i]->write(read_in_valid);
     297          READ_IN_ADDRESS   [i]->write(address);
     298
     299          for (uint32_t j=0; j<_param._nb_bank; j++)
     300            read_select_ack [j][i] = 0;
    299301        }
    300302
     303      for (uint32_t i=0; i<_param._nb_bank; i++)
     304        for (uint32_t j=0; j<_param._nb_port_read_by_bank; j++)
     305          {
     306            read_out_ack      [i][j] = (rand() % 2) != 0;
     307            READ_OUT_ACK      [i][j]->write(read_out_ack      [i][j]);
     308            READ_OUT_DATA     [i][j]->write((j<<1)|1); // (j<<1)|1 afin de n'avoir jamais 0
     309          }
     310     
    301311      // compute the good read_select
    302312      for (uint32_t i=0; i<_param._nb_bank; i++)
    303313        for (uint32_t j=0; j<_param._nb_port_read_by_bank; j++)
    304314          {
    305             Tcontrol_t read_out_ack = (rand() % 2) != 0;
    306             READ_OUT_ACK     [i][j]->write(read_out_ack);
    307             READ_OUT_DATA    [i][j]->write((j<<1)|1);            // (j<<1)|1 afin de n'avoir jamais 0
    308 
    309             read_out_find    [i][j] = false;
    310             read_out_port    [i][j] = 0;
    311 
    312             read_out_val     [i][j] = 0;
    313             read_out_address [i][j] = 0;
    314 
    315315            bool find = false; // have find a port_in to link with this port_out
    316316            for (uint32_t k=0; k<_param._nb_port_select_by_bank_read_port[j]; k++)
    317317              {
     318
    318319                uint32_t num_port; // number of port
    319320               
     
    322323                  num_port = k;
    323324                else
    324                   num_port = k*_param._nb_port_read_by_bank+j;
    325 
    326                 read_select_val [i][j][k] = read_out_ack and not read_is_busy [num_port] and (read_in_num_bank[num_port] == i); // select val if port is not busy and out accept a data
    327                 Tcontrol_t read_select_ack = 0;
    328 
    329                 // test a previous find
    330                 if (not ((read_out_ack == 0) || find))
     325                  num_port = _param._link_port_read [i];
     326
     327                read_select_val [i][num_port] = read_out_ack [i][j] && not read_is_busy [num_port];
     328               
     329                if ((read_out_ack [i][j] == 0) || find)
     330                  read_select_ack [i][num_port] = 0; // read_out is busy or already find
     331                else
    331332                  {
    332333                    // find a busy port?
    333                     find                      = read_select_val;
    334                     read_is_busy   [num_port]|= find; // port became busy if find
    335                     read_select_ack           = find; // ack if find
     334                    find = not read_is_busy [num_port];
     335                    read_is_busy       [num_port]|= find;
     336                    read_select_ack [i][num_port] = find;
    336337
    337338                    if (find)
    338339                      {
    339                         read_out_find    [i][j] = true;
    340                         read_out_port    [i][j] = num_port;
    341 
    342                         // know the good output
    343340                        read_in_ack      [num_port] = 1;
    344341                        read_in_data     [num_port] = ((j<<1)|1);
    345342                        read_out_val     [i][j]     = 1;
    346                         read_out_address [i][j]     = (i << _param._shift_address) | (gen_mask<Taddress_t>(_param._size_address-_param._shift_address) & num_port);
     343                        read_out_address [i][j]     = (read_in_num_bank[i] << _param._shift_address) | (gen_mask<Taddress_t>(_param._size_address-_param._shift_address) & i);
    347344                      }
    348345                  }
    349346               
    350                 READ_SELECT_ACK [i][j][k]->write(read_select_ack);
     347                READ_SELECT_ACK [i][j][k]->write(read_select_ack [i][num_port]);
    351348              }
    352349          }
     
    355352      sc_start(1);
    356353
    357       // test output
    358 
    359       TEXT ("===== Test Output =====");
    360       for (uint32_t i=0; i<_param._nb_port_read; i++)
    361         {
    362           TEXT ("Read_in         [" << i << "]       : "
    363                 << READ_IN_VAL [i]->read() << ","
    364                 << read_in_ack [i]         << " - "
    365                 << "Reg[" << READ_IN_ADDRESS [i]->read() << "] -> "
    366                 << read_in_data [i] << " "
    367                 << "{bank : " << read_in_num_bank[i] << "}"
    368                 );
    369 
    370           TEST (Tcontrol_t, read_in_ack  [i], READ_IN_ACK  [i]->read());
    371           if (READ_IN_VAL [i]->read() and READ_IN_ACK [i]->read())
    372           TEST (Tdata_t   , read_in_data [i], READ_IN_DATA [i]->read());
    373         }
    374 
    375       cout << endl;
    376       for (uint32_t i=0; i<_param._nb_bank; i++)
    377         for (uint32_t j=0; j<_param._nb_port_read_by_bank; j++)
    378           {
    379             TEXT ("Read_out        [" << i << "][" << j << "]    : "
    380                   << read_out_val [i][j]         << ","
    381                   << READ_OUT_ACK [i][j]->read() << " - "
    382                   << "Reg[" << read_out_address [i][j] << "] -> "
    383                   << READ_OUT_DATA [i][j]->read() << " - "
    384                   << "[" << read_out_find [i][j]<< " , "
    385                   << read_out_port    [i][j] << "]"               
    386                   );
    387 
    388             TEST (Tcontrol_t, read_out_val     [i][j], READ_OUT_VAL     [i][j]->read());
    389             if (READ_OUT_VAL [i][j]->read() and READ_OUT_ACK [i][j]->read())
    390             TEST (Taddress_t, read_out_address [i][j], READ_OUT_ADDRESS [i][j]->read());
    391 
    392             for (uint32_t k=0; k<_param._nb_port_select_by_bank_read_port[j]; k++)
    393               {
    394                 uint32_t num_port; // number of port
    395                
    396                 // compute the good number of port
    397                 if (_param._crossbar == FULL_CROSSBAR)
    398                   num_port = k;
    399                 else
    400                   num_port = k*_param._nb_port_read_by_bank+j;
    401                
    402                 TEXT (" * Read_select  [" << i << "][" << j << "][" << k << "] : "
    403                       << read_select_val [i][j][k]         << ","
    404                       << READ_SELECT_ACK [i][j][k]->read() << " - "
    405                       << "link with read_in[" << num_port << "]"
    406                       );
    407                
    408                 TEST (Tcontrol_t, read_select_val  [i][j][k], READ_SELECT_VAL  [i][j][k]->read());
    409               }
    410            
    411            
    412            
    413           }
    414 
    415     }
    416 
    417   sc_start(0);
     354//       // lot of test
     355//   public    : SC_OUT(Tcontrol_t)           ** out_READ_IN_ACK       ;
     356//   public    : SC_OUT(Tdata_t   )           ** out_READ_IN_DATA      ;
     357
     358//   public    : SC_OUT(Tcontrol_t)         **** out_READ_SELECT_VAL   ;
     359
     360//   public    : SC_OUT(Tcontrol_t)          *** out_READ_OUT_VAL      ;
     361//   public    : SC_OUT(Taddress_t)          *** out_READ_OUT_ADDRESS  ;
     362
     363    }
    418364
    419365  /********************************************************
     
    421367   ********************************************************/
    422368
    423   TEXT("............ Stop Simulation");
     369  cout << "<" << name << "> ............ Stop Simulation" << endl;
    424370
    425371  delete CLOCK;
    426372
    427   TEXT("delete read_in");
    428373  for (uint32_t i=0; i<_param._nb_port_read; i++)
    429374    {
    430 //       TEXT("1, i " << i);
    431375      delete READ_IN_VAL       [i];
    432 //       TEXT("2");
    433376      delete READ_IN_ACK       [i];
    434 //       TEXT("3");
    435377      delete READ_IN_ADDRESS   [i];
    436 //       TEXT("4");
    437378      delete READ_IN_DATA      [i];
    438 //       TEXT("5");
    439379    }
    440380                                                     
     
    444384  delete READ_IN_DATA   ;
    445385
    446   TEXT("delete read_select");
    447386   for (uint32_t i=0; i<_param._nb_bank; i++)
    448387     {
     
    463402   delete READ_SELECT_ACK;
    464403
    465   TEXT("delete read_out");
    466404   for (uint32_t i=0; i<_param._nb_bank; i++)
    467405     {
     
    485423  delete READ_OUT_DATA   ;
    486424
    487   TEXT("delete write_in");
    488425  for (uint32_t i=0; i<_param._nb_port_write; i++)
    489426    {
     
    499436  delete WRITE_IN_DATA   ;
    500437
    501   TEXT("delete write_select");
    502438  for (uint32_t i=0; i<_param._nb_bank; i++)
    503439    {
     
    518454  delete WRITE_SELECT_ACK;
    519455 
    520   TEXT("delete write_out");
    521456  for (uint32_t i=0; i<_param._nb_bank; i++)
    522457    {
     
    542477#endif
    543478
    544 
    545479  delete _RegisterFile_Multi_Banked_Glue;
    546480}
Note: See TracChangeset for help on using the changeset viewer.