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 它可以转换到 SRET
或 SCLEARRET
allDone
:从其他模块告诉 FSM 它可以离开 SRET
或 SCLEARRET
Go
:按钮
Stop
:按钮
Clr
:按钮
nextLED
:从其他模块告诉 FSM 它可以从 SDELAY
转换到 SSHIP
lost
:从其他模块告诉 FSM 它可以从 SRET
转换到 SWAIT
转换图我重画了好多次,case语句单步执行,重写也试过,还是找不到问题所在。我不明白状态 SCLEAR
和 SCLEARRET
以及无法访问是怎么回事。如果 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 @*
这种紧凑的语法会自动使用您需要的所有信号。
我正在为具有 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 它可以转换到 SRET
或 SCLEARRET
allDone
:从其他模块告诉 FSM 它可以离开 SRET
或 SCLEARRET
Go
:按钮
Stop
:按钮
Clr
:按钮
nextLED
:从其他模块告诉 FSM 它可以从 SDELAY
转换到 SSHIP
lost
:从其他模块告诉 FSM 它可以从 SRET
转换到 SWAIT
转换图我重画了好多次,case语句单步执行,重写也试过,还是找不到问题所在。我不明白状态 SCLEAR
和 SCLEARRET
以及无法访问是怎么回事。如果 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 @*
这种紧凑的语法会自动使用您需要的所有信号。