FIFO scoreboardΒΆ

This ready/valid example separates reset, input drive, output readiness, monitoring, and checking into ordinary Task<void> coroutines. Event publishes reset completion and two Queue<uint32_t> objects connect the driver and monitor to the scoreboard.

constexpr uint32_t kWordCount = 24;

Task<void> scoreboard(TestContext& test,
                      Queue<uint32_t>& expected_words,
                      Queue<uint32_t>& observed_words) {
    for (uint32_t index = 0; index < kWordCount; ++index) {
        const uint32_t expected = co_await expected_words.get();
        const uint32_t actual = co_await observed_words.get();
        test.expect_eq("FIFO payload", actual, expected);
    }
}

Task<void> fifo_test(Dut dut, TestContext& test) {
    dut.clk.set_now(0);
    test.start_clock(dut.clk, 10_ns);

    Event reset_done;
    Queue<uint32_t> expected_words;
    Queue<uint32_t> observed_words;
    uint32_t input_stalls = 0;

    co_await Join{reset_dut(dut, reset_done),
                  input_driver(dut, reset_done, expected_words, input_stalls),
                  output_ready_driver(dut, reset_done),
                  output_monitor(dut, reset_done, observed_words),
                  scoreboard(test, expected_words, observed_words)};
}

CPPTB_REGISTER_TEST(fifo_test);

Build and run it with cpptb test --project examples/fifo_scoreboard --build-dir build. Every drive, edge wait, and settle delay remains explicit. The pure SV peer uses the same kWordCount = 24, data generator, and ready pattern.