diff --git a/bs/Bus.bs b/bs/Bus.bs index 3217cb5..b9d5b32 100644 --- a/bs/Bus.bs +++ b/bs/Bus.bs @@ -9,6 +9,7 @@ import Arbiter import FIFO import FIFOF import SpecialFIFOs +import Printf clientRequest :: Arbiter.ArbiterClient_IFC -> Action clientRequest ifc = ifc.request @@ -39,11 +40,14 @@ mkBus serverMap = do -- a request is unmappable and instead opt to form and submit a -- `BusError UnMapped` response directly to a client response arbiter. Thus -- we must arbit between a total of `numServers + 1` requestors. - clientResponseArbiter :: Vector numClients (Arbiter.Arbiter_IFC (TAdd numServers 1)) - clientResponseArbiter <- replicateM (mkArbiter False) + responseArbiterByClient :: Vector numClients (Arbiter.Arbiter_IFC (TAdd numServers 1)) + responseArbiterByClient <- replicateM (mkArbiter False) - serverRequestArbiter :: Vector numServers (Arbiter.Arbiter_IFC numClients) - serverRequestArbiter <- replicateM (mkArbiter False) + -- There are `numServer` servers, each of which needs its own arbiter as + -- there are up to `numClient` clients that may wish to submit a response + -- to a given client. + requestArbiterByServer :: Vector numServers (Arbiter.Arbiter_IFC numClients) + requestArbiterByServer <- replicateM (mkArbiter False) dummyVar :: Reg(Bool) dummyVar <- mkReg False @@ -63,27 +67,28 @@ mkBus serverMap = do selectedClientRequestQueue = (select clientRequestQueues clientIdx) in rules - "request": when True ==> do + (sprintf "request server from client %d" clientIdx): when True ==> do let clientRequest :: TaggedBusRequest inFlightTransactions clientRequest = selectedClientRequestQueue.first targetAddr :: Addr = busRequestToAddr |> clientRequest.busRequest targetServerIdx :: (Maybe ServerIdx) = serverMap targetAddr - -- case targetServerIdx of - -- Just serverIdx -> do - -- targetServerArbiter :: Arbiter.Arbiter_IFC numClients - -- targetServerArbiter = (select serverArbiters serverIdx) + -- $display "clientRequest" (fshow clientRequest) + case targetServerIdx of + Just serverIdx -> do + let + targetServerArbiter :: Arbiter.Arbiter_IFC numClients + targetServerArbiter = (select requestArbiterByServer serverIdx) + arbiterClientSlot :: Arbiter.ArbiterClient_IFC + arbiterClientSlot = (select targetServerArbiter.clients clientIdx) + arbiterClientSlot.request + Nothing -> do action {} + - $display "client test rule " (fromInteger clientIdx) addRules |> foldr (<+>) (rules {}) clientRules - addRules |> - rules - "test rule": when True ==> do - $display "test rule" - -- Client interface vector let clients :: Vector numClients (BusClient inFlightTransactions) clients = genWith $ \clientIdx -> diff --git a/bs/Top.bs b/bs/Top.bs index a125406..a0816a0 100644 --- a/bs/Top.bs +++ b/bs/Top.bs @@ -71,7 +71,7 @@ mkSim = do do let server = (Vector.select bus.servers 0) result <- server.consumeRequest - $display (fshow result) + $display "Top.bs:74" (fshow result) "initCFunctionsOnce": when not initCFunctions ==> do initTerminal