2016-11-09 3 views
0

Я пишу код Verilog для вычисления количества цифр в десятичном разряде. В приведенном ниже коде я инициализировал значение c, равное a. Я смог правильно получить результаты моделирования, но не смог синхронизировать, и ошибка вызвана «c = a». Как я могу избавиться от ошибки? Есть ли другая логика для вычисления числа цифр?Использование цикла For всегда в блоке

Error: [Synth 8-3380] loop condition does not converge after 2000 iterations 

Код: -

module numdigits(a,b); 
parameter n=100; 
input [0:n-1] a; 
output reg [0:n-1]b; //THIS MODULE COUNTS THE NUMBER OF DIGITS IN DECIMAL FORM 
reg [0:n-1] d,c; 
always @(*) 
begin 
    d=0; 
    for(c=a;c>0;c=c/10) 
    begin 
    d=d+1; 
    end 
    b=d; 
end 
endmodule 
+0

У меня нет проблем с вашим модулем. Возможно, это тестовый тест или проблема с инструментом? Смотрите: https://www.edaplayground.com/x/24e3 – Hida

+0

@Hida Я использую программное обеспечение vivado и почему нам нужен тестовый стенд для синтеза кода? Это в основном для симуляции, не так ли? –

+0

Я согласен, что не ответил на ваш вопрос. Однако я хотел бы отметить, что вы всегда должны имитировать RTL, чтобы сократить время отладки на FPGA/синтеза обратной связи. – Hida

ответ

0

Для того чтобы for петли, чтобы быть синтезируемыми, он должен быть статическим: то есть, максимальное число итераций по петле должно быть закреплено. Может показаться, что существует максимальное количество итераций вашего цикла, учитывая, что a имеет фиксированное количество бит, но помните, что ваш синтезатор не моделирует ваш код, поэтому он не может этого сказать.

Вам необходимо реорганизовать свой код; вам нужно записать его таким образом, чтобы было зафиксировано максимальное количество итераций цикла. Другими словами, число итераций цикла должно быть фиксированным, но вы можете выскочить раньше, если хотите (с использованием инструкции disable).

+0

Есть ли другая логика для нахождения числа цифр в числе? –

+0

Ну, ваш алгоритм в порядке, он просто не синтезируется так, как вы его написали. Для начала вам нужно пройти круг за фиксированное количество раз: как насчет 'n/3'? Это слишком много, но 'n/4' слишком мало. Затем можно продолжать делиться на десять и увеличивать счетчик, останавливаясь, когда вы достигаете нуля. В этот момент вы можете выпрыгнуть из цикла, используя 'disable', если хотите, но это не существенно. (Важно то, что вы перестаете увеличивать счетчик, когда 'c' становится равным нулю.) –

Смежные вопросы