Creating a utility module for easily scoping the LiteDRAMBISTChecker module.
This commit is contained in:
parent
aac61f346e
commit
c142db3966
|
@ -222,9 +222,6 @@ class _LiteDRAMBISTChecker(Module, AutoCSR):
|
||||||
self.data_counter = data_counter = Signal(dram_port.aw)
|
self.data_counter = data_counter = Signal(dram_port.aw)
|
||||||
self.submodules.data_fsm = data_fsm = FSM(reset_state="IDLE")
|
self.submodules.data_fsm = data_fsm = FSM(reset_state="IDLE")
|
||||||
|
|
||||||
self.data_error = Signal()
|
|
||||||
self.comb += self.data_error.eq(dma.source.data != gen.o)
|
|
||||||
|
|
||||||
data_fsm.act("IDLE",
|
data_fsm.act("IDLE",
|
||||||
If(self.start,
|
If(self.start,
|
||||||
NextValue(data_counter, 0),
|
NextValue(data_counter, 0),
|
||||||
|
@ -237,7 +234,7 @@ class _LiteDRAMBISTChecker(Module, AutoCSR):
|
||||||
If(dma.source.valid,
|
If(dma.source.valid,
|
||||||
gen.ce.eq(1),
|
gen.ce.eq(1),
|
||||||
NextValue(data_counter, data_counter + 1),
|
NextValue(data_counter, data_counter + 1),
|
||||||
If(self.data_error,
|
If(dma.source.data != gen.o,
|
||||||
NextValue(self.err_count, self.err_count + 1),
|
NextValue(self.err_count, self.err_count + 1),
|
||||||
),
|
),
|
||||||
If(data_counter == (self.length-1),
|
If(data_counter == (self.length-1),
|
||||||
|
@ -325,3 +322,30 @@ class LiteDRAMBISTChecker(Module, AutoCSR):
|
||||||
err_count_sync.i.eq(core.err_count),
|
err_count_sync.i.eq(core.err_count),
|
||||||
self.err_count.status.eq(err_count_sync.o),
|
self.err_count.status.eq(err_count_sync.o),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class LiteDRAMBISTCheckerScope(Module):
|
||||||
|
"""Easy scope access to important signals of LiteDRAMBISTChecker."""
|
||||||
|
|
||||||
|
def __init__(self, checker):
|
||||||
|
core = checker.core
|
||||||
|
self.data_error = Signal()
|
||||||
|
self.data_address = Signal(core.data_counter.nbits)
|
||||||
|
self.data_expected = Signal(core.dma.source.data.nbits)
|
||||||
|
self.data_actual = Signal(core.dma.source.data.nbits)
|
||||||
|
|
||||||
|
self.comb += [
|
||||||
|
self.data_error.eq(core.dma.source.valid &
|
||||||
|
(self.data_actual != self.data_expected)),
|
||||||
|
self.data_address.eq(core.base + core.data_counter),
|
||||||
|
self.data_actual.eq(core.dma.source.data),
|
||||||
|
self.data_expected.eq(core.gen.o),
|
||||||
|
]
|
||||||
|
|
||||||
|
def signals(self):
|
||||||
|
return [
|
||||||
|
self.data_error,
|
||||||
|
self.data_address,
|
||||||
|
self.data_expected,
|
||||||
|
self.data_actual,
|
||||||
|
]
|
||||||
|
|
|
@ -9,6 +9,7 @@ from litex.soc.interconnect.stream import *
|
||||||
from litedram.common import LiteDRAMWritePort, LiteDRAMReadPort
|
from litedram.common import LiteDRAMWritePort, LiteDRAMReadPort
|
||||||
from litedram.frontend.bist import LiteDRAMBISTGenerator
|
from litedram.frontend.bist import LiteDRAMBISTGenerator
|
||||||
from litedram.frontend.bist import LiteDRAMBISTChecker
|
from litedram.frontend.bist import LiteDRAMBISTChecker
|
||||||
|
from litedram.frontend.bist import LiteDRAMBISTCheckerScope
|
||||||
|
|
||||||
from test.common import *
|
from test.common import *
|
||||||
|
|
||||||
|
@ -18,6 +19,7 @@ class TB(Module):
|
||||||
self.read_port = LiteDRAMReadPort(aw=32, dw=32)
|
self.read_port = LiteDRAMReadPort(aw=32, dw=32)
|
||||||
self.submodules.generator = LiteDRAMBISTGenerator(self.write_port, random=True)
|
self.submodules.generator = LiteDRAMBISTGenerator(self.write_port, random=True)
|
||||||
self.submodules.checker = LiteDRAMBISTChecker(self.read_port, random=True)
|
self.submodules.checker = LiteDRAMBISTChecker(self.read_port, random=True)
|
||||||
|
self.submodules.checker_scope = LiteDRAMBISTCheckerScope(self.checker)
|
||||||
|
|
||||||
|
|
||||||
def main_generator(dut, mem):
|
def main_generator(dut, mem):
|
||||||
|
@ -117,7 +119,7 @@ def main_generator(dut, mem):
|
||||||
yield
|
yield
|
||||||
yield
|
yield
|
||||||
|
|
||||||
# read with two errors but halting on the first one
|
# check the scoped signals
|
||||||
yield from reset_bist_module(dut.checker)
|
yield from reset_bist_module(dut.checker)
|
||||||
errors = yield dut.checker.err_count.status
|
errors = yield dut.checker.err_count.status
|
||||||
assert errors == 0, errors
|
assert errors == 0, errors
|
||||||
|
@ -129,27 +131,27 @@ def main_generator(dut, mem):
|
||||||
yield from toggle_re(dut.checker.start)
|
yield from toggle_re(dut.checker.start)
|
||||||
for i in range(8):
|
for i in range(8):
|
||||||
yield
|
yield
|
||||||
while((yield dut.checker.core.data_error) == 0):
|
while((yield dut.checker_scope.data_error) == 0):
|
||||||
yield
|
yield
|
||||||
|
|
||||||
err_addr = yield dut.checker.core.data_counter + dut.checker.core.base
|
err_addr = yield dut.checker_scope.data_address
|
||||||
assert err_addr == 20, err_addr
|
assert err_addr == 20, err_addr
|
||||||
err_expect = yield dut.checker.core.gen.o
|
err_expect = yield dut.checker_scope.data_expected
|
||||||
assert err_expect == 0xffff000f, hex(err_expect)
|
assert err_expect == 0xffff000f, hex(err_expect)
|
||||||
err_actual = yield dut.checker.core.dma.source.data
|
err_actual = yield dut.checker_scope.data_actual
|
||||||
assert err_actual == 0x200, err_actual
|
assert err_actual == 0x200, err_actual
|
||||||
yield
|
yield
|
||||||
errors = yield dut.checker.core.err_count
|
errors = yield dut.checker.core.err_count
|
||||||
assert errors == 1, errors
|
assert errors == 1, errors
|
||||||
|
|
||||||
while((yield dut.checker.core.data_error) == 0):
|
while((yield dut.checker_scope.data_error) == 0):
|
||||||
yield
|
yield
|
||||||
|
|
||||||
err_addr = yield dut.checker.core.data_counter + dut.checker.core.base
|
err_addr = yield dut.checker_scope.data_address
|
||||||
assert err_addr == 21, err_addr
|
assert err_addr == 21, err_addr
|
||||||
err_expect = yield dut.checker.core.gen.o
|
err_expect = yield dut.checker_scope.data_expected
|
||||||
assert err_expect == 0xfff1ff1f, hex(err_expect)
|
assert err_expect == 0xfff1ff1f, hex(err_expect)
|
||||||
err_actual = yield dut.checker.core.dma.source.data
|
err_actual = yield dut.checker_scope.data_actual
|
||||||
assert err_actual == 0x210, hex(err_actual)
|
assert err_actual == 0x210, hex(err_actual)
|
||||||
yield
|
yield
|
||||||
errors = yield dut.checker.core.err_count
|
errors = yield dut.checker.core.err_count
|
||||||
|
|
Loading…
Reference in New Issue