综合后无法让 Mealy FSM 模拟工作

问题描述 投票:0回答:1

我正在尝试根据以下状态机设计一个非重叠序列检测器:

我在systemverilog中编写了以下代码:

typedef enum { S0, S1, S2, S3 } State;

module ass26(
    input sysclk, rst, in,
    output out
    );

    State state, stateNext;
    logic dout;

    always @(posedge sysclk) begin
        if (rst)
            state <= S0;
        else
            state <= stateNext;
    end

    // next-state logic
    always_comb begin
        stateNext = state;

        case (state)
            S0 : begin
                if (in == 1'b1)
                    stateNext = S1;
            end

            S1: begin
                if (in == 1'b0)
                    stateNext = S2;
            end

            S2: begin
                if (in == 1'b1)
                    stateNext = S1;
                else
                    stateNext = S3;
            end

            S3: begin
                stateNext = S0;
            end
            default: stateNext = S0;
        endcase
    end

    // output logic
    always_comb begin
        dout = (state == S3) & in;
    end

    assign out = dout;
endmodule

使用“3过程”方法(我知道这不是经验丰富的工程师倾向于使用的方法,但这应该不重要)。

我还有以下测试平台:

`timescale 1ns / 1ps


module ass26_tb();

reg sysclk, rst, in, out;

ass26 dut (.sysclk(sysclk), .rst(rst), .in(in), .out(out));

initial begin
    sysclk = 0;
    forever #10 sysclk = ~sysclk;
end

initial begin
    rst = 1'b1;
    in = 1'b0;
    #15;
    
    rst = 0;
    in = 0;
    #10;
    
    in = 1; #20;
    in = 0; #20;
    in = 1; #20;
    in = 0; #20;
    in = 0; #20;
    in = 1; #20;
    $finish();
end

当我模拟行为模型时,我得到以下预期结果

输出根据当前状态和输入异步反应,就像我们对 Mealy 机器所期望的那样。

Vivado 生成的行为原理图如下所示:

现在来说说实际问题。综合设计后,仿真不再有效,即我得到以下综合后仿真结果:

合成后原理图:

我无法理解这里的问题。 10 年前我在 Uni 学过 VHDL,从那以后就没有接触过 FPGA。现在,我尝试学习verilog/systemverilog并回到基础知识。我用纯verilog重写了代码,甚至在互联网上找到了其他示例,但结果相同。我在这里缺少什么?

感谢您的帮助!

system-verilog fpga vivado fsm
1个回答
0
投票

复位仅在 t=0 时的一小段时间内有效。
这将重置您的行为模拟,但不会重置后期合成。
在开始时移除复位之前添加延迟,保持几个时钟,以便同步复位按需要运行。

像这样:

initial begin
    rst = 1'b1;
    #60; // added delay
    in = 1'b0;
    #15;
    rst = 0;
    in = 0;
    #10;
    in = 1; #20;
    in = 0; #20;
    in = 1; #20;
    in = 0; #20;
    in = 0; #20;
    in = 1; #20;
    $finish();
end
© www.soinside.com 2019 - 2024. All rights reserved.