in theory bus is now complete
This commit is contained in:
parent
c28425f10c
commit
ece1f86574
63
bs/Bus.bs
63
bs/Bus.bs
|
@ -11,21 +11,16 @@ import FIFOF
|
||||||
import SpecialFIFOs
|
import SpecialFIFOs
|
||||||
import Printf
|
import Printf
|
||||||
|
|
||||||
clientRequest :: Arbiter.ArbiterClient_IFC -> Action
|
|
||||||
clientRequest ifc = ifc.request
|
|
||||||
|
|
||||||
busRequestToAddr :: BusRequest -> Addr
|
busRequestToAddr :: BusRequest -> Addr
|
||||||
busRequestToAddr req = case req of
|
busRequestToAddr req = case req of
|
||||||
BusReadRequest (ReadRequest addr _) -> addr
|
BusReadRequest (ReadRequest addr _) -> addr
|
||||||
BusWriteRequest (WriteRequest addr _) -> addr
|
BusWriteRequest (WriteRequest addr _) -> addr
|
||||||
|
|
||||||
dummyRule :: Rules
|
-- Create a Bus Module that supports multiple clients and servers
|
||||||
dummyRule =
|
-- submitting requests and simultaneously returning responses.
|
||||||
rules
|
-- Responses can be consumed by clients out of order as all client
|
||||||
"test rule": when True ==> do
|
-- submitted requests are tagged - and servers keep that tag
|
||||||
$display "test rule"
|
-- when responding.
|
||||||
|
|
||||||
-- we need a way to make serverMap safer...
|
|
||||||
mkBus :: (Add n (TLog numServers) (TLog (TAdd numServers 1)))
|
mkBus :: (Add n (TLog numServers) (TLog (TAdd numServers 1)))
|
||||||
=> (Addr -> Maybe (MkServerIdx numServers))
|
=> (Addr -> Maybe (MkServerIdx numServers))
|
||||||
-> Module (Bus inFlightTransactions numClients numServers)
|
-> Module (Bus inFlightTransactions numClients numServers)
|
||||||
|
@ -71,7 +66,12 @@ mkBus serverMap = do
|
||||||
)
|
)
|
||||||
consumeRequestQueues <- replicateM mkBypassFIFOF
|
consumeRequestQueues <- replicateM mkBypassFIFOF
|
||||||
|
|
||||||
submitResponseQueues :: Vector numServers (FIFOF (TaggedBusResponse inFlightTransactions))
|
submitResponseQueues :: Vector numServers (
|
||||||
|
FIFOF (
|
||||||
|
MkClientTagType numClients,
|
||||||
|
TaggedBusResponse inFlightTransactions
|
||||||
|
)
|
||||||
|
)
|
||||||
submitResponseQueues <- replicateM mkBypassFIFOF
|
submitResponseQueues <- replicateM mkBypassFIFOF
|
||||||
|
|
||||||
let clientRules :: Vector numClients (Rules)
|
let clientRules :: Vector numClients (Rules)
|
||||||
|
@ -157,12 +157,15 @@ mkBus serverMap = do
|
||||||
grantedServerIdx :: MkServerIdx numServers
|
grantedServerIdx :: MkServerIdx numServers
|
||||||
grantedServerIdx = truncate grantedIdx
|
grantedServerIdx = truncate grantedIdx
|
||||||
|
|
||||||
selectedSubmitResponseQueue :: FIFOF (TaggedBusResponse inFlightTransactions)
|
selectedSubmitResponseQueue :: FIFOF (
|
||||||
|
MkClientTagType numClients,
|
||||||
|
TaggedBusResponse inFlightTransactions
|
||||||
|
)
|
||||||
selectedSubmitResponseQueue = (select submitResponseQueues grantedServerIdx)
|
selectedSubmitResponseQueue = (select submitResponseQueues grantedServerIdx)
|
||||||
|
|
||||||
response :: TaggedBusResponse inFlightTransactions
|
response :: (MkClientTagType numClients, TaggedBusResponse inFlightTransactions)
|
||||||
response = selectedSubmitResponseQueue.first
|
response = selectedSubmitResponseQueue.first
|
||||||
selectedClientResponseQueue.enq response
|
selectedClientResponseQueue.enq response.snd
|
||||||
selectedSubmitResponseQueue.deq
|
selectedSubmitResponseQueue.deq
|
||||||
|
|
||||||
let serverRules :: Vector numServers (Rules)
|
let serverRules :: Vector numServers (Rules)
|
||||||
|
@ -178,7 +181,7 @@ mkBus serverMap = do
|
||||||
selectedConsumeRequestQueue = (select consumeRequestQueues serverIdx)
|
selectedConsumeRequestQueue = (select consumeRequestQueues serverIdx)
|
||||||
in
|
in
|
||||||
rules
|
rules
|
||||||
(sprintf "server[%d] handle request" serverIdx): when True ==> do
|
(sprintf "server[%d] arbit requests" serverIdx): when True ==> do
|
||||||
let
|
let
|
||||||
grantedClientIdx :: MkClientTagType numClients
|
grantedClientIdx :: MkClientTagType numClients
|
||||||
grantedClientIdx = unpack selectedServerArbiter.grant_id
|
grantedClientIdx = unpack selectedServerArbiter.grant_id
|
||||||
|
@ -192,7 +195,29 @@ mkBus serverMap = do
|
||||||
selectedConsumeRequestQueue.enq (grantedClientIdx, clientRequest)
|
selectedConsumeRequestQueue.enq (grantedClientIdx, clientRequest)
|
||||||
selectedClientRequestQueue.deq
|
selectedClientRequestQueue.deq
|
||||||
|
|
||||||
|
(sprintf "server[%d] route response" serverIdx): when True ==> do
|
||||||
|
let
|
||||||
|
selectedSubmitResponseQueue :: FIFOF (
|
||||||
|
MkClientTagType numClients,
|
||||||
|
TaggedBusResponse inFlightTransactions
|
||||||
|
)
|
||||||
|
selectedSubmitResponseQueue = (select submitResponseQueues serverIdx)
|
||||||
|
|
||||||
|
response :: (MkClientTagType numClients, TaggedBusResponse inFlightTransactions)
|
||||||
|
response = selectedSubmitResponseQueue.first
|
||||||
|
|
||||||
|
clientTag :: MkClientTagType numClients
|
||||||
|
clientTag = response.fst
|
||||||
|
|
||||||
|
targetClientResponseArbiter :: Arbiter.Arbiter_IFC (TAdd numServers 1)
|
||||||
|
targetClientResponseArbiter = (select responseArbiterByClient clientTag)
|
||||||
|
|
||||||
|
arbiterClientSlot :: Arbiter.ArbiterClient_IFC
|
||||||
|
arbiterClientSlot = (select targetClientResponseArbiter.clients serverIdx)
|
||||||
|
arbiterClientSlot.request
|
||||||
|
|
||||||
addRules |> foldr (<+>) (rules {}) clientRules
|
addRules |> foldr (<+>) (rules {}) clientRules
|
||||||
|
addRules |> foldr (<+>) (rules {}) serverRules
|
||||||
|
|
||||||
-- Client interface vector
|
-- Client interface vector
|
||||||
let clients :: Vector numClients (BusClient inFlightTransactions)
|
let clients :: Vector numClients (BusClient inFlightTransactions)
|
||||||
|
@ -248,7 +273,13 @@ mkBus serverMap = do
|
||||||
TaggedBusResponse inFlightTransactions
|
TaggedBusResponse inFlightTransactions
|
||||||
) -> Action
|
) -> Action
|
||||||
submitResponse (clientTag, taggedBusResponse) = do
|
submitResponse (clientTag, taggedBusResponse) = do
|
||||||
dummyVar := (not dummyVar)
|
let
|
||||||
|
selectedSubmitResponseQueue :: FIFOF (
|
||||||
|
MkClientTagType numClients,
|
||||||
|
TaggedBusResponse inFlightTransactions
|
||||||
|
)
|
||||||
|
selectedSubmitResponseQueue = (select submitResponseQueues serverIdx)
|
||||||
|
selectedSubmitResponseQueue.enq (clientTag, taggedBusResponse)
|
||||||
|
|
||||||
return $
|
return $
|
||||||
interface Bus
|
interface Bus
|
||||||
|
|
Loading…
Reference in a new issue