verilog - 为什么 ModelSim 仿真会冻结?
问题描述
这是“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 运行您的代码时,我收到以下消息:
警告-[PALF] 发现潜在的 always loop 这个always 块没有事件控制或延迟语句,它可能会导致模拟中的无限循环。
它指向代码中的这一行:
always {y,nx_st}= fsm(x,pr_st);
当我将其更改为此消息时,该消息消失:
always @* {y,nx_st}= fsm(x,pr_st);
@*
是一个隐含的敏感度列表。该always
块现在只会在任何时候x
或pr_st
更改值时触发。
注意:您也可以在edaplayground上的其他模拟器上尝试您的代码。
推荐阅读
- c# - 是否可以在 xamarin 表单中从第一页到第二页访问进度条?
- api - 通过 api rest 更新共享点文档的属性
- vba - 应用带有 Or 运算符的 If Then 语句来确定 am/pm
- css - 在引导进度条顶部添加数字步骤
- typescript - 如何获取 RxJS 主题的先前值?
- install4j - 如何让我的 install4j 安装程序替换 i4jinst.dll 以避免 UnsatisfiedLinkError
- python - 绘制具有相同 X 轴和多个 Y 轴且数据数量未定义的图形
- c# - 如何在 EF Core 的父对象中分离对象?
- mysql - 为什么 FIRST_VALUE() 不能正常工作?
- r - 在ggplot条形图中重命名图例中的变量,同时保持条形顺序相同