111666Stushar@ece.gatech.edu/*
211666Stushar@ece.gatech.edu * Copyright (c) 2008 Princeton University
311666Stushar@ece.gatech.edu * Copyright (c) 2016 Georgia Institute of Technology
411666Stushar@ece.gatech.edu * All rights reserved.
511666Stushar@ece.gatech.edu *
611666Stushar@ece.gatech.edu * Redistribution and use in source and binary forms, with or without
711666Stushar@ece.gatech.edu * modification, are permitted provided that the following conditions are
811666Stushar@ece.gatech.edu * met: redistributions of source code must retain the above copyright
911666Stushar@ece.gatech.edu * notice, this list of conditions and the following disclaimer;
1011666Stushar@ece.gatech.edu * redistributions in binary form must reproduce the above copyright
1111666Stushar@ece.gatech.edu * notice, this list of conditions and the following disclaimer in the
1211666Stushar@ece.gatech.edu * documentation and/or other materials provided with the distribution;
1311666Stushar@ece.gatech.edu * neither the name of the copyright holders nor the names of its
1411666Stushar@ece.gatech.edu * contributors may be used to endorse or promote products derived from
1511666Stushar@ece.gatech.edu * this software without specific prior written permission.
1611666Stushar@ece.gatech.edu *
1711666Stushar@ece.gatech.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1811666Stushar@ece.gatech.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1911666Stushar@ece.gatech.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2011666Stushar@ece.gatech.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2111666Stushar@ece.gatech.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2211666Stushar@ece.gatech.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2311666Stushar@ece.gatech.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2411666Stushar@ece.gatech.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2511666Stushar@ece.gatech.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2611666Stushar@ece.gatech.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2711666Stushar@ece.gatech.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2811666Stushar@ece.gatech.edu *
2911666Stushar@ece.gatech.edu * Authors: Niket Agarwal
3011666Stushar@ece.gatech.edu *          Tushar Krishna
3111666Stushar@ece.gatech.edu */
3211666Stushar@ece.gatech.edu
3311666Stushar@ece.gatech.edu
3412492Sodanrc@yahoo.com.br#ifndef __MEM_RUBY_NETWORK_GARNET2_0_NETWORKINTERFACE_HH__
3512492Sodanrc@yahoo.com.br#define __MEM_RUBY_NETWORK_GARNET2_0_NETWORKINTERFACE_HH__
3611666Stushar@ece.gatech.edu
3711666Stushar@ece.gatech.edu#include <iostream>
3811666Stushar@ece.gatech.edu#include <vector>
3911666Stushar@ece.gatech.edu
4011666Stushar@ece.gatech.edu#include "mem/ruby/common/Consumer.hh"
4111666Stushar@ece.gatech.edu#include "mem/ruby/network/garnet2.0/CommonTypes.hh"
4211666Stushar@ece.gatech.edu#include "mem/ruby/network/garnet2.0/CreditLink.hh"
4311666Stushar@ece.gatech.edu#include "mem/ruby/network/garnet2.0/GarnetNetwork.hh"
4411666Stushar@ece.gatech.edu#include "mem/ruby/network/garnet2.0/NetworkLink.hh"
4511666Stushar@ece.gatech.edu#include "mem/ruby/network/garnet2.0/OutVcState.hh"
4611666Stushar@ece.gatech.edu#include "mem/ruby/slicc_interface/Message.hh"
4711666Stushar@ece.gatech.edu#include "params/GarnetNetworkInterface.hh"
4811666Stushar@ece.gatech.edu
4911666Stushar@ece.gatech.educlass MessageBuffer;
5011666Stushar@ece.gatech.educlass flitBuffer;
5111666Stushar@ece.gatech.edu
5211666Stushar@ece.gatech.educlass NetworkInterface : public ClockedObject, public Consumer
5311666Stushar@ece.gatech.edu{
5411666Stushar@ece.gatech.edu  public:
5511666Stushar@ece.gatech.edu    typedef GarnetNetworkInterfaceParams Params;
5611666Stushar@ece.gatech.edu    NetworkInterface(const Params *p);
5711666Stushar@ece.gatech.edu    ~NetworkInterface();
5811666Stushar@ece.gatech.edu
5911666Stushar@ece.gatech.edu    void init();
6011666Stushar@ece.gatech.edu
6111666Stushar@ece.gatech.edu    void addInPort(NetworkLink *in_link, CreditLink *credit_link);
6211666Stushar@ece.gatech.edu    void addOutPort(NetworkLink *out_link, CreditLink *credit_link,
6311666Stushar@ece.gatech.edu        SwitchID router_id);
6411666Stushar@ece.gatech.edu
6511797Smatthew.poremba@amd.com    void dequeueCallback();
6611666Stushar@ece.gatech.edu    void wakeup();
6711666Stushar@ece.gatech.edu    void addNode(std::vector<MessageBuffer *> &inNode,
6811666Stushar@ece.gatech.edu                 std::vector<MessageBuffer *> &outNode);
6911666Stushar@ece.gatech.edu
7011666Stushar@ece.gatech.edu    void print(std::ostream& out) const;
7111666Stushar@ece.gatech.edu    int get_vnet(int vc);
7211666Stushar@ece.gatech.edu    int get_router_id() { return m_router_id; }
7311666Stushar@ece.gatech.edu    void init_net_ptr(GarnetNetwork *net_ptr) { m_net_ptr = net_ptr; }
7411666Stushar@ece.gatech.edu
7511666Stushar@ece.gatech.edu    uint32_t functionalWrite(Packet *);
7611666Stushar@ece.gatech.edu
7711666Stushar@ece.gatech.edu  private:
7811666Stushar@ece.gatech.edu    GarnetNetwork *m_net_ptr;
7911666Stushar@ece.gatech.edu    const NodeID m_id;
8011666Stushar@ece.gatech.edu    const int m_virtual_networks, m_vc_per_vnet, m_num_vcs;
8111666Stushar@ece.gatech.edu    int m_router_id; // id of my router
8211666Stushar@ece.gatech.edu    std::vector<OutVcState *> m_out_vc_state;
8311666Stushar@ece.gatech.edu    std::vector<int> m_vc_allocator;
8411666Stushar@ece.gatech.edu    int m_vc_round_robin; // For round robin scheduling
8511666Stushar@ece.gatech.edu    flitBuffer *outFlitQueue; // For modeling link contention
8611666Stushar@ece.gatech.edu    flitBuffer *outCreditQueue;
8711762Sjieming.yin@amd.com    int m_deadlock_threshold;
8811666Stushar@ece.gatech.edu
8911666Stushar@ece.gatech.edu    NetworkLink *inNetLink;
9011666Stushar@ece.gatech.edu    NetworkLink *outNetLink;
9111666Stushar@ece.gatech.edu    CreditLink *inCreditLink;
9211666Stushar@ece.gatech.edu    CreditLink *outCreditLink;
9311666Stushar@ece.gatech.edu
9411797Smatthew.poremba@amd.com    // Queue for stalled flits
9511797Smatthew.poremba@amd.com    std::deque<flit *> m_stall_queue;
9611797Smatthew.poremba@amd.com    std::vector<int> m_stall_count;
9711797Smatthew.poremba@amd.com
9811666Stushar@ece.gatech.edu    // Input Flit Buffers
9911666Stushar@ece.gatech.edu    // The flit buffers which will serve the Consumer
10011666Stushar@ece.gatech.edu    std::vector<flitBuffer *>  m_ni_out_vcs;
10111666Stushar@ece.gatech.edu    std::vector<Cycles> m_ni_out_vcs_enqueue_time;
10211666Stushar@ece.gatech.edu
10311666Stushar@ece.gatech.edu    // The Message buffers that takes messages from the protocol
10411666Stushar@ece.gatech.edu    std::vector<MessageBuffer *> inNode_ptr;
10511666Stushar@ece.gatech.edu    // The Message buffers that provides messages to the protocol
10611666Stushar@ece.gatech.edu    std::vector<MessageBuffer *> outNode_ptr;
10711762Sjieming.yin@amd.com    // When a vc stays busy for a long time, it indicates a deadlock
10811762Sjieming.yin@amd.com    std::vector<int> vc_busy_counter;
10911666Stushar@ece.gatech.edu
11011797Smatthew.poremba@amd.com    bool checkStallQueue();
11111666Stushar@ece.gatech.edu    bool flitisizeMessage(MsgPtr msg_ptr, int vnet);
11211666Stushar@ece.gatech.edu    int calculateVC(int vnet);
11311797Smatthew.poremba@amd.com
11411666Stushar@ece.gatech.edu    void scheduleOutputLink();
11511666Stushar@ece.gatech.edu    void checkReschedule();
11611797Smatthew.poremba@amd.com    void sendCredit(flit *t_flit, bool is_free);
11711797Smatthew.poremba@amd.com
11811797Smatthew.poremba@amd.com    void incrementStats(flit *t_flit);
11911666Stushar@ece.gatech.edu};
12011666Stushar@ece.gatech.edu
12112492Sodanrc@yahoo.com.br#endif // __MEM_RUBY_NETWORK_GARNET2_0_NETWORKINTERFACE_HH__
122