// watchdog.sv — FSM with a large timeout counter module watchdog #( parameter int TW = 20 ) ( input logic clk, rst, start, kick, stop, output logic bark // timeout expired ); typedef enum logic [1:0] {OFF, ARMED, BARK} st_t; st_t st; logic [TW-1:0] cnt; logic expired; assign expired = (cnt == '1); // all ones = timeout assign bark = (st == BARK); always_ff @(posedge clk) begin if (rst) begin st <= OFF; cnt <= '0; end else begin case (st) OFF: if (start) begin st <= ARMED; cnt <= '0; end ARMED: if (stop) st <= OFF; else if (kick) cnt <= '0; else if (expired) st <= BARK; else cnt <= cnt + 1'b1; BARK: if (stop) st <= OFF; default: st <= OFF; endcase end end endmodule