oarbiter.h
来自「基于4个mips核的noc设计」· C头文件 代码 · 共 132 行
H
132 行
/* * TU Eindhoven * Eindhoven, The Netherlands * * Name : oarbiter.h * * Author : A.S.Slusarczyk@tue.nl * * Date : 13-09-2003 * * Function : Link access arbiter for e-cube router * * */#ifndef OARBITER_H_INCLUDED#define OARBITER_H_INCLUDED#include <systemc.h>#include "net_dim.h"// channel controller for a single virtual channelSC_MODULE(ARBITER_CHANNEL_CTRL){ sc_in< bool > clk, rst; // two sets of req/ack - from the associated output queue and the network sc_in< bool > reqin, ackin; sc_out< bool > reqout, ackout; sc_out< bool > arb_req; // arbiter link request sc_in< bool > arb_grant; // arbiter link grant enum state { IDLE, REQUEST_CHANNEL, WAIT_REQ_OFF };#ifdef VERILOG sc_signal<state> current_state, next_state;#else sc_signal<unsigned> current_state, next_state;#endif // FSM void logic(); void change_state(); // ack received from the network is permanently forwarded to the queue void forward_ack(); SC_CTOR(ARBITER_CHANNEL_CTRL){ SC_METHOD(logic); sensitive << current_state << reqin << arb_grant; SC_METHOD(change_state); sensitive_pos << clk << rst; SC_METHOD(forward_ack); sensitive << ackin; }};// link request arbitrationSC_MODULE(ARBITER_SELECT_CHANNEL){ sc_in<bool> clk; sc_in<bool> req0, req1; sc_out<bool> grant0, grant1; sc_in< sc_bv<FLIT_LEN> > data0, data1; sc_out< sc_bv<FLIT_LEN> > dataout; // is link busy? sc_signal<bool> channel_busy; // if busy, which channel is using it? sc_signal<bool> selected_channel; void select(); void output(); SC_CTOR(ARBITER_SELECT_CHANNEL){ SC_METHOD(select); sensitive_pos << clk; SC_METHOD(output); sensitive << req0 << req1 << data0 << data1 << channel_busy << selected_channel; }};// RTL arbiter module - connects two channel controllers with the link arbiterSC_MODULE(OUTPUT_ARBITER){ sc_in< bool > clk, rst; sc_in< sc_bv<FLIT_LEN> > data0, data1; sc_in< bool > req0in, req1in; sc_out< bool > ack0out, ack1out; sc_out< sc_bv<FLIT_LEN> > data; sc_out< bool > req0out, req1out; sc_in< bool > ack0in, ack1in; ARBITER_CHANNEL_CTRL *ch0ctrl, *ch1ctrl; ARBITER_SELECT_CHANNEL *arbiter; sc_signal<bool> arb_req0, arb_req1, arb_grant0, arb_grant1; SC_CTOR(OUTPUT_ARBITER) { ch0ctrl = new ARBITER_CHANNEL_CTRL("ch0ctrl"); ch1ctrl = new ARBITER_CHANNEL_CTRL("ch1ctrl"); arbiter = new ARBITER_SELECT_CHANNEL("arbiter"); ch0ctrl->clk(clk); ch0ctrl->rst(rst); ch0ctrl->reqin( req0in ); ch0ctrl->reqout( req0out ); ch0ctrl->ackin( ack0in ); ch0ctrl->ackout( ack0out ); ch0ctrl->arb_req( arb_req0 ); ch0ctrl->arb_grant( arb_grant0 ); ch1ctrl->clk(clk); ch1ctrl->rst(rst); ch1ctrl->reqin( req1in ); ch1ctrl->reqout( req1out ); ch1ctrl->ackin( ack1in ); ch1ctrl->ackout( ack1out ); ch1ctrl->arb_req( arb_req1 ); ch1ctrl->arb_grant( arb_grant1 ); arbiter->clk(clk); arbiter->data0( data0 ); arbiter->data1( data1 ); arbiter->dataout( data ); arbiter->req0( arb_req0 ); arbiter->req1( arb_req1 ); arbiter->grant0( arb_grant0 ); arbiter->grant1( arb_grant1 ); }};#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?