Nick_K 0 23 октября, 2019 Опубликовано 23 октября, 2019 · Жалоба 8 hours ago, Timmy said: При этом арифметика на VHDL внезапно получается проще и надёжнее, чем на Верилог, но вот про чистую логику этого сказать нельзя. Мне чисто из любопытства: а почему, по-вашему, арифметика на VHDL "проще и надёжнее"? Я просто после 5+ лет на VHDL могу сказать наоборот: в SV проще делать любую арифметику (в часности не критичную к размерностям), а на VHDL идеально продумана работа с логикой и размерностями. Чего только стоит простейшая и в то же время очень мощная конструкция объявления сигналов по длинне другого (возможно реконфигурируемого) сигнала: signal ram_data_out : std_logic_vector(ram_data_in'range) := (others => '0'); увы, на SystemVerilog увы можно сделать только так: logic [$bits(ram_data_in) - 1 : 0] ram_data_out; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 23 октября, 2019 Опубликовано 23 октября, 2019 · Жалоба 35 минут назад, Nick_K сказал: в SV проще делать любую арифметику (в часности не критичную к размерностям) И огребать варгинги на ровном месте? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 23 октября, 2019 Опубликовано 23 октября, 2019 · Жалоба 30 minutes ago, andrew_b said: И огребать варгинги на ровном месте? Ну варнинги и что? Не на все варнинги нужно обращать внимание - это первое. Второе: можно заигнорировать некоторые варнинги и делов. Я перфекционист, но не настолько, чтобы усложнять себе жизнь ненужными конструкциями или лишней избыточностью кода только "чтобы небыло варнингов". В противном случае - пишите на VHDL, там так же будет писанины и минимум варнингов Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 23 октября, 2019 Опубликовано 23 октября, 2019 · Жалоба Только что, Nick_K сказал: Не на все варнинги нужно обращать внимание В шуме можно пропустить полезный сигнал. Только что, Nick_K сказал: пишите на VHDL Именно это я и делаю. Но приходится иметь дело и с Верилогом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 23 октября, 2019 Опубликовано 23 октября, 2019 · Жалоба 5 hours ago, Nick_K said: Мне чисто из любопытства: а почему, по-вашему, арифметика на VHDL "проще и надёжнее"? Я просто после 5+ лет на VHDL могу сказать наоборот: в SV проще делать любую арифметику (в часности не критичную к размерностям), а на VHDL идеально продумана работа с логикой и размерностями. Чего только стоит простейшая и в то же время очень мощная конструкция объявления сигналов по длинне другого (возможно реконфигурируемого) сигнала: signal ram_data_out : std_logic_vector(ram_data_in'range) := (others => '0'); увы, на SystemVerilog увы можно сделать только так: logic [$bits(ram_data_in) - 1 : 0] ram_data_out; На примере задачи из топика: function bitsum(v:unsigned; l:natural) return unsigned is variable s:unsigned(l-1 downto 0); begin s := to_unsigned(0, l); for i in v'range loop s := s + resize(v(i downto i), l); end loop; return s; end function; И попробуйте сделать такую же удобную в использовании функцию общего вида на Верилоге. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 23 октября, 2019 Опубликовано 23 октября, 2019 · Жалоба 1 час назад, Timmy сказал: s := s + resize(v(i downto i), l); Можно обойтись и без вызова функции. s := s + unsigned'('0' & v(i)); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 23 октября, 2019 Опубликовано 23 октября, 2019 · Жалоба 2 hours ago, Timmy said: И попробуйте сделать такую же удобную в использовании функцию общего вида на Верилоге. На Верилоге чистом очень проблемно, я и не спорю. На SystemVerilog: logic [l-1 : 0] s_v; always_comb begin s_v = '0; foreach(s[i]) s_v += {s[i]}; end Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 23 октября, 2019 Опубликовано 23 октября, 2019 · Жалоба 11 hours ago, Nick_K said: На Верилоге чистом очень проблемно, я и не спорю. На SystemVerilog: logic [l-1 : 0] s_v; always_comb begin s_v = '0; foreach(s[i]) s_v += {s[i]}; end Примеры не эквивалентны. в постановке задачи написано что должна быть функция. Аналога этой функции в V/SV нет, т.к. используется VHDL фича, заложенная в объявлении типа unsigned и возможность декларации переменной, разрядность которой, задается в параметре вызова функции. В вашем же случае, это просто код уровня модуля и он такой будет и в V/SV. Изменится только тип цикла. Но, при синтезе, все равно эта VHDL функция должна быть с априори известным числом, задающем разрядность, поэтому тут чисто удобство описания. В V/SV, если для синтеза, это может быть описано через шаблоны функций, реализованных на модулях/интерфейсах, для моделирования шаблон на модулях/интерфейсах/классах либо перевод в неупакованные массивы и использование функции редуцирования массивов sum. ЗЫ. Повторюсь, говнокод определяется не тем языком, на котором описывают схему, а тем какую именно схему им описывают ЗЗЫ. А с какой версии софта от вендоров, foreach стал синтезируемым? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 24 октября, 2019 Опубликовано 24 октября, 2019 · Жалоба 6 hours ago, des00 said: Аналога этой функции в V/SV нет, т.к. используется VHDL фича, заложенная в объявлении типа unsigned и возможность декларации переменной, разрядность которой, задается в параметре вызова функции. Прям аналога и вправду нет, но зачем? Выходное значение функции на VHDL - сигнал типа unsigned разрядностью l то же самое и тут, только разрядность уже можно выбрать в месте присвоения далее по коду. ИМХО на SV и компактнее и проще в описании и понятнее (как минимум нет необходимости создавать именно функцию где-то там, хотя и синтаксис нужно учитывать). 6 hours ago, des00 said: А с какой версии софта от вендоров, foreach стал синтезируемым? В Vivado 18.3 я уже вроде бы синтезировал, в 19.1 уже полным ходом юзаю. А вообще на форумах (та же verification academy) есть записи конца 2016 года. Но точно не скажу. 6 hours ago, des00 said: Повторюсь, говнокод определяется не тем языком, на котором описывают схему, а тем какую именно схему им описывают Всё же не какую схему важнее, а именно как её описать. Вот где искусство говнокодирования раскрывается в полной силе Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 24 октября, 2019 Опубликовано 24 октября, 2019 · Жалоба 8 minutes ago, Nick_K said: ИМХО на SV и компактнее и проще в описании и понятнее (как минимум нет необходимости создавать именно функцию где-то там, хотя и синтаксис нужно учитывать). но не по месту. функции на все возможные разрядности не сделать, а именно это и было целью примера. Насчет где-то там, ну как дойдете до библиотек/пакетов функций, тогда поймете. 8 minutes ago, Nick_K said: В Vivado 18.3 я уже вроде бы синтезировал, в 19.1 уже полным ходом юзаю. А вообще на форумах (та же verification academy) есть записи конца 2016 года. Но точно не скажу. Понятно. Ну хорошо что для старых чипов вам работать не придется, а то весь код нужно будет корчевать. 8 minutes ago, Nick_K said: Всё же не какую схему важнее, а именно как её описать. Вот где искусство говнокодирования раскрывается в полной силе Ну вам виднее, но все же спорное утверждение. на форуме есть тема AHDL vs SV, почитайте на досуге, довольно интересно. Правда AHDLщик слился) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 24 октября, 2019 Опубликовано 24 октября, 2019 · Жалоба 2 minutes ago, des00 said: Понятно. Ну хорошо что для старых чипов вам работать не придется, а то весь код нужно будет корчевать. У меня сейчас 2 полных проекта лежит в поддержке на Spartan-6 /*лирическая пауза*/ хорошо что там всё написано на VHDL 4 minutes ago, des00 said: функции на все возможные разрядности не сделать, а именно это и было целью примера. Ещё раз, а зачем на все возможные разрядности? Foreach принимает вектор с его размером и уже с ним работает. Не важно какой он длинны... Или я не могу понять о чём речь. 5 minutes ago, des00 said: Насчет где-то там, ну как дойдете до библиотек/пакетов функций, тогда поймете. И этого добра вагон. Хотя пакеты в VHDL действительно приятнее в инициализации. И вообще, не поймите меня привратно - я не противник VHDL, и не сторонник SV. Просто я указал, что мне кажется, писать арифметические операции на SV проще, чем на VHDL. Чего не скажу про работу с векторами/разрядностями. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 24 октября, 2019 Опубликовано 24 октября, 2019 · Жалоба 20 minutes ago, Nick_K said: Ещё раз, а зачем на все возможные разрядности? Foreach принимает вектор с его размером и уже с ним работает. Не важно какой он длинны... Или я не могу понять о чём речь. Еще раз. Вы привели код, тела модуля. А задача стояла сделать функцию, которая считает количество единичных бит в векторе любой длинны. Причем универсальную функцию, а не функцию конкретного модуля(!!!) Сложность не посчитать, сложность передать. Типы аргументов функции должны быть статические, динамические типы, ссылки, классы, не синтезируемы. Вот эту особеность VHDL вам привели. Quote И вообще, не поймите меня привратно - я не противник VHDL, и не сторонник SV. Просто я указал, что мне кажется, писать арифметические операции на SV проще, чем на VHDL. Чего не скажу про работу с векторами/разрядностями. Проще, особенно если выучить 2 страницы стандарта, о правилах автоматического приведения типов. Но тут уж на вкус и цвет все фломастеры разные. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 24 октября, 2019 Опубликовано 24 октября, 2019 · Жалоба 6 minutes ago, des00 said: А задача стояла сделать функцию, которая считает количество единичных бит в векторе любой длинны. Ну тогда понятно. Если нужна прямо функция, которую нужно где-то объявить, инициализировать, описать и только потом использовать, тогда Верилог в этом не поможет. Хотя зачем такие сложности для описания обычного кода? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 24 октября, 2019 Опубликовано 24 октября, 2019 · Жалоба 9 minutes ago, Nick_K said: Ну тогда понятно. Если нужна прямо функция, которую нужно где-то объявить, инициализировать, описать и только потом использовать, тогда Верилог в этом не поможет. Хотя зачем такие сложности для описания обычного кода? чтобы часто не делать одинаковые функции, но для разных типов данных, отличающихся только длинной. Да, есть несколько вариантов обхода этого, но они не универсальные. Тогда как VHDL вариант универсален. Кстати, ввести подобную фичу в стандарт(что-то вроде logic[$]), предлагалось, но было отвергнуто коммитетом. Причину писал пользователь @CaPpuCcino , но я уже не помню детали. А самого @CaPpuCcino давно не видно на форуме. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 24 октября, 2019 Опубликовано 24 октября, 2019 · Жалоба Вот ещё простой пример с арифметикой, где VHDL удобнее: надо умножить две переменных произвольной разрядности, записав результат в другую переменную произвольной разрядности, с выравниванием по старшим битам, при необходимости обрезав лишние младшие биты, либо дополнив недостающие младшие биты нулями. Для этой достаточно типичной операции я написал универсальную функцию align_left, которую можно вызвать: c := align_left(a * b, c'length); А вот с Верилогом, кажется, придётся мудрить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться