riscv-bluespec-classic/bs/Bus/Server.bs
Yehowshua Immanuel d552934b95 Fixed grant bug
Just becasue we have a grant id doesn't mean that anything has actually
been granted...
2025-04-17 22:47:24 -04:00

57 lines
2.3 KiB
Haskell

package Server(
serverArbitRequests,
serverRouteResponse
) where
import Types
import BusTypes
import TagEngine
import Vector
import Util
import Arbiter
import FIFO
import FIFOF
import SpecialFIFOs
import Printf
serverRouteResponse :: Integer
-> FIFOF (MkClientTagType numClients, TaggedBusResponse inFlightTransactions)
-> Vector numClients (Arbiter.Arbiter_IFC (TAdd numServers 1))
-> Rules
serverRouteResponse serverIdx submitRespQueue responseArbiterByClient =
rules
(sprintf "server[%d] route response" serverIdx): when True ==> do
let response :: (MkClientTagType numClients, TaggedBusResponse inFlightTransactions)
response = submitRespQueue.first
clientTag :: MkClientTagType numClients
clientTag = response.fst
targetClientRespArbiter :: Arbiter.Arbiter_IFC (TAdd numServers 1)
targetClientRespArbiter = select responseArbiterByClient clientTag
arbiterClientSlot :: Arbiter.ArbiterClient_IFC
arbiterClientSlot = select targetClientRespArbiter.clients serverIdx
arbiterClientSlot.request
serverArbitRequests :: Integer
-> Arbiter.Arbiter_IFC numClients
-> FIFOF (MkClientTagType numClients, TaggedBusRequest inFlightTransactions)
-> Vector numClients (FIFOF (TaggedBusRequest inFlightTransactions))
-> Rules
serverArbitRequests serverIdx serverArbiter consumeReqQueue clientReqQueues =
let grantedClientIdx :: MkClientTagType numClients
grantedClientIdx = unpack serverArbiter.grant_id
selectedClientInterface :: ArbiterClient_IFC
selectedClientInterface = select serverArbiter.clients grantedClientIdx
in
rules
(sprintf "server[%d] arbit requests" serverIdx): when selectedClientInterface.grant ==> do
let selectedClientReqQueue :: FIFOF (TaggedBusRequest inFlightTransactions)
selectedClientReqQueue = select clientReqQueues grantedClientIdx
clientRequest :: TaggedBusRequest inFlightTransactions
clientRequest = selectedClientReqQueue.first
consumeReqQueue.enq (grantedClientIdx, clientRequest)
selectedClientReqQueue.deq