implement_Bus_alt1 #16
35
bs/Bus.bs
35
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 ->
|
||||
|
|
Loading…
Reference in a new issue