сдвиг влево, пока MSB не станет равным 1: превышен предел числа циклов. Состояние никогда не ложное - PullRequest
0 голосов
/ 23 апреля 2019

Я пытался сдвинуть влево «сдвинутый регистр», пока он не станет равным 1. Но мой код не работает. Компилятор говорит: «Превышен предел числа циклов. Условие никогда не ложно»

input wire [31:0] targetnumber,
...
reg [31:0] shifted;
...
shifted=targetnumber;
for(cnt = 0; shifted[31] == 0; shifted = shifted << 1)begin
   cnt = cnt + 1;
end

Так что проблема в цикле, я на 100% уверен, что MSB моего сдвинутого регистра может достигнуть 1, если я сделаю это сдвиг влево. Но компилятор говорит сука НОП. Я попытался сместить [31]! = 0; это не дает ошибки, но это не дает результата, который я намеревался.

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

Учитывая, что не все зависимости между сигналами объяснены / детализированы, я не уверен, полностью ли я понимаю Ваш код, но, возможно, приведенный ниже фрагмент кода поможет Вам.

for(cnt = 0; cnt < 31; cnt = cnt + 1)begin
    if (targetnumber[i])
        shift_index = 31 - cnt;
    cnt = cnt + 1;
end

assign shifted = targetnumber << shift_index;
0 голосов
/ 23 апреля 2019

Компилятор правильный.Подумайте, что происходит, когда shifted = 0.

Этот код вряд ли будет синтезируемым.Если вы пытаетесь подсчитать число старших 0 битов в числе, предпочтительнее более явный подход (например, написание цикла, который выполняется 32 раза и проверяет каждый бит в последовательности).

...