No submissions yet

Submit your solution to display here.

Please login/signup to submit your solution.

Testbench Code

`timescale 1ns/1ps

module tb_tribuf_prim;
    // 1) Inputs
    reg a, en;

    // 2) DUT outputs
    wire y;

    // 3) Expected (prefixed expected_)
    reg expected_y;

    // 4) Mismatch (HIGH on fail)
    wire mismatch = (y !== expected_y);

    // Counters
    integer TOTAL_TEST_CASES        = 0;
    integer TOTAL_PASSED_TEST_CASES = 0;
    integer TOTAL_FAILED_TEST_CASES = 0;

    // VCD limit
    integer VCD_MAX_CASES = 32;

    // DUT
    tribuf_prim dut(.a(a), .en(en), .y(y));

    // VCD dump (Inputs -> Outputs -> Expected -> Mismatch)
    initial begin
        $dumpfile("tb_tribuf_prim.vcd");
        $dumpvars(0,
            tb_tribuf_prim.a, tb_tribuf_prim.en,    // Inputs
            tb_tribuf_prim.y,                       // Output
            tb_tribuf_prim.expected_y,              // Expected
            tb_tribuf_prim.mismatch                 // Mismatch
        );
        $dumpon; // start at time 0
    end

    // Helper for pretty-printing 4-state values
    function [7*8-1:0] bit2s;
        input bitval;
        begin
            if      (bitval === 1'b0) bit2s = "0";
            else if (bitval === 1'b1) bit2s = "1";
            else if (bitval === 1'bx) bit2s = "x";
            else                      bit2s = "z";
        end
    endfunction

    // Reference model for bufif1
    task compute_expected;
        input ta, ten;
        begin
            if (ten === 1'b1) begin
                if      (ta === 1'b0) expected_y = 1'b0;
                else if (ta === 1'b1) expected_y = 1'b1;
                else                  expected_y = 1'bx; // a = x/z -> unknown
            end
            else if (ten === 1'b0) begin
                expected_y = 1'bz; // disabled -> high-Z
            end
            else begin
                expected_y = 1'bx; // enable unknown -> unknown
            end
        end
    endtask

    // Apply + check (EXPECTED FIRST -> WAIT -> COMPARE)
    task apply_and_check;
        input ta, ten;
        begin
            a  = ta;
            en = ten;

            compute_expected(ta, ten); // expected first
            #1;                        // let DUT settle

            TOTAL_TEST_CASES++;
            if (!mismatch) TOTAL_PASSED_TEST_CASES++; else TOTAL_FAILED_TEST_CASES++;

            $display(" a=%s en=%s | y=%s | expected=%s | mismatch=%0d",
                     bit2s(a), bit2s(en), bit2s(y), bit2s(expected_y), mismatch);

            if (TOTAL_TEST_CASES == VCD_MAX_CASES) $dumpoff;
        end
    endtask

    initial begin
        $display(" a en | y | expected | mismatch");
        $display("--------------------------------");

        // Directed tests (<= 20 rows total)
        apply_and_check(1'b0, 1'b0); // -> z
        apply_and_check(1'b1, 1'b0); // -> z
        apply_and_check(1'b0, 1'b1); // -> 0
        apply_and_check(1'b1, 1'b1); // -> 1

        // X/Z cases
        apply_and_check(1'bx, 1'b1); // -> x
        apply_and_check(1'bz, 1'b1); // -> x
        apply_and_check(1'b1, 1'bx); // -> x
        apply_and_check(1'b0, 1'bx); // -> x
        apply_and_check(1'b1, 1'bz); // -> x
        apply_and_check(1'b0, 1'bz); // -> x

        // 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");

        #2 $finish;
    end
endmodule