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

Как лаконично описывать конвейеры ?

2 hours ago, Leka said:

Но это повезло, что синтезатор понял. С двухпортовой не получилось, отрапортовал о нехватке ресурсов.

посмотрите, как описывать двухпортовую память в кодинг-стилях в хелпе на синтезатор - для ПЛИС все они умеют - нужно только придерживаться стиля описания (для разных ПЛИС - например, ксайлинс/альтера может быть разное описание из-за ограничений DP RAM в железе)

 

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


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

53 minutes ago, yes said:

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

Знаю, как правильно - просто попробовал, поймет ли синтезатор выходной код после транслятора (сильно отличается от стандартного кодинг-стиля).

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


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

Кстати, по поводу макросов.

Можно ли так определить макрос "`define A(...) ... ", чтобы он создавал новый макрос "`define B(...) ..."  ?

В препроцессоре Си так можно делать (хотя и забыл уже, как именно), в V/SV не получилось.

 

По поводу использования макросов. 

Правильно ли понимаю, что функции и таски не могут заменить полноценные макросы, тк не могут обращаться к внешним переменным, минуя аргументы ?

Правильно ли понимаю, что единственная возможность определить произвольный макрос - через "`define" ? 

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


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

Для чего это нужно. Пусть модуль инстанцируется через макрос "`m(a)". Этот макрос, помимо самого инстанса и объявлений переменных, создает другие макросы вида "а(...)", которые позволяют обращаться к портам модуля без их явного указания.  

Как это делать средствами V/SV ?  

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


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

"2D-песочница" - удобная задачка для экспериментов с HDL - очень простая для Си, и непростая для синтезируемого HDL. 

Можно постепенно усложнять алгоритм, и выявлять новые недостатки языка синтеза со всеми надстройками.

 

Простые вложенные циклы на Си вида "for(i=...)for(j=...){...}" легко привести в одиночный цикл "for(i =..., j =…){...}", 

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

А вот с вложенными циклами вида "for(i=...){...while(...){...}}" опять возникла проблема лаконичного описания.

 

На чистом синтезируемом Верилоге описывать алгоритм работы множества конвейеров со множеством массивов - это уровень 50-х годов прошлого века, когда вручную считали запуски спутников.

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


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

On 12/5/2021 at 3:10 PM, Leka said:

А вот с вложенными циклами вида "for(i=...){...while(...){...}}" опять возникла проблема лаконичного описания.

Разобрался, как лаконично описывать - также, как и операторы for(;;) в Си, выкинуть только понятие "тело цикла".

Разворачивается все это в последовательную цепочку конвейеров с блокировкой.

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


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

Где-то ошибка у меня в знаковой математике - "2D-песочница" на Си и синтезируемом HDL почему-то по-разному ведет себя при одинаковых исходных данных и одинаковой (если не напутал) математике. Сравниваю на самом простом примере, маятнике.

Раньше уже наступал на эти грабли (знаковая математика в HDL), поэтому обычно стараюсь свести все к беззнаковому представлению. Тут так не получится, придется разобраться.   

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


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

On 12/18/2021 at 3:33 PM, Leka said:

Где-то ошибка у меня в знаковой математике

Знаковая математика с фиксированной точкой, с умножениями.

В программе на Си и в симуляторе Icarus Verilog (синтезируемый код) все работает, как надо.

Квартус же при синтезе просто выкидывает весь этот кусок дизайна, сажая соответствующие выходы на 0.

Если убираю все описатели "signed" - этот кусок остается, но работает, конечно, неправильно.

Получается, надо вручную прописывать такую математику (объявляя все данные, как "unsigned") ?

 

 

Изменено пользователем Leka

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


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

Правильный знаковый умножитель описан на стр. 812 в Quartus Prime Standard Edition Handbook Volume 1, в параграфе 12.3.1.

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


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

22 hours ago, blackfin said:

Правильный знаковый умножитель описан ...

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

Сделал беззнаковое умножение с рукопашным учетом знака - синтезируется, работает в железе

(хотя некоторые странности остаются).

 

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


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

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

Не могу понять, какие вообще м/б причины, по которым замена "unsigned" на "signed" приводит к выкидыванию всей этой арифметики. Условных операций там нет, код простой, примерно:

	x2=dx*dx;  y2=dy*dy;
	x=x2>>E;  y=y2>>E;
	r=(x+y)-(1<<E);
	x2=dx*r;  y2=dy*r;
	x=x2>>E;  y=y2>>E;
	

 

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


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

50 minutes ago, Leka said:

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

Не могу понять, какие вообще м/б причины, по которым замена "unsigned" на "signed" приводит к выкидыванию всей этой арифметики. Условных операций там нет, код простой, примерно:

Для сдвига числа со знаком нужно использовать оператор: x=x2 >>> E;

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


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

2 hours ago, blackfin said:

Для сдвига числа со знаком нужно использовать оператор: x=x2 >>> E;

Да, использую ">>>", тут просто опечатался.

Сделал знаковое умножение через мегафункцию, в самом дизайне все "unsigned", не работает та часть дизайна, которая зависит от арифметики с умножением (выходы сидят на 0), хотя умножители синтезируются.

Где-то дурацкая ошибка у меня, сейчас уже удивляет, почему работает вариант с рукопашным учетом знака.

 

 

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


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

23 minutes ago, Leka said:

знаковое умножение через мегафункцию, в самом дизайне все "unsigned"

работает, исправил опечатку в коде (допустил при правке кода на использование мегафункции).

 

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


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

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

	x2=dx*r; y2=dy*r;
	x=x2>>>E; y=y2>>>E; 
	

 

так (у меня):

 

	x2(dx,r); y2(dy,r);
	x=x2; y=y2; 
	

 

с одной дополнительной строчкой в топ-модуле:

 

	`muldef(W,E) `mul(x2) `mul(y2) 
	

 

В Верилоге unsigned имеет приоритет над signed, случайно залетевший unsigned-дятел может разрушить signed-цивилизацию. Поэтому основной код д/б unsigned, это не мешает знаковой арифметике (в дополнительных кодах) с одинаковой разрядностью операндов. Где нужно signed - выделять в отдельные модули. Имхо.

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


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

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

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

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

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

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

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

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

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

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