16. Parking Lot Status

Loading...

Testbench Code

`timescale 1ns/1ps

module tb_parking_status16;
    // Input
    reg  [15:0] slots;

    // DUT outputs
    wire all_full;
    wire any_free;

    // Expected outputs
    reg  expected_all_full;
    reg  expected_any_free;

    // Mismatch signals
    wire mismatch_all_full = (all_full !== expected_all_full);
    wire mismatch_any_free = (any_free !== expected_any_free);
    wire mismatch          = mismatch_all_full | mismatch_any_free;

    integer TOTAL_TEST_CASES = 0;
    integer TOTAL_PASSED_TEST_CASES = 0;
    integer TOTAL_FAILED_TEST_CASES = 0;

    // Instantiate DUT
    parking_status16 dut (
        .slots(slots),
        .all_full(all_full),
        .any_free(any_free)
    );

    // VCD dump (Inputs -> Outputs -> Expected Outputs -> mismatch)
    initial begin
        $dumpfile("tb_parking_status16.vcd");
        $dumpvars(0,
            tb_parking_status16.slots,             // inputs
            tb_parking_status16.all_full,          // outputs
            tb_parking_status16.any_free,
            tb_parking_status16.expected_all_full, // expected
            tb_parking_status16.expected_any_free,
            tb_parking_status16.mismatch           // consolidated mismatch flag
        );
    end

    // Golden model (mirrors reference solution)
    task compute_expected;
        input [15:0] t_slots;
        begin
            expected_all_full = &t_slots;
            expected_any_free = ~(&t_slots);
            // Alternative: expected_any_free = |(~t_slots);
        end
    endtask

    task run_test;
        input [15:0] t_slots;
        begin
            slots = t_slots;
            compute_expected(t_slots);
            #1; // settle
            TOTAL_TEST_CASES = TOTAL_TEST_CASES + 1;

            if (!mismatch) begin
                TOTAL_PASSED_TEST_CASES = TOTAL_PASSED_TEST_CASES + 1;
            end else begin
                TOTAL_FAILED_TEST_CASES = TOTAL_FAILED_TEST_CASES + 1;
                $display("FAILED: slots=%h | all_full=%b any_free=%b | exp_full=%b exp_free=%b mismatch=%b",
                         slots, all_full, any_free, expected_all_full, expected_any_free, mismatch);
            end
        end
    endtask

    integer i;
    initial begin
        // Directed edge/typical cases
        run_test(16'h0000); // all free
        run_test(16'hFFFF); // all full
        run_test(16'hAAAA); // alternating 1010...
        run_test(16'h5555); // alternating 0101...
        run_test(16'h0001); // endpoints occupied only
        run_test(16'hFFFE); // all but endpoints

        // Limited randomized sweep (covers variety but keeps log short)
        for (i = 0; i < 8; i = i + 1)
            run_test($random);

        // Summary
        $display("======================================");
        $display("TOTAL_TEST_CASES=%0d", TOTAL_TEST_CASES);
        $display("TOTAL_PASSED_TEST_CASES=%0d", TOTAL_PASSED_TEST_CASES);
        $display("TOTAL_FAILED_TEST_CASES=%0d", TOTAL_FAILED_TEST_CASES);
        $display("ALL_TEST_CASES_PASSED=%s",
                 (TOTAL_FAILED_TEST_CASES==0) ? "true" : "false");
        $display("======================================");

        $finish;
    end
endmodule