EDAPlayground: код Verilog «достиг максимального времени выполнения»

#verilog #infinite-loop #system-verilog

Вопрос:

У меня есть простой код Verilog для последовательной логической сети. Он состоит из дизайна и файла тестовой среды; он компилируется, но выполняется слишком долго. Я не уверен, почему; кроме clk , я не вставлял в него никаких циклов. Возможно, у меня есть некоторые синтаксические ошибки при использовании двоичных чисел. Я запустил его с помощью онлайн-программы EDA Playground; я не пробовал это на Xilinx.

Симулятор: Icarus Verilog 0.9.7, параметры компиляции: -Стена. «Выполнение прервано или достигнуто максимальное время выполнения».

Это то, что написано в журнале.

Файл дизайна:

 module hazimodul(
  input clk,
  input rst,
  input ce,
  input x,
  output z
  
);
  

  reg[1:0] all;
  reg[3:0] y;
  reg[0:0] zout;
  
  always@(posedge clk)
  begin
    if(rst)
      begin
        zout <= 1'b0;
        all <= 2'b00;
        y <= 4'b0111;
      end
    else if(ce)
      begin
        if(all == 2'b00)
          begin
            if(x== 1'b0)
              zout<=1'b0;
            else 
              all <=2'b01;
          end
        if(all==2'b01)
          begin
            zout <= y[3:3];
            y <= {y[2:0],y[3:3]};
            if (y == 4'b0111)
              all <= 2'b10;
          end
        if(all==2'b10)
          begin
            if(x == 1'b0)
             all <= 2'b00;
             
          end
      end
  end
  
  assign z = zout;
  
endmodule 
 

Тестовый файл:

 module test;

    reg clk;
    reg rst;
    reg x;
    reg ce;
  
  
    // Outputs
    wire z;

    // Instantiate the Unit Under Test (UUT)
    hazimodul uut (
        .clk(clk), 
        .rst(rst), 
      .x(x),
      .ce(ce),
      .z(z)
    );

    initial begin
        // Initialize Inputs
        clk = 0;
        rst = 0;
        x=0;
        ce=0;

        #10;
        rst<=1;
        #20;
        rst<=0;
        #30
        ce<=1;
        #40
        x<=1;
        #80
        x<=0;
        #90
        x<=1;
        
        
    end
    always #5
        clk <=~clk;
endmodule
 

Ответ №1:

Вам нужно сообщить симулятору, когда прекратить выполнение. Один из способов — использовать $finish системную задачу, которую вы можете добавить в свой тестовый стенд:

 initial #1000 $finish;
 

Теперь моделирование завершается на edaplayground. Вы можете изменить #1000 задержку на что-то более значимое для вашего дизайна.


Вот объяснение того, почему ваш код продолжает выполняться. Ваш тестовый стенд имеет 2 параллельных потока: один initial блок и один always блок. В обоих потоках вы добавляете события в очередь событий Verilog. initial Блок заканчивается после последнего назначения x .

Однако always блок продолжает добавлять события в очередь событий, поэтому моделирование никогда не заканчивается.

Добавление второго initial блока с $finish завершением моделирования завершается, независимо от бесконечного always блока.