【发布时间】:2021-02-04 15:33:29
【问题描述】:
我正在为具有 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吗?
【问题讨论】:
标签: switch-statement conditional-statements verilog hdl unreachable-code