Почему моделирование ModelSim зависает?

#verilog #modelsim

#verilog #modelsim

Вопрос:

Это код Verilog для детектора неперекрывающихся последовательностей ‘10101’. Когда я компилирую этот код, он не показывает никаких ошибок. Но, когда я моделирую код, 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
 

Ответ №1:

Когда я запускаю ваш код с помощью VCS, я получаю это сообщение:

Предупреждение -[PALF] Обнаружен потенциальный цикл always В этом блоке always нет операторов управления событиями или задержки, это может привести к бесконечному циклу при моделировании.

Это указывает на эту строку в вашем коде:

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

Сообщение исчезает, когда я меняю его на это:

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

@* это неявный список чувствительности. Теперь always блок будет запускаться только x pr_st при изменении значения или.


Примечание: вы также можете попробовать свой код на других симуляторах в edaplayground.