Sobol' 0 4 февраля, 2015 Опубликовано 4 февраля, 2015 · Жалоба Помогите разобраться, или ткните носом в подходящую статью - в чем принципиальная разница между assign и always@* в случае непрерывного присвоения? Допустим надо написать инвертор. Можно поступить так: input i; output o; assign o = !i; Или так: input i; output reg o; always @* 0 <= !i; Данные конструкции синтезируются одинакого? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 4 февраля, 2015 Опубликовано 4 февраля, 2015 · Жалоба Данные конструкции синтезируются одинакого? Да, можете сами это проверить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 4 февраля, 2015 Опубликовано 4 февраля, 2015 · Жалоба 2 Sobol' Касательно always@* - это некоторый аналог процесса, только не надо список чувствительности писать (как я понял из стандарта - он его сам делает). Ищите "Implicit event_expression list" раздел в стандарте. Там в принципе нет этого вашего "непрерывного присвоения" - там лист чувствительности. Касательно assign - это "Continuous assignments" со всеми вытекающими. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sobol' 0 4 февраля, 2015 Опубликовано 4 февраля, 2015 · Жалоба Kuzmi4, не очень понял, в чем разница между непрерывном присвоением и присвоением со списком чувствительности в который входят все используемые сигналы? И про все вытекающие можно по-подробнее? В общем меня интересует, в каких случаях какую конструкцию более целесообразно использовать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sobol' 0 4 февраля, 2015 Опубликовано 4 февраля, 2015 · Жалоба У меня ситуация следующая. Есть модуль, с кучей присвоений через always. В определенном состоянии, симулятор зацикливается (пишет превышен лимит в 10000 итераций или что-то вроде того). Поиски контура зацикливания не увенчались успехом. Поменял always на assign (там где не память а комб. логика естесственно) и все заработало как положено. Вот и призадумался... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bogaev_roman 0 4 февраля, 2015 Опубликовано 4 февраля, 2015 · Жалоба Поменял always на assign (там где не память а комб. логика естесственно) и все заработало как положено. Вот и призадумался... Комбинация always@(*) с блокирующим присваиванием вырождается в комбинаторику, в Вашем первом посте используется неблокирующее присваивание. Насколько корректно использование его сказать не могу, но на практике видел разный результат при моделировании на modelsim и VCS. Может приведете кусок кода? Зацикливание - это некорректное описание, к примеру assign a=a*b или always @(*) a=a*b, попробуйте отсинтезировать этот кусок и в логе будет либо ошибка, либо предупреждение на это место (latch к примеру). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sobol' 0 4 февраля, 2015 Опубликовано 4 февраля, 2015 · Жалоба Может приведете кусок кода? было около сотни строк типа always @* dec_sbrc <= ({instruction[15:9], instruction[3]} == `SBRC) && decoder_en; заменил на assign dec_sbrc = ({instruction[15:9], instruction[3]} == `SBRC) && decoder_en; Что характерно, циклился симулятор ISim, тот же проект в Cadence работает штатно. А что, неблокирующее присвоение в данном примере не вырождается в комбинационную логику? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 4 февраля, 2015 Опубликовано 4 февраля, 2015 · Жалоба было около сотни строк типа always @* dec_sbrc <= ({instruction[15:9], instruction[3]} == `SBRC) && decoder_en; заменил на assign dec_sbrc = ({instruction[15:9], instruction[3]} == `SBRC) && decoder_en; Что характерно, циклился симулятор ISim, тот же проект в Cadence работает штатно. А что, неблокирующее присвоение в данном примере не вырождается в комбинационную логику? Судя по приведенному тексту понятия о синхронном проектировании у Вас отсутствуют... Так же как и понятие о разнице в "&" и "&&"... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bogaev_roman 0 4 февраля, 2015 Опубликовано 4 февраля, 2015 · Жалоба А что, неблокирующее присвоение в данном примере не вырождается в комбинационную логику? Конкретно в этом примере комбинаторика, но вся картина не видна и утверждению о том, что заменил вот эту строчку на другую и все заработало не верю. В чем проблема отсинтезировать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 4 февраля, 2015 Опубликовано 4 февраля, 2015 · Жалоба У меня ситуация следующая. Есть модуль, с кучей присвоений через always. В определенном состоянии, симулятор зацикливается (пишет превышен лимит в 10000 итераций или что-то вроде того). Поиски контура зацикливания не увенчались успехом. Поменял always на assign (там где не память а комб. логика естесственно) и все заработало как положено. Вот и призадумался... Я тоже сталкивался с зацикливанием ActiveHDL при использовании always @(*). Заменил (*) на список чувствительности в явной форме, и зацикливаться перестал. Квартус синтезировал этот код без предупреждений и в том и в другом случае. Похоже на ошибку в ActiveHDL. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 4 февраля, 2015 Опубликовано 4 февраля, 2015 · Жалоба Помогите разобраться, или ткните носом в подходящую статью - в чем принципиальная разница между assign и always@* в случае непрерывного присвоения? Для синтеза разницы нет, для моделирования разница большая. assign это длительное присвоение, always - процесс, в котором реализуется процедурное присвоение. Назначения в них идут в разные очереди обработки событий и исполняются в разные моменты модельного времени. Лучше всего почитать в стандарте в разделах Scheduling semantics, Assignment statements-> Continuous assignments и Procedural assignments. Реализация событийного шедулера в разных симуляторах может быть разная, потому один виснет, а другой нет :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 4 февраля, 2015 Опубликовано 4 февраля, 2015 · Жалоба Помогите разобраться, или ткните носом в подходящую статью - в чем принципиальная разница между assign и always@* в случае непрерывного присвоения? Статья называется "IEEE Std 1364-2001 IEEE Standard Verilog® Hardware Description Language" Разница лишь в том, что при непрерывном присваивании можно использовать указание силы "drive strength", которая может быть полезна при моделировании всяких там емкостно-резистивных динамических цепей, ключей, и т.п. Зациклиться могут и те, и эти одинаково, ставьте задержку (#1) в присваивание, чтобы гарантированно не циклилось... С ней быстро поймаете, где этот цикл. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 4 февраля, 2015 Опубликовано 4 февраля, 2015 · Жалоба Зациклиться могут и те, и эти одинаково, ставьте задержку (#1) в присваивание, чтобы гарантированно не циклилось... С ней быстро поймаете, где этот цикл. Вроде #0 тоже активизирует шедулер к переходу на следующий дельта-цикл. А вообще мне не нравятся всякие #T, особенно в SV коде, но порой без них никуда :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 4 февраля, 2015 Опубликовано 4 февраля, 2015 · Жалоба ИМХО гораздо прикольнее что топик стартер пихает в сигнал булево значение assign dec_sbrc = ({instruction[15:9], instruction[3]} == `SBRC) && decoder_en; фактически это assign dec_sbrc = (({instruction[15:9], instruction[3]} == `SBRC) && (decoder_en != 0)); и ничего синтезатор прожевал и все сделал:) забавно... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 4 февраля, 2015 Опубликовано 4 февраля, 2015 · Жалоба ИМХО гораздо прикольнее что топик стартер пихает в сигнал булево значение а в чем проблема то ? все по стандарту. у меня в коде всякие &&, || и т.д. практически отсутствуют. В Верилоге нет типа boolean, значения сравнений приводятся к однобитному сигналу, поэтому и разницы почти нет. UPD. и сигнал decoder_en 99.9% однобитный :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться