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

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

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

 

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

input i;

output o;

assign o = !i;

 

Или так:

input i;

output reg o;

always @* 0 <= !i;

 

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

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


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

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

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

 

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


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

2 Sobol'

 

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

 

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

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


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

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

 

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

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


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

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

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


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

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

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

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

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


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

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

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

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

заменил на

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

 

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

 

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

 

 

 

 

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


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

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

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

заменил на

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

 

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

 

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

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

 

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


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

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

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

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


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

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

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

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


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

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

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

 

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

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


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

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

 

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

 

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

 

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

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


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

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

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

 

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


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

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

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

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

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

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

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


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

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

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

 

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

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


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

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

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

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

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

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

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

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

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

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