Verilog综合错误Synth 8-151:案例项无法访问

问题描述

我正在为具有6种可能状态的简单FSM编写Verilog模块。该模块有4个Moore输出和其他模块的7个输入。我正在使用case语句确定状态的下一个值,但是出现综合错误

[Synth 8-151] case item 3'b100 is unreachable [line 40]

[Synth 8-151] case item 3'b101 is unreachable [line 41]

第40行指向SCLEAR: nS = Done ? SCLEARRET : SCLEAR;

第41行指向SCLEARRET: nS = allDone ? SWAIT : SCLEARRET;

这些错误导致FSM无法发送shipClr变量。

这是整个模块:

module SsstateMachine(shipGRB,Done,Go,clk,reset,allDone,Ready2Go,Stop,nextLED,delay,lost,Clr,shipClr);
    output  shipGRB,shipClr;
    input   allDone,Clr;
    input   clk,reset;

    reg [1:0]   S,nS;
    parameter   SWAIT=3'b000,SSHIP=3'b001,SRET=3'b010,SDELAY=3'b011,SCLEAR=3'b100,SCLEARRET=3'b101;

    // Set the next state on the rising edge of the clock
    always @(posedge clk) begin
        if(reset)
            S <= SWAIT;
        else
            S <= nS;
        end

    // Determine the next value of the state based on the inputs
    always @(Go,nextLED) begin
        case(S)
            SWAIT:      if(Go)         nS = SSHIP;
                        else if(Clr)   nS = SCLEAR; 
                        else           nS = SWAIT;  
            SSHIP:      nS = Done    ? SRET     : SSHIP;
            SRET:       if(allDone) begin
                             if(Stop || lost) nS = SWAIT;
                             else             nS = SDELAY;
                             end
                        else nS = SRET;
            SDELAY:     nS = nextLED ? SSHIP     : SDELAY;
            SCLEAR:     nS = Done    ? SCLEARRET : SCLEAR;                       
            SCLEARRET:  nS = allDone ? SWAIT     : SCLEARRET;
            default:    nS = SWAIT;
        endcase
        end

    // Assign the outputs
    assign Ready2Go = (S==SWAIT);  // okay to press Go
    assign shipGRB  = (S==SSHIP);  // send data bits
    assign shipClr  = (S==SCLEAR);
    assign delay    = (S==SDELAY);
endmodule

输入变量的说明:

Done:从告诉FSM的其他模块可以过渡到SRETSCLEARRET

allDone:从其他模块告诉FSM,它可以离开SRETSCLEARRET

Go:按钮

Stop:按钮

Clr:按钮

nextLED:从告诉FSM的其他模块可以从SDELAY过渡到SSHIP

lost:从告诉FSM的其他模块可以从SRET过渡到SWAIT

我多次重画了过渡图,逐步执行了case语句,尝试重写它,但仍然找不到可能的错误。我不了解状态SCLEARSCLEARRET以及如何无法到达。如果按下Clr,并且它处于状态SWAIT,那么FSM是否不应该过渡到SCLEAR

解决方法

由于有6个状态,因此状态变量必须为3位宽,而不是2位。 更改:

example2

收件人:

resolve.modules

此外,您的显式灵敏度列表缺少reg [1:0] S,nS; 信号。您可以将列表替换为隐式列表。更改:

reg [2:0]   S,nS;

收件人:

S

这种紧凑的语法会自动使用您需要的所有信号。