首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SystemVerilog: always_comb构造不能推断纯粹的组合逻辑

SystemVerilog: always_comb构造不能推断纯粹的组合逻辑
EN

Stack Overflow用户
提问于 2020-06-03 07:04:00
回答 1查看 445关注 0票数 1

我有这个FSM,它控制我正在构建的游戏(在Quartus Prime Lite Edition17.0中)中的不同事件。当我试图编译它时,我得到了这个错误:

代码语言:javascript
运行
复制
Error (10166): SystemVerilog RTL Coding error at GameFSM.sv(40): always_comb construct does not infer purely combinational logic.

我将所有的输出都指定为默认值,所以我相信不应该推断出任何闩锁(我不完全理解它是如何工作的..)。

代码语言:javascript
运行
复制
    //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状态时,我就知道应该返回到哪里。

EN

Stack Overflow用户

回答已采纳

发布于 2020-06-03 07:17:00

问题在于,您需要读取always_comb块中的counter信号并将其赋值:

代码语言:javascript
运行
复制
                counter = counter - 1;

这可以创建一个组合反馈循环。

类似于:

代码语言:javascript
运行
复制
                counter = DELAY_TIME;

也许您应该对counter使用顺序逻辑:always @(posedge clk ...)

另一个问题信号可能是return_state。我不知道为什么我的模拟器没有抱怨这个。我认为return_state也应该在它自己的顺序逻辑块中分配。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62162745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档