我在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 机器所期望的那样。
现在来说说实际问题。综合设计后,仿真不再有效,即我得到以下综合后仿真结果:
我无法理解这里的问题。 10 年前我在 Uni 学过 VHDL,从那以后就没有接触过 FPGA。现在,我尝试学习verilog/systemverilog并回到基础知识。我用纯verilog重写了代码,甚至在互联网上找到了其他示例,但结果相同。我在这里缺少什么?
感谢您的帮助!
复位仅在 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