`timescale 1us/1us module debounce_tb; logic rst_i; logic clk_i; logic signal_i; logic signal_o; integer i = 0; debounce #(.STABLE_PERIOD(5)) uut ( .rst_i(rst_i), .clk_i(clk_i), .signal_i(signal_i), .signal_o(signal_o) ); string filename; initial begin `ifdef DUMP_FILE_NAME filename=`DUMP_FILE_NAME; `else filename="debounce.lxt2"; `endif $dumpfile(filename); $dumpvars(); clk_i = 0; rst_i = 1'b1; signal_i = 1'b1; #1 rst_i = 1'b0; #1 rst_i = 1'b1; end always #10 clk_i = ~clk_i; initial begin // initial key press @(negedge clk_i); signal_i = ~signal_i; assert (signal_o == 1'b1); repeat(2) @(negedge clk_i); signal_i = ~signal_i; assert (signal_o == 1'b1); // try bouncing repeat(2) @(negedge clk_i); for (i=0; i < 20; i = i + 1) begin @(negedge clk_i); signal_i = ~signal_i; assert (signal_o == 1'b1); end @(negedge clk_i); signal_i = ~signal_i; assert (signal_o == 1'b1); repeat(10) @(negedge clk_i); assert (signal_o == 1'b0); repeat(10) @(negedge clk_i); signal_i = ~signal_i; repeat(10) @(negedge clk_i); assert (signal_o == 1'b1); repeat(10) @(negedge clk_i); $finish(); end endmodule