Verilog для цикла

#for-loop #verilog

#для цикла #verilog

Вопрос:

У меня есть следующий код в verilog для тестирования цикла For:

 module test1;

reg [2:0] i;

initial
begin
    for(i=0;i<=3;i=i 1) begin
         #10;
         $display("%d",i);
    end
end

endmodule
 

Печатный вывод показывает:

0
1
2
3

Что имеет смысл для меня. Но приведенная ниже форма сигнала меня смущает:

введите описание изображения здесь

Как reg ‘i’ принимает здесь значение ‘4’?

Это часть более крупного кода, над которым я работаю, где у меня много вложенных циклов for, используемых в тестовом стенде.

Я добавляю вложенный цикл, который ведет себя странно:

 module test1;

reg signed [2:0] i,j;

initial
begin
    for(i=-3;i<=3;i=i 1) begin
        for(j=-3;j<=3;j=j 1) begin
            #10;
            $display("%d   %d",i,j);
        end
    end
end

endmodule
 

Форма выходного сигнала показана ниже:
введите описание изображения здесь

Почему 2-й цикл не работает, а первый цикл продолжает повторяться?

Ответ №1:

Это связано с тем, как for циклы знают, когда остановиться.

Когда вы пишете

 for(i=0;i<=3;i=i 1)
 

это говорит о трех вещах:

  1. i начинается с 0
  2. Цикл продолжается до i<=3 тех пор, пока не станет ложным
  3. Каждый раз увеличивайте i на единицу

Дело в том, i<=3 что не может стать ложным, пока i не станет 4. Когда i становится 4, цикл прекращает цикл. Но i все равно 4.


В вашем примере с вложенным циклом проблема заключается в переполнении.

Вы объявили j как подписанные три бита:

 reg signed [2:0] i,j;
 

Но вы выполняете цикл до j тех пор, пока не станет 4:

 for(j=-3;j<=3;j=j 1)
 

Невозможно представить 4 как трехразрядное целое число со знаком. Поскольку j<=3 всегда должно быть true, цикл никогда не может остановиться.