Ignore:
Timestamp:
Dec 10, 2008, 7:31:39 PM (16 years ago)
Author:
rosiere
Message:

Almost complete design
with Test and test platform

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Read_unit/Read_unit/SelfTest/src/test.cpp

    r82 r88  
    77 */
    88
    9 #define NB_ITERATION  1
    10 #define CYCLE_MAX     (128*NB_ITERATION)
     9#define NB_ITERATION  16
     10#define CYCLE_MAX     (1024*NB_ITERATION)
    1111
    1212#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Read_unit/Read_unit/SelfTest/include/test.h"
    1313#include "Common/include/Test.h"
     14#include "Common/include/BitManipulation.h"
    1415#include "Behavioural/include/Allocation.h"
     16
     17class write_req_t
     18{
     19  public : uint32_t ooo;
     20  public : uint32_t reg;
     21
     22  write_req_t (uint32_t ooo,
     23               uint32_t reg)
     24  {
     25    this->ooo = ooo;
     26    this->reg = reg;
     27  }
     28};
    1529
    1630void test (string name,
     
    2236  morpheo::behavioural::Parameters_Statistics * _parameters_statistics = new morpheo::behavioural::Parameters_Statistics (5,50);
    2337#endif
     38
     39  Tusage_t _usage = USE_ALL;
     40
     41//   _usage = usage_unset(_usage,USE_SYSTEMC              );
     42//   _usage = usage_unset(_usage,USE_VHDL                 );
     43//   _usage = usage_unset(_usage,USE_VHDL_TESTBENCH       );
     44//   _usage = usage_unset(_usage,USE_VHDL_TESTBENCH_ASSERT);
     45//   _usage = usage_unset(_usage,USE_POSITION             );
     46//   _usage = usage_unset(_usage,USE_STATISTICS           );
     47//   _usage = usage_unset(_usage,USE_INFORMATION          );
    2448
    2549  Read_unit * _Read_unit = new Read_unit
     
    2953#endif
    3054     _param,
    31      USE_ALL);
     55     _usage);
    3256 
    3357#ifdef SYSTEMC
     
    130154  if (_param->_have_port_ooo_engine_id)
    131155  INSTANCE_SC_SIGNAL (_Read_unit, in_READ_UNIT_IN_OOO_ENGINE_ID         );
    132   if (_param->_have_port_packet_id)
     156  if (_param->_have_port_rob_ptr)
    133157  INSTANCE_SC_SIGNAL (_Read_unit, in_READ_UNIT_IN_PACKET_ID             );
    134158  INSTANCE_SC_SIGNAL (_Read_unit, in_READ_UNIT_IN_OPERATION             );
     
    157181  if (_param->_have_port_ooo_engine_id)
    158182  INSTANCE1_SC_SIGNAL(_Read_unit,out_READ_UNIT_OUT_OOO_ENGINE_ID        ,_param->_nb_inst_retire);
    159   if (_param->_have_port_packet_id)
     183  if (_param->_have_port_rob_ptr)
    160184  INSTANCE1_SC_SIGNAL(_Read_unit,out_READ_UNIT_OUT_PACKET_ID            ,_param->_nb_inst_retire);
    161185  INSTANCE1_SC_SIGNAL(_Read_unit,out_READ_UNIT_OUT_OPERATION            ,_param->_nb_inst_retire);
     
    213237  msg(_("<%s> : Start Simulation ............\n"),name.c_str());
    214238   
     239  // Initialisation
     240  const uint32_t seed = 0;
     241//const uint32_t seed = static_cast<uint32_t>(time(NULL));
     242
     243  srand(seed);
     244
     245  SC_START(0);
     246
    215247  Time * _time = new Time();
    216248
     
    218250   * Simulation - Begin
    219251   ********************************************************/
    220 
     252  {
    221253  // Initialisation
    222254
    223   const uint32_t seed = 0;
    224 //const uint32_t seed = static_cast<uint32_t>(time(NULL));
    225 
    226   srand(seed);
    227 
    228   SC_START(0);
     255  const uint32_t nb_request = _param->_nb_packet;
     256
     257  Tcontext_t         _ooo_engine_id [nb_request];
     258  Tcontrol_t         _read_ra    [nb_request];
     259  Tgeneral_address_t _num_reg_ra [nb_request];
     260  Tcontrol_t         _read_rb    [nb_request];
     261  Tgeneral_address_t _num_reg_rb [nb_request];
     262  Tcontrol_t         _read_rc    [nb_request];
     263  Tspecial_address_t _num_reg_rc [nb_request];
     264
     265  // emulation of registerFile
     266  Tcontrol_t         _gpr_val    [_param->_nb_general_register][_param->_nb_ooo_engine];
     267  Tgeneral_data_t    _gpr        [_param->_nb_general_register][_param->_nb_ooo_engine];
     268  Tcontrol_t         _spr_val    [_param->_nb_special_register][_param->_nb_ooo_engine];
     269  Tspecial_data_t    _spr        [_param->_nb_special_register][_param->_nb_ooo_engine];
     270
    229271  LABEL("Initialisation");
    230 
    231   LABEL("Reset");
     272  in_READ_UNIT_IN_VAL ->write(0);
     273  for (uint32_t i=0; i<_param->_nb_inst_retire  ; i++)
     274    in_READ_UNIT_OUT_ACK [i]->write(0);
     275  for (uint32_t i=0; i<_param->_nb_gpr_write    ; i++)
     276    in_GPR_WRITE_VAL               [i]->write(0);
     277  for (uint32_t i=0; i<_param->_nb_spr_write    ; i++)
     278    in_SPR_WRITE_VAL               [i]->write(0);
     279  for (uint32_t i=0; i<_param->_nb_bypass_write ; i++)
     280    {
     281      in_BYPASS_WRITE_GPR_VAL      [i]->write(0);
     282      in_BYPASS_WRITE_SPR_VAL      [i]->write(0);
     283    }
     284  for (uint32_t i=0; i<_param->_nb_bypass_memory; i++)
     285    in_BYPASS_MEMORY_VAL           [i]->write(0);
     286
    232287  in_NRESET->write(0);
    233288  SC_START(5);
    234   in_NRESET->write(1); 
     289  in_NRESET->write(1);
    235290
    236291  LABEL("Loop of Test");
     
    240295      LABEL("Iteration %d",iteration);
    241296
    242       SC_START(1);
     297      int32_t percent_transaction_queue_in     = (rand()%50)+25;
     298      int32_t percent_transaction_queue_out    = (rand()%50)+25;
     299      int32_t percent_registerfile_valid       = (rand()%50)+25;
     300      int32_t percent_transaction_registerfile = (rand()%50)+25;
     301      int32_t percent_transaction_bypass       = (rand()%50)+25;
     302     
     303      LABEL("Initialisation");
     304
     305      for (uint32_t i=0; i<nb_request; i++)
     306        {
     307          _ooo_engine_id   [i] = rand()% _param->_nb_ooo_engine            ;
     308          _read_ra         [i] = rand()% 2                              ;
     309          _num_reg_ra      [i] = rand()% _param->_nb_general_register   ;
     310          _read_rb         [i] = rand()% 2                              ;
     311          _num_reg_rb      [i] = rand()% _param->_nb_general_register   ;
     312          _read_rc         [i] = rand()% 2                              ;
     313          _num_reg_rc      [i] = rand()% _param->_nb_special_register   ;
     314        }
     315     
     316      // emulation of registerFile
     317      for (uint32_t j=0; j<_param->_nb_ooo_engine; j++)
     318        {
     319          for (uint32_t i=0; i<_param->_nb_general_register; i++)
     320            {
     321              _gpr_val      [i][j] = ((rand()%100) < percent_registerfile_valid);
     322              _gpr          [i][j] = range<Tgeneral_data_t>(rand(),_param->_size_general_data);
     323            }
     324          for (uint32_t i=0; i<_param->_nb_special_register; i++)
     325            {
     326              _spr_val      [i][j] = ((rand()%100) < percent_registerfile_valid);
     327              _spr          [i][j] = range<Tspecial_data_t>(rand(),_param->_size_special_data);
     328            }
     329        }
     330      // End initialisation .......
     331
     332      uint32_t request_in  = 0;
     333      uint32_t request_out = 0;
     334      bool     request_out_wait [nb_request];
     335
     336      for (uint32_t i=0; i<nb_request; i++)
     337        request_out_wait [i] = true;
     338     
     339//       bool can_gpr_use [_param->_nb_ooo_engine][_param->_nb_general_register];
     340//       bool can_spr_use [_param->_nb_ooo_engine][_param->_nb_special_register];
     341
     342      list<write_req_t> write_req_gpr;
     343      list<write_req_t> write_req_spr;
     344
     345      while (request_out < nb_request)
     346        {
     347          LABEL("request_in         : %d",request_in );
     348          LABEL("request_out        : %d",request_out);
     349          for (uint32_t i=0; i<nb_request; i++)
     350            if (request_out_wait [i])
     351              LABEL("request_out_wait   : %d",i);
     352          LABEL("write_req_gpr size : %d",write_req_gpr.size());
     353          LABEL("write_req_spr size : %d",write_req_spr.size());
     354
     355//        for (uint32_t j=0; j<_param->_nb_ooo_engine; j++)
     356//          {
     357//            for (uint32_t i=0; i<_param->_nb_general_register; i++)
     358//              can_gpr_use [j][i] = true;
     359//            for (uint32_t i=0; i<_param->_nb_special_register; i++)
     360//              can_spr_use [j][i] = true;
     361//          }
     362
     363          Tcontrol_t         read_unit_in_val = (request_in < nb_request) and ((rand()%100) < percent_transaction_queue_in);
     364          Tcontext_t         read_unit_in_ooo_engine_id;
     365          Tgeneral_address_t read_unit_in_num_reg_ra;
     366          Tgeneral_address_t read_unit_in_num_reg_rb;
     367          Tspecial_address_t read_unit_in_num_reg_rc;
     368
     369          in_READ_UNIT_IN_VAL         ->write(read_unit_in_val);
     370          if (read_unit_in_val)
     371            {
     372              bool               data_val;
     373              read_unit_in_ooo_engine_id = _ooo_engine_id [request_in];
     374              read_unit_in_num_reg_ra    = _num_reg_ra [request_in];
     375              read_unit_in_num_reg_rb    = _num_reg_rb [request_in];
     376              read_unit_in_num_reg_rc    = _num_reg_rc [request_in];
     377
     378              if (_param->_have_port_context_id)
     379              in_READ_UNIT_IN_CONTEXT_ID     ->write((2*read_unit_in_ooo_engine_id)%_param->_nb_context  );
     380              if (_param->_have_port_front_end_id)
     381              in_READ_UNIT_IN_FRONT_END_ID   ->write((3*read_unit_in_ooo_engine_id)%_param->_nb_front_end);
     382              if (_param->_have_port_ooo_engine_id)
     383              in_READ_UNIT_IN_OOO_ENGINE_ID  ->write(read_unit_in_ooo_engine_id);
     384              if (_param->_have_port_rob_ptr)
     385              in_READ_UNIT_IN_PACKET_ID   ->write(request_in);
     386              in_READ_UNIT_IN_OPERATION   ->write(0);
     387              in_READ_UNIT_IN_TYPE        ->write(0);
     388              in_READ_UNIT_IN_STORE_QUEUE_PTR_WRITE->write(0);
     389              if (_param->_have_port_load_queue_ptr)
     390              in_READ_UNIT_IN_LOAD_QUEUE_PTR_WRITE ->write(0);
     391              in_READ_UNIT_IN_HAS_IMMEDIAT->write(0);
     392              in_READ_UNIT_IN_IMMEDIAT    ->write(0);
     393              in_READ_UNIT_IN_READ_RA     ->write(_read_ra[request_in]);
     394              data_val = not(_read_ra[request_in]) or _gpr_val[read_unit_in_num_reg_ra][read_unit_in_ooo_engine_id];
     395
     396              if (not data_val)
     397                if (rand ()%2)
     398                  write_req_gpr.push_back (write_req_t(read_unit_in_ooo_engine_id,read_unit_in_num_reg_ra));
     399                else
     400                  write_req_gpr.push_front(write_req_t(read_unit_in_ooo_engine_id,read_unit_in_num_reg_ra));
     401
     402
     403              in_READ_UNIT_IN_NUM_REG_RA  ->write(read_unit_in_num_reg_ra);
     404//            in_READ_UNIT_IN_DATA_RA_VAL ->write(data_val);
     405//            in_READ_UNIT_IN_DATA_RA     ->write((data_val)?_gpr[read_unit_in_num_reg_ra][read_unit_in_ooo_engine_id]:0);
     406              in_READ_UNIT_IN_READ_RB     ->write(_read_rb[request_in]);
     407              data_val = not(_read_rb[request_in]) or _gpr_val[read_unit_in_num_reg_rb][read_unit_in_ooo_engine_id];
     408
     409              if (not data_val)
     410                if (rand ()%2)
     411                  write_req_gpr.push_back (write_req_t(read_unit_in_ooo_engine_id,read_unit_in_num_reg_rb));
     412                else
     413                  write_req_gpr.push_front(write_req_t(read_unit_in_ooo_engine_id,read_unit_in_num_reg_rb));
     414
     415
     416              in_READ_UNIT_IN_NUM_REG_RB  ->write(read_unit_in_num_reg_rb);                           
     417//            in_READ_UNIT_IN_DATA_RB_VAL ->write(data_val);                           
     418//            in_READ_UNIT_IN_DATA_RB     ->write((data_val)?_gpr[read_unit_in_num_reg_rb][read_unit_in_ooo_engine_id]:0);
     419              in_READ_UNIT_IN_READ_RC     ->write(_read_rc[request_in]);
     420              data_val = not(_read_rc[request_in]) or _spr_val[read_unit_in_num_reg_rc][read_unit_in_ooo_engine_id];
     421
     422              if (not data_val)
     423                if (rand ()%2)
     424                  write_req_spr.push_back (write_req_t(read_unit_in_ooo_engine_id,read_unit_in_num_reg_rc));
     425                else
     426                  write_req_spr.push_front(write_req_t(read_unit_in_ooo_engine_id,read_unit_in_num_reg_rc));
     427
     428              in_READ_UNIT_IN_NUM_REG_RC  ->write(read_unit_in_num_reg_rc);                           
     429//            in_READ_UNIT_IN_DATA_RC_VAL ->write(data_val);                           
     430//            in_READ_UNIT_IN_DATA_RC     ->write((data_val)?_spr[read_unit_in_num_reg_rc][read_unit_in_ooo_engine_id]:0);
     431              in_READ_UNIT_IN_WRITE_RD    ->write(0);
     432              in_READ_UNIT_IN_NUM_REG_RD  ->write(0);
     433              in_READ_UNIT_IN_WRITE_RE    ->write(0);
     434              in_READ_UNIT_IN_NUM_REG_RE  ->write(0);
     435
     436//            can_gpr_use [read_unit_in_ooo_engine_id][read_unit_in_num_reg_ra] = false;
     437//            can_gpr_use [read_unit_in_ooo_engine_id][read_unit_in_num_reg_rb] = false;
     438//            can_spr_use [read_unit_in_ooo_engine_id][read_unit_in_num_reg_rc] = false;
     439            }
     440                 
     441          for (uint32_t i=0; i<_param->_nb_inst_retire; i++)
     442            in_READ_UNIT_OUT_ACK[i]->write((rand()%100)<percent_transaction_queue_out);
     443
     444          // RegisterFile access
     445          for (uint32_t i=0; i<_param->_nb_gpr_read ; i++)
     446            {
     447              Tcontrol_t ack = (rand()%100) < percent_transaction_registerfile;
     448              in_GPR_READ_ACK      [i]->write(ack);
     449
     450              SC_START(0);
     451
     452              if (out_GPR_READ_VAL [i]->read())
     453                {
     454                  Tgeneral_address_t num_reg    = out_GPR_READ_NUM_REG       [i]->read();
     455                  Tcontext_t         ooo_engine = (_param->_have_port_ooo_engine_id)?out_GPR_READ_OOO_ENGINE_ID [i]->read():0;
     456                  Tgeneral_data_t    data       = _gpr    [num_reg][ooo_engine];
     457                  Tcontrol_t         data_val   = _gpr_val[num_reg][ooo_engine];
     458                 
     459                  if (ack)
     460                    LABEL(" * GPR_READ      [%d] - gpr[%d][%d] ->  (%d) 0x%x",i,num_reg,ooo_engine,data_val,data);
     461                 
     462                  in_GPR_READ_DATA     [i]->write(data);
     463                  in_GPR_READ_DATA_VAL [i]->write(data_val);
     464                }
     465            }
     466
     467          for (uint32_t i=0; i<_param->_nb_spr_read ; i++)
     468            {
     469              Tcontrol_t ack = (rand()%100) < percent_transaction_registerfile;
     470              in_SPR_READ_ACK      [i]->write(ack);
     471
     472              SC_START(0);
     473
     474              if (out_SPR_READ_VAL [i]->read())
     475                {
     476                  Tspecial_address_t num_reg    = out_SPR_READ_NUM_REG       [i]->read();
     477                  Tcontext_t         ooo_engine = (_param->_have_port_ooo_engine_id)?out_SPR_READ_OOO_ENGINE_ID [i]->read():0;
     478                  Tspecial_data_t    data       = _spr    [num_reg][ooo_engine];
     479                  Tcontrol_t         data_val   = _spr_val[num_reg][ooo_engine];
     480                 
     481                  if (ack)
     482                    LABEL(" * SPR_READ      [%d] - spr[%d][%d] ->  (%d) 0x%x",i,num_reg,ooo_engine,data_val,data);
     483                 
     484                  in_SPR_READ_DATA     [i]->write(data);
     485                  in_SPR_READ_DATA_VAL [i]->write(data_val);
     486                }
     487            }
     488
     489          list<write_req_t>::iterator it_gpr = write_req_gpr.begin();
     490          list<write_req_t>::iterator it_spr = write_req_spr.begin();
     491
     492          LABEL("Bypass Network :");
     493          for (uint32_t i=0; i<_param->_nb_gpr_write; i++)
     494            {
     495              Tcontext_t         ooo_engine = (it_gpr != write_req_gpr.end())?(*it_gpr).ooo:0;
     496              Tgeneral_address_t num_reg    = (it_gpr != write_req_gpr.end())?(*it_gpr).reg:0;
     497              Tcontrol_t         val     = (_gpr_val [num_reg][ooo_engine]== 0)?((rand()%100) < percent_transaction_registerfile):0;
     498              Tgeneral_data_t    data    = range<Tgeneral_data_t>(rand(),_param->_size_general_data);
     499           
     500              val = (val// and can_spr_use [ooo_engine][num_reg]
     501                     and (it_gpr != write_req_gpr.end()));
     502
     503              in_GPR_WRITE_VAL            [i]->write(val);           
     504              if (_param->_have_port_ooo_engine_id)
     505              in_GPR_WRITE_OOO_ENGINE_ID  [i]->write(ooo_engine);
     506              in_GPR_WRITE_NUM_REG        [i]->write(num_reg);
     507              in_GPR_WRITE_DATA           [i]->write(data);
     508
     509              if (val)
     510                {
     511                  LABEL(" * GPR_WRITE     [%d] - gpr[%d][%d] <- 0x%x",i,num_reg,ooo_engine,data);
     512
     513//                can_gpr_use [ooo_engine][num_reg] = false;
     514
     515                  _gpr     [num_reg][ooo_engine] = data;
     516                  _gpr_val [num_reg][ooo_engine] = 1;
     517                }
     518
     519              if (it_gpr != write_req_gpr.end())
     520                it_gpr ++;
     521            }
     522          for (uint32_t i=0; i<_param->_nb_spr_write; i++)
     523            {
     524              Tcontext_t         ooo_engine = (it_spr != write_req_spr.end())?(*it_spr).ooo:0;
     525              Tgeneral_address_t num_reg    = (it_spr != write_req_spr.end())?(*it_spr).reg:0;
     526
     527              Tcontrol_t         val     = (_spr_val [num_reg][ooo_engine]== 0)?((rand()%100) < percent_transaction_registerfile):0;
     528              Tspecial_data_t    data    = range<Tspecial_data_t>(rand(),_param->_size_special_data);
     529
     530              val = (val // and can_spr_use [ooo_engine][num_reg]
     531                     and (it_spr != write_req_spr.end()));
     532
     533              in_SPR_WRITE_VAL            [i]->write(val);           
     534              if (_param->_have_port_ooo_engine_id)
     535              in_SPR_WRITE_OOO_ENGINE_ID  [i]->write(ooo_engine);
     536              in_SPR_WRITE_NUM_REG        [i]->write(num_reg);
     537              in_SPR_WRITE_DATA           [i]->write(data);
     538
     539              if (val == 1)
     540                {
     541                  LABEL(" * SPR_WRITE     [%d] - spr[%d][%d] <- 0x%x",i,num_reg,ooo_engine,data);
     542                 
     543//                can_spr_use [ooo_engine][num_reg] = false;
     544
     545                  _spr     [num_reg][ooo_engine] = data;
     546                  _spr_val [num_reg][ooo_engine] = 1;
     547                }
     548
     549              if (it_spr != write_req_spr.end())
     550                it_spr ++;
     551
     552            }
     553
     554          for (uint32_t i=0; i<_param->_nb_bypass_write; i++)
     555            {
     556              Tcontext_t         ooo_engine = (it_gpr != write_req_gpr.end())?(*it_gpr).ooo:0;
     557              Tgeneral_address_t gpr_num_reg= (it_gpr != write_req_gpr.end())?(*it_gpr).reg:0;
     558
     559              if (_param->_have_port_ooo_engine_id)
     560              in_BYPASS_WRITE_OOO_ENGINE_ID [i]->write(ooo_engine);
     561
     562              Tcontrol_t         gpr_val     = (_gpr_val [gpr_num_reg][ooo_engine]== 0)?((rand()%100) < percent_transaction_bypass):0;
     563              Tgeneral_data_t    gpr_data    = range<Tgeneral_data_t>(rand(),_param->_size_general_data);
     564             
     565              gpr_val = (gpr_val // and can_gpr_use [ooo_engine][gpr_num_reg]
     566                         and (it_gpr != write_req_gpr.end()));
     567
     568              in_BYPASS_WRITE_GPR_VAL    [i]->write(gpr_val);         
     569              in_BYPASS_WRITE_GPR_NUM_REG[i]->write(gpr_num_reg);
     570              in_BYPASS_WRITE_GPR_DATA   [i]->write(gpr_data);
     571
     572              if (gpr_val)
     573                {
     574                  LABEL(" * BYPASS_WRITE  [%d] - gpr[%d][%d] <- 0x%x",i,gpr_num_reg,ooo_engine,gpr_data);
     575//                can_gpr_use [ooo_engine][gpr_num_reg] = false;
     576
     577                  _gpr     [gpr_num_reg][ooo_engine] = gpr_data;
     578                  _gpr_val [gpr_num_reg][ooo_engine] = 1;
     579                }
     580
     581              if (it_gpr != write_req_gpr.end())
     582                it_gpr ++;
     583
     584              Tspecial_address_t spr_num_reg = (it_spr != write_req_spr.end())?(*it_spr).reg:0;
     585              Tcontrol_t         spr_val     = (_spr_val [spr_num_reg][ooo_engine]== 0)?((rand()%100) < percent_transaction_bypass):0;
     586              Tspecial_data_t    spr_data    = range<Tspecial_data_t>(rand(),_param->_size_special_data);
     587             
     588              spr_val = (spr_val // and can_spr_use [ooo_engine][spr_num_reg]
     589                         and (it_spr != write_req_spr.end()) and ((*it_spr).ooo == ooo_engine));
     590
     591              in_BYPASS_WRITE_SPR_VAL    [i]->write(spr_val);         
     592              in_BYPASS_WRITE_SPR_NUM_REG[i]->write(spr_num_reg);
     593              in_BYPASS_WRITE_SPR_DATA   [i]->write(spr_data);
     594
     595              if (spr_val)
     596                {
     597                  LABEL(" * BYPASS_WRITE  [%d] - spr[%d][%d] <- 0x%x",i,spr_num_reg,ooo_engine,spr_data);
     598
     599//                can_spr_use [ooo_engine][spr_num_reg] = false;
     600
     601                  _spr     [spr_num_reg][ooo_engine] = spr_data;
     602                  _spr_val [spr_num_reg][ooo_engine] = 1;
     603                }
     604
     605              if (it_spr != write_req_spr.end())
     606                it_spr ++;
     607            }
     608
     609          for (uint32_t i=0; i<_param->_nb_bypass_memory; i++)
     610            {
     611              Tcontext_t         ooo_engine = (it_gpr != write_req_gpr.end())?(*it_gpr).ooo:0;
     612              Tgeneral_address_t num_reg    = (it_gpr != write_req_gpr.end())?(*it_gpr).reg:0;
     613
     614              if (_param->_have_port_ooo_engine_id)
     615              in_BYPASS_MEMORY_OOO_ENGINE_ID [i]->write(ooo_engine);
     616
     617              Tcontrol_t         val     = (_gpr_val [num_reg][ooo_engine]== 0)?((rand()%100) < percent_transaction_bypass):0;
     618              Tgeneral_data_t    data    = range<Tgeneral_data_t>(rand(),_param->_size_general_data);
     619             
     620              val = (val // and can_gpr_use [ooo_engine][num_reg]
     621                     and (it_gpr != write_req_gpr.end()));
     622
     623              in_BYPASS_MEMORY_VAL    [i]->write(val);       
     624              in_BYPASS_MEMORY_NUM_REG[i]->write(num_reg);
     625              in_BYPASS_MEMORY_DATA   [i]->write(data);
     626
     627              if (val)
     628                {
     629                  LABEL(" * BYPASS_MEMORY [%d] - gpr[%d][%d] <- 0x%x",i,num_reg,ooo_engine,data);
     630                 
     631//                can_gpr_use [ooo_engine][num_reg] = false;
     632
     633                  _gpr     [num_reg][ooo_engine] = data;
     634                  _gpr_val [num_reg][ooo_engine] = 1;
     635                }
     636
     637              if (it_gpr != write_req_gpr.end())
     638                it_gpr ++;
     639            }
     640
     641          SC_START(0); // to mealy function
     642         
     643//        LABEL("Test     READ_UNIT_IN  : "+toString(in_READ_UNIT_IN_VAL->read())+","+toString(out_READ_UNIT_IN_ACK->read()));
     644          if (( in_READ_UNIT_IN_VAL->read() == 1) and
     645              (out_READ_UNIT_IN_ACK->read() == 1))
     646            {
     647              LABEL("Accepted READ_UNIT_IN  number : %d",request_in);
     648              request_in  ++;
     649            }
     650
     651          for (uint32_t i=0; i<_param->_nb_inst_retire; i++)
     652            {
     653              LABEL("Test     READ_UNIT_OUT %d : %d,%d",i,out_READ_UNIT_OUT_VAL[i]->read(),in_READ_UNIT_OUT_ACK[i]->read());
     654              if ((out_READ_UNIT_OUT_VAL [i]->read() == 1) and
     655                  ( in_READ_UNIT_OUT_ACK [i]->read() == 1))
     656                {
     657                  Tpacket_t  packet_id;
     658                  if (_param->_have_port_rob_ptr)
     659                    packet_id = out_READ_UNIT_OUT_PACKET_ID [i]->read();
     660                  else
     661                    packet_id = 0;
     662                  LABEL("Accepted READ_UNIT_OUT [%d] number : %d, request number : %d",i,packet_id,request_out);
     663                  TEST(bool, request_out_wait [packet_id] , true);
     664
     665                  request_out ++;
     666                  request_out_wait [packet_id] = false;
     667
     668                  Tcontext_t ooo_engine_id = _ooo_engine_id [packet_id];
     669                 
     670                  if (_param->_have_port_context_id)
     671                  TEST(Tcontext_t        ,out_READ_UNIT_OUT_CONTEXT_ID   [i]->read(),(2*ooo_engine_id)%_param->_nb_context  );
     672                  if (_param->_have_port_front_end_id)
     673                  TEST(Tcontext_t        ,out_READ_UNIT_OUT_FRONT_END_ID [i]->read(),(3*ooo_engine_id)%_param->_nb_front_end);
     674                  if (_param->_have_port_ooo_engine_id)
     675                  TEST(Tcontext_t        ,out_READ_UNIT_OUT_OOO_ENGINE_ID[i]->read(),ooo_engine_id);
     676
     677                  if (_read_ra [packet_id])
     678                  TEST(Tgeneral_data_t   ,out_READ_UNIT_OUT_DATA_RA   [i]->read(),_gpr[_num_reg_ra[packet_id]][ooo_engine_id]);
     679                 
     680                  if (_read_rb [packet_id])
     681                  TEST(Tgeneral_data_t   ,out_READ_UNIT_OUT_DATA_RB   [i]->read(),_gpr[_num_reg_rb[packet_id]][ooo_engine_id]);
     682                 
     683                  if (_read_rc [packet_id])
     684                  TEST(Tspecial_data_t   ,out_READ_UNIT_OUT_DATA_RC   [i]->read(),_spr[_num_reg_rc[packet_id]][ooo_engine_id]);
     685                }
     686            }
     687         
     688          SC_START(1);   
     689
     690          for (list<write_req_t>::iterator it = write_req_gpr.begin();
     691               it != write_req_gpr.end();
     692               )
     693            {
     694              if (_gpr_val [(*it).reg][(*it).ooo] == 1)
     695                it = write_req_gpr.erase(it);
     696              else
     697                it ++;
     698            }
     699
     700          for (list<write_req_t>::iterator it = write_req_spr.begin();
     701               it != write_req_spr.end();
     702               )
     703            {
     704              if (_spr_val [(*it).reg][(*it).ooo] == 1)
     705                it = write_req_spr.erase(it);
     706              else
     707                it ++;
     708            }
     709        }
     710
     711      for (uint32_t i=0; i<nb_request; i++)
     712        TEST(bool, request_out_wait [i] , false);
    243713    }
     714  }
    244715
    245716  /********************************************************
Note: See TracChangeset for help on using the changeset viewer.