13. Parity Checker

Loading...

Testbench Code

`timescale 1ns/1ps

module tb_parity_checker;
    // Inputs
    reg  [7:0] D;

    // DUT outputs
    wire odd_parity;
    wire even_parity;

    // Expected outputs
    reg  expected_odd_parity;
    reg  expected_even_parity;

    // Mismatch (for waveform + pass/fail)
    wire mismatch_odd  = (odd_parity  !== expected_odd_parity);
    wire mismatch_even = (even_parity !== expected_even_parity);
    wire mismatch      = mismatch_odd | mismatch_even;

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

    // Instantiate DUT
    parity_checker dut (
        .D(D),
        .odd_parity(odd_parity),
        .even_parity(even_parity)
    );

    // VCD dump (Inputs → Outputs → Expected → mismatch)
    initial begin
        $dumpfile("tb_parity_checker.vcd");
        $dumpvars(0,
            tb_parity_checker.D,                   // inputs
            tb_parity_checker.odd_parity,          // outputs
            tb_parity_checker.even_parity,
            tb_parity_checker.expected_odd_parity, // expected
            tb_parity_checker.expected_even_parity,
            tb_parity_checker.mismatch             // consolidated flag
        );
    end

    // Golden computation (reuse everywhere)
    task compute_expected;
        input [7:0] tD;
        begin
            expected_odd_parity  = ^tD;
            expected_even_parity = ~^tD;
        end
    endtask

    // One test run (counts pass/fail)
    task run_test;
        input [7:0] tD;
        begin
            D = tD;
            compute_expected(tD);
            #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: D=%b | odd=%b even=%b | exp_odd=%b exp_even=%b",
                         D, odd_parity, even_parity,
                         expected_odd_parity, expected_even_parity);
            end
        end
    endtask

    // Short truth table print (no counter changes)
    task print_short_truth_table;
        begin
            $display("D(hex) | odd even | exp_odd exp_even | mismatch");
            $display("------------------------------------------------");
            D = 8'h00; compute_expected(D); #1; $display("%02h    |  %b    %b   |    %b       %b   | %b",
                                                        D, odd_parity, even_parity, expected_odd_parity, expected_even_parity, mismatch);
            D = 8'h01; compute_expected(D); #1; $display("%02h    |  %b    %b   |    %b       %b   | %b",
                                                        D, odd_parity, even_parity, expected_odd_parity, expected_even_parity, mismatch);
            D = 8'h03; compute_expected(D); #1; $display("%02h    |  %b    %b   |    %b       %b   | %b",
                                                        D, odd_parity, even_parity, expected_odd_parity, expected_even_parity, mismatch);
            D = 8'hAA; compute_expected(D); #1; $display("%02h    |  %b    %b   |    %b       %b   | %b",
                                                        D, odd_parity, even_parity, expected_odd_parity, expected_even_parity, mismatch);
            D = 8'hF0; compute_expected(D); #1; $display("%02h    |  %b    %b   |    %b       %b   | %b",
                                                        D, odd_parity, even_parity, expected_odd_parity, expected_even_parity, mismatch);
            D = 8'hFF; compute_expected(D); #1; $display("%02h    |  %b    %b   |    %b       %b   | %b",
                                                        D, odd_parity, even_parity, expected_odd_parity, expected_even_parity, mismatch);
        end
    endtask

    integer i;
    initial begin
        // Directed tests
        run_test(8'h00);
        run_test(8'h01);
        run_test(8'h03);
        run_test(8'hAA);
        run_test(8'hF0);
        run_test(8'hFF);

        // Randomized but limited sweep
        for (i = 0; i < 20; i = i + 1)
            run_test($random);

        // Print short truth table (recomputes expected each row)
        print_short_truth_table();

        // 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