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

Простой вопрос про инкремент

Приветствую!

О чем спорим?  И я хочу :training1:

23 hours ago, Nick_K said:

logic r_cnt = 0;

wire s_cnt = r_cnt++;

Плохой пример.  Нельзя в continuous assignment использовать ++. 

Вообще в любом языке  можно найти undefined behavioral или неоднозначности  в реализации.  Тем более в таком "гибком" как Verilog/SV. И разработчик должен знать где эти грабли лежат.  Тем более для разных вариантов реализаций - симуляции и синтза. 

В примере TC: для  сима  вариант с  cnt <= cnt++; не работает. Вернее  перемененная cnt меняет свое значение на несколько delta циклов. Так как сначала запоминаем текущее значение cnt для неблокирующего присвоения, затем блокирующее изменяет актуальное значение cnt. И затем сразу же неблокирующее устанавливает запомненное значение. Но поймать  event смены состояния cnt  в симе  при этом запросто,  так что можно устроить коллегам веселый квест :on_the_quiet2:

Вариант с  cnt <= ++cnt; работает! и оно и понятно почему.  Сначала блокирующее  поменяли cnt, а потом еще раз присвоили  себе же.

Для синтеза же оба варианта понятное дело недопустимы. 

Удачи! Rob.

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


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

2 minutes ago, RobFPGA said:

Плохой пример.  Нельзя в continuous assignment использовать ++.

А я и не использую) Задание было написать счётчик с конструкцией ++. В реальном коде я таким не страдаю, а тут написал как получилось. Опять же - на истинну не претендую.

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


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

1 час назад, Nick_K сказал:

То есть Вас не смущает, что на синтезированной схеме физически будет именно 2 сигнала

Нет, результат синтеза меня не мущает. Один и тот же результат можно получить из разного исходного кода.

Зачем вместо "интуитивно понятной" конструкции вида

always_ff @(posedge clk)
	r_cnt <= r_cnt + 1;

писать нечто иное, мне непонятно.

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


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

40 minutes ago, andrew_b said:

Зачем вместо "интуитивно понятной" конструкции вида


always_ff @(posedge clk)
	r_cnt <= r_cnt + 1;

писать нечто иное, мне непонятно.

Quote

Мы же в контексте Верилога ведём обсуждение? Покажите правильный счётчик на Верилоге с использованием оператора ++?

Как поставлено ТЗ, так и сделан проект :pardon:

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


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

21 час назад, Nick_K сказал:

Как поставлено ТЗ, так и сделан проект

Э-э, пардоньте! Так называемое "ТЗ" возникло из вашей фразы:

В 19.12.2019 в 13:47, Nick_K сказал:

В Верилоге же всё донозначно и единообразно: i++ ровно как и ++i будет синтезированно в счётчик

После чего вам и было предложено продемонстрировать счётчик на операторе ++, который реализует блокирующее присваивание в то время как реализация счётчика требует использования неблокирующего. Это был вопрос с подвохом на ваше утверждение (см. цитату), а никакое не "ТЗ".

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


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

4 hours ago, dxp said:

После чего вам и было предложено продемонстрировать счётчик на операторе ++, который реализует блокирующее присваивание в то время как реализация счётчика требует использования неблокирующего. Это было вопрос с подвохом на ваше утверждение (см. цитату), а никакое не "ТЗ".

Так а в чем проблема написать

always_ff @(posedge clk)
    cnt++;

? Будут, конечно, нюансы использования этого cnt, но сам по себе это будет вполне счетчик.

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


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

28 минут назад, alexadmin сказал:

Так а в чем проблема написать

Написать не проблема. Проблемы могут возникать из-за того, что блокирующие присваивания используются для описания последовательсной логики. Выше уважаемый @RobFPGAуже объяснил разницу. Обновление этого счётчика будет происходить не как положено в NBA регионе планировщика, а в Active регионе, из-за чего могут возникать очень подлые косяки на синхронизации. Конкретно я столкнулся с такой ситуацией. Причины проблем и пояснения там в последнем посте. Если не хочется себе проблем на разные места, лучше соблюдать правила, их же не просто так придумали.

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


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

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

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

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

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

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

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

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

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

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