I'm trying to learn Verilog using Pong P. Chu's book. I have a question about how an always block is evaluated and implemented. A style in the authors code is confusing me.
In this example he codes an FSM with two output registers 'y1' and 'y2'. The part I'm confused about is in the NEXT STATE LOGIC AND OUTPUT LOGIC always block, where after the begin statement and
always@* y1 and y0 are set to 0. I seems that regardless of state, y1 and y0 will toggle to 0 on every clock cycle and signal change. According to state diagram in the book reg y1 should be equal to 1 while in state 0 or 1.
So does y1 toggle to 0 every clock cycle then back to what ever its value at the present state?? I assume that's not the case and that I'm just confused about how the block is evaluated. Can someone explain what that part of the code is doing. I'm lost. Thanks
module fsm_eg_2_seg ( input wire clk, reset, a, b, output reg y0, y1 ); //STATE DECLARATION localparam [1:0] s0 =2'b00, s1=2'b01, s2=2'b10; // SIGNAL DECLARATION reg [1:0] state_reg, state_next ; //STATE REGISTER always @(posedge clk, posedge reset) if (reset) state_reg <= s0; else state_reg <= state_next; //NEXT STATE LOGIC AND OUTPUT LOGIC always @* begin state_next = state_reg; // default next state: the same y1 = 1'b0; // default output: 0 y0 = 1'b0; // default output: 0 case (state_reg) s0: begin y1 = 1'b1; if (a) if(b) begin state_next = s2; y0 = 1'b1; end else state_next = s1; end s1: begin y1 = 1'b1; if (a) state_next = s0; end s2: state_next = s0; default: state_next = s0; endcase end endmodule