better names in TagEngine

This commit is contained in:
Yehowshua Immanuel 2025-04-03 09:15:53 -04:00
parent d1e3358197
commit 271148e538

View file

@ -23,10 +23,10 @@ mkTagEngine =
do do
let reifiedNumTags = fromInteger |> valueOf numTags let reifiedNumTags = fromInteger |> valueOf numTags
-- we really only use inUseVec after emptying out our `resetTagCounter` buffer -- we really only use tagUsageTracker after emptying out our
-- perhaps rename this variable to better communicate that -- `initialTagDistributor` buffer
inUseVec :: Vector numTags (Reg Bool) tagUsageTracker :: Vector numTags (Reg Bool)
inUseVec <- replicateM |> mkReg False tagUsageTracker <- replicateM |> mkReg False
-- Since Bluespec doesn't allow us to initialize FIFOs with values at -- Since Bluespec doesn't allow us to initialize FIFOs with values at
-- reset, we can pretend as if the buffer within our tagFIFO is populated -- reset, we can pretend as if the buffer within our tagFIFO is populated
@ -34,15 +34,14 @@ mkTagEngine =
-- by having our tag engine effectively return the value of a decrementing -- by having our tag engine effectively return the value of a decrementing
-- counter initialized to (numTags - 1) for the first n tag requests made -- counter initialized to (numTags - 1) for the first n tag requests made
-- to TagEngine where `n := numTags`. -- to TagEngine where `n := numTags`.
-- Maybe resetTagCounter isn't the greatest name? initialTagDistributor :: (Reg (Maybe UIntLog2N(numTags)))
resetTagCounter :: (Reg (Maybe UIntLog2N(numTags))) initialTagDistributor <- mkReg |> Just |> reifiedNumTags - 1
resetTagCounter <- mkReg |> Just |> reifiedNumTags - 1
retireTag :: Wire UIntLog2N(numTags) retireTag :: Wire UIntLog2N(numTags)
retireTag <- mkWire retireTag <- mkWire
freeQueue :: FIFOF UIntLog2N(numTags) tagFIFO :: FIFOF UIntLog2N(numTags)
freeQueue <- mkSizedFIFOF reifiedNumTags tagFIFO <- mkSizedFIFOF reifiedNumTags
debugOnce <- mkReg True debugOnce <- mkReg True
@ -50,18 +49,14 @@ mkTagEngine =
rules rules
"display": when (debugOnce == True) ==> "display": when (debugOnce == True) ==>
do do
$display "inUseVec : " (fshow |> readVReg inUseVec) $display "tagUsageTracker : " (fshow |> readVReg tagUsageTracker)
debugOnce := False debugOnce := False
-- The "retire_tags" rule can't fire when the `requestTag` method is called.
-- In practice, this is Ok since:
-- 1. the `requestTag` method should take priority over the "retire_tags" rule
-- 2. the `requestTag` method handles the case where there are some tags to retire.
"retire_tags": when True ==> "retire_tags": when True ==>
do do
$display "firing retire_tags" (fshow retireTag) $display "firing retire_tags" (fshow retireTag)
freeQueue.enq retireTag tagFIFO.enq retireTag
(select inUseVec retireTag) := False (select tagUsageTracker retireTag) := False
return $ return $
interface TagEngine interface TagEngine
@ -69,18 +64,18 @@ mkTagEngine =
requestTag :: ActionValue UIntLog2N(numTags) requestTag :: ActionValue UIntLog2N(numTags)
requestTag = requestTag =
do do
case resetTagCounter of case initialTagDistributor of
Just 0 -> do Just 0 -> do
resetTagCounter := Nothing initialTagDistributor := Nothing
(select inUseVec 0) := True (select tagUsageTracker 0) := True
return 0 return 0
Just tag -> do Just tag -> do
resetTagCounter := Just |> tag - 1 initialTagDistributor := Just |> tag - 1
(select inUseVec tag) := True (select tagUsageTracker tag) := True
return tag return tag
Nothing -> do Nothing -> do
let tag = freeQueue.first let tag = tagFIFO.first
freeQueue.deq tagFIFO.deq
return tag return tag
-- `retireTag` isn't guarded on tag validity(this would break Bluespec's safety model) -- `retireTag` isn't guarded on tag validity(this would break Bluespec's safety model)
@ -92,7 +87,7 @@ mkTagEngine =
do do
let let
tagValid = tag < reifiedNumTags tagValid = tag < reifiedNumTags
tagInUse = readReg (select inUseVec tag) tagInUse = readReg (select tagUsageTracker tag)
if (tagValid && tagInUse) if (tagValid && tagInUse)
then do then do
retireTag := tag retireTag := tag