为什么 ModelSim 仿真会卡住?
Why does ModelSim simulation freeze?
这是“10101”非重叠序列检测器的 Verilog 代码。
当我编译这段代码时,它没有显示任何错误。但是,当我模拟代码时,ModelSim 停止工作并无限期地冻结。
我找不到错误或问题所在。
module seq_det(y,x,clk,rst);
output reg y;
input x,clk,rst;
reg[2:0] pr_st,nx_st;
parameter s0=3'b000;
parameter s1=3'b001;
parameter s2=3'b010;
parameter s3=3'b011;
parameter s4=3'b100;
always {y,nx_st}= fsm(x,pr_st);
always @(posedge clk)
begin if(rst)begin
y=0;
nx_st=s0;
end
else nx_st=pr_st;
end
//function defined here
function [3:0] fsm;
input sm_x;
input sm_ps;
reg sm_y;
reg[2:0] sm_ns;
begin
case(sm_ps)
s0:begin
if(sm_x==0) begin
sm_y=0;
sm_ns=s0;
end
else begin
sm_y=0;
sm_ns=s1;
end
end
s1:begin
if(sm_x==1) begin
sm_y=0;
sm_ns=s1;
end
else begin
sm_y=0;
sm_ns=s2;
end
end
s2:begin
if(sm_x==0) begin
sm_y=0;
sm_ns=s0;
end
else begin
sm_y=0;
sm_ns=s3;
end
end
s3:begin
if(sm_x==1) begin
sm_y=0;
sm_ns=s1;
end
else begin
sm_y=0;
sm_ns=s4;
end
end
s4:begin
sm_y=sm_x;
sm_ns=s0;
end
endcase
fsm={sm_y,sm_ns};
end
endfunction
endmodule
当我 运行 使用 VCS 编写您的代码时,我收到此消息:
Warning-[PALF] Potential always loop found This always block has no
event control or delay statements, it might cause an infinite loop
in simulation.
它指向您代码中的这一行:
always {y,nx_st}= fsm(x,pr_st);
当我把它改成这样时,消息消失了:
always @* {y,nx_st}= fsm(x,pr_st);
@*
是一个隐含的敏感性列表。 always
块现在只会在 x
或 pr_st
更改值时触发。
注意:您也可以在 edaplayground 上的其他模拟器上尝试您的代码。
这是“10101”非重叠序列检测器的 Verilog 代码。 当我编译这段代码时,它没有显示任何错误。但是,当我模拟代码时,ModelSim 停止工作并无限期地冻结。 我找不到错误或问题所在。
module seq_det(y,x,clk,rst);
output reg y;
input x,clk,rst;
reg[2:0] pr_st,nx_st;
parameter s0=3'b000;
parameter s1=3'b001;
parameter s2=3'b010;
parameter s3=3'b011;
parameter s4=3'b100;
always {y,nx_st}= fsm(x,pr_st);
always @(posedge clk)
begin if(rst)begin
y=0;
nx_st=s0;
end
else nx_st=pr_st;
end
//function defined here
function [3:0] fsm;
input sm_x;
input sm_ps;
reg sm_y;
reg[2:0] sm_ns;
begin
case(sm_ps)
s0:begin
if(sm_x==0) begin
sm_y=0;
sm_ns=s0;
end
else begin
sm_y=0;
sm_ns=s1;
end
end
s1:begin
if(sm_x==1) begin
sm_y=0;
sm_ns=s1;
end
else begin
sm_y=0;
sm_ns=s2;
end
end
s2:begin
if(sm_x==0) begin
sm_y=0;
sm_ns=s0;
end
else begin
sm_y=0;
sm_ns=s3;
end
end
s3:begin
if(sm_x==1) begin
sm_y=0;
sm_ns=s1;
end
else begin
sm_y=0;
sm_ns=s4;
end
end
s4:begin
sm_y=sm_x;
sm_ns=s0;
end
endcase
fsm={sm_y,sm_ns};
end
endfunction
endmodule
当我 运行 使用 VCS 编写您的代码时,我收到此消息:
Warning-[PALF] Potential always loop found This always block has no event control or delay statements, it might cause an infinite loop in simulation.
它指向您代码中的这一行:
always {y,nx_st}= fsm(x,pr_st);
当我把它改成这样时,消息消失了:
always @* {y,nx_st}= fsm(x,pr_st);
@*
是一个隐含的敏感性列表。 always
块现在只会在 x
或 pr_st
更改值时触发。
注意:您也可以在 edaplayground 上的其他模拟器上尝试您的代码。