riscv-bluespec-classic/bs/Tests/TagEngineTester.bs

77 lines
1.9 KiB
Haskell

package TagEngineTester(mkTagEngineTester) where
import TagEngine
import ActionSeq
import Printf
import Util
type NumTags = 5
mkTagEngineTester :: Module Empty
mkTagEngineTester = do
tagEngine :: TagEngine 5 <- mkTagEngine
runOnce :: Reg Bool <- mkReg False
s :: ActionSeq
s <-
let
requestTagAction :: Action
requestTagAction =
do
tag <- tagEngine.requestTag
-- $display $time " got tag : " (fshow tag)
action {}
retireTagAction :: UInt 3 -> Action
retireTagAction tag =
do
res <- tagEngine.retireTag tag
-- $display $time " retiring tag : " (fshow tag) " " (fshow res)
action {}
in
actionSeq $
do
$display "=== TESTING TagEngine ==="
let expectedTag = 4
tag <- tagEngine.requestTag
dynamicAssert (tag == expectedTag) ""
|> do
let expectedTag = 3
tag <- tagEngine.requestTag
dynamicAssert (tag == expectedTag) ""
|> do
let expectedTag = 2
tag <- tagEngine.requestTag
dynamicAssert (tag == expectedTag) ""
|> do
let expectedTag = 1
tag <- tagEngine.requestTag
dynamicAssert (tag == expectedTag) ""
|> do
let expectedTag = 0
tag <- tagEngine.requestTag
dynamicAssert (tag == expectedTag) ""
|> do retireTagAction 2
|> do
retireTagAction 4
let expectedTag :: MkTagType NumTags
expectedTag = 2
tag <- tagEngine.requestTag
dynamicAssert (tag == expectedTag) ""
|> do
retireTagAction 2
let expectedTag = 4
tag <- tagEngine.requestTag
dynamicAssert (tag == expectedTag) ""
|> do
$display "=== PASSED ==="
terminateSimNoError
addRules $
rules
"start unit test": when (runOnce == False) ==>
do
s.start
runOnce := True