枚举状态的字面减速是否可以确保无故障状态机?

时间:2019-01-28 16:24:32

标签: verilog system-verilog state-machine asic

状态机的枚举状态是否立即减速,是否保证无故障行为与将以下状态分配给状态的行为相同?

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

2 个答案:

答案 0 :(得分:2)

要使状态机“可靠地”工作,所有输入信号必须满足组成状态机的所有寄存器的建立和保持时间。

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

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

即使状态是使用格雷码定义的,并且遵循格雷序列(请参见下面的示例)。这不能保证状态机将“可靠地”工作。

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异步到达,它可以从任何状态进入任何其他状态。这是因为驱动每个寄存器的逻辑需要“稳定”。当信号未稳定时,它可能在“ 1”或“ 0”之间变化。因此,每个寄存器的输入可以为“ 1”或“ 0”。 FSM的下一个状态可以取任何可能的值(或保持旧状态)。

答案 1 :(得分:1)

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

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

但是许多综合工具都有指令,让该工具为他们所识别的FSM样式确定最佳编码。