implement_Bus_alt1 #16

Merged
Yehowshua merged 23 commits from implement_Bus_alt1 into main 2025-04-16 22:00:14 +00:00
2 changed files with 21 additions and 16 deletions
Showing only changes of commit 813f543b42 - Show all commits

View file

@ -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 ->

View file

@ -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