Verilog 综合错误 (Synth 8-151):Case item is unreachable

Verilog Synthesis Error (Synth 8-151): Case item is unreachable

我正在为具有 6 种可能状态的简单 FSM 编写 Verilog 模块。该模块有 4 个摩尔输出和 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, Ready2Go, delay, shipClr;
    input   allDone, Done, Go, Stop, nextLED,lost,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, Clr, Stop, Done, allDone, lost, 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 位。 变化:

reg [1:0]   S, nS;

至:

reg [2:0]   S, nS;

此外,您的显式敏感度列表缺少 S 信号。您可以用隐式列表替换您的列表。变化:

always @(Go, Clr, Stop, Done, allDone, lost, nextLED) begin

至:

always @*

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