Verilog Reg как счетчик цикла не может использовать максимальное число - PullRequest
0 голосов
/ 01 октября 2018

Я написал модуль, используя цикл for:

reg [3:0] i;
always @ ( a or b )
begin
    for ( i = 4'h0; i <= 4'hf; i = i + 1'b1 )
    //some code
end

Я считаю, что это должно быть нормально для компиляции, но вивадо говорят, что "предел цикла превышает".

Если я изменюreg[3:0] до reg[4:0], все в порядке.

Я запутался, почему мой текущий код не компилируется;я сделал ошибку?

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

В цикле for переменная изменяется до тех пор, пока условие не станет ложным.

Таким образом, сначала i увеличивается (i = i + 1'b1), а затем код проверяет, должен ли цикл for выполняться.Для i == 15 значение все равно true, поэтому цикл выполняется.Затем происходит приращение: 15 + 1, но это дает 0, что все еще верно.Таким образом, у вас есть бесконечный цикл.

0 голосов
/ 01 октября 2018

Ваша ошибка в том, что вы создали бесконечный цикл.Конечное условие цикла for никогда не будет истинным.Максимальное значение 4-битного reg составляет 15 (4'hf).Когда i = 15, выполнение i = i + 1 снова устанавливает i = 0.Расширяя ваш reg еще на один бит, вы увеличиваете максимальное значение до 31 и избегаете бесконечного цикла.

Более условно вы бы изменили:

reg [3:0] i;

на:

integer i;
...