A natural second block: an exponential moving average. ema = ema + alpha * (px - ema), one multiply and a couple of adds per tick, no window buffer at all, so it is simpler than the MAC engine in a lot of ways.
Goal: rtl/ema_engine.v with a configurable alpha in Q16.16, plus the matching golden model and a self-checking testbench, following the same pattern as the MAC engine (model is the source of truth, testbench replays its vectors).
Why this is a good first issue: it reuses the whole verification scaffold that already exists, so you can copy the MAC engine flow and focus on the (small) datapath.
Done when: ema_engine.v matches its golden model and runs in CI next to the MAC engine.
A natural second block: an exponential moving average.
ema = ema + alpha * (px - ema), one multiply and a couple of adds per tick, no window buffer at all, so it is simpler than the MAC engine in a lot of ways.Goal:
rtl/ema_engine.vwith a configurablealphain Q16.16, plus the matching golden model and a self-checking testbench, following the same pattern as the MAC engine (model is the source of truth, testbench replays its vectors).Why this is a good first issue: it reuses the whole verification scaffold that already exists, so you can copy the MAC engine flow and focus on the (small) datapath.
Done when:
ema_engine.vmatches its golden model and runs in CI next to the MAC engine.