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

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

Всем добра.
Столкнулся с непонятной мне вещью:

logic reset;
logic [5:0] cnt;
always_ff @(posedge clk) begin
    cnt <= reset ? '0 : cnt + 1;
end

Работает, но

always_ff @(posedge clk) begin
    cnt <= reset ? '0 : cnt++;
end

нет. Отсылка к стандарту или куда-либо ещё приветствуется.
 

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


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

про стандарт не знаю, но второй вариант немного противоречит здравому смыслу

он ведь должен развернуться в две операции: cnt <= cnt;  и  cnt <= cnt + 1; и что теперь компилятор делать должен?

может хотя бы ++cnt тогда уж.

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


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

3 minutes ago, _pv said:

он ведь должен развернуться в две операции: cnt <= cnt;  и  cnt <= cnt + 1; и что теперь компилятор делать должен?

Только не "cnt <= cnt + 1", а  "cnt = cnt + 1", как я понимаю.

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


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

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

++cnt и cnt++  работают в контексте блокирующих присвоений.   Поэтому  каша  cnt <= cnt++;   есть ни что иное как  undefined behavioral.

Если уж так хочется то можно писать  так   

logic reset;
logic [5:0] cnt;
always_ff @(posedge clk) begin
  if (reset)
    cnt = '0;
  else
    cnt++;
end

Удачи! Rob. 

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


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

8 minutes ago, alexadmin said:

Только не "cnt <= cnt + 1", а  "cnt = cnt + 1", как я понимаю.

в любом случае два раза в одной строчке делать присвоение разных значений и думать потом кто там про приоритетам победит идея так себе, даже в С.

x = x++ + ++x;

а тут ещё и блокирующее / неблокирующее поверх этого.

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


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

Это история аналогичная известному вопросу из Си: какой будет результат при i = i++;. Ответ: будет неопределённое поведение, т.к. переменная меняет значение более одного раза внутри одной точки следования. Про Верилог глубоко не копал, но думается, что он унаследовал это поведение из Си.

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


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

1 hour ago, dxp said:

Это история аналогичная известному вопросу из Си: какой будет результат при i = i++;. Ответ: будет неопределённое поведение, т.к. переменная меняет значение более одного раза внутри одной точки следования. Про Верилог глубоко не копал, но думается, что он унаследовал это поведение из Си.

Вот не нужно сейчас смешивать всё в кучу :acute:В Ся'х да и в С++ даже размер int нельзя определить точно т.к. он зависит от различных факторов. В Верилоге же всё донозначно и единообразно: i++ ровно как и ++i будет синтезированно в счётчик, а int имеет длинну 32 бита. Для тестирования - там немного всё сложнее, но всё в cтандартах описано. И если пользоваться языком с умом (читай использовать простые конструкции), то и синтез и тестбенч будет вести себя вполне очевидно. Ну а если же слепить всё в одну строку кода... В общем почитайте на форумах как таких разработчиков "любят"

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


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

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

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

Покажите правильный счётчик на ++?

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

В Ся'х да и в С++ даже размер int нельзя определить точно <...>. В Верилоге же всё донозначно и единообразно: <...> а int имеет длинну 32 бита.

 

#include <stdint.h>

uint32_t slon;

В SV int - это по сути псевдоним:

typedef bit signed [31:0] int;

прибитый гвоздями внутри компилятора. Различия по форме, но не по сути.

Никакой кучи нет. Верилог корнями сидит в Си. Отсюда и операторы, и синтаксис. И логика выражения i = i++; такая же. Подозреваю, что внутри компилятора vlog имплементация этого выражения ровно такая же, но соответственно на C/C++.

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


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

23 minutes ago, dxp said:

Покажите правильный счётчик на ++?

Что значит правильный?) Если есть инкрементация - оно всё правильное :smile:

23 minutes ago, dxp said:

uint32_t slon;

Я говорил про обычный int, а не спецтипы с различных библиотек. Точно так же я могу создать свою библиотеку с типом uint_16_my разрядностью 9 бит. Никто не запрещает - я так захотел :wink:

23 minutes ago, dxp said:

прибитый гвоздями внутри компилятора. Различия по форме, но не по сути.

Во-первых компилятор руганётся ибо пользователю нельзя использовать в объявлении зарезервированные в языке слова.

Во-вторых это Ваши гвозди. Можете с ними построить дом, а можете вколотить в гроб проекта - Ваше право.

Я же говорил про самые стандартные и очевидные расширения без шаманства.

23 minutes ago, dxp said:

Никакой кучи нет. Верилог корнями сидит в Си. Отсюда и операторы, и синтаксис. И логика выражения i = i++; такая же. Подозреваю, что внутри компилятора vlog имплементация этого выражения ровно такая же, но соответственно на C/C++.

Я не говорил, что Верилог самостоятельный язык. Я лишь сказал, что область применения Верилога, а соответственно и сущьности, кардинально отличаются от С/С++ соответственно напрямую сравнивать их неправильно. Как минимум стандартная статическая функция и различные типы присвоение (блокирующее и неблокирующее) уже вносят кардинальное отличие. А это практически базовые конструкции используемые сплошь и рядом.

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


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

22 минуты назад, Nick_K сказал:

