Ignore:
Timestamp:
Apr 5, 2007, 4:17:30 PM (17 years ago)
Author:
rosiere
Message:

Interface normalisé
Début du banc de registres multi niveaux

Location:
trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/RegisterFile/RegisterFile_Multi_Banked/RegisterFile_Multi_Banked_Glue/SelfTest/src
Files:
2 edited

Legend:

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

    r10 r15  
    66 */
    77
    8 #include "Behavioural/Generic/RegisterFile_Multi_Banked/RegisterFile_Multi_Banked_Glue/SelfTest/include/test.h"
     8#include "Behavioural/Generic/RegisterFile/RegisterFile_Multi_Banked/RegisterFile_Multi_Banked_Glue/SelfTest/include/test.h"
    99
    1010#define NB_PARAMS 5
     
    1414  cerr << "<Usage> " << argv[0] << " name_instance list_params" << endl
    1515       << "list_params is :" << endl
    16        << " - nb_port_read  (unsigned int)" << endl
    17        << " - nb_port_write (unsigned int)" << endl
    18        << " - size_address  (unsigned int)" << endl
    19        << " - size_word     (unsigned int)" << endl
    20        << " - nb_bank       (unsigned int)" << endl
     16       << " - nb_port_read          (uint32_t   )" << endl
     17       << " - nb_port_write         (uint32_t   )" << endl
     18       << " - size_address          (uint32_t   )" << endl
     19       << " - size_word             (uint32_t   )" << endl
     20       << " - nb_bank               (uint32_t   )" << endl
     21       << " - nb_port_read_by_bank  (uint32_t   )" << endl
     22       << " - nb_port_write_by_bank (uint32_t   )" << endl
     23       << " - crossbar              (Tcrossbar_t)" << endl
    2124       << "" << endl;
    2225
     
    3740    usage (argc, argv);
    3841
    39   const string   name          = argv[1];
    40   const uint32_t nb_port_read  = atoi(argv[2]);
    41   const uint32_t nb_port_write = atoi(argv[3]);
    42   const uint32_t size_address  = atoi(argv[4]);
    43   const uint32_t size_word     = atoi(argv[5]);
    44   const uint32_t nb_bank       = atoi(argv[6]);
     42  const string      name                  =      argv[1];
     43  const uint32_t    nb_port_read          = atoi(argv[2]);
     44  const uint32_t    nb_port_write         = atoi(argv[3]);
     45  const uint32_t    size_address          = atoi(argv[4]);
     46  const uint32_t    size_word             = atoi(argv[5]);
     47  const uint32_t    nb_bank               = atoi(argv[6]);
     48  const uint32_t    nb_port_read_by_bank  = atoi(argv[7]);
     49  const uint32_t    nb_port_write_by_bank = atoi(argv[8]);
     50  const Tcrossbar_t crossbar              = fromString<Tcrossbar_t>(argv[9]);
    4551
    4652  try
    4753    {
    48       morpheo::behavioural::generic::registerfile_multi_banked::registerfile_multi_banked_glue::Parameters param (nb_port_read ,
    49                                                                                                                   nb_port_write,
    50                                                                                                                   size_address ,
    51                                                                                                                   size_word    ,
    52                                                                                                                   nb_bank      );
    53      
     54      morpheo::behavioural::generic::registerfile::registerfile_multi_banked::registerfile_multi_banked_glue::Parameters param (nb_port_read         ,
     55                                                                                                                                nb_port_write        ,
     56                                                                                                                                size_address         ,
     57                                                                                                                                size_word            ,
     58                                                                                                                                nb_bank              ,
     59                                                                                                                                nb_port_read_by_bank ,
     60                                                                                                                                nb_port_write_by_bank,
     61                                                                                                                                crossbar             );
     62
    5463      cout << param.print(1);
    5564     
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/RegisterFile/RegisterFile_Multi_Banked/RegisterFile_Multi_Banked_Glue/SelfTest/src/test.cpp

    r10 r15  
    77 */
    88
    9 #define NB_ITERATION 1
    10 
    11 #include "Behavioural/Generic/RegisterFile_Multi_Banked/RegisterFile_Multi_Banked_Glue/SelfTest/include/test.h"
     9#define NB_ITERATION 16
     10
     11#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)
     12
     13#include "Behavioural/Generic/RegisterFile/RegisterFile_Multi_Banked/RegisterFile_Multi_Banked_Glue/SelfTest/include/test.h"
    1214#include "Include/Test.h"
     15#include "Include/BitManipulation.h"
    1316
    1417void test (string name,
    15            morpheo::behavioural::generic::registerfile_multi_banked::registerfile_multi_banked_glue::Parameters _param)
     18           morpheo::behavioural::generic::registerfile::registerfile_multi_banked::registerfile_multi_banked_glue::Parameters _param)
    1619{
    1720  cout << "<" << name << "> : Simulation SystemC" << endl;
     
    1922  RegisterFile_Multi_Banked_Glue * _RegisterFile_Multi_Banked_Glue = new RegisterFile_Multi_Banked_Glue (name.c_str(),
    2023#ifdef STATISTICS
    21                                             morpheo::behavioural::Parameters_Statistics(5,50),
     24                                                                                                        morpheo::behavioural::Parameters_Statistics(5,50),
    2225#endif
    23                                             _param);
     26                                                                                                        _param);
    2427 
    2528#ifdef SYSTEMC
     
    3336  sc_signal<Taddress_t>                 ** READ_IN_ADDRESS   ;
    3437  sc_signal<Tdata_t   >                 ** READ_IN_DATA      ;
    35   sc_signal<Tcontrol_t>                 ** READ_SELECT_VAL   ;
    36   sc_signal<Tcontrol_t>                 ** READ_SELECT_ACK   ;
     38  sc_signal<Tcontrol_t>               **** READ_SELECT_VAL   ;
     39  sc_signal<Tcontrol_t>               **** READ_SELECT_ACK   ;
    3740  sc_signal<Tcontrol_t>                *** READ_OUT_VAL      ;
    3841  sc_signal<Tcontrol_t>                *** READ_OUT_ACK      ;
     
    4144  sc_signal<Tcontrol_t>                 ** WRITE_IN_VAL      ;
    4245  sc_signal<Tcontrol_t>                 ** WRITE_IN_ACK      ;
    43   sc_signal<Tcontrol_t>                 ** WRITE_SELECT_VAL  ;
    44   sc_signal<Tcontrol_t>                 ** WRITE_SELECT_ACK  ;
    4546  sc_signal<Taddress_t>                 ** WRITE_IN_ADDRESS  ;
    4647  sc_signal<Tdata_t   >                 ** WRITE_IN_DATA     ;
     48  sc_signal<Tcontrol_t>               **** WRITE_SELECT_VAL  ;
     49  sc_signal<Tcontrol_t>               **** WRITE_SELECT_ACK  ;
    4750  sc_signal<Tcontrol_t>                *** WRITE_OUT_VAL     ;
    4851  sc_signal<Tcontrol_t>                *** WRITE_OUT_ACK     ;
     
    5861  READ_IN_ADDRESS   = new sc_signal<Taddress_t>           * [_param._nb_port_read];
    5962  READ_IN_DATA      = new sc_signal<Tdata_t   >           * [_param._nb_port_read];
    60   READ_SELECT_VAL   = new sc_signal<Tcontrol_t>           * [_param._nb_port_read];
    61   READ_SELECT_ACK   = new sc_signal<Tcontrol_t>           * [_param._nb_port_read];
    6263
    6364  for (uint32_t i=0; i<_param._nb_port_read; i++)
     
    7172      rename = "READ_IN_DATA_"+toString(i)+"     ";
    7273      READ_IN_DATA      [i] = new sc_signal<Tdata_t   > (rename.c_str());
    73       rename = "READ_SELECT_VAL_"+toString(i)+"  ";
    74       READ_SELECT_VAL       [i] = new sc_signal<Tcontrol_t> (rename.c_str());
    75       rename = "READ_SELECT_ACK_"+toString(i)+"  ";
    76       READ_SELECT_ACK       [i] = new sc_signal<Tcontrol_t> (rename.c_str());
    77     }
     74    }
     75
     76   READ_SELECT_VAL  = new sc_signal<Tcontrol_t> *** [_param._nb_bank];
     77   READ_SELECT_ACK  = new sc_signal<Tcontrol_t> *** [_param._nb_bank];
     78
     79    for (uint32_t i=0; i<_param._nb_bank; i++)
     80      {
     81        READ_SELECT_VAL [i] = new sc_signal<Tcontrol_t>  ** [_param._nb_port_read_by_bank];
     82        READ_SELECT_ACK [i] = new sc_signal<Tcontrol_t>  ** [_param._nb_port_read_by_bank];
     83
     84         for (uint32_t j=0; j<_param._nb_port_read_by_bank; j++)
     85           {
     86             READ_SELECT_VAL [i][j] = new sc_signal<Tcontrol_t>   * [_param._nb_port_select_by_bank_read_port [j]];
     87             READ_SELECT_ACK [i][j] = new sc_signal<Tcontrol_t>   * [_param._nb_port_select_by_bank_read_port [j]];
     88             
     89             for (uint32_t k=0; k<_param._nb_port_select_by_bank_read_port [j]; k++)
     90               {
     91                 rename="READ_SELECT_VAL_"+toString(i)+"_"+toString(j)+"_"+toString(k)+" ";
     92                 READ_SELECT_VAL [i][j][k] = new sc_signal<Tcontrol_t> (rename.c_str());
     93                 
     94                 rename="READ_SELECT_ACK_"+toString(i)+"_"+toString(j)+"_"+toString(k)+" ";
     95                 READ_SELECT_ACK [i][j][k] = new sc_signal<Tcontrol_t> (rename.c_str());
     96               }
     97           }
     98      }
    7899                                                     
    79100   READ_OUT_VAL      = new sc_signal<Tcontrol_t>          ** [_param._nb_bank];
     
    106127   WRITE_IN_ADDRESS  = new sc_signal<Taddress_t>           * [_param._nb_port_write];
    107128   WRITE_IN_DATA     = new sc_signal<Tdata_t   >           * [_param._nb_port_write];
    108    WRITE_SELECT_VAL  = new sc_signal<Tcontrol_t>           * [_param._nb_port_write];
    109    WRITE_SELECT_ACK  = new sc_signal<Tcontrol_t>           * [_param._nb_port_write];
    110 
    111129   for (uint32_t i=0; i<_param._nb_port_write; i++)
    112130     {
     
    119137       rename = "WRITE_IN_DATA_"+toString(i)+"    ";
    120138       WRITE_IN_DATA     [i] = new sc_signal<Tdata_t   > (rename.c_str());
    121 
    122        rename = "WRITE_SELECT_VAL_"+toString(i)+" ";
    123        WRITE_SELECT_VAL  [i] = new sc_signal<Tcontrol_t> (rename.c_str());
    124        rename = "WRITE_SELECT_ACK_"+toString(i)+" ";
    125        WRITE_SELECT_ACK  [i] = new sc_signal<Tcontrol_t> (rename.c_str());
    126      }
     139     }
     140
     141   WRITE_SELECT_VAL  = new sc_signal<Tcontrol_t> *** [_param._nb_bank];
     142   WRITE_SELECT_ACK  = new sc_signal<Tcontrol_t> *** [_param._nb_bank];
     143
     144    for (uint32_t i=0; i<_param._nb_bank; i++)
     145      {
     146        WRITE_SELECT_VAL [i] = new sc_signal<Tcontrol_t>  ** [_param._nb_port_write_by_bank];
     147        WRITE_SELECT_ACK [i] = new sc_signal<Tcontrol_t>  ** [_param._nb_port_write_by_bank];
     148
     149         for (uint32_t j=0; j<_param._nb_port_write_by_bank; j++)
     150           {
     151             WRITE_SELECT_VAL [i][j] = new sc_signal<Tcontrol_t>   * [_param._nb_port_select_by_bank_write_port [j]];
     152             WRITE_SELECT_ACK [i][j] = new sc_signal<Tcontrol_t>   * [_param._nb_port_select_by_bank_write_port [j]];
     153             
     154             for (uint32_t k=0; k<_param._nb_port_select_by_bank_write_port [j]; k++)
     155               {
     156                 rename="WRITE_SELECT_VAL_"+toString(i)+"_"+toString(j)+"_"+toString(k)+" ";
     157                 WRITE_SELECT_VAL [i][j][k] = new sc_signal<Tcontrol_t> (rename.c_str());
     158                 
     159                 rename="WRITE_SELECT_ACK_"+toString(i)+"_"+toString(j)+"_"+toString(k)+" ";
     160                 WRITE_SELECT_ACK [i][j][k] = new sc_signal<Tcontrol_t> (rename.c_str());
     161               }
     162           }
     163      }
    127164     
    128165   WRITE_OUT_VAL     = new sc_signal<Tcontrol_t>          ** [_param._nb_bank];
     
    165202       (*(_RegisterFile_Multi_Banked_Glue-> in_READ_IN_ADDRESS   [i]))       (*(READ_IN_ADDRESS   [i]));
    166203       (*(_RegisterFile_Multi_Banked_Glue->out_READ_IN_DATA      [i]))       (*(READ_IN_DATA      [i]));
    167        (*(_RegisterFile_Multi_Banked_Glue-> in_READ_SELECT_VAL   [i]))       (*(READ_SELECT_VAL   [i]));
    168        (*(_RegisterFile_Multi_Banked_Glue->out_READ_SELECT_ACK   [i]))       (*(READ_SELECT_ACK   [i]));
    169      }
     204     }
     205
     206   for (uint32_t i=0; i<_param._nb_bank; i++)
     207     for (uint32_t j=0; j<_param._nb_port_read_by_bank; j++)
     208       for (uint32_t k=0; k<_param._nb_port_select_by_bank_read_port[j]; k++)
     209         {
     210           (*(_RegisterFile_Multi_Banked_Glue->out_READ_SELECT_VAL [i][j][k])) (*(READ_SELECT_VAL [i][j][k]));
     211           (*(_RegisterFile_Multi_Banked_Glue-> in_READ_SELECT_ACK [i][j][k])) (*(READ_SELECT_ACK [i][j][k]));
     212         }
     213
    170214   for (uint32_t i=0; i<_param._nb_bank; i++)
    171215       for (uint32_t j=0; j<_param._nb_port_read_by_bank; j++)
     
    183227       (*(_RegisterFile_Multi_Banked_Glue-> in_WRITE_IN_ADDRESS  [i]))       (*(WRITE_IN_ADDRESS  [i]));
    184228       (*(_RegisterFile_Multi_Banked_Glue-> in_WRITE_IN_DATA     [i]))       (*(WRITE_IN_DATA     [i]));
    185        (*(_RegisterFile_Multi_Banked_Glue-> in_WRITE_SELECT_VAL  [i]))       (*(WRITE_SELECT_VAL  [i]));
    186        (*(_RegisterFile_Multi_Banked_Glue->out_WRITE_SELECT_ACK  [i]))       (*(WRITE_SELECT_ACK  [i]));
    187      }
     229     }
     230
     231   for (uint32_t i=0; i<_param._nb_bank; i++)
     232     for (uint32_t j=0; j<_param._nb_port_write_by_bank; j++)
     233       for (uint32_t k=0; k<_param._nb_port_select_by_bank_write_port[j]; k++)
     234         {
     235           (*(_RegisterFile_Multi_Banked_Glue->out_WRITE_SELECT_VAL [i][j][k])) (*(WRITE_SELECT_VAL [i][j][k]));
     236           (*(_RegisterFile_Multi_Banked_Glue-> in_WRITE_SELECT_ACK [i][j][k])) (*(WRITE_SELECT_ACK [i][j][k]));
     237         }
    188238
    189239   for (uint32_t i=0; i<_param._nb_bank; i++)
     
    197247
    198248
     249  cout << "<" << name << "> Start Simulation ............" << endl;
     250 
    199251  /********************************************************
    200252   * Simulation - Begin
    201253   ********************************************************/
    202254
    203   cout << "<" << name << "> Start Simulation ............" << endl;
    204255  // Initialisation
    205256
     
    210261
    211262  sc_start(0);
    212   _RegisterFile_Multi_Banked_Glue->vhdl_testbench_label("Initialisation");
    213   cout << "{"+toString(static_cast<uint32_t>(sc_simulation_time()))+"} Initialisation" << endl;
    214 
    215 
    216   _RegisterFile_Multi_Banked_Glue->vhdl_testbench_label("Loop of Test");
    217   cout << "{"+toString(static_cast<uint32_t>(sc_simulation_time()))+"} Loop of Test" << endl;
     263
     264  LABEL("Initialisation");
     265
     266  uint32_t   read_in_num_bank [_param._nb_port_read]; // Number of bank
     267//Tcontrol_t read_in_valid    [_param._nb_port_read];
     268  Tcontrol_t read_in_ack      [_param._nb_port_read]; // to test
     269  Tdata_t    read_in_data     [_param._nb_port_read]; // to test
     270  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]; 
     272  Taddress_t read_out_address [_param._nb_bank][_param._nb_port_read_by_bank]; 
     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        ];
     276
     277  LABEL("Loop of Test");
    218278
    219279  for (uint32_t iteration=0; iteration<NB_ITERATION; iteration ++)
    220280    {
    221       _RegisterFile_Multi_Banked_Glue->vhdl_testbench_label("Iteration "+toString(iteration));
    222 
     281      LABEL("Iteration "+toString(iteration));
     282     
     283      LABEL("Test read_in");
     284     
     285      // Write in interface "read_in"
     286      for (uint32_t i=0; i<_param._nb_port_read; i++)
     287        {
     288          read_in_num_bank  [i] =  rand() % _param._nb_bank;
     289          Tcontrol_t read_in_valid = (rand() % 2) != 0;
     290
     291          Taddress_t address    = (read_in_num_bank[i] << _param._shift_address) | (gen_mask<Taddress_t>(_param._size_address-_param._shift_address) & i);
     292
     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;
     301        }
     302
     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     
     311      // compute the good read_select
     312      for (uint32_t i=0; i<_param._nb_bank; i++)
     313        for (uint32_t j=0; j<_param._nb_port_read_by_bank; j++)
     314          {
     315            bool find = false; // have find a port_in to link with this port_out
     316            for (uint32_t k=0; k<_param._nb_port_select_by_bank_read_port[j]; k++)
     317              {
     318
     319                uint32_t num_port; // number of port
     320               
     321                // compute the good number of port
     322                if (_param._crossbar == FULL_CROSSBAR)
     323                  num_port = k;
     324                else
     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
     332                  {
     333                    // find a busy port?
     334                    find = not read_is_busy [num_port];
     335                    read_is_busy       [num_port]|= find;
     336                    read_select_ack [i][num_port] = find;
     337
     338                    if (find)
     339                      {
     340                        read_in_ack      [num_port] = 1;
     341                        read_in_data     [num_port] = ((j<<1)|1);
     342                        read_out_val     [i][j]     = 1;
     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);
     344                      }
     345                  }
     346               
     347                READ_SELECT_ACK [i][j][k]->write(read_select_ack [i][num_port]);
     348              }
     349          }
     350
     351      // next cycle
    223352      sc_start(1);
     353
     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
    224363    }
    225364
     
    238377      delete READ_IN_ADDRESS   [i];
    239378      delete READ_IN_DATA      [i];
    240       delete READ_SELECT_VAL   [i];
    241       delete READ_SELECT_ACK   [i];
    242379    }
    243380                                                     
     
    246383  delete READ_IN_ADDRESS;
    247384  delete READ_IN_DATA   ;
    248   delete READ_SELECT_VAL;
    249   delete READ_SELECT_ACK;
     385
     386   for (uint32_t i=0; i<_param._nb_bank; i++)
     387     {
     388       for (uint32_t j=0; j<_param._nb_port_read_by_bank; j++)
     389         {
     390           for (uint32_t k=0; k<_param._nb_port_select_by_bank_read_port[j]; k++)
     391             {
     392               delete READ_SELECT_VAL [i][j][k];
     393               delete READ_SELECT_ACK [i][j][k];
     394             }
     395           delete READ_SELECT_VAL [i][j];
     396           delete READ_SELECT_ACK [i][j];
     397         }
     398       delete READ_SELECT_VAL [i];
     399       delete READ_SELECT_ACK [i];
     400     }
     401   delete READ_SELECT_VAL;
     402   delete READ_SELECT_ACK;
    250403
    251404   for (uint32_t i=0; i<_param._nb_bank; i++)
     
    276429      delete WRITE_IN_ADDRESS  [i];
    277430      delete WRITE_IN_DATA     [i];
    278       delete WRITE_SELECT_VAL  [i];
    279       delete WRITE_SELECT_ACK  [i];
    280431    }
    281432
     
    284435  delete WRITE_IN_ADDRESS;
    285436  delete WRITE_IN_DATA   ;
     437
     438  for (uint32_t i=0; i<_param._nb_bank; i++)
     439    {
     440      for (uint32_t j=0; j<_param._nb_port_write_by_bank; j++)
     441        {
     442          for (uint32_t k=0; k<_param._nb_port_select_by_bank_write_port[j]; k++)
     443            {
     444              delete WRITE_SELECT_VAL [i][j][k];
     445              delete WRITE_SELECT_ACK [i][j][k];
     446            }
     447          delete WRITE_SELECT_VAL [i][j];
     448          delete WRITE_SELECT_ACK [i][j];
     449        }
     450      delete WRITE_SELECT_VAL [i];
     451      delete WRITE_SELECT_ACK [i];
     452    }
    286453  delete WRITE_SELECT_VAL;
    287454  delete WRITE_SELECT_ACK;
Note: See TracChangeset for help on using the changeset viewer.