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

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;

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


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

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

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

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

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


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

30 minutes ago, andrew_b said:

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

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

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


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

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

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

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

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

пишите на VHDL

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

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


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

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;

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

 

 

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


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

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

s := s + resize(v(i downto i), l);

Можно обойтись и без вызова функции.

s := s + unsigned'('0' & v(i));

 

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


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

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

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


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

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

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


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

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:

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


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

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щик слился)

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


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

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. Чего не скажу про работу с векторами/разрядностями.

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


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

20 minutes ago, Nick_K said:

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

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

Quote

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

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

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


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

6 minutes ago, des00 said:

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

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

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


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

9 minutes ago, Nick_K said:

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

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

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


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

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

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

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

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


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

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

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

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

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

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

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

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

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

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