Что значит правильный?) Если есть инкрементация - оно всё правильное :smile:

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

22 минуты назад, Nick_K сказал:

Я говорил про обычный int, а не спецтипы с различных библиотек.

stdint.h - это не библиотека. Это стандартные типы языка. То, что это не встроенные, вбитые в язык типа, а псевдонимы, сути не меняет. Смысл и суть стандартного типа, например uint32_t, в том, что его разрядность и знак строго определены во всех контекстах, что даёт предсказуемость и переносимость. В Верилоге всё встроено в язык. Там (и в SV тоже и даже в большей мере) вообще такая, имхо, не очень далёкая практика - все средства включать в язык вместо того, чтобы выносить функциональность на уровень библиотек как, например, в С++. В итоге язык получается очень костыльный и негибкий. Отсюда разница по форме описания (встроено в компилятор или вынесено во внешнее описание через стандартный заголовок), но не по сути.

 

22 минуты назад, Nick_K сказал:

область применения Верилога, а соответственно и сущьности, кардинально отличаются от С/С++ соответственно напрямую сравнивать их неправильно

Да никто их и не сравнивает. Речь шла лишь о выражении x = x++ и была проведена параллель.

22 минуты назад, Nick_K сказал:

Как минимум стандартная статическая функция

Вы имеете в виду, что в функциях Верилога по умолчанию внутренние переменные являются статическими? Ну, так напишите в описании модуля:

module automatic ...

и все функции и таски будут по умолчанию иметь автоматические переменные. И, кстати, для функций-членов классов это поведение сразу именно такое, прям как в плюсах. :)

 

22 минуты назад, Nick_K сказал:

различные типы присвоение (блокирующее и неблокирующее)

Это дань тому, что язык с нативной поддержкой параллельности. Вот это - встроенная поддержка параллельно выполняемых блоков и выражений (а это: события, планировщик, синхронизация и т.д. и т.п.), - на самом деле чуть ли не единственное ключевое отличие, конечно, кардинально меняющее подходы и суть. Остальное - в сущности косметика.

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


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

1 hour ago, dxp said:

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

И ещё раз - каждый волен писать счётчик как хочет и нравится (или как рекомендуют в темплейтах к IDE). Плюс я не уверен что Верилог поддерживает ++ конструкцию.

А вообще, если мне поставят задание, я напишу вот такой счётчик

logic r_cnt = 0;
wire s_cnt = r_cnt++;

always_ff @(posedge clk)
	r_cnt <= s_cnt;

 

1 hour ago, dxp said:

не очень далёкая практика - все средства включать в язык вместо того, чтобы выносить функциональность на уровень библиотек

А теперь давайте вспомним, чторазработчик FPGA полжен знать как работают IP ядра, знать какие настройки для синтеза/имплементации применить, задать правильно констрейны (иногда дольше возишься с констрейнами чем с самими компонентами) ну и желательно разбираться в скриптовании на tcl, дабы упростить себе жизнь/обеспечить более гибкую кросплатформенность. И к этому вы предлагаете прилепить 150 библиотек, которые нужно изучить и знать как юзать? Это же свихнуться недолго. Кстати именно поэтому задача верификации/дебага стоит как отдельная профессия. Там нужно знать всякие UVM, OVM, VMM и т.д.M со своими специфическими багами особенностями и иметь отдельный опыт, не касающийся разработки Хардвара. Вот вам отдельные библиотеки.

На всякий случай - я не ради холивара это затеял. Просто есть нюанс :wink:

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


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

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

я напишу вот такой счётчик

Использовать для счётчика целых два сигнала? Несколько странно. Чтоб врагиколлеги добрым словом вспоминали?

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

И к этому вы предлагаете прилепить 150 библиотек, которые нужно изучить и знать как юзать? Это же свихнуться недолго.

В VHDL мы как-то не страдаем от того, что всё хорошее сделано вне ядра языка.

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


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

23 minutes ago, andrew_b said:

Использовать для счётчика целых два сигнала? Несколько странно. Чтоб врагиколлеги добрым словом вспоминали?

То есть Вас не смущает, что на синтезированной схеме физически будет именно 2 сигнала: один выход с комбинаторики счётчика, второй - выход регистра. Или Вы думаете, что счётчик "встраивается" прямо в регистр? Честно особо проблем не вижу. Если проект правильно структурирован и иерархически разбит на логически завершённые компоненты, а после собран - никаких проблем не должно быть. А вот если всё нагавнокодить в один файл, тогда да... коллеги будут охреневать. А данное описание - просто привычка хорошего тона: и наглядно, и структурно, и при синтезе меньше шансов, что сумматор "улетит" куда-то внебытье.

Картинка для наглядности как оно вжизни:

Screenshot_20191219_140434.thumb.png.2f6d19202b4bd6703468cd929721c5a0.png

32 minutes ago, andrew_b said:

В VHDL мы как-то не страдаем от того, что всё хорошее сделано вне ядра языка.

А кто сказал, что нельзя сделать на SystemVerilog'е? Те же пакеты, те же классы. Просто зачем? Если возможностей языка достаточно, чтобы вести разработку и не изобретать себе "верных друзей" в других библиотеках и пакетах :wink:

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


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

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

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

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

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

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

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

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

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

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