Ignore:
Timestamp:
Jan 18, 2011, 6:37:31 PM (14 years ago)
Author:
alain
Message:

decreasing the number of registers

Location:
trunk/modules/vci_synthetic_initator/caba/sources
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/modules/vci_synthetic_initator/caba/sources/include/vci_synthetic_initiator.h

    r126 r128  
    5757
    5858
    59       /* States of the GENERATOR fsm */
     59      /* States of the VCI CMD fsm */
    6060      enum vci_fsm_state_e{
    6161        VCI_IDLE,
     
    6464      };
    6565
    66       enum bc_rsp_fsm_state_e{
     66      enum bc_fsm_state_e{
    6767        BC_RSP_IDLE,
    6868        BC_RSP_WAIT_RSP
     
    7070
    7171
    72       uint64_t     m_cpt_cycles;            // Counter of cycles
    7372     
    7473
     
    115114
    116115      // Component attributes
    117       const size_t                        m_length;             // Number of words to write
    118       const size_t                        m_rho;                // Rate of packets in the network wanted
    119       //const float                       m_rho;                // Rate of packets in the network wanted
    120       const size_t                        m_depth;              // Fifo depth
    121       const size_t                        m_xmesh;     
    122       const size_t                        m_ymesh;
    123       const size_t                        m_bc_period;          // Broadcast period, if no broadcast => 0
    124       const size_t                        m_xmin;
    125       const size_t                        m_xmax;
    126       const size_t                        m_ymin;
    127       const size_t                        m_ymax;
    128       const size_t                        m_srcid;
    129       static const int                    tab_size = 1 << vci_param::T;
     116      const size_t                m_length;             // Number of words to write
     117      const size_t                m_rho;                // offered load * 1000
     118      const size_t                m_depth;              // Fifo depth
     119      const size_t                m_xmesh;     
     120      const size_t                m_ymesh;
     121      const size_t                m_bc_period;          // Broadcast period, if no broadcast => 0
     122      const size_t                m_xmin;
     123      const size_t                m_xmax;
     124      const size_t                m_ymin;
     125      const size_t                m_ymax;
     126      const size_t                m_srcid;
     127      static const int            m_tab_size = 1 << vci_param::T;
    130128
    131       sc_signal<size_t>                   r_count;                  // Numbers of words sent
    132       sc_signal<size_t>                   r_npackets;               // Total number of packets already sent
    133       sc_signal<uint64_t>                 r_start_latency1;         // Start time of sending packet wanted
    134       sc_signal<uint64_t>                 r_start_latency2;         // Start time of sending packet
    135       sc_signal<uint64_t>                 r_latency1;               // Average latency wanted
    136       sc_signal<uint64_t>                 r_latency2;               // Average latency
    137       sc_signal<addr_t>                   r_address_to_send;        // Address to send the write command
    138       sc_signal<uint32_t>                 r_local_seed;
    139       sc_signal<int>                      r_id_to_send;
    140129
    141       sc_signal<uint64_t>                 r_start_latency_bc;
    142       sc_signal<uint64_t>                 r_latency_bc;
    143       sc_signal<uint64_t>                 r_nb_bc;
     130      // Fifo transmitting requests from the generator FSM to the VCI FSM
     131      GenericFifo<uint64_t>     r_date_fifo;
     132      GenericFifo<bool>         r_bc_fifo;
    144133
    145       // Fifo transmitting date to the VCI FSM
    146       GenericFifo<uint32_t>     m_date_fifo;
     134      // VCI CMD FSM
     135      sc_signal<int>            r_cmd_fsm;
     136      sc_signal<addr_t>         r_cmd_address;  // Address for the single transaction
     137      sc_signal<int>            r_cmd_trdid;    // TRDID for the single transaction
     138      sc_signal<size_t>         r_cmd_count;    // Numbers of words sent
     139      sc_signal<uint32_t>       r_cmd_seed;     // seed for reproducible address generation
    147140
    148       sc_signal<int>            r_cmd_fsm;
     141      // Broadcast FSM
     142      sc_signal<bool>           r_bc_fsm;       // FSM state
     143      sc_signal<uint64_t>       r_bc_date;      // broadcast transaction requested date
     144      sc_signal<uint32_t>       r_bc_nrsp;      // Expected number of responses for a broadcast command
     145       
     146      // Pending transaction FSMs
     147      sc_signal<bool>*          r_pending_fsm;  // FSM states
     148      sc_signal<uint64_t>*      r_pending_date; // single transaction requested date
    149149
    150       sc_signal<int>            r_bc_rsp_fsm;
    151        
    152       sc_signal<size_t>         r_index;
    153 
    154       sc_signal<bool>           r_broadcast_req;
    155 
    156       sc_signal<bool>           r_broadcast_rsp;
    157 
    158       sc_signal<uint32_t>       r_bc_nrsp;                  // Expected number of responses for a broadcast command
    159 
    160       sc_signal<uint64_t>       **r_req_id;
    161 
     150      // Instrumentation registers
     151      sc_signal<uint64_t>       r_cpt_cycles;   // Local time
     152      sc_signal<uint64_t>       r_cpt_period;   // Number of cycles between 2 broadcast transactions
     153      sc_signal<size_t>         r_nb_single;    // Total number of single transactions
     154      sc_signal<uint64_t>       r_latency_single;       // Total cumulated latency for single transactions
     155      sc_signal<size_t>         r_nb_bc;        // Total number of bc transactions
     156      sc_signal<uint64_t>       r_latency_bc;   // Total cumulated latency for broadcast transactions
    162157
    163158    }; // end class VciSyntheticInitiator
  • trunk/modules/vci_synthetic_initator/caba/sources/src/vci_synthetic_initiator.cpp

    r127 r128  
    5252      const soclib::common::IntTab       &vci_index,
    5353      const uint32_t length,    // Packet length (flit numbers)
    54       const uint32_t rho,       // Packets ratio on the network
    55     //  const float  rho,       // Packets ratio on the network
     54      const uint32_t rho,       // Offered load * 1000
    5655      const uint32_t depth,     // Fifo depth
    5756      const uint32_t xmesh,     
     
    8281    m_ymin(ymin),
    8382    m_ymax(ymax),
    84     m_date_fifo("m_date_fifo", depth),
    85     r_count           ("r_count"),             
    86     r_npackets        ("r_npackets"),           
    87     r_start_latency1  ("r_start_latency1"), 
    88     r_start_latency2  ("r_start_latency2"),   
    89     r_latency1        ("r_latency1"),           
    90     r_latency2        ("r_latency2"),           
    91     r_address_to_send ("r_address_to_send"),     
    92     r_local_seed      ("r_local_seed"),
    93     r_id_to_send      ("r_id_to_send"),
    94     r_start_latency_bc("r_start_latency_bc"),
    95     r_latency_bc      ("r_latency_bc"),
    96     r_nb_bc           ("r_nb_bc"),
    97     r_cmd_fsm("r_cmd_fsm"),
     83    r_date_fifo("r_date_fifo", depth),
     84    r_type_fifo("r_type_fifo", depth),
     85    r_cmd_fsm;        ("r_count"),             
    9886    r_bc_rsp_fsm("r_bc_rsp_fsm"),
    9987    r_index("r_index"),
     
    161149                  << " : state_cmd_fsm = " << state_cmd_str[r_cmd_fsm]
    162150                  << " : state_rsp_fsm = " << state_bc_rsp_str[r_bc_rsp_fsm]
    163                   << " Adresse to send : " << std::hex << r_address_to_send.read()
     151                  << " Adresse to send : " << std::hex << r_cmd_address.read()
    164152                  << " Number of broadcast to receive : " << std::dec << r_bc_nrsp.read()
    165                   << " Number of packets sent : " << std::dec << r_npackets.read() << " " << r_id_to_send.read() << std::endl;
     153                  << " Number of packets sent : " << std::dec << r_nb_single.read() << " " << r_id_to_send.read() << std::endl;
    166154        for(int i = 0; i < (1<<vci_param::T) ; i++){
    167155          std::cout << "ID : " << i << " " << (uint64_t)(r_req_id[i][0].read()) << " " << (uint64_t)(r_req_id[i][1].read()) << std::endl;
     
    173161  //////////////////////////////////
    174162  {
    175         std::cout << name() << " : "<< std::dec << m_cpt_cycles << " cycles, " << r_npackets.read() << " packets sent" << std::endl;
    176         std::cout << ((double)r_latency1.read()/(double)r_npackets.read()) << " | " << ((double)r_latency2.read()/(double)r_npackets.read()) << std::endl;
     163        std::cout << name() << " : "<< std::dec << m_cpt_cycles << " cycles, " << r_nb_single.read() << " packets sent" << std::endl;
     164        std::cout << ((double)r_latency1.read()/(double)r_nb_single.read()) << " | " << ((double)r_latency2.read()/(double)r_nb_single.read()) << std::endl;
    177165        if(m_bc_period)
    178166          std::cout << ((double)r_latency_bc.read()/(double)r_nb_bc.read()) << std::endl;
     
    184172  {
    185173    //  RESET         
    186     if ( ! p_resetn.read() ) {
     174    if ( ! p_resetn.read() )
     175    {
    187176      // Initializing seed for random numbers generation
     177
    188178#ifndef DETERMINISTIC
    189179      srand(time(NULL));
     
    192182      // Initializing FSMs
    193183      r_cmd_fsm = VCI_IDLE;
    194 
    195       r_bc_rsp_fsm = BC_RSP_IDLE;
     184      r_bc_fsm = BC_RSP_IDLE;
     185      for(size_t i=0 ; i<m_tab_size ; i++) r_pending_fsm[i] = false;
    196186
    197187      // Initializing FIFOs
    198       m_date_fifo.init();
    199 
    200       // Initializing the stats
    201       r_latency1 = 0 ;
    202       r_latency2 = 0 ;
    203       // Activity counters
    204       m_cpt_cycles              = 0;
     188      r_date_fifo.init();
     189      r_bc_fifo.init();
     190
     191      // Initializing the instrumentation registers
     192      r_latency_single          = 0 ;
     193      r_nb_single               = 0;
     194      r_latency_bc              = 0 ;
     195      r_nb_bc                   = 0;
     196      r_cpt_cycles              = 0;
     197      r_cpt_period              = 0;
    205198     
    206       r_start_latency_bc        = 0;
    207       r_latency_bc              = 0;
    208       r_nb_bc                   = 0;
    209       r_id_to_send              = -1;
    210 
    211       r_broadcast_req           = false;
    212 
    213       r_broadcast_rsp           = false;
    214 
    215       r_bc_nrsp                 = 0;
    216       r_count                   = 0;       
    217       r_npackets                = 0;     
    218       r_start_latency1          = 0;       
    219       r_start_latency2          = 0;       
    220       r_address_to_send         = 0;     
    221       r_local_seed              = (uint32_t)m_srcid;
    222 
    223       r_latency_bc              = 0;
    224 
    225       for(int i = 0; i < tab_size; i++){
    226         r_req_id[i][0] = 0;
    227         r_req_id[i][1] = 0;
    228       }
     199      r_cmd_seed        = (uint32_t)m_srcid;
    229200
    230201      return;
    231202    }
    232203
    233     bool    date_fifo_put = false;
    234     bool    date_fifo_get = false;
     204    bool    fifo_put = false;
     205    bool    fifo_get = false;
     206    bool    fifo_bc;
    235207
    236208    uint32_t m_local_seed ;
    237209
    238 
    239     // FSM controling effective requests send
     210    //////////////////
     211    // VCI CMD FSM
     212    //////////////////
    240213    switch ( r_cmd_fsm.read() ) {
    241       //////////////////
    242214      case VCI_IDLE:
    243215        {
    244           if (m_date_fifo.rok()){
    245             if (r_broadcast_req.read() && !r_broadcast_rsp.read()){
    246               r_address_to_send = 0x3 | (0x7c1f << vci_param::N-20) ;
     216          if (r_date_fifo.rok())
     217          {
     218            if ( r_bc_fifo() = true )   // its a broadcast request
     219            {
     220              if ( r_bc_fsm.read() = false )    // no current broadcast
     221              {
    247222              r_cmd_fsm = VCI_BC_SEND ;
    248             } else {
    249               r_id_to_send = -1;
     223              r_cmd_address = 0x3 | (0x7c1f << vci_param::N-20) ;
     224              }
     225            }
     226            else                        // its a single request
     227            {
     228              int id = -1;
    250229              for(int i = 0; i < tab_size; i++){
    251                 if(r_req_id[i][0].read() == 0){
    252                   r_id_to_send = i;
     230                if(r_pending_fsm[i].read() == false)
     231                {
     232                  id = i;
    253233                  break;
    254234                }
    255235              }
    256               if(r_id_to_send.read() == -1){
    257                 r_cmd_fsm = VCI_IDLE ;
    258                 break;
    259               } else {
     236              if(id != -1){
    260237                r_cmd_fsm = VCI_SINGLE_SEND ;
     238                r_cmd_count = 0;
     239                r_cmd_trdid = id;
    261240              }
    262241#ifdef DETERMINISTIC
    263               m_local_seed = r_local_seed.read();
    264               r_address_to_send = destAdress(&m_local_seed) << (vci_param::N)-(soclib::common::uint32_log2((uint32_t)m_xmesh)+soclib::common::uint32_log2((uint32_t)m_ymesh));
    265               r_local_seed = m_local_seed;
     242              m_local_seed = r_cmd_seed.read();
     243              r_cmd_address = destAdress(&m_local_seed) << (vci_param::N)-(soclib::common::uint32_log2((uint32_t)m_xmesh)+soclib::common::uint32_log2((uint32_t)m_ymesh));
     244              r_cmd_seed = m_local_seed;
    266245#else
    267               r_address_to_send = destAdress() << (vci_param::N)-(soclib::common::uint32_log2((uint32_t)m_xmesh)+soclib::common::uint32_log2((uint32_t)m_ymesh));
     246              r_cmd_address = destAdress() << (vci_param::N)-(soclib::common::uint32_log2((uint32_t)m_xmesh)+soclib::common::uint32_log2((uint32_t)m_ymesh));
    268247#endif
    269               r_count = 0;
    270248            }
    271249          }
    272250          break;
    273251        }
    274         //////////////////
    275252      case VCI_SINGLE_SEND:
    276253        {
    277           if (p_vci.cmdack.read()){
    278             if (r_count.read() == m_length-1) {
    279               r_req_id[r_id_to_send.read()][0] = (uint64_t)(m_date_fifo.read());
    280               r_req_id[r_id_to_send.read()][1] = m_cpt_cycles;
    281               //std::cout << name () << " FIFO " << m_date_fifo.read() << std::endl;
    282               date_fifo_get = true;
    283               r_npackets = r_npackets.read() + 1;
    284               r_cmd_fsm = VCI_IDLE ;
    285             } else {
    286               r_cmd_fsm = VCI_SINGLE_SEND ;
    287               r_count = r_count.read() + 1;
     254          if ( p_vci.cmdack.read())
     255          {
     256            r_count = r_count.read() + 1;
     257            if (r_cmd_count.read() == m_length-1)
     258            {
     259              r_nb_single = r_nb_single.read() + 1;
     260              r_cmd_fsm = VCI_SINGLE_REGISTER ;
    288261            }
    289262          }
    290263          break;
    291264        }
    292       ///////////////////
     265      case VCI_SINGLE_REGISTER:
     266        {
     267          r_pending_date[r_cmd_trdid.read()] = (uint64_t)(m_date_fifo.read());
     268          r_pending_fsm[r_cmd_trdid.read()] = true;
     269          fifo_get = true;
     270          r_cmd_fsm = VCI_IDLE;
     271        }
    293272      case VCI_BC_SEND:
    294273        {
    295           if (p_vci.rspval.read()) {
     274          if (p_vci.cmdack.read())
     275          {
     276            r_bc_fsm = true;
    296277            r_bc_nrsp = (m_xmax - m_xmin) * (m_ymax - m_ymin) ;
    297             r_start_latency_bc = m_cpt_cycles;
    298             r_broadcast_rsp = true;
    299             date_fifo_get = true;
    300             r_bc_rsp_fsm = VCI_IDLE;
     278            r_bc_date = (uint64_t)(m_date_fifo.read());
     279            fifo_get = true;
     280            r_cmd_fsm = VCI_IDLE;
    301281            break;
    302282          }
     
    304284    } // end switch vci_fsm
    305285
    306     switch(r_bc_rsp_fsm.read()){
    307       ///////////////////
    308       case BC_RSP_IDLE:
    309         {
    310           if (p_vci.rspval.read() && r_broadcast_rsp.read()) {
    311             r_bc_rsp_fsm = BC_RSP_WAIT_RSP;
    312             break;
    313           }
    314         }
    315       ////////////////////
    316       case BC_RSP_WAIT_RSP:
    317         {
    318           if (p_vci.rspval.read() && (p_vci.rpktid.read() == 1)){
    319             if (r_bc_nrsp == 1) {
    320               r_broadcast_req = false;
    321               r_broadcast_rsp = false;
    322               //r_address_to_send.read() = 0;
    323               r_latency_bc = r_latency_bc.read() + (m_cpt_cycles - r_start_latency_bc.read());
    324               r_nb_bc = r_nb_bc.read() + 1;
    325               r_bc_rsp_fsm = BC_RSP_IDLE ;
    326             } else {
    327               r_bc_nrsp = r_bc_nrsp.read() - 1;;
    328               r_bc_rsp_fsm = BC_RSP_WAIT_RSP ;
    329             }
    330           }
    331           break;
    332         }   
    333     }
    334 
    335     if(p_vci.rspval.read()){
    336       if((int)(p_vci.pktid.read()) == 0){
    337         r_latency1 = r_latency1.read() + (m_cpt_cycles - r_req_id[(int)(p_vci.rtrdid.read())][0].read());
    338         r_latency2 = r_latency2.read() + (m_cpt_cycles - r_req_id[(int)(p_vci.rtrdid.read())][1].read());
    339         r_req_id[(int)(p_vci.rtrdid.read())][0] = 0;
    340         r_req_id[(int)(p_vci.rtrdid.read())][1] = 0;
    341         //std::cout << name() << " bla bla " << p_vci.rtrdid.read() << std::endl;
     286    /////////////////////
     287    // BC_FSM
     288    /////////////////////
     289    if ( r_bc_fsm.read() && p_vci.rspval.read() )
     290    {
     291      if ( p_vci.rpktid.read() == 1 ) r_bc_nrsp = r_bc_nrsp.read() - 1;
     292      if (r_bc_nrsp == 1)
     293      {
     294        r_bc_fsm = false;
     295        r_latency_bc = r_latency_bc.read() + (r_cpt_cycle.read() - r_bc_date.read());
    342296      }
    343297    }
    344298
    345     /////////////////// Filling fifo
    346     if( ( (uint64_t)(m_rho*m_cpt_cycles) > (uint64_t)(m_length*r_npackets.read()*1000)) ){
    347       if (m_date_fifo.wok()){
    348         date_fifo_put = true ;
    349       }
    350       if (m_bc_period){
    351               if (!r_broadcast_req.read() && (m_cpt_cycles % m_bc_period)){
    352                       r_broadcast_req = true;
    353               }
     299    ///////////////////
     300    // PENDING FSMs
     301    //////////////////
     302    if(p_vci.rspval.read())i
     303    {
     304      if((int)(p_vci.pktid.read()) == 0)        // not a broadcast
     305      {
     306        assert( ( r_pending_fsm[(int)p_vci.rtrdid.read()] == true ) &&
     307                "illegal single response received")
     308        r_pending_fsm[p_vci.rtrdid.read()] = false;
     309        r_latency_single = r_latency_single.read() +
     310                           (r_cpt_cycles.read() - r_pending_date[(int)p_vci.rtrdid.read()].read());
    354311      }
    355312    }
    356313
     314    ////////////////////////
     315    //  traffic regulator
     316    ////////////////////////
     317    if ( m_bc_period && (r_cpt_period.read() > m_bc_period) )
     318    {
     319      fifo_put = true ;
     320      fifo_bc  = true;
     321      if (r_date_fifo.wok())   r_nb_bc = r_nb_bc.read() + 1;
     322    }
     323    else if( ( (uint64_t)(m_rho*r_cpt_cycles.read()) > (uint64_t)(m_length*r_nb_single.read()*1000)) )
     324    {
     325      fifo_put = true ;
     326      fifo_bc  = false;
     327      if (r_date_fifo.wok())   r_nb_single = r_nb_single.read() + 1;
     328    }
     329
     330    ////////////////////////
     331    //  update fifos
     332    ////////////////////////
    357333    if (date_fifo_put){
    358334      if (date_fifo_get){
    359         m_date_fifo.put_and_get(m_cpt_cycles);
     335        r_date_fifo.put_and_get(r_cpt_cycles.read());
     336        r_bc_fifo.put_and_get(fifo_bc);
    360337      } else {
    361         m_date_fifo.simple_put(m_cpt_cycles);
     338        r_date_fifo.simple_put(m_cpt_cycles);
     339        r_bc_fifo.simple_put(fifo_bc);
    362340      }
    363341    } else {
    364342      if (date_fifo_get){
    365         m_date_fifo.simple_get();
     343        r_date_fifo.simple_get();
     344        r_bc_fifo.simple_get();
    366345      }
    367346    }
    368347   
    369     m_cpt_cycles++;
     348    ///////////////////////////
     349    //  increment local time
     350    ///////////////////////////
     351    r_cpt_cycles = r_cpt_cycles.read() + 1;
     352    r_cpt_period = r_cpt_period.read() + 1;
    370353
    371354    return;
     
    375358  /////////////////////////////
    376359  tmpl(void)::genMoore()
    377     /////////////////////////////
     360  /////////////////////////////
    378361  {
    379362    ////////////////////////////////////////////////////////////
     
    409392        {
    410393          p_vci.cmdval  = true;                 
    411           p_vci.address = (addr_t)(r_address_to_send.read() + (r_count.read()*4));
     394          p_vci.address = (addr_t)(r_cmd_address.read() + (r_count.read()*4));
    412395          p_vci.plen    = m_length*4;                                         
    413396          p_vci.wdata   = 0;                                       
     
    424407        {
    425408          p_vci.cmdval  = true;                 
    426           p_vci.address = (addr_t) r_address_to_send.read();
     409          p_vci.address = (addr_t) r_cmd_address.read();
    427410          p_vci.plen    = 4;                                         
    428411          p_vci.wdata   = 0;                                       
Note: See TracChangeset for help on using the changeset viewer.