状态的枚举文字减速是否保证无故障状态机?

Does enum literal deceleration of states guarantee a glitch free state machine?

状态机的状态枚举字面减速是否保证无故障行为,就像将如下顺序分配给状态一样?

enum { a,b,c} states; 

//vs if you were to declare

parameter a = 3'b000;
parameter b= 3'b010;
parameter c = 3'b011;

/////////////////////////

always @(posedge clk) begin  
  if ( reset) begin
    // initial condition 
    end
  else begin
    case ( state) begin
      a: begin
        state<=b;
      end
      b: begin   
        state<=c;
      end
      c: begin
        state<= a;
      end
      default: state<=c;
    endcase
  end
end

默认情况下,enum 标签获得编码 a=0、b=1、c=2。你可以给出明确的编码:

enum { a=0,b=2,c=3} states; 

但是许多综合工具都有指令让工具决定它们识别的 FSM 样式的最佳编码。

要使状态机工作'reliably',所有输入信号必须满足构成状态机的所有寄存器的设置和保持时间。

这与状态值的定义方式无关。直接或通过枚举。

如果一个或多个控制信号异步到达,则无法保证下一状态是什么。

即使状态是使用格雷码定义的并且遵循格雷序列(参见下面的示例)。这并不能保证状态机会工作 'reliably'。

localparam ST0 = 2'b00,
           ST1 = 2'b01,
           ST2 = 2'b11,
           ST3 = 2'b10;
  ...
  case (state)
  ST0 : if (in==2'b11)
           state <= ST1;
  ST1 : if (in!=2'b11)
           state <= ST2;
  ST2 : if (in==2'b10)
           state <= ST3;
  ST3 : if (in==2'b01)
           state <= ST0;
  endcase

如果 in 异步到达,它可以从任何状态转到任何其他状态。这是因为驱动每个寄存器的逻辑需要'settle'。虽然信号未稳定,但它可能会在“1”或“0”之间变化。因此,每个寄存器都可以在输入端获得“1”或“0”。然后 FSM 的下一个状态可以取任何可能的值(或保持在旧状态)。