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