/***************************************************************************** ServerFarm ========== Simon Moore, Oct 2009 Generic module which multiplexes N servers to one server interface. Useful if the base server is quite slow and you want several copies of it. *****************************************************************************/ package ServerFarm; import FIFO::*; import FIFOF::*; import SpecialFIFOs::*; import GetPut::*; import ClientServer::*; import Connectable::*; import Vector::*; interface ServerFarmFullIfc#(numeric type num_servers, type requestT, type responseT); interface Server#(requestT,responseT) server; endinterface typedef UInt#(TAdd#(TLog#(num_servers),1)) ServerNumT#(numeric type num_servers); module mkServerFarmFull#(module#(Server#(requestT,responseT)) mkServer) (ServerFarmFullIfc#(num_servers,requestT,responseT)) provisos(Bits#(requestT,requestTwidth), Bits#(responseT,responseTwidth)); let inum_servers = valueof(num_servers); Vector#(num_servers, Server#(requestT,responseT)) servers <- replicateM(mkServer); Reg#(ServerNumT#(num_servers)) write_server <- mkReg(0); Reg#(ServerNumT#(num_servers)) read_server <- mkReg(0); FIFOF#(requestT) request_fifo <- mkBypassFIFOF; FIFOF#(responseT) response_fifo <- mkBypassFIFOF; function ServerNumT#(num_servers) next_server(ServerNumT#(num_servers) n, ServerNumT#(num_servers) max); let next = n+1; return (next>=max) ? 0 : next; endfunction for(Integer j=0; j