Перейти к содержанию
    

Стали сыпаться Zero-delay loop в нормальном коде

Доброго всем дня.

Последние пару дней Квеста выносит мне мозг.

Решил выполнить рефакторинг кода конечного автомата, и переделать его из one-always style в, как это принято, несколько always блоков.

Квеста бесится, находит этот Zero-delay loop даже там, где я сто лет ничего не менял.

 

Ниже пример, не относящийся к тому большому КА, просто квеста выдала ошибку в неожиданном месте. Причём эти ошибки валятся уже во время симуляционного процесса, т.е. после команды run, с приостановкой самой симуляции.

 

    
wire            align_now;
    reg            align_delay;
    reg    [7:0]    align_counter;

    always @ (posedge reset or posedge clock)
    begin
        if( reset) begin
            align_counter <= 0;
            align_delay <= 1;
        end else begin
            align_counter <= align_counter + 1;
            align_delay <= align_now;
        end
    end

    assign    align_now = (align_counter < 2); //Zero-Delay Loop

 

Если сделать align_now reg'ом и вставить внуть always - то всё ок, но это же бредово. Это же 1000 раз нормальный код.

Причём, сделав align_now reg-ом он находить это ош-ку в других местах.

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

На данным момент ликвидирую все конструкции вида always ( * ) и вписываю явный sensitivity list. Скажу, что будет.

Заработало. Неужели, такой дорогущий симулятор как Квеста не умеет корректно понимать always ( * ) ?

 

Ага, вставив во все такие always явные списки вместо (*) и в вышеупомянутом фрагменте тоже перестал находить ошибку. Хотя там always ( * ) и не было.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Неужели, такой дорогущий симулятор как Квеста не умеет корректно понимать always ( * ) ?

Ага, вставив во все такие always явные списки вместо (*) и в вышеупомянутом фрагменте тоже перестал находить ошибку. Хотя там always ( * ) и не было.

Так ведь always @(*) и always @(posedge...) - это разные вещи.

В первом случае получается комбинационная логика, а во втором последовательностная.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так ведь always @(*) и always @(posedge...) - это разные вещи.

В первом случае получается комбинационная логика, а во втором последовательностная.

 

конечно разные, я говорю про замену always @ ( * ) на always @ ( var1 or var2 or ........... or varN)

а вышеупомянутый фрагмент я привёл, т.к. он-то составлен по законам жанра, а always @ ( * ) был рядом, тем не менее ошибка всплыла именно на том фрагменте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...