Jump to content
    

Непрерывное присвоение на Verilog

Помогите разобраться, или ткните носом в подходящую статью - в чем принципиальная разница между assign и always@* в случае непрерывного присвоения?

 

Допустим надо написать инвертор. Можно поступить так:

input i;

output o;

assign o = !i;

 

Или так:

input i;

output reg o;

always @* 0 <= !i;

 

Данные конструкции синтезируются одинакого?

Share this post


Link to post
Share on other sites

Данные конструкции синтезируются одинакого?

Да, можете сами это проверить.

 

Share this post


Link to post
Share on other sites

2 Sobol'

 

Касательно always@* - это некоторый аналог процесса, только не надо список чувствительности писать (как я понял из стандарта - он его сам делает). Ищите "Implicit event_expression list" раздел в стандарте. Там в принципе нет этого вашего "непрерывного присвоения" - там лист чувствительности.

 

Касательно assign - это "Continuous assignments" со всеми вытекающими.

Share this post


Link to post
Share on other sites

Kuzmi4, не очень понял, в чем разница между непрерывном присвоением и присвоением со списком чувствительности в который входят все используемые сигналы? И про все вытекающие можно по-подробнее?

 

В общем меня интересует, в каких случаях какую конструкцию более целесообразно использовать.

Share this post


Link to post
Share on other sites

У меня ситуация следующая. Есть модуль, с кучей присвоений через always. В определенном состоянии, симулятор зацикливается (пишет превышен лимит в 10000 итераций или что-то вроде того). Поиски контура зацикливания не увенчались успехом. Поменял always на assign (там где не память а комб. логика естесственно) и все заработало как положено. Вот и призадумался...

Share this post


Link to post
Share on other sites

Поменял always на assign (там где не память а комб. логика естесственно) и все заработало как положено. Вот и призадумался...

Комбинация always@(*) с блокирующим присваиванием вырождается в комбинаторику, в Вашем первом посте используется неблокирующее присваивание. Насколько корректно использование его сказать не могу, но на практике видел разный результат при моделировании на modelsim и VCS. Может приведете кусок кода?

Зацикливание - это некорректное описание, к примеру assign a=a*b или always @(*) a=a*b, попробуйте отсинтезировать этот кусок и в логе будет либо ошибка, либо предупреждение на это место (latch к примеру).

Share this post


Link to post
Share on other sites

Может приведете кусок кода?

было около сотни строк типа

always @* dec_sbrc <= ({instruction[15:9], instruction[3]} == `SBRC) && decoder_en;

заменил на

assign dec_sbrc = ({instruction[15:9], instruction[3]} == `SBRC) && decoder_en;

 

Что характерно, циклился симулятор ISim, тот же проект в Cadence работает штатно.

 

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

 

 

 

 

Share this post


Link to post
Share on other sites

было около сотни строк типа

always @* dec_sbrc <= ({instruction[15:9], instruction[3]} == `SBRC) && decoder_en;

заменил на

assign dec_sbrc = ({instruction[15:9], instruction[3]} == `SBRC) && decoder_en;

 

Что характерно, циклился симулятор ISim, тот же проект в Cadence работает штатно.

 

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

Судя по приведенному тексту понятия о синхронном проектировании у Вас отсутствуют... Так же как и понятие о разнице в "&" и "&&"...

 

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

У меня ситуация следующая. Есть модуль, с кучей присвоений через always. В определенном состоянии, симулятор зацикливается (пишет превышен лимит в 10000 итераций или что-то вроде того). Поиски контура зацикливания не увенчались успехом. Поменял always на assign (там где не память а комб. логика естесственно) и все заработало как положено. Вот и призадумался...

Я тоже сталкивался с зацикливанием ActiveHDL при использовании always @(*). Заменил (*) на список чувствительности в явной форме, и зацикливаться перестал. Квартус синтезировал этот код без предупреждений и в том и в другом случае. Похоже на ошибку в ActiveHDL.

Share this post


Link to post
Share on other sites

Помогите разобраться, или ткните носом в подходящую статью - в чем принципиальная разница между assign и always@* в случае непрерывного присвоения?

Для синтеза разницы нет, для моделирования разница большая. assign это длительное присвоение, always - процесс, в котором реализуется процедурное присвоение. Назначения в них идут в разные очереди обработки событий и исполняются в разные моменты модельного времени. Лучше всего почитать в стандарте в разделах Scheduling semantics, Assignment statements-> Continuous assignments и Procedural assignments.

 

Реализация событийного шедулера в разных симуляторах может быть разная, потому один виснет, а другой нет :)

Share this post


Link to post
Share on other sites

Помогите разобраться, или ткните носом в подходящую статью - в чем принципиальная разница между assign и always@* в случае непрерывного присвоения?

 

Статья называется "IEEE Std 1364-2001 IEEE Standard Verilog® Hardware Description Language"

 

Разница лишь в том, что при непрерывном присваивании можно использовать указание силы "drive strength", которая может быть полезна при моделировании всяких там емкостно-резистивных динамических цепей, ключей, и т.п.

 

Зациклиться могут и те, и эти одинаково, ставьте задержку (#1) в присваивание, чтобы гарантированно не циклилось... С ней быстро поймаете, где этот цикл.

Share this post


Link to post
Share on other sites

Зациклиться могут и те, и эти одинаково, ставьте задержку (#1) в присваивание, чтобы гарантированно не циклилось... С ней быстро поймаете, где этот цикл.

Вроде #0 тоже активизирует шедулер к переходу на следующий дельта-цикл. А вообще мне не нравятся всякие #T, особенно в SV коде, но порой без них никуда :)

 

Share this post


Link to post
Share on other sites

ИМХО гораздо прикольнее что топик стартер пихает в сигнал булево значение

assign dec_sbrc = ({instruction[15:9], instruction[3]} == `SBRC) && decoder_en;

фактически это

assign dec_sbrc = (({instruction[15:9], instruction[3]} == `SBRC) && (decoder_en != 0));

и ничего синтезатор прожевал и все сделал:) забавно...

Share this post


Link to post
Share on other sites

ИМХО гораздо прикольнее что топик стартер пихает в сигнал булево значение

а в чем проблема то ? все по стандарту. у меня в коде всякие &&, || и т.д. практически отсутствуют. В Верилоге нет типа boolean, значения сравнений приводятся к однобитному сигналу, поэтому и разницы почти нет.

 

UPD. и сигнал decoder_en 99.9% однобитный :)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...