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