1    `define ST_STOP     3'b001
2    `define ST_GO       3'b010
3    `define ST_SLOW     3'b100
4    
5    module main;
6    
7    reg        clk;
8    reg        go;
9    wire [2:0] state;
10   
11   fsma fsm1( clk, go, state );
12   fsmb fsm2( clk, go );
13   
14   wire error = (state[0] & state[1]) || (state[0] & state[2]) || (state[1] & state[2]) || (state == 3'b000);
15   
16   initial begin
17    $dumpfile( "example.vcd" );
18    $dumpvars( 0, main );
19    go = 1'b0;
20    repeat( 10 ) @(posedge clk);
21    go = 1'b1;
22    #10;
23    $finish;
24   end
25   
26   initial begin
27    clk = 1'b0;
28    forever #(1) clk = ~clk;
29   end
30   
31   endmodule
32   
33   module fsma( clk, go, state );
34   
35   input        clk;
36   input        go;
37   output [2:0] state;
38   
39   reg [2:0] next_state;
40   reg [2:0] state;
41   
42   initial begin
43    state = `ST_SLOW;
44   end
45   
46   always @(posedge clk) state <= next_state;
47   
48   (* covered_fsm, lights, is="state", os="next_state" *)
49   always @(state or go)
50     case( state )
51       `ST_STOP :  next_state = go ? `ST_GO : `ST_STOP;
52       `ST_GO   :  next_state = go ? `ST_GO : `ST_SLOW;
53       `ST_SLOW :  next_state = `ST_STOP;
54     endcase
55   
56   endmodule
57   
58   module fsmb( clk, go );
59   
60   input     clk;
61   input     go;
62        
63   reg [2:0] next_state;
64   reg [2:0] state;  
65        
66   initial begin
67           state = `ST_STOP;
68   end     
69           
70   always @(posedge clk) state <= next_state;
71           
72   (* covered_fsm, lights, is="state", os="next_state",
73                           trans="3'b001->3'b010",
74                           trans="3'b010->3'b100",
75                           trans="3'b100->3'b001" *)
76   always @(state or go)
77     case( state )
78       `ST_STOP :  next_state = go ? `ST_GO : `ST_STOP;
79       `ST_GO   :  next_state = go ? `ST_GO : `ST_SLOW;
80       `ST_SLOW :  next_state = `ST_STOP;
81     endcase
82           
83   endmodule
84