Jump to content

    

numeric_std

Recommended Posts

Nick_K
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;

Share this post


Link to post
Share on other sites

andrew_b
35 минут назад, Nick_K сказал:

в SV проще делать любую арифметику (в часности не критичную к размерностям)

И огребать варгинги на ровном месте?

Share this post


Link to post
Share on other sites

Nick_K
30 minutes ago, andrew_b said:

И огребать варгинги на ровном месте?

Ну варнинги и что? Не на все варнинги нужно обращать внимание - это первое. Второе: можно заигнорировать некоторые варнинги и делов. Я перфекционист, но не настолько, чтобы усложнять себе жизнь ненужными конструкциями или лишней избыточностью кода только "чтобы небыло варнингов". В противном случае - пишите на VHDL, там так же будет писанины и минимум варнингов :wink3:

Share this post


Link to post
Share on other sites

andrew_b
Только что, Nick_K сказал:

Не на все варнинги нужно обращать внимание

В шуме можно пропустить полезный сигнал.

Только что, Nick_K сказал:

пишите на VHDL

Именно это я и делаю. Но приходится иметь дело и с Верилогом.

Share this post


Link to post
Share on other sites

Timmy
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;

И попробуйте сделать такую же удобную в использовании функцию общего вида на Верилоге.

 

 

Share this post


Link to post
Share on other sites

Nick_K
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

Share this post


Link to post
Share on other sites

des00
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 стал синтезируемым? 

Share this post


Link to post
Share on other sites

Nick_K
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:

Повторюсь, говнокод определяется не тем языком, на котором описывают схему, а тем какую именно схему им описывают

Всё же не какую схему важнее, а именно как её описать. Вот где искусство говнокодирования раскрывается в полной силе :smile:

Share this post


Link to post
Share on other sites

des00
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:

Всё же не какую схему важнее, а именно как её описать. Вот где искусство говнокодирования раскрывается в полной силе :smile:

Ну вам виднее, но все же спорное утверждение. на форуме есть тема AHDL vs SV, почитайте на досуге, довольно интересно. Правда AHDLщик слился)

Share this post


Link to post
Share on other sites

Nick_K
2 minutes ago, des00 said:

Понятно. Ну хорошо что для старых чипов вам работать не придется, а то весь код нужно будет корчевать.

У меня сейчас 2 полных проекта лежит в поддержке на Spartan-6 /*лирическая пауза*/ хорошо что там всё написано на VHDL :smile:

4 minutes ago, des00 said:

функции на все возможные разрядности не сделать, а именно это и было целью примера.

Ещё раз, а зачем на все возможные разрядности? Foreach принимает вектор с его размером и уже с ним работает. Не важно какой он длинны... Или я не могу понять о чём речь.

5 minutes ago, des00 said:

Насчет где-то там, ну как дойдете до библиотек/пакетов функций, тогда поймете. 

И этого добра вагон. Хотя пакеты в VHDL действительно приятнее в инициализации.

И вообще, не поймите меня привратно - я не противник VHDL, и не сторонник SV. Просто я указал, что мне кажется, писать арифметические операции на SV проще, чем на VHDL. Чего не скажу про работу с векторами/разрядностями.

Share this post


Link to post
Share on other sites

des00
20 minutes ago, Nick_K said:

Ещё раз, а зачем на все возможные разрядности? Foreach принимает вектор с его размером и уже с ним работает. Не важно какой он длинны... Или я не могу понять о чём речь.

Еще раз. Вы привели код, тела модуля. А задача стояла сделать функцию, которая считает количество единичных бит в векторе любой длинны. Причем универсальную функцию, а не функцию конкретного модуля(!!!) Сложность не посчитать, сложность передать. Типы аргументов функции должны быть статические, динамические типы, ссылки, классы, не синтезируемы.  Вот эту особеность VHDL вам привели.

Quote

И вообще, не поймите меня привратно - я не противник VHDL, и не сторонник SV. Просто я указал, что мне кажется, писать арифметические операции на SV проще, чем на VHDL. Чего не скажу про работу с векторами/разрядностями.

Проще, особенно если выучить 2 страницы стандарта, о правилах автоматического приведения типов. Но тут уж на вкус и цвет все фломастеры разные.

Share this post


Link to post
Share on other sites

Nick_K
6 minutes ago, des00 said:

А задача стояла сделать функцию, которая считает количество единичных бит в векторе любой длинны.

Ну тогда понятно. Если нужна прямо функция, которую нужно где-то объявить, инициализировать, описать и только потом использовать, тогда Верилог в этом не поможет. Хотя зачем такие сложности для описания обычного кода? :smile:

Share this post


Link to post
Share on other sites

des00
9 minutes ago, Nick_K said:

Ну тогда понятно. Если нужна прямо функция, которую нужно где-то объявить, инициализировать, описать и только потом использовать, тогда Верилог в этом не поможет. Хотя зачем такие сложности для описания обычного кода? :smile:

чтобы часто не делать одинаковые функции, но для разных типов данных, отличающихся только длинной. Да, есть несколько вариантов обхода этого, но они не универсальные. Тогда как VHDL вариант универсален. Кстати, ввести подобную фичу в стандарт(что-то вроде logic[$]), предлагалось, но было отвергнуто коммитетом. Причину писал пользователь @CaPpuCcino , но я уже не помню детали. А самого @CaPpuCcino давно не видно на форуме.

Share this post


Link to post
Share on other sites

Timmy

Вот ещё простой пример с арифметикой, где VHDL удобнее: надо умножить две переменных произвольной разрядности, записав результат  в другую переменную произвольной разрядности, с выравниванием по старшим битам, при необходимости обрезав лишние младшие биты, либо дополнив недостающие младшие биты нулями. Для этой достаточно типичной операции я написал универсальную функцию align_left, которую можно вызвать:

c := align_left(a * b, c'length);

А вот с Верилогом, кажется, придётся мудрить.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.