Ignore:
Timestamp:
Jan 15, 2013, 5:54:45 PM (11 years ago)
Author:
joannou
Message:

Updated vci_vdspin_initiator_wrapper and vci_vdspin_target_wrapper to fit new spec :
A single flit VCI response packet with a rdata=0 is translated to a single flit DSPIN response packet.
(All other responses need multi flit DSPIN response packets)

Location:
trunk/modules/vci_vdspin_initiator_wrapper/caba/source
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/modules/vci_vdspin_initiator_wrapper/caba/source/include/vci_vdspin_initiator_wrapper.h

    r150 r287  
    55  *
    66  * SOCLIB_LGPL_HEADER_BEGIN
    7   * 
     7  *
    88  * This file is part of SoCLib, GNU LGPLv2.1.
    9   * 
     9  *
    1010  * SoCLib is free software; you can redistribute it and/or modify it
    1111  * under the terms of the GNU Lesser General Public License as published
    1212  * by the Free Software Foundation; version 2.1 of the License.
    13   * 
     13  *
    1414  * SoCLib is distributed in the hope that it will be useful, but
    1515  * WITHOUT ANY WARRANTY; without even the implied warranty of
    1616  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    1717  * Lesser General Public License for more details.
    18   * 
     18  *
    1919  * You should have received a copy of the GNU Lesser General Public
    2020  * License along with SoCLib; if not, write to the Free Software
    2121  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    2222  * 02110-1301 USA
    23   * 
     23  *
    2424  * SOCLIB_LGPL_HEADER_END
     25  *
     26  * Maintainers: alexandre.joannou@lip6.fr
     27  *
    2528  */
    2629
     
    4144// - VCI plen             == 8  bits
    4245// - VCI srcid            <= 14 bits
    43 // - VCI trdid            <= 8  bits
    44 // - VCI pktid field not transmitted
    45 // - VCI rerror           == 2 bits
     46// - VCI trdid            <= 4  bits
     47// - VCI pktid            <= 4  bits
     48// - VCI rerror           == 1  bit
    4649////////////////////////////////////////////////////////////////////////
    4750
     
    6063template<typename vci_param, int dspin_cmd_width, int dspin_rsp_width>
    6164class VciVdspinInitiatorWrapper
    62         : public soclib::caba::BaseModule
     65    : public soclib::caba::BaseModule
    6366{
    64     // Command FSM 
     67    // Command FSM
    6568    enum fsm_state_cmd{
    66         CMD_IDLE,
    67         CMD_BROADCAST,
    68         CMD_READ,
    69         CMD_WRITE,
    70         CMD_WDATA,
     69    CMD_IDLE,
     70    CMD_BROADCAST,
     71    CMD_READ,
     72    CMD_WRITE,
     73    CMD_WDATA,
    7174    };
    7275
    7376    // Response FSM
    7477    enum fsm_state_rsp{
    75         RSP_IDLE,
    76         RSP_READ,               
    77         RSP_WRITE,     
     78    RSP_IDLE,
     79    RSP_DSPIN_SINGLE_FLIT,
     80    RSP_DSPIN_MULTI_FLIT,
    7881    };
    7982
     
    8386public:
    8487    // ports
    85     sc_core::sc_in<bool>                                        p_clk;
    86     sc_core::sc_in<bool>                                        p_resetn;
    87     soclib::caba::DspinOutput<dspin_cmd_width>                  p_dspin_out;
    88     soclib::caba::DspinInput<dspin_rsp_width>                   p_dspin_in;
    89     soclib::caba::VciTarget<vci_param>                          p_vci;
     88    sc_core::sc_in<bool>                                    p_clk;
     89    sc_core::sc_in<bool>                                    p_resetn;
     90    soclib::caba::DspinOutput<dspin_cmd_width>              p_dspin_out;
     91    soclib::caba::DspinInput<dspin_rsp_width>               p_dspin_in;
     92    soclib::caba::VciTarget<vci_param>                      p_vci;
    9093
    9194    // constructor / destructor
    92     VciVdspinInitiatorWrapper(  sc_module_name                  name,
    93                                 size_t                          cmd_fifo_depth,
    94                                 size_t                          rsp_fifo_depth);
     95    VciVdspinInitiatorWrapper(  sc_module_name              name,
     96                                size_t                      cmd_fifo_depth,
     97                                size_t                      rsp_fifo_depth  );
    9598private:
    9699    // internal registers
    97     sc_core::sc_signal<int>                                     r_cmd_fsm;
    98     sc_core::sc_signal<int>                                     r_rsp_fsm;
    99     sc_core::sc_signal<sc_uint<dspin_rsp_width> >               r_rsp_buf;
     100    sc_core::sc_signal<int>                                 r_cmd_fsm;
     101    sc_core::sc_signal<int>                                 r_rsp_fsm;
     102    sc_core::sc_signal<sc_uint<dspin_rsp_width>    >        r_rsp_buf;
    100103
    101104    // fifos cmd and rsp
    102     soclib::caba::GenericFifo<sc_uint<dspin_cmd_width> >        r_fifo_cmd;
    103     soclib::caba::GenericFifo<sc_uint<dspin_rsp_width> >        r_fifo_rsp;
     105    soclib::caba::GenericFifo<sc_uint<dspin_cmd_width> >    r_fifo_cmd;
     106    soclib::caba::GenericFifo<sc_uint<dspin_rsp_width> >    r_fifo_rsp;
    104107
    105108    // methods systemc
     
    113116
    114117}} // end namespace
    115                
     118
    116119#endif // VCI_VDSPIN_INITIATOR_WRAPPER_H_
    117120
  • trunk/modules/vci_vdspin_initiator_wrapper/caba/source/src/vci_vdspin_initiator_wrapper.cpp

    r284 r287  
    2323  *
    2424  * SOCLIB_LGPL_HEADER_END
     25  *
     26  * Maintainers: alexandre.joannou@lip6.fr
     27  *
    2528  */
    2629
     
    3134#define tmpl(x) template<typename vci_param, int dspin_cmd_width, int dspin_rsp_width> x VciVdspinInitiatorWrapper<vci_param, dspin_cmd_width, dspin_rsp_width>
    3235
    33 //////////////////////////////////////////////////////////:////////////////////////////////
    34 tmpl(/**/)::VciVdspinInitiatorWrapper(sc_module_name             name,
    35                       size_t                cmd_fifo_depth,
    36                       size_t                rsp_fifo_depth)
    37            : soclib::caba::BaseModule(name),
    38                  p_clk("p_clk"),
    39                  p_resetn("p_resetn"),
    40                  p_dspin_out("p_dspin_out"),
    41                  p_dspin_in("p_dspin_in"),
    42                  p_vci("p_vci"),
    43                  r_cmd_fsm("r_cmd_fsm"),
    44                  r_rsp_fsm("r_rsp_fsm"),
    45              r_fifo_cmd("r_fifo_cmd", cmd_fifo_depth),
    46              r_fifo_rsp("r_fifo_rsp", rsp_fifo_depth)
     36//////////////////////////////////////////////////////////////////////////////////////////
     37tmpl(/**/)::VciVdspinInitiatorWrapper(  sc_module_name  name,
     38                                        size_t          cmd_fifo_depth,
     39                                        size_t          rsp_fifo_depth  )
     40            :  soclib::caba::BaseModule(name),
     41                p_clk("p_clk"),
     42                p_resetn("p_resetn"),
     43                p_dspin_out("p_dspin_out"),
     44                p_dspin_in("p_dspin_in"),
     45                p_vci("p_vci"),
     46                r_cmd_fsm("r_cmd_fsm"),
     47                r_rsp_fsm("r_rsp_fsm"),
     48                r_fifo_cmd("r_fifo_cmd", cmd_fifo_depth),
     49                r_fifo_rsp("r_fifo_rsp", rsp_fifo_depth)
    4750{
    4851    SC_METHOD (transition);
    4952    dont_initialize();
    5053    sensitive << p_clk.pos();
     54
    5155    SC_METHOD (genMoore);
    5256    dont_initialize();
     
    5660    assert( (dspin_rsp_width == 33) && "The DSPIN RSP flit width must have 33 bits");
    5761    assert( (vci_param::N    <= 40) && "The VCI ADDRESS field cannot have more than 40 bits");
    58     assert( (vci_param::B    == 4) && "The VCI DATA filds must have 32 bits");
    59     assert( (vci_param::K    == 8) && "The VCI PLEN field cannot have more than 8 bits");
    60     assert( (vci_param::S    <= 14) && "The VCI SRCID field cannot have more than 8 bits");
    61     assert( (vci_param::T    <= 8) && "The VCI TRDID field cannot have more than 8 bits");
    62     assert( (vci_param::E    == 2) && "The VCI RERROR field cannot have more than 2 bits");
     62    assert( (vci_param::B    == 4 ) && "The VCI DATA filds must have 32 bits");
     63    assert( (vci_param::K    == 8 ) && "The VCI PLEN field cannot have more than 8 bits");
     64    assert( (vci_param::S    <= 14) && "The VCI SRCID field cannot have more than 14 bits");
     65    assert( (vci_param::T    <= 4 ) && "The VCI TRDID field cannot have more than 4 bits");
     66    assert( (vci_param::P    <= 4 ) && "The VCI PKTID field cannot have more than 4 bits");
     67    assert( (vci_param::E    <= 2 ) && "The VCI RERROR field cannot have more than 2 bits");
    6368
    6469} //  end constructor
     
    6873{
    6974    sc_uint<dspin_cmd_width>    cmd_fifo_data;
    70     bool                cmd_fifo_write;
    71     bool                cmd_fifo_read;
     75    bool                        cmd_fifo_write;
     76    bool                        cmd_fifo_read;
    7277
    7378    sc_uint<dspin_rsp_width>    rsp_fifo_data;
    74     bool                rsp_fifo_write;
    75     bool                rsp_fifo_read;
     79    bool                        rsp_fifo_write;
     80    bool                        rsp_fifo_read;
    7681
    7782    if (p_resetn == false)
    78         {
     83    {
    7984        r_fifo_cmd.init();
    8085        r_fifo_rsp.init();
     
    123128                    else                      address = address << (39 - vci_param::N);
    124129
    125                     if ( is_broadcast )    // VCI broacast command
     130                    if ( is_broadcast ) // VCI broacast command
    126131                    {
    127132                        r_cmd_fsm     = CMD_BROADCAST;
     
    131136                                                        0x0000000001LL;
    132137                    }
    133                     else if (is_read )            // VCI READ  command
     138                    else if (is_read )  // VCI READ  command
    134139                    {
    135140                        r_cmd_fsm     = CMD_READ;
    136141                        cmd_fifo_data = address & 0x7FFFFFFFFELL;
    137142                    }
    138                     else                 // VCI WRITE command
     143                    else                // VCI WRITE command
    139144                    {
    140145                        r_cmd_fsm     = CMD_WRITE;
     
    144149         break;
    145150        }
    146         case CMD_BROADCAST:        // write second DSPIN flit in case of broadcast
     151        case CMD_BROADCAST:             // write second DSPIN flit in case of broadcast
    147152            {
    148153                if( p_vci.cmdval && r_fifo_cmd.wok() )
     
    158163                break;
    159164            }
    160             case CMD_READ:    // write second DSPIN flit in case of read/write
     165            case CMD_READ:              // write second DSPIN flit in case of read/write
    161166            case CMD_WRITE:
    162167            {
     
    179184                    if ( p_vci.cons.read()   ) cmd_fifo_data = cmd_fifo_data | 0x0000200000LL ;
    180185
    181                     if( r_cmd_fsm == CMD_READ )  // read command
     186                    if( r_cmd_fsm == CMD_READ ) // read command
    182187                    {
    183188                        r_cmd_fsm = CMD_IDLE;
    184189                        cmd_fifo_data = cmd_fifo_data    | 0x8000000000LL ;
    185190                    }
    186                     else            // write command
     191                    else                        // write command
    187192                    {
    188193                        r_cmd_fsm = CMD_WDATA;
     
    221226    // The FIFO output is analysed and translated to a VCI packet
    222227    //////////////////////////////////////////////////////////////
    223     // - A N+1 flits DSPIN read response packet is translated
     228    // - A N+1 flits DSPIN response packet is translated
    224229    //   to a N flits VCI response.
    225     // - A single flit DSPIN write response packet is translated
    226     //   to a single flit VCI response.
     230    // - A single flit DSPIN response packet is translated
     231    //   to a single flit VCI response with RDATA = 0.
    227232    // A valid DSPIN flit in the fifo_rsp is always consumed
    228233    // in the CMD_IDLE state, but no VCI flit is transmitted.
    229     // The VCI flits are sent in the RSP_READ & RSP_WRITE states.
     234    // The VCI flits are sent in the RSP_DSPIN_SINGLE_FLIT &
     235    // RSP_DSPIN_MULTI_FLIT states.
    230236    //////////////////////////////////////////////////////////////
    231237
     
    235241
    236242    // r_rsp_fsm, rsp_fifo_read
    237         rsp_fifo_read = false;        // default value
    238 
    239     switch(r_rsp_fsm) {
     243    rsp_fifo_read = false;        // default value
     244
     245    switch(r_rsp_fsm)
     246    {
    240247        case RSP_IDLE:
    241             {
    242         if( r_fifo_rsp.rok() )
    243                 {
    244             rsp_fifo_read = true;
    245                     r_rsp_buf = r_fifo_rsp.read();
    246                     if ( (r_fifo_rsp.read() & 0x000020000LL) == 0 )  r_rsp_fsm = RSP_READ;
    247                     else                              r_rsp_fsm = RSP_WRITE;
    248         }
    249         break;
    250             }
    251         case RSP_READ:
    252248        {
    253         if( r_fifo_rsp.rok() && p_vci.rspack.read() )
    254                 {
    255             rsp_fifo_read = true;
    256                     if ( (r_fifo_rsp.read() & 0x100000000LL) ) r_rsp_fsm = RSP_IDLE;
    257         }
    258         break;
    259             }
    260             case RSP_WRITE:
    261             {
    262                 if ( p_vci.rspack.read() ) r_rsp_fsm = RSP_IDLE;
    263             }
     249            if( r_fifo_rsp.rok() )
     250            {
     251                rsp_fifo_read = true;
     252                r_rsp_buf = r_fifo_rsp.read();
     253                if ( (r_fifo_rsp.read() & 0x100000000LL) == 0x100000000LL )
     254                    r_rsp_fsm = RSP_DSPIN_SINGLE_FLIT;
     255                else
     256                    r_rsp_fsm = RSP_DSPIN_MULTI_FLIT;
     257            }
     258            break;
     259        }
     260        case RSP_DSPIN_SINGLE_FLIT:
     261        {
     262            if ( p_vci.rspack.read() )
     263                r_rsp_fsm = RSP_IDLE;
     264            break;
     265        }
     266        case RSP_DSPIN_MULTI_FLIT:
     267        {
     268            if( r_fifo_rsp.rok() && p_vci.rspack.read() )
     269            {
     270                rsp_fifo_read = true;
     271                if ( (r_fifo_rsp.read() & 0x100000000LL) == 0x100000000LL )
     272                    r_rsp_fsm = RSP_IDLE;
     273            }
     274            break;
     275        }
    264276    } // end switch r_rsp_fsm
    265277
     
    275287{
    276288    // VCI CMD interface
    277         if ( ( r_cmd_fsm.read() == CMD_IDLE ) || ( r_cmd_fsm.read() == CMD_WRITE ) )
    278         {
    279             p_vci.cmdack = false;
    280         }
     289    if ( ( r_cmd_fsm.read() == CMD_IDLE ) || ( r_cmd_fsm.read() == CMD_WRITE ) )
     290    {
     291        p_vci.cmdack = false;
     292    }
    281293    else
    282         {
    283             p_vci.cmdack = r_fifo_cmd.wok();
    284         }
     294    {
     295        p_vci.cmdack = r_fifo_cmd.wok();
     296    }
    285297
    286298    // VCI RSP interface
    287299    if ( r_rsp_fsm.read() == RSP_IDLE )
    288         {
    289             p_vci.rspval = false;
    290         }
    291         else if ( r_rsp_fsm.read() == RSP_WRITE )
    292         {
    293             p_vci.rspval = true;
    294             p_vci.rdata  = 0;
    295             p_vci.rsrcid = (sc_uint<vci_param::S>)((r_rsp_buf.read() & 0x0FFFC0000LL) >> 18);
    296             p_vci.rpktid = (sc_uint<vci_param::T>)((r_rsp_buf.read() & 0x000000F00LL) >> 8);
    297             p_vci.rtrdid = (sc_uint<vci_param::P>)((r_rsp_buf.read() & 0x00000F000LL) >> 12);
    298             p_vci.rerror = (sc_uint<vci_param::E>)((r_rsp_buf.read() & 0x000030000LL) >> 16);
    299             p_vci.reop   = true;
    300         }
    301         else if ( r_rsp_fsm.read() == RSP_READ )
    302         {
    303             p_vci.rspval = r_fifo_rsp.rok();
    304             p_vci.rdata  = (sc_uint<8*vci_param::B>)(r_fifo_rsp.read() & 0x0FFFFFFFFLL);
    305             p_vci.rsrcid = (sc_uint<vci_param::S>)((r_rsp_buf.read()   & 0x0FFFC0000LL) >> 18);
    306             p_vci.rpktid = (sc_uint<vci_param::T>)((r_rsp_buf.read()   & 0x000000F00LL) >> 8);
    307             p_vci.rtrdid = (sc_uint<vci_param::P>)((r_rsp_buf.read()   & 0x00000F000LL) >> 12);
    308             p_vci.rerror = (sc_uint<vci_param::E>)((r_rsp_buf.read()   & 0x000030000LL) >> 16);
    309             p_vci.reop   = ((r_fifo_rsp.read() & 0x100000000LL) == 0x100000000LL);
    310         }
    311 
    312         // DSPIN_OUT interface
    313         p_dspin_out.write = r_fifo_cmd.rok();
    314         p_dspin_out.data  = r_fifo_cmd.read();
    315 
    316         // DSPIN_IN interface
    317         p_dspin_in.read   = r_fifo_rsp.wok();
     300    {
     301        p_vci.rspval = false;
     302    }
     303    else if ( r_rsp_fsm.read() == RSP_DSPIN_SINGLE_FLIT )
     304    {
     305        p_vci.rspval = true;
     306        p_vci.rdata  = 0;
     307        p_vci.rsrcid = (sc_uint<vci_param::S>)((r_rsp_buf.read() & 0x0FFFC0000LL) >> 18);
     308        p_vci.rpktid = (sc_uint<vci_param::T>)((r_rsp_buf.read() & 0x000000F00LL) >> 8);
     309        p_vci.rtrdid = (sc_uint<vci_param::P>)((r_rsp_buf.read() & 0x00000F000LL) >> 12);
     310        p_vci.rerror = (sc_uint<vci_param::E>)((r_rsp_buf.read() & 0x000030000LL) >> 16);
     311        p_vci.reop   = true;
     312    }
     313    else if ( r_rsp_fsm.read() == RSP_DSPIN_MULTI_FLIT )
     314    {
     315        p_vci.rspval = r_fifo_rsp.rok();
     316        p_vci.rdata  = (sc_uint<8*vci_param::B>)(r_fifo_rsp.read() & 0x0FFFFFFFFLL);
     317        p_vci.rsrcid = (sc_uint<vci_param::S>)((r_rsp_buf.read()   & 0x0FFFC0000LL) >> 18);
     318        p_vci.rpktid = (sc_uint<vci_param::T>)((r_rsp_buf.read()   & 0x000000F00LL) >> 8);
     319        p_vci.rtrdid = (sc_uint<vci_param::P>)((r_rsp_buf.read()   & 0x00000F000LL) >> 12);
     320        p_vci.rerror = (sc_uint<vci_param::E>)((r_rsp_buf.read()   & 0x000030000LL) >> 16);
     321        p_vci.reop   = ((r_fifo_rsp.read() & 0x100000000LL) == 0x100000000LL);
     322    }
     323
     324    // DSPIN_OUT interface
     325    p_dspin_out.write = r_fifo_cmd.rok();
     326    p_dspin_out.data  = r_fifo_cmd.read();
     327
     328    // DSPIN_IN interface
     329    p_dspin_in.read   = r_fifo_rsp.wok();
    318330
    319331}; // end genMoore
     
    330342    };
    331343    const char* rsp_str[] = {
    332     "RSP_IDLE     ",
    333     "RSP_READ     ",
    334     "RSP_WRITE    ",
     344    "RSP_IDLE             ",
     345    "RSP_DSPIN_SINGLE_FLIT",
     346    "RSP_DSPIN_MULTI_FLIT ",
    335347    };
    336348
Note: See TracChangeset for help on using the changeset viewer.