diff --git a/hw/unit_tests/generic_queue/main.cpp b/hw/unit_tests/generic_queue/main.cpp index c3dd026d..c753a7c8 100644 --- a/hw/unit_tests/generic_queue/main.cpp +++ b/hw/unit_tests/generic_queue/main.cpp @@ -1,14 +1,22 @@ -#include -#include -#include -#include -#include #include "vl_simulator.h" #include "VVX_fifo_queue.h" -#include "VVX_fifo_queue__Syms.h" +#include -static const uint32_t MAX_TICKS = 10000000; -static const uint32_t NUM_ITERATIONS = 20000; +#define MAX_TICKS 20 + +#define CHECK(x) \ + do { \ + if (x) \ + break; \ + std::cout << "FAILED: " << #x << std::endl; \ + std::abort(); \ + } while (false) + +uint64_t ticks = 0; + +double sc_time_stamp() { + return ticks; +} using Device = VVX_fifo_queue; @@ -18,41 +26,68 @@ int main(int argc, char **argv) { vl_simulator sim; - auto start_time = std::chrono::system_clock::now(); - - // run simulation - unit64_t ticks = sim.reset(0); - - for (;;) { - //sim->io_in_valid = (in_sample < num_iterations * FFT_SIZE); - //sim->io_out_ready = (out_sample < num_iterations * FFT_SIZE); - - // enqueue data - //if (sim->io_in_valid && sim->io_in_ready) { - //std::cout << "t" << std::dec << ticks << std::hex << " input: re=" << re << ", im=" << im << std::endl; - //sim->io_in_data = sample; - //} - - // dequeue data - //if (sim->io_out_valid && sim->io_out_ready) { - //std::cout << "t" << std::dec << ticks << std::hex << " output: re=" << re << ", im=" << im << std::endl; - //test_outputs[out_sample++] = sample; - //} - - // check for completion - + // run test + ticks = sim.reset(0); + while (ticks < MAX_TICKS) { + switch (ticks) { + case 0: + // initial values + sim->pop = 0; + sim->push = 0; + ticks = sim.step(ticks, 2); + break; + case 2: + // Verify outputs + CHECK(sim->full == 0x0); + CHECK(sim->empty == 0x1); + // push 0xa + sim->pop = 0; + sim->push = 1; + sim->data_in = 0xa; + break; + case 4: + // verify outputs + CHECK(sim->data_out == 0xa); + CHECK(sim->full == 0x0); + CHECK(sim->empty == 0x0); + // push 0xb + sim->pop = 0; + sim->push = 1; + sim->data_in = 0xb; + break; + case 6: + // verify outputs + CHECK(sim->data_out == 0xa); + CHECK(sim->full == 0x1); + CHECK(sim->empty == 0x0); + // pop + sim->pop = 1; + sim->push = 0; + break; + case 8: + // verify outputs + CHECK(sim->data_out == 0xb); + CHECK(sim->full == 0x0); + CHECK(sim->empty == 0x0); + // pop + sim->pop = 1; + sim->push = 0; + break; + case 10: + // verify outputs + CHECK(sim->full == 0x0); + CHECK(sim->empty == 0x1); + sim->pop = 0; + sim->push = 0; + break; + } // advance clock ticks = sim.step(ticks, 2); } - auto end_time = std::chrono::system_clock::now(); - auto latency = end_time - start_time; - std::cout << "Average elapsed time = " - << std::chrono::duration(latency).count() - << " ms" << std::endl; - - std::cout << "Simulation run time: " << std::dec << ticks/2 << " cycles" << std::endl; + std::cout << "PASSED!" << std::endl; + std::cout << "Simulation time: " << std::dec << ticks/2 << " cycles" << std::endl; return 0; } \ No newline at end of file