我有这个FSM,它控制我正在构建的游戏(在Quartus Prime Lite Edition17.0中)中的不同事件。当我试图编译它时,我得到了这个错误:
Error (10166): SystemVerilog RTL Coding error at GameFSM.sv(40): always_comb construct does not infer purely combinational logic.
我将所有的输出都指定为默认值,所以我相信不应该推断出任何闩锁(我不完全理解它是如何工作的..)。
//Game FSM, controls the game events
module GameFSM (
input logic clk, resetN, NPCCollisions, Dead_NPCs, start_game, pause_game, continue_game, delay_indicator,
output logic Message_main_menu,
output logic Message_pause,
output logic Message_win,
output logic Message_lose,
output logic Display_Main_Menu,
output logic MainMenu_Music,
output logic BackGround_Music,
output logic Paused,
output logic Win_Music,
output logic Lose_Music
);
enum logic [2:0] {main_Menu, three_hearts, two_hearts, one_heart, delay_state, pause, win, lose} prState, nxtState;
logic [1:0] return_state;
always @(posedge clk or negedge resetN)
begin
if ( !resetN ) begin // Asynchronic reset
prState <= main_Menu;
end
else begin // Synchronic logic FSM
prState <= nxtState;
end
end // always
always_comb // Update next state and outputs
begin
nxtState = prState; // default values
Message_main_menu = 1'b0;
Message_pause = 1'b0;
Message_win = 1'b0;
Message_lose = 1'b0;
MainMenu_Music = 1'b0;
BackGround_Music = 1'b0;
Paused = 1'b0;
Win_Music = 1'b0;
Lose_Music = 1'b0;
Display_Main_Menu = 1'b0;
case (prState)
main_Menu: begin
Message_main_menu = 1'b1;
MainMenu_Music = 1'b1;
Display_Main_Menu = 1'b1;
if(start_game)
nxtState = three_hearts;
end
three_hearts: begin
BackGround_Music = 1'b1;
return_state = 2'h3;
if(NPCCollisions) //Corony hits an npc while he has 3 hearts left
nxtState = delay_state;
else if(Dead_NPCs) //all npc's are dead
nxtState = win;
else if(pause_game)
nxtState = pause;
end
two_hearts: begin
BackGround_Music = 1'b1;
return_state = 2'h2;
if(NPCCollisions) //Corony hits an npc while he has 2 hearts left
nxtState = delay_state;
else if(Dead_NPCs) //all npc's are dead
nxtState = win;
else if(pause_game)
nxtState = pause;
end
one_heart: begin
BackGround_Music = 1'b1;
return_state = 2'h1;
if(NPCCollisions) //Corony lost all his hearts
nxtState = lose;
else if(Dead_NPCs) //all npc's are dead
nxtState = win;
else if(pause_game)
nxtState = pause;
end
delay_state: begin
if(delay_indicator) begin
if(return_state == 2'h3)
nxtState = two_hearts;
else if(return_state == 2'h2)
nxtState = one_heart;
end
end
pause: begin
Paused = 1'b1;
Message_pause = 1'b1;
if(continue_game) begin
if(return_state == 2'h3)
nxtState = three_hearts;
else if(return_state == 2'h2)
nxtState = two_hearts;
else
nxtState = one_heart;
end
end
win: begin
Win_Music = 1'b1;
Message_win = 1'b1;
end
lose: begin
Lose_Music = 1'b1;
Message_lose = 1'b1;
end
endcase
end // always comb
endmodule
使用了return_state
,这样我就可以知道是哪个状态将我带到了pause
状态,所以当我想离开pause
状态时,我就知道应该返回到哪里。
发布于 2020-06-03 07:17:00
问题在于,您需要读取always_comb
块中的counter
信号并将其赋值:
counter = counter - 1;
这可以创建一个组合反馈循环。
类似于:
counter = DELAY_TIME;
也许您应该对counter
使用顺序逻辑:always @(posedge clk ...)
另一个问题信号可能是return_state
。我不知道为什么我的模拟器没有抱怨这个。我认为return_state
也应该在它自己的顺序逻辑块中分配。
https://stackoverflow.com/questions/62162745
复制相似问题