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

Как исправить код? Или что добавить?

Всем доброго дня.

 

Только погружаюсь в таинства верилога и прошу помощи у опытных товарищей :)

Есть такой модуль (приложил файлом). Он уже был готовый и у меня в тестбенче (RTL) ведет себя отлично, без проблем.

Но когда собираю проект с этим модулем в реальном чипе, то тайминг анализер ругается на то, что регистры под always @(*) - например Phase1R0w, Phase1R1w, Phase1C0w и т.д. (всего 88 цепей) не имеют клока. И собственно вроде тайминг анализер прав - вроде как сигналы-то регистрятся только в регистрах под always @(posedge clk or negedge rst), например Phase1R0r- это регистр. А вышеупомянутые Phase1R0w... и т.д. - это комбинационная логика. Как не поломав логику скорректировать код, чтобы тайминг анализер корректно рассчитал и учел все эти пути. Т.к. этот блок похоже глючит, но редко - выловить трудно. И длина комбинационной цепи там вроде немалая, т.е. я подозреваю это одно из узких мест в тайминге.

jpeg_idctx.v

Заранее благодарен! 

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


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

always @(*) begin
      case(Phase1Page)
        3'd0:begin
           case(Phase1Count)
             3'd0: begin
                Phase1R0w <= Data00In;
                Phase1R1w <= Data04In;
             end
             3'd1: begin
                Phase1R0w <= Data02In;
                Phase1R1w <= Data06In;
             end
...

Замените <= на =. В комбинационных блоках рекомендуется использовать блокирующие присваивания. Вообще, настоятельно советую навести ясность с блокирующими и неблокирующими присваиваниями. Это один из "столпов" Верилога.

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


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

2 часа назад, dxp сказал:

Замените <= на =. В комбинационных блоках рекомендуется использовать блокирующие присваивания.

С чего это?

 

@alexPec

У вас  там латчей полно. Phase1Count (и др.) 3-разрядный, то есть 8 значений, а в case описано только 4.

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


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

4 минуты назад, andrew_b сказал:

С чего это?

А вы не знали? С того, что обычно хотят, чтобы результат симуляции соответствовал результату синтеза.

 

Приведите причину, зачем в комбинационном блоке нужны неблокирующие присваивания?

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


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

8 minutes ago, andrew_b said:

С чего это?

С того, что они ведут себя так, как должна вести комбинаторная логика. Можно сделать комбинаторику и с неблокирующими присваиваниями, но зачем?

А вот то, что в приведённом примере всё-равно не будет комбинаторики - это да.

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


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

Если имеете в виду, что защёлки сгенерируются, так это не полный пример, это я выдрал кусок. Там в оригинальном портянка на несколько экранов.

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


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

4 minutes ago, dxp said:

Если имеете в виду, что защёлки сгенерируются, так это не полный пример, это я выдрал кусок. Там в оригинальном портянка на несколько экранов.

Нет. Мы имеем в виду, что в комбинаторном always должне быть определены все случаи, и в них переменной должно быть присвоено новое значение (возможно, оно будет тем же самым, но должно браться откуда-то снаружи, а не присвоение переменной самой себе). В противном случае, значение нужно запомнить, значит, будет latch, поскольку нет тактирования.

Конкретно здесь - кейсы на 8 значений, а обрабатывается 4, и так - несколько раз.

 

Тут не код менять надо, а ДНК, или хотя бы почитать что-то полезное. Поиграться в песочнице с кодом на 4 строки, потом на 16. А не тащить портянку, не понимая что это - и сразу на форум.

Изменено пользователем one_eight_seven

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


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

А, в этом смысле. Согласен. Самое простое было бы присвоить перед case значения по умолчанию, и никаких защёлок.

 

 

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


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

Интересно. Всегда считал, что это аксиома Верилога - неблокирующие присваивания  в always @ (posedge clk) и блокирующие присваивания в always @ (sensititvity_list). В стандартах допускается использование обеих вариантов, но в практических руководствах рекомендуют использовать именно так. Вот например:

http://www.sunburst-design.com/papers/CummingsSNUG2000SJ_NBA.pdf

Вот например выдержка из этого документа:

I

Quote

t is better to develop the habit of coding all sequential always blocks, even simple single-block
modules, using nonblocking assignments as shown in Example 14.

 

Изменено пользователем attaboy

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


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

6 часов назад, dxp сказал:

Замените <= на =.

Спасибо, попробовал, но не помогло. Вивадо в тайминг анализе все так же ругается на то, что "Register/latch with no clock...".

6 часов назад, andrew_b сказал:

У вас  там латчей полно. Phase1Count (и др.) 3-разрядный, то есть 8 значений, а в case описано только 4.

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

 

3 часа назад, one_eight_seven сказал:

Тут не код менять надо, а ДНК, или хотя бы почитать что-то полезное. Поиграться в песочнице с кодом на 4 строки, потом на 16. А не тащить портянку, не понимая что это - и сразу на форум.

Не понятна мне ваша агрессия и переход на личности. ДНК своей вполне доволен и менять ее не собираюсь. Наигрался уже много, давно уже занимаюсь конкретными задачами. Но (в отличии от вас, генетически предрасположенного) всех тонкостей верилога не знаю и не скрываю этого. Тем более что модуль чужой - я не заметил латчей, а кто-то вот заметил. Если вы не обратили внимания, то на форум обратился не за общей теорией (это к тому что "почитать"), а с конкретной проблемой, когда в теории явно не описана именно моя проблема. "Портянку" притащил, чтобы участникам можно было посмотреть модуль целиком и иметь общую картину конкретной проблемы. Ну и да, посмотрел, попробовал, потыкался сам - не получается, и "сразу на форум" - разве не для этого форум создан, чтобы общими усилиями, ДОБРОВОЛЬНО помогать решать чьи-то (мои, ваши, других участников) проблемы? А то после вашего поста складывается впечатление, что я замучил вас своими вопросами и требую от вас ответа. Не хотите - не отвечайте, можно просто почитать и закрыть. Тем более что вы всего лишь подтвердили опубликованное предположение  andrew_b.

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


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

3 minutes ago, alexPec said:

Не понятна мне ваша агрессия и переход на личности. ДНК своей вполне доволен и менять ее не собираюсь

Это отсылка к довольно известному в индустрии анекдоту.

 

 

3 minutes ago, alexPec said:

. Наигрался уже много, давно уже занимаюсь конкретными задачами.

Оно и видно.

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


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

37 minutes ago, alexPec said:

Добавил дефолтный кейс везде (хотя по логике он бесполезен, других значений не бывает)

Это очевидно для Вас. Увы синтезатор не настолько понимающий и во многих местах сильно тупит, посему приходится разжовывать многое.

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


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

9 minutes ago, Nick_K said:

Это очевидно для Вас. Увы синтезатор не настолько понимающий и во многих местах сильно тупит, посему приходится разжовывать многое.

Отнюдь. Отсутствие дефолтного кейса - даст ЗАКОННЫЙ ЛАТЧ.

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


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

2 minutes ago, Dr.Alex said:

Отнюдь. Отсутствие дефолтного кейса - даст ЗАКОННЫЙ ЛАТЧ.

Отнюдь) Для проектирования ASIC-ов нет дефолтных кейсов совсем (ну не бывает такого) и Летчи делаются неколько по-другому :wink:

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


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

1 minute ago, Nick_K said:

Отнюдь) Для проектирования ASIC-ов нет дефолтных кейсов совсем (ну не бывает такого) и Летчи делаются неколько по-другому :wink:

А вы точно пишете RTL? Засомневался что-то. Оказывается, в асиках HDL работает не так как в фпга? Это что-то новенькое :-)))

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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