【问题标题】:Why does ModelSim simulation freeze?为什么 ModelSim 仿真会冻结?
【发布时间】:2020-12-14 20:10:26
【问题描述】:

这是“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

【问题讨论】:

    标签: verilog modelsim


    【解决方案1】:

    当我使用 VCS 运行您的代码时,我收到以下消息:

    警告-[PALF] 发现潜在的总是循环这个总是块没有 事件控制或延迟语句,可能会导致无限循环 在模拟中。

    它指向代码中的这一行:

    always {y,nx_st}= fsm(x,pr_st);
    

    当我将其更改为此消息时,该消息消失了:

    always @* {y,nx_st}= fsm(x,pr_st);
    

    @* 是一个隐含的敏感度列表。 always 块现在只会在 xpr_st 更改值时触发。


    注意:您也可以在edaplayground 上的其他模拟器上尝试您的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-18
      • 1970-01-01
      相关资源
      最近更新 更多