42 lines
1.5 KiB
Python
42 lines
1.5 KiB
Python
from base_test import *
|
|
from generator.crv import CacheCRVGenerator
|
|
from utils.common import mmio_addr
|
|
|
|
|
|
@toffee_test.testcase
|
|
async def test_mask_and_conflict_directed(start_func):
|
|
env = await start_func(mem_latency=(0, 3))
|
|
gen = CacheCRVGenerator(seed=0xD1)
|
|
for scenario in [gen.mask_corners(), gen.same_set_conflict(index=9, tags=7)]:
|
|
await env.run_txns(scenario.txns)
|
|
env.scoreboard.assert_drained()
|
|
|
|
|
|
@toffee_test.testcase
|
|
async def test_mmio_decode_windows(start_func):
|
|
env = await start_func(mmio_latency=(1, 3))
|
|
scenario = CacheCRVGenerator(seed=0xD2).mmio_window()
|
|
await env.run_txns(scenario.txns)
|
|
env.scoreboard.assert_drained()
|
|
|
|
|
|
@toffee_test.testcase
|
|
async def test_mmio_second_window_is_uncached(start_func):
|
|
env = await start_func(mmio_latency=(0, 1))
|
|
gen = CacheCRVGenerator(seed=0xD3)
|
|
addr = mmio_addr("b", 0x118)
|
|
|
|
first = 0x1111_2222_3333_4444
|
|
second = 0xAAAA_BBBB_CCCC_DDDD
|
|
env.shared_mmio.write_word(addr, first, 0xFF)
|
|
env.scoreboard.oracle.mmio.write_word(addr, first, 0xFF)
|
|
await env.run_txns([gen.read(addr)])
|
|
|
|
# External device-side mutation between reads. Correct MMIO behavior must
|
|
# observe this new value; an erroneous cached 0x4...-0x7... decode returns
|
|
# the stale first value and is killed by the scoreboard.
|
|
env.shared_mmio.write_word(addr, second, 0xFF)
|
|
env.scoreboard.oracle.mmio.write_word(addr, second, 0xFF)
|
|
await env.run_txns([gen.read(addr)])
|
|
env.scoreboard.assert_drained()
|