From ea98ca49df1233578103c3dd6ce53fc1a37963ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Nguyen?= Date: Wed, 6 Apr 2022 14:39:58 +0200 Subject: [PATCH] tb: fix timer reset; cosmetic fixes. --- power_fv/tb.py | 49 ++++++++++++++++++++++++------------------------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/power_fv/tb.py b/power_fv/tb.py index c38a7be..e311ffc 100644 --- a/power_fv/tb.py +++ b/power_fv/tb.py @@ -5,47 +5,46 @@ from amaranth.asserts import * __all__ = ["Testbench"] +def _check_triggers(t_start, t_pre, t_post): + if not isinstance(t_start, int) or t_start <= 0: + raise ValueError("t_start must be a positive integer, not {!r}" + .format(t_start)) + if not isinstance(t_post, int) or t_post < t_start: + raise ValueError("t_post must be an integer greater than or equal to t_start ({}), not {!r}" + .format(t_start, t_post)) + if not isinstance(t_pre, int) or t_pre > t_post or t_pre < t_start: + raise ValueError("t_pre must be an integer between t_start and t_post (i.e. [{},{}]), " + "not {!r}".format(t_pre, t_start, t_post)) + + class Testbench(Elaboratable): - def __init__(self, check, dut, *, t_post, t_pre=None, t_start=0): - if not isinstance(t_post, int) or t_post < 0: - raise ValueError("t_post must be a non-negative integer, not {!r}" - .format(t_post)) - if t_pre is None: + def __init__(self, check, dut, *, t_start=1, t_pre=None, t_post=20): + if t_pre is None and t_post is not None: t_pre = t_post - if not isinstance(t_pre, int) or t_pre < 0: - raise ValueError("t_pre must be a non-negative integer, not {!r}" - .format(t_pre)) - if t_pre > t_post: - raise ValueError("t_pre ({}) must be lesser than or equal to t_post ({})" - .format(t_pre, t_post)) - if not isinstance(t_start, int) or t_start < 0: - raise ValueError("t_start must be a non-negative integer, not {!r}" - .format(t_start)) - if t_start > t_pre: - raise ValueError("t_start ({}) must be lesser than or equal to t_pre ({})" - .format(t_start, t_pre)) - self.t_post = t_post - self.t_pre = t_pre - self.t_start = t_start + _check_triggers(t_start, t_pre, t_post) - self.check = check - self.dut = dut + self.check = check + self.dut = dut + self.t_start = t_start + self.t_pre = t_pre + self.t_post = t_post def elaborate(self, platform): m = Module() - timer = Signal(range(self.t_post + 1)) - with m.If(timer != self.t_post): + timer = Signal(range(self.t_post + 2), reset=1) + + with m.If(timer <= self.t_post): m.d.sync += timer.eq(timer + 1) m.submodules.check = ResetInserter(timer < self.t_start)(self.check) m.submodules.dut = self.dut m.d.comb += [ - self.check.dut .eq(self.dut.pfv), self.check.pre .eq(timer == self.t_pre), self.check.post.eq(timer == self.t_post), + self.check.pfv .eq(self.dut.pfv), ] m.d.comb += Assume(ResetSignal() == Initial())