module clean(input logic clk, b, output logic bo); logic clr, done, b1, b2, b3; localparam WID = 22; logic [WID:0] cnt; typedef enum logic[1:0] {A, B, C, D} sttype; sttype ns, cs; always_ff @(posedge clk) if (clr) cnt = 0; else cnt = cnt + 1; assign done = cnt[WID]; always_ff @(posedge clk) begin cs <= ns; b1 <= b; b2 <= (ns == C || ns == D); b3 <= b2; bo <= b2 & ~b3; end always_comb begin clr = 0; ns = cs; case (cs) A: if (b1) begin ns = B; clr = 1; end B: if (done) ns = C; C: if (~b1) begin ns = D; clr = 1; end D: begin if (done) ns = A; end default: ns = A; endcase // case (cs) end // always_comb endmodule