Changeset 77


Ignore:
Timestamp:
Aug 27, 2010, 3:48:56 PM (14 years ago)
Author:
choichil
Message:

Rename of vci_traffic_generator to vci_synthetic_initiator

Location:
trunk/modules/vci_synthetic_initator
Files:
3 deleted
4 copied
1 moved

Legend:

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

    r75 r77  
     1/* -*- c++ -*-
     2 * File         : vci_synthetic_initiator.h
     3 * Date         : 26/08/2010
     4 * Copyright    : UPMC / LIP6
     5 * Authors      : Christophe Choichillon
     6 *
     7 * SOCLIB_LGPL_HEADER_BEGIN
     8 *
     9 * This file is part of SoCLib, GNU LGPLv2.1.
     10 *
     11 * SoCLib is free software; you can redistribute it and/or modify it
     12 * under the terms of the GNU Lesser General Public License as published
     13 * by the Free Software Foundation; version 2.1 of the License.
     14 *
     15 * SoCLib is distributed in the hope that it will be useful, but
     16 * WITHOUT ANY WARRANTY; without even the implied warranty of
     17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     18 * Lesser General Public License for more details.
     19 *
     20 * You should have received a copy of the GNU Lesser General Public
     21 * License along with SoCLib; if not, write to the Free Software
     22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
     23 * 02110-1301 USA
     24 *
     25 * SOCLIB_LGPL_HEADER_END
     26 *
     27 * Maintainers: christophe.choichillon@lip6.fr
     28 */
     29
     30#ifndef SOCLIB_CABA_SYNTHETIC_INITIATOR_H
     31#define SOCLIB_CABA_SYNTHETIC_INITIATOR_H
     32
     33#include <systemc>
     34
     35namespace soclib {  namespace caba {
     36    using namespace sc_core;
     37
     38    template<typename vci_param>
     39    class VciSyntheticInitiator
     40      : public soclib::caba::BaseModule
     41    {
     42      typedef uint32_t addr_t;
     43      typedef uint32_t data_t;
     44      typedef uint32_t tag_t;
     45      typedef uint32_t size_t;
     46      typedef uint32_t be_t;
     47      typedef uint32_t copy_t;
     48
     49
     50      /* States of the GENERATOR fsm */
     51      enum vci_fsm_state_e{
     52        VCI_IDLE,
     53        VCI_SINGLE_SEND,
     54        VCI_SINGLE_RECEIVE,
     55        VCI_BC_SEND,
     56        VCI_BC_RECEIVE
     57      };
     58      enum gen_fsm_state_e{
     59        A_IDLE,
     60        A_DATA
     61      };
     62
     63      uint32_t     m_cpt_cycles;            // Counter of cycles
     64
     65    protected:
     66
     67      SC_HAS_PROCESS(VciSyntheticInitiator);
     68   
     69    public:
     70      sc_in<bool>                               p_clk;
     71      sc_in<bool>                               p_resetn;
     72      soclib::caba::VciInitiator<vci_param>     p_vci; 
     73
     74      VciSyntheticInitiator(
     75                  sc_module_name name,                            // Instance Name
     76                  const soclib::common::MappingTable &mtp,        // Mapping table for primary requets
     77                  const soclib::common::IntTab &vci_index,        // VCI port to PROC (initiator)
     78                  size_t nways,                                   // Number of ways per set
     79                  size_t nsets,                                   // Number of sets
     80                  size_t nwords);                                 // Number of words per line
     81
     82      ~VciSyntheticInitiator();
     83
     84      void transition();
     85
     86      void genMoore();
     87
     88      void print_stats();
     89
     90    private:
     91
     92      // Component attributes
     93      const size_t                        m_initiators;         // Number of initiators
     94      const size_t                        m_ways;               // Number of ways in a set
     95      const size_t                        m_sets;               // Number of cache sets
     96      const size_t                        m_words;              // Number of words in a line
     97      const size_t                        m_srcid;              // Srcid for requests to processors
     98
     99      data_t                              ***m_cache_data;      // data array[set][way][word]
     100
     101      // adress masks
     102      const soclib::common::AddressMaskingTable<addr_t>   m_x;
     103      const soclib::common::AddressMaskingTable<addr_t>   m_y;
     104      const soclib::common::AddressMaskingTable<addr_t>   m_z;
     105      const soclib::common::AddressMaskingTable<addr_t> m_nline;
     106
     107      //////////////////////////////////////////////////
     108      // Registers controlled by the TGT_CMD fsm
     109      //////////////////////////////////////////////////
     110
     111      // Fifo between TGT_CMD fsm and READ fsm
     112      GenericFifo<addr_t>    m_cmd_read_addr_fifo;
     113
     114      sc_signal<int>         r_vci_fsm;
     115       
     116      sc_signal<size_t>      r_index;
     117
     118    }; // end class VciMemCache
     119 
     120  }}
     121
     122#endif
  • trunk/modules/vci_synthetic_initator/caba/sources/src/vci_synthetic_initator.cpp

    r75 r77  
     1/* -*- c++ -*-
     2 * File         : vci_traffic_generator.cpp
     3 * Date         : 26/08/2010
     4 * Copyright    : UPMC / LIP6
     5 * Authors      : Christophe Choichillon
     6 *
     7 * SOCLIB_LGPL_HEADER_BEGIN
     8 *
     9 * This file is part of SoCLib, GNU LGPLv2.1.
     10 *
     11 * SoCLib is free software; you can redistribute it and/or modify it
     12 * under the terms of the GNU Lesser General Public License as published
     13 * by the Free Software Foundation; version 2.1 of the License.
     14 *
     15 * SoCLib is distributed in the hope that it will be useful, but
     16 * WITHOUT ANY WARRANTY; without even the implied warranty of
     17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     18 * Lesser General Public License for more details.
     19 *
     20 * You should have received a copy of the GNU Lesser General Public
     21 * License along with SoCLib; if not, write to the Free Software
     22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
     23 * 02110-1301 USA
     24 *
     25 * SOCLIB_LGPL_HEADER_END
     26 *
     27 * Maintainers: christophe.choichillon@lip6.fr
     28 */
     29
     30#include "../include/vci_traffic_generator.h"
     31
     32
     33
     34namespace soclib { namespace caba {
     35
     36
     37#define tmpl(x) template<typename vci_param> x VciTrafficGenerator<vci_param>
     38
     39
     40  ////////////////////////////////
     41  //    Constructor
     42  ////////////////////////////////
     43
     44  tmpl(/**/)::VciTrafficGenerator(
     45      sc_module_name name,
     46      const soclib::common::MappingTable &mtp,
     47      const soclib::common::MappingTable &mtc,
     48      const soclib::common::MappingTable &mtx,
     49      const soclib::common::IntTab &vci_ixr_index,
     50      const soclib::common::IntTab &vci_ini_index,
     51      const soclib::common::IntTab &vci_tgt_index,
     52      size_t nways,
     53      size_t nsets,
     54      size_t nwords)
     55
     56    : soclib::caba::BaseModule(name),
     57
     58    p_clk("clk"),
     59    p_resetn("resetn"),
     60    p_vci("vci_ini"),
     61
     62    m_srcid_ini( mtc.indexForId(vci_ini_index) ),
     63    //  FIFOs
     64    m_cmd_read_addr_fifo("m_cmd_read_addr_fifo", 4),
     65
     66    r_tgt_cmd_fsm("r_tgt_cmd_fsm"),
     67    {
     68      assert(IS_POW_OF_2(nsets));
     69      assert(IS_POW_OF_2(nwords));
     70      assert(IS_POW_OF_2(nways));
     71      assert(nsets);
     72      assert(nwords);
     73      assert(nways);
     74      assert(nsets <= 1024);
     75      assert(nwords <= 32);
     76      assert(nways <= 32);
     77
     78      // Get the segments associated to the MemCache
     79      //std::list<soclib::common::Segment> segList(mtp.getSegmentList(vci_tgt_index));
     80      std::list<soclib::common::Segment>::iterator seg;
     81      /*
     82         for(seg = segList.begin(); seg != segList.end() ; seg++) {
     83         if( seg->size() > 8 ) m_mem_segment = *seg;
     84         else                  m_reg_segment = *seg;
     85         nseg++;
     86         }
     87         */
     88
     89      for(seg = m_seglist.begin(); seg != m_seglist.end() ; seg++) {
     90        if( seg->size() > 8 ) nseg++;
     91      }
     92      //assert( (nseg == 2) && (m_reg_segment.size() == 8) );
     93
     94      m_seg = new soclib::common::Segment*[nseg];
     95      size_t i = 0;
     96      for ( seg = m_seglist.begin() ; seg != m_seglist.end() ; seg++ ) {
     97        if ( seg->size() > 8 )
     98        {
     99          m_seg[i] = &(*seg);
     100          i++;
     101        }
     102        else
     103        {
     104          m_reg_segment = *seg;
     105        }               
     106      }
     107
     108      assert( (m_reg_segment.size() == 8) );
     109
     110      // Memory cache allocation & initialisation
     111      m_cache_data = new data_t**[nways];
     112      for ( size_t i=0 ; i<nways ; ++i ) {
     113        m_cache_data[i] = new data_t*[nsets];
     114      }
     115      for ( size_t i=0; i<nways; ++i ) {
     116        for ( size_t j=0; j<nsets; ++j ) {
     117          m_cache_data[i][j] = new data_t[nwords];
     118          for ( size_t k=0; k<nwords; k++){
     119            m_cache_data[i][j][k]=0;
     120          }     
     121        }
     122      }
     123
     124      // Allocation for IXR_RSP FSM
     125      r_ixr_rsp_to_xram_rsp_rok         = new sc_signal<bool>[TRANSACTION_TAB_LINES];
     126
     127      // Allocation for XRAM_RSP FSM
     128      r_xram_rsp_victim_data            = new sc_signal<data_t>[nwords];
     129      r_xram_rsp_to_tgt_rsp_data        = new sc_signal<data_t>[nwords];
     130      r_xram_rsp_to_tgt_rsp_val         = new sc_signal<bool>[nwords];
     131      r_xram_rsp_to_xram_cmd_data       = new sc_signal<data_t>[nwords];
     132
     133      // Allocation for READ FSM
     134      r_read_data                       = new sc_signal<data_t>[nwords];
     135      r_read_to_tgt_rsp_data            = new sc_signal<data_t>[nwords];
     136      r_read_to_tgt_rsp_val             = new sc_signal<bool>[nwords];
     137
     138      // Allocation for WRITE FSM
     139      r_write_data                      = new sc_signal<data_t>[nwords];
     140      r_write_be                        = new sc_signal<be_t>[nwords];
     141      r_write_to_init_cmd_data          = new sc_signal<data_t>[nwords];
     142      r_write_to_init_cmd_we            = new sc_signal<bool>[nwords];
     143
     144      // Simulation
     145
     146      SC_METHOD(transition);
     147      dont_initialize();
     148      sensitive << p_clk.pos();
     149
     150      SC_METHOD(genMoore);
     151      dont_initialize();
     152      sensitive << p_clk.neg();
     153
     154    } // end constructor
     155
     156  /////////////////////////////////////////
     157  // This function prints the statistics
     158  /////////////////////////////////////////
     159
     160  tmpl(void)::print_stats()
     161  {
     162    std::cout << "----------------------------------" << std::dec << std::endl;
     163    std::cout << "MEM_CACHE " << m_srcid_ini << " / Time = " << m_cpt_cycles << std::endl
     164      << "- READ RATE           = " << (float)m_cpt_read/m_cpt_cycles << std::endl
     165      << "- READ MISS RATE      = " << (float)m_cpt_read_miss/m_cpt_read << std::endl
     166      << "- WRITE RATE          = " << (float)m_cpt_write/m_cpt_cycles << std::endl
     167      << "- WRITE MISS RATE     = " << (float)m_cpt_write_miss/m_cpt_write << std::endl
     168      << "- WRITE BURST LENGTH  = " << (float)m_cpt_write_cells/m_cpt_write << std::endl
     169      << "- UPDATE RATE         = " << (float)m_cpt_update/m_cpt_cycles << std::endl
     170      << "- UPDATE ARITY        = " << (float)m_cpt_update_mult/m_cpt_update << std::endl
     171      << "- INVAL RATE          = " << (float)m_cpt_inval/m_cpt_cycles << std::endl
     172      << "- INVAL ARITY         = " << (float)m_cpt_inval_mult/m_cpt_inval << std::endl
     173      << "- SAVE DIRTY RATE     = " << (float)m_cpt_write_dirty/m_cpt_cycles << std::endl
     174      << "- CLEANUP RATE        = " << (float)m_cpt_cleanup/m_cpt_cycles << std::endl
     175      << "- LL RATE             = " << (float)m_cpt_ll/m_cpt_cycles << std::endl
     176      << "- SC RATE             = " << (float)m_cpt_sc/m_cpt_cycles << std::endl;
     177  }
     178
     179  /////////////////////////////////
     180  tmpl(/**/)::~VciTrafficGenerator()
     181    /////////////////////////////////
     182  {
     183    for(size_t i=0; i<m_ways ; i++){
     184      for(size_t j=0; j<m_sets ; j++){
     185        delete [] m_cache_data[i][j];
     186      }
     187    }
     188    for(size_t i=0; i<m_ways ; i++){
     189      delete [] m_cache_data[i];
     190    }
     191    delete [] m_cache_data;
     192    delete [] m_coherence_table;
     193
     194    delete [] r_ixr_rsp_to_xram_rsp_rok;
     195
     196    delete [] r_xram_rsp_victim_data;
     197    delete [] r_xram_rsp_to_tgt_rsp_data;
     198    delete [] r_xram_rsp_to_tgt_rsp_val;
     199    delete [] r_xram_rsp_to_xram_cmd_data;
     200
     201    delete [] r_read_data;
     202    delete [] r_read_to_tgt_rsp_data;
     203    delete [] r_read_to_tgt_rsp_val;
     204
     205    delete [] r_write_data;
     206    delete [] r_write_be;
     207    delete [] r_write_to_init_cmd_data;
     208  }
     209
     210  //////////////////////////////////
     211  tmpl(void)::transition()
     212    //////////////////////////////////
     213  {
     214    using soclib::common::uint32_log2;
     215    //  RESET         
     216    if ( ! p_resetn.read() ) {
     217
     218      //     Initializing FSMs
     219      r_tgt_cmd_fsm     = TGT_CMD_IDLE;
     220      r_tgt_rsp_fsm     = TGT_RSP_READ_IDLE;
     221      r_init_cmd_fsm    = INIT_CMD_INVAL_IDLE;
     222      r_init_rsp_fsm    = INIT_RSP_IDLE;
     223      r_read_fsm        = READ_IDLE;
     224      r_write_fsm       = WRITE_IDLE;
     225      r_llsc_fsm        = LLSC_IDLE;
     226      r_cleanup_fsm     = CLEANUP_IDLE;
     227      r_alloc_dir_fsm = ALLOC_DIR_READ;
     228      r_alloc_trt_fsm = ALLOC_TRT_READ;
     229      r_alloc_upt_fsm = ALLOC_UPT_WRITE;
     230      r_ixr_rsp_fsm     = IXR_RSP_IDLE;
     231      r_xram_rsp_fsm    = XRAM_RSP_IDLE;
     232      r_xram_cmd_fsm    = XRAM_CMD_READ_IDLE;
     233
     234      //  Initializing Tables
     235      m_cache_directory.init();
     236      m_atomic_tab.init();     
     237      m_transaction_tab.init();
     238
     239      // initializing FIFOs and communication Buffers
     240
     241      m_cmd_read_addr_fifo.init();
     242      m_cmd_read_word_fifo.init();
     243      m_cmd_read_srcid_fifo.init();
     244      m_cmd_read_trdid_fifo.init();
     245      m_cmd_read_pktid_fifo.init();
     246
     247      m_cmd_write_addr_fifo.init();
     248      m_cmd_write_eop_fifo.init();
     249      m_cmd_write_srcid_fifo.init();
     250      m_cmd_write_trdid_fifo.init();
     251      m_cmd_write_pktid_fifo.init();
     252      m_cmd_write_data_fifo.init();
     253
     254      m_cmd_llsc_addr_fifo.init();
     255      m_cmd_llsc_srcid_fifo.init();
     256      m_cmd_llsc_trdid_fifo.init();
     257      m_cmd_llsc_pktid_fifo.init();
     258      m_cmd_llsc_wdata_fifo.init();
     259      m_cmd_llsc_sc_fifo.init();
     260
     261      m_cmd_cleanup_srcid_fifo.init();
     262      m_cmd_cleanup_trdid_fifo.init();
     263      m_cmd_cleanup_pktid_fifo.init();
     264      m_cmd_cleanup_nline_fifo.init();
     265
     266      r_read_to_tgt_rsp_req             = false;
     267      r_read_to_xram_cmd_req            = false;
     268
     269      r_write_to_tgt_rsp_req            = false;
     270      r_write_to_xram_cmd_req           = false;
     271      r_write_to_init_cmd_req           = false;
     272
     273      r_init_rsp_to_tgt_rsp_req = false;
     274
     275      r_cleanup_to_tgt_rsp_req  = false;
     276
     277      r_llsc_to_tgt_rsp_req             = false;
     278      r_llsc_to_xram_cmd_req            = false;
     279
     280      for(size_t i=0; i<TRANSACTION_TAB_LINES ; i++){
     281        r_ixr_rsp_to_xram_rsp_rok[i]= false;
     282      }
     283
     284      r_xram_rsp_to_tgt_rsp_req = false;
     285      r_xram_rsp_to_init_cmd_req        = false;
     286      r_xram_rsp_to_xram_cmd_req        = false;
     287      r_xram_rsp_trt_index              = 0;
     288
     289      r_xram_cmd_cpt = 0;
     290
     291      // Activity counters
     292      m_cpt_cycles              = 0;
     293      m_cpt_read                = 0;
     294      m_cpt_read_miss           = 0;
     295      m_cpt_write               = 0;
     296      m_cpt_write_miss  = 0;
     297      m_cpt_write_cells = 0;
     298      m_cpt_write_dirty = 0;
     299      m_cpt_update              = 0;
     300      m_cpt_update_mult         = 0;
     301      m_cpt_inval               = 0;
     302      m_cpt_inval_mult  = 0;
     303      m_cpt_cleanup             = 0;
     304      m_cpt_ll                  = 0;
     305      m_cpt_sc                  = 0;
     306
     307      return;
     308    }
     309
     310    bool    cmd_read_fifo_put = false;
     311    bool    cmd_read_fifo_get = false;
     312
     313    bool    cmd_write_fifo_put = false;
     314    bool    cmd_write_fifo_get = false;
     315
     316    bool    cmd_llsc_fifo_put = false;
     317    bool    cmd_llsc_fifo_get = false;
     318
     319    bool    cmd_cleanup_fifo_put = false;
     320    bool    cmd_cleanup_fifo_get = false;
     321
     322
     323
     324    switch ( r_tgt_cmd_fsm.read() ) {
     325
     326      //////////////////
     327      case TGT_CMD_IDLE:
     328        {
     329          if ( p_vci_tgt.cmdval ) {
     330            assert( (p_vci_tgt.srcid.read() < m_initiators)
     331                && "error in VCI_MEM_CACHE : The received SRCID is larger than 31");
     332
     333            bool reached = false;
     334            for ( size_t index = 0 ; index < nseg && !reached ; index++)
     335            {
     336              if ( m_seg[index]->contains(p_vci_tgt.address.read()) ) {
     337                reached = true;
     338                r_index = index;
     339              }
     340            }
     341
     342            if ( !reached )
     343            {
     344              std::cout << "Out of segment access in VCI_MEM_CACHE" << std::endl;
     345              std::cout << "Faulty address = " << p_vci_tgt.address.read() << std::endl;
     346              std::cout << "Faulty initiator = " << p_vci_tgt.srcid.read() << std::endl;
     347              exit(0);
     348            }
     349            else if ( p_vci_tgt.cmd.read() == vci_param::CMD_READ )
     350            {
     351              r_tgt_cmd_fsm = TGT_CMD_READ;
     352            }
     353            else if (( p_vci_tgt.cmd.read() == vci_param::CMD_WRITE ) && ( p_vci_tgt.trdid.read() == 0x0 ) )
     354            { 
     355              r_tgt_cmd_fsm = TGT_CMD_WRITE;
     356            }
     357            else if ((p_vci_tgt.cmd.read() == vci_param::CMD_LOCKED_READ) ||
     358                (p_vci_tgt.cmd.read() == vci_param::CMD_STORE_COND) )
     359            {
     360              r_tgt_cmd_fsm = TGT_CMD_ATOMIC;
     361            }
     362            else if (( p_vci_tgt.cmd.read() == vci_param::CMD_WRITE ) && ( p_vci_tgt.trdid.read() == 0x1 ))
     363            { 
     364              r_tgt_cmd_fsm = TGT_CMD_CLEANUP;
     365            }
     366          }
     367          break;
     368        }
     369        //////////////////
     370      case TGT_CMD_READ:
     371        {
     372          assert(((p_vci_tgt.plen.read() == 4) || (p_vci_tgt.plen.read() == m_words*4))
     373              && "All read request to the MemCache must have PLEN = 4 or PLEN = 4*nwords");
     374
     375          if ( p_vci_tgt.cmdval && m_cmd_read_addr_fifo.wok() ) {
     376            cmd_read_fifo_put = true;
     377            if ( p_vci_tgt.eop )  r_tgt_cmd_fsm = TGT_CMD_IDLE;
     378            else                  r_tgt_cmd_fsm = TGT_CMD_READ_EOP;             
     379          }
     380          break;
     381        }
     382        //////////////////////
     383      case TGT_CMD_READ_EOP:
     384        {
     385          if ( p_vci_tgt.cmdval && p_vci_tgt.eop ){
     386            r_tgt_cmd_fsm = TGT_CMD_IDLE;
     387          }
     388          break;
     389        }
     390        ///////////////////
     391      case TGT_CMD_WRITE:
     392        {
     393          if ( p_vci_tgt.cmdval && m_cmd_write_addr_fifo.wok() ) {
     394            cmd_write_fifo_put = true;
     395            if(  p_vci_tgt.eop )  r_tgt_cmd_fsm = TGT_CMD_IDLE;
     396          }
     397          break;
     398        }
     399        ////////////////////
     400      case TGT_CMD_ATOMIC:
     401        {
     402          assert(p_vci_tgt.eop && "Memory Cache Error: LL or SC command with length > 1 ");
     403
     404          if ( p_vci_tgt.cmdval && m_cmd_llsc_addr_fifo.wok() ) {
     405            cmd_llsc_fifo_put = true;
     406            r_tgt_cmd_fsm = TGT_CMD_IDLE;
     407          }
     408          break;
     409        }
     410        /////////////////////
     411      case TGT_CMD_CLEANUP:
     412        {
     413          assert(p_vci_tgt.eop && "Memory Cache Error: CLEANUP request with length > 1 ");
     414
     415          if ( p_vci_tgt.cmdval && m_cmd_cleanup_nline_fifo.wok() ) {
     416            cmd_cleanup_fifo_put = true;
     417            r_tgt_cmd_fsm = TGT_CMD_IDLE;
     418          }
     419          break;
     420        }
     421    } // end switch tgt_cmd_fsm
     422
     423
     424    if ( cmd_cleanup_fifo_put ) {
     425      if ( cmd_cleanup_fifo_get ) {
     426        m_cmd_cleanup_srcid_fifo.put_and_get(p_vci_tgt.srcid.read());
     427        m_cmd_cleanup_trdid_fifo.put_and_get(p_vci_tgt.trdid.read());
     428        m_cmd_cleanup_pktid_fifo.put_and_get(p_vci_tgt.pktid.read());
     429        m_cmd_cleanup_nline_fifo.put_and_get(p_vci_tgt.wdata.read());
     430      } else {
     431        m_cmd_cleanup_srcid_fifo.simple_put(p_vci_tgt.srcid.read());
     432        m_cmd_cleanup_trdid_fifo.simple_put(p_vci_tgt.trdid.read());
     433        m_cmd_cleanup_pktid_fifo.simple_put(p_vci_tgt.pktid.read());
     434        m_cmd_cleanup_nline_fifo.simple_put(p_vci_tgt.wdata.read());
     435      }
     436    } else {
     437      if ( cmd_cleanup_fifo_get ) {
     438        m_cmd_cleanup_srcid_fifo.simple_get();
     439        m_cmd_cleanup_trdid_fifo.simple_get();
     440        m_cmd_cleanup_pktid_fifo.simple_get();
     441        m_cmd_cleanup_nline_fifo.simple_get();
     442      }
     443    }
     444
     445    m_cpt_cycles++;
     446
     447  } // end transition()
     448
     449  /////////////////////////////
     450  tmpl(void)::genMoore()
     451    /////////////////////////////
     452  {
     453    ////////////////////////////////////////////////////////////
     454    // Command signals on the p_vci_ixr port
     455    ////////////////////////////////////////////////////////////
     456
     457
     458    p_vci_ixr.be      = 0xF;
     459    p_vci_ixr.pktid   = 0;
     460    p_vci_ixr.srcid   = m_srcid_ixr;
     461    p_vci_ixr.cons    = false;
     462    p_vci_ixr.wrap    = false;
     463    p_vci_ixr.contig  = true;
     464    p_vci_ixr.clen    = 0;
     465    p_vci_ixr.cfixed  = false;
     466
     467    if ( r_xram_cmd_fsm.read() == XRAM_CMD_READ_NLINE ) {
     468      p_vci_ixr.cmd     = vci_param::CMD_READ;
     469      p_vci_ixr.cmdval  = true;
     470      p_vci_ixr.address = (r_read_to_xram_cmd_nline.read()*m_words*4);
     471      p_vci_ixr.plen    = m_words*4;
     472      p_vci_ixr.wdata   = 0x00000000;
     473      p_vci_ixr.trdid   = r_read_to_xram_cmd_trdid.read();
     474      p_vci_ixr.eop     = true;
     475    }
     476    else if ( r_xram_cmd_fsm.read() == XRAM_CMD_LLSC_NLINE ) {
     477      p_vci_ixr.cmd     = vci_param::CMD_READ;
     478      p_vci_ixr.cmdval  = true;
     479      p_vci_ixr.address = (r_llsc_to_xram_cmd_nline.read()*m_words*4);
     480      p_vci_ixr.plen    = m_words*4;
     481      p_vci_ixr.wdata   = 0x00000000;
     482      p_vci_ixr.trdid   = r_llsc_to_xram_cmd_trdid.read();
     483      p_vci_ixr.eop     = true;
     484    }
     485    else if ( r_xram_cmd_fsm.read() == XRAM_CMD_WRITE_NLINE ) {
     486      p_vci_ixr.cmd     = vci_param::CMD_READ;
     487      p_vci_ixr.cmdval  = true;
     488      p_vci_ixr.address = (r_write_to_xram_cmd_nline.read()*m_words*4);
     489      p_vci_ixr.plen    = m_words*4;
     490      p_vci_ixr.wdata   = 0x00000000;
     491      p_vci_ixr.trdid   = r_write_to_xram_cmd_trdid.read();
     492      p_vci_ixr.eop     = true;
     493    }
     494    else if ( r_xram_cmd_fsm.read() == XRAM_CMD_XRAM_DATA ) {
     495      p_vci_ixr.cmd     = vci_param::CMD_WRITE;
     496      p_vci_ixr.cmdval  = true;
     497      p_vci_ixr.address = ((r_xram_rsp_to_xram_cmd_nline.read()*m_words+r_xram_cmd_cpt.read())*4);
     498      p_vci_ixr.plen    = m_words*4;
     499      p_vci_ixr.wdata   = r_xram_rsp_to_xram_cmd_data[r_xram_cmd_cpt.read()].read();
     500      p_vci_ixr.trdid   = r_xram_rsp_to_xram_cmd_trdid.read();
     501      p_vci_ixr.eop     = (r_xram_cmd_cpt == (m_words-1));
     502    } else {
     503      p_vci_ixr.cmdval  = false;
     504      p_vci_ixr.address = 0;
     505      p_vci_ixr.plen    = 0;
     506      p_vci_ixr.wdata   = 0;
     507      p_vci_ixr.trdid   = 0;
     508      p_vci_ixr.eop       = false;
     509    }
     510
     511    ////////////////////////////////////////////////////
     512    // Response signals on the p_vci_ixr port
     513    ////////////////////////////////////////////////////
     514
     515    if ( ((r_alloc_trt_fsm.read() == ALLOC_TRT_IXR_RSP) &&
     516          (r_ixr_rsp_fsm.read() == IXR_RSP_TRT_READ)) ||
     517        (r_ixr_rsp_fsm.read() == IXR_RSP_ACK) )           p_vci_ixr.rspack = true;
     518    else                                                    p_vci_ixr.rspack = false;
     519
     520    ////////////////////////////////////////////////////
     521    // Command signals on the p_vci_tgt port
     522    ////////////////////////////////////////////////////
     523
     524    switch ((tgt_cmd_fsm_state_e)r_tgt_cmd_fsm.read()) {
     525      case TGT_CMD_IDLE:
     526        p_vci_tgt.cmdack  = false;
     527        break;
     528      case TGT_CMD_READ:
     529        p_vci_tgt.cmdack  = m_cmd_read_addr_fifo.wok();
     530        break;
     531      case TGT_CMD_READ_EOP:
     532        p_vci_tgt.cmdack  = true;
     533        break;
     534      case TGT_CMD_WRITE:
     535        p_vci_tgt.cmdack  = m_cmd_write_addr_fifo.wok();
     536        break;
     537      case TGT_CMD_ATOMIC:
     538        p_vci_tgt.cmdack  = m_cmd_llsc_addr_fifo.wok();
     539        break;
     540      case TGT_CMD_CLEANUP:
     541        p_vci_tgt.cmdack  = m_cmd_cleanup_nline_fifo.wok();
     542        break;
     543      default:
     544        p_vci_tgt.cmdack = false;
     545        break;
     546    }
     547
     548    ////////////////////////////////////////////////////
     549    // Response signals on the p_vci_tgt port
     550    ////////////////////////////////////////////////////
     551    switch ( r_tgt_rsp_fsm.read() ) {
     552
     553      case TGT_RSP_READ_IDLE:
     554      case TGT_RSP_WRITE_IDLE:
     555      case TGT_RSP_LLSC_IDLE:
     556      case TGT_RSP_CLEANUP_IDLE:
     557      case TGT_RSP_XRAM_IDLE:
     558      case TGT_RSP_INIT_IDLE:
     559      case TGT_RSP_READ_TEST:
     560      case TGT_RSP_XRAM_TEST:
     561
     562        p_vci_tgt.rspval  = false;
     563        p_vci_tgt.rsrcid  = 0;
     564        p_vci_tgt.rdata   = 0;
     565        p_vci_tgt.rpktid  = 0;
     566        p_vci_tgt.rtrdid  = 0;
     567        p_vci_tgt.rerror  = 0;
     568        p_vci_tgt.reop    = false;     
     569        break;
     570      case TGT_RSP_READ_LINE:
     571        p_vci_tgt.rspval   = true;
     572        p_vci_tgt.rdata    = r_read_to_tgt_rsp_data[r_tgt_rsp_cpt.read()].read();
     573        p_vci_tgt.rsrcid   = r_read_to_tgt_rsp_srcid.read();
     574        p_vci_tgt.rtrdid   = r_read_to_tgt_rsp_trdid.read();
     575        p_vci_tgt.rpktid   = r_read_to_tgt_rsp_pktid.read();
     576        p_vci_tgt.rerror   = 0;
     577        p_vci_tgt.reop     = (r_tgt_rsp_cpt.read()==(m_words-1));
     578        break;
     579      case TGT_RSP_READ_WORD:
     580        p_vci_tgt.rspval   = true;
     581        p_vci_tgt.rdata    = r_read_to_tgt_rsp_data[r_tgt_rsp_cpt.read()].read();
     582        p_vci_tgt.rsrcid   = r_read_to_tgt_rsp_srcid.read();
     583        p_vci_tgt.rtrdid   = r_read_to_tgt_rsp_trdid.read();
     584        p_vci_tgt.rpktid   = r_read_to_tgt_rsp_pktid.read();
     585        p_vci_tgt.rerror   = 0;
     586        p_vci_tgt.reop     = true;     
     587        break;
     588      case TGT_RSP_WRITE:
     589        p_vci_tgt.rspval   = true;
     590        p_vci_tgt.rdata    = 0;
     591        p_vci_tgt.rsrcid   = r_write_to_tgt_rsp_srcid.read();
     592        p_vci_tgt.rtrdid   = r_write_to_tgt_rsp_trdid.read();
     593        p_vci_tgt.rpktid   = r_write_to_tgt_rsp_pktid.read();
     594        p_vci_tgt.rerror   = 0;
     595        p_vci_tgt.reop     = true;
     596        break;
     597      case TGT_RSP_CLEANUP:
     598        p_vci_tgt.rspval   = true;
     599        p_vci_tgt.rdata    = 0;
     600        p_vci_tgt.rsrcid   = r_cleanup_to_tgt_rsp_srcid.read();
     601        p_vci_tgt.rtrdid   = r_cleanup_to_tgt_rsp_trdid.read();
     602        p_vci_tgt.rpktid   = r_cleanup_to_tgt_rsp_pktid.read();
     603        p_vci_tgt.rerror   = 0;
     604        p_vci_tgt.reop     = true;
     605        break;
     606      case TGT_RSP_LLSC:
     607        p_vci_tgt.rspval   = true;
     608        p_vci_tgt.rdata    = r_llsc_to_tgt_rsp_data.read();
     609        p_vci_tgt.rsrcid   = r_llsc_to_tgt_rsp_srcid.read();
     610        p_vci_tgt.rtrdid   = r_llsc_to_tgt_rsp_trdid.read();
     611        p_vci_tgt.rpktid   = r_llsc_to_tgt_rsp_pktid.read();
     612        p_vci_tgt.rerror   = 0;
     613        p_vci_tgt.reop     = true;
     614        break;
     615      case TGT_RSP_XRAM_LINE:
     616        p_vci_tgt.rspval   = true;
     617        p_vci_tgt.rdata    = r_xram_rsp_to_tgt_rsp_data[r_tgt_rsp_cpt.read()].read();
     618        p_vci_tgt.rsrcid   = r_xram_rsp_to_tgt_rsp_srcid.read();
     619        p_vci_tgt.rtrdid   = r_xram_rsp_to_tgt_rsp_trdid.read();
     620        p_vci_tgt.rpktid   = r_xram_rsp_to_tgt_rsp_pktid.read();
     621        p_vci_tgt.rerror   = 0;
     622        p_vci_tgt.reop     = (r_tgt_rsp_cpt.read()==(m_words-1));
     623        break;
     624      case TGT_RSP_XRAM_WORD:
     625        p_vci_tgt.rspval   = true;
     626        p_vci_tgt.rdata    = r_xram_rsp_to_tgt_rsp_data[r_tgt_rsp_cpt.read()].read();
     627        p_vci_tgt.rsrcid   = r_xram_rsp_to_tgt_rsp_srcid.read();
     628        p_vci_tgt.rtrdid   = r_xram_rsp_to_tgt_rsp_trdid.read();
     629        p_vci_tgt.rpktid   = r_xram_rsp_to_tgt_rsp_pktid.read();
     630        p_vci_tgt.rerror   = 0;
     631        p_vci_tgt.reop     = true;
     632        break;
     633      case TGT_RSP_INIT:
     634        p_vci_tgt.rspval   = true;
     635        p_vci_tgt.rdata    = 0;
     636        p_vci_tgt.rsrcid   = r_init_rsp_to_tgt_rsp_srcid.read();
     637        p_vci_tgt.rtrdid   = r_init_rsp_to_tgt_rsp_trdid.read();
     638        p_vci_tgt.rpktid   = r_init_rsp_to_tgt_rsp_pktid.read();
     639        p_vci_tgt.rerror   = 0;
     640        p_vci_tgt.reop     = true;     
     641        break;
     642    } // end switch r_tgt_rsp_fsm
     643
     644    ///////////////////////////////////////////////////
     645    // Command signals on the p_vci_ini port
     646    ///////////////////////////////////////////////////
     647
     648    p_vci_ini.cmd     = vci_param::CMD_WRITE;
     649    p_vci_ini.srcid   = m_srcid_ini;
     650    p_vci_ini.pktid   = 0;
     651    p_vci_ini.cons    = true;
     652    p_vci_ini.wrap    = false;
     653    p_vci_ini.contig  = false;
     654    p_vci_ini.clen    = 0;
     655    p_vci_ini.cfixed  = false;
     656
     657    switch ( r_init_cmd_fsm.read() ) {
     658
     659      case INIT_CMD_UPDT_IDLE:
     660      case INIT_CMD_INVAL_IDLE:
     661      case INIT_CMD_UPDT_SEL:
     662      case INIT_CMD_INVAL_SEL:
     663        p_vci_ini.cmdval = false;
     664        p_vci_ini.address = 0;
     665        p_vci_ini.wdata   = 0;
     666        p_vci_ini.be      = 0;
     667        p_vci_ini.plen    = 0;
     668        p_vci_ini.trdid   = 0;
     669        p_vci_ini.eop     = false;
     670        break;
     671      case INIT_CMD_INVAL_NLINE:
     672        p_vci_ini.cmdval  = true;
     673        p_vci_ini.address = m_coherence_table[r_init_cmd_target.read()];
     674        p_vci_ini.wdata   = r_xram_rsp_to_init_cmd_nline.read();
     675        p_vci_ini.be      = 0xF;
     676        p_vci_ini.plen    = 4;
     677        p_vci_ini.trdid   = r_xram_rsp_to_init_cmd_trdid.read();
     678        p_vci_ini.eop     = true;
     679        break;
     680      case INIT_CMD_UPDT_NLINE:
     681        p_vci_ini.cmdval  = true;
     682        p_vci_ini.address = m_coherence_table[r_init_cmd_target.read()] + 4;
     683        p_vci_ini.wdata   = r_write_to_init_cmd_nline.read();
     684        p_vci_ini.be      = 0xF;
     685        p_vci_ini.plen    = 4 * (r_write_to_init_cmd_count.read() + 2);
     686        p_vci_ini.trdid   = r_write_to_init_cmd_trdid.read();
     687        p_vci_ini.eop     = false;
     688        break;
     689      case INIT_CMD_UPDT_INDEX:
     690        p_vci_ini.cmdval  = true;
     691        p_vci_ini.address = m_coherence_table[r_init_cmd_target.read()] + 4;
     692        p_vci_ini.wdata   = r_write_to_init_cmd_index.read();
     693        p_vci_ini.be      = 0xF;
     694        p_vci_ini.plen    = 4 * (r_write_to_init_cmd_count.read() + 2);
     695        p_vci_ini.trdid   = r_write_to_init_cmd_trdid.read();
     696        p_vci_ini.eop     = false;
     697        break;
     698      case INIT_CMD_UPDT_DATA:
     699        p_vci_ini.cmdval  = true;
     700        p_vci_ini.address = m_coherence_table[r_init_cmd_target.read()] + 4;
     701        p_vci_ini.wdata   = r_write_to_init_cmd_data[r_init_cmd_cpt.read() +
     702          r_write_to_init_cmd_index.read()].read();
     703        if(r_write_to_init_cmd_we[r_init_cmd_cpt.read() +
     704            r_write_to_init_cmd_index.read()].read()) 
     705          p_vci_ini.be      = 0xF;
     706        else                    p_vci_ini.be      = 0x0;
     707        p_vci_ini.plen    = 4 * (r_write_to_init_cmd_count.read() + 2);
     708        p_vci_ini.trdid   = r_write_to_init_cmd_trdid.read();
     709        p_vci_ini.eop     = ( r_init_cmd_cpt.read() == (r_write_to_init_cmd_count.read()-1) );
     710        break;
     711    } // end switch r_init_cmd_fsm
     712
     713    //////////////////////////////////////////////////////
     714    // Response signals on the p_vci_ini port
     715    //////////////////////////////////////////////////////
     716
     717    if ( r_init_rsp_fsm.read() == INIT_RSP_IDLE ) p_vci_ini.rspack  = true;
     718    else                                          p_vci_ini.rspack  = false;
     719
     720  } // end genMoore()
     721
     722}} // end name space
Note: See TracChangeset for help on using the changeset viewer.