// SPDX-License-Identifier: MIT `timescale 1ns/1ps module tb; reg clk = 0, reset = 1, request = 0; reg release_slot = 1, debug_request = 1; reg [3:0] length = 0; wire accepted, debug_accepted, full, empty, impossible; wire [1:0] occupancy; reg [31:0] state; integer seed = 1, directed = 0; integer short_seen = 0, long_seen = 0; integer impossible_seen = 0, debug_seen = 0, checked = 0; packet_gate dut(clk, reset, request, release_slot, debug_request, length, accepted, debug_accepted, full, empty, impossible, occupancy); always #5 clk = !clk; task observe; #1; if (accepted && length <= 7) short_seen = short_seen + 1; if (accepted && length == 15) long_seen = long_seen + 1; if (impossible) impossible_seen = impossible_seen + 1; if (debug_accepted) debug_seen = debug_seen + 1; if (!accepted) $fatal(1, "expected admission in empty simultaneous-release setup"); checked = checked + 1; @(posedge clk); endtask initial begin if ($value$plusargs("seed=%d", seed)) begin end if ($value$plusargs("directed=%d", directed)) begin end state = 32'(seed); @(negedge clk); reset = 0; request = 1; for (integer i = 0; i < 16; i = i + 1) begin state = 32'd1664525 * state + 32'd1013904223; length = 4'(1 + state % 7); observe(); @(negedge clk); end if (directed) begin length = 15; observe(); end $display("seed=%0d directed=%0d checked=%0d short=%0d long=%0d impossible=%0d debug=%0d", seed, directed, checked, short_seen, long_seen, impossible_seen, debug_seen); $finish; end endmodule