Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как заставить Квартус явно продублировать регистры?
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
iiv
Всем привет,

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

Сейчас имеется один затык, который не могу пройти.

Алгоритмически мне надо выполнить такую операцию.

Пусть (a_{t,0}, a_{t_1}, a{t_2}) - три 14 битных знаковых числа, которые поступают на вход в момент времени t, а я хочу считать матрицу для линейных предсказаний со всевозможными комбинациями по формуле

s_{i,j,k} = \sum_{l=0,...,t} a_{l,i} a_{l-k,j}, k=0,...,42, i,j=0,1,2

и, естественно, на плиске sm.gif

Что получается, я имею на входе модуля по клоку 3 числа

reg signed [31:0] In[0:2];

загоняю их в сдвиговый массив

reg signed [13:0] Data[0:2][0:43];

always@(posedge Clk)
for(int i=0; i<3; i++)
begin
Data[i][0]<=In[i];
for(int k=0; k<43; k++)
Data[i][k+1]<=Data[i][k];
end

а потом для всех возможных пар вычисляю мегафункцией произведение Data[i][k]*Data[j][0] попутно конечно учитывая то, что стратикс может эффективно только пару умножений и следом идущее сложение вычислять и много остальных ньюансов как то регистровасть умножения и результата...

Если я вычисляю такую корреляцию для маленького числа сдвигов, то есть умножений, мой фмакс получается близким к аппаратному 490МГц и слаков нет даже если я клок поставлю 475МГц. Мне хочется иметь клок 400МГц для большого числа сдвигов, а именно 42, то есть задействовать 378 умножителей. Но, в этом случае, у меня вылезают слаки от Data[j][0] до мегафункции.

И действительно, Data[j][0] должно продублироваться аж 42*3=126 раз!!!

Естественно, первым делом я засунул между Data[j][0] и мегафункией конвейер регистров, один, второй, третий... Квартус, их всех оптимизирует, видя, что они все одни и те же, но продолжает ругаться слаками между последним регистром конвейера до мегафункции... Ах да, все возможные оптимизации по времени включены на полную. Мои потуги с логик-локом пока не увенчались успехом - на кошках - все хорошо, а вот целиком все - совсем плохо, поэтому я принимаю, как данность, время сборки всего проекта в 45 минут...

Можно ли заставить Квартус явно продублировать содержимое конвейера, возможно после этого слаки уйдут, или тут надо применить какую-то еще более хитрую стратегию, пожалуйста, посоветуйте!

Спасибо

ИИВ
des333
iiv:
Можете в Assignment Editor для нужного регистра/группы регистров задать Maximum Fan-Out.
И если число фан-аутов превысит указанное, регистр будет автоматически продублирован.
bogaev_roman
Если сами руками дублируете/разбиваете, то следующие настройки надо выставить:
в physical synthesis optimization - perform register duplication
и в analysis & synthesis settings - remove duplicate registers - OFF
iiv
Цитата(des333 @ Apr 28 2011, 19:02) *
iiv:
Можете в Assignment Editor для нужного регистра/группы регистров задать Maximum Fan-Out.
И если число фан-аутов превысит указанное, регистр будет автоматически продублирован.

Спасибо!!! А ларчик просто открывался... Пошел читать как это правильно сделать.
des333
Цитата(iiv @ Apr 28 2011, 18:12) *
Спасибо!!! А ларчик просто открывался... Пошел читать как это правильно сделать.


Только у Вас размерности в массивах перепутаны.
Ну, это не страшно, работать будет также, но размерности по старшинству идут так (3 - самая старшая):
1 0 reg 3 2

Поэтому, на мой взгляд, логичней, сдвиговый регистр представлять так:
Код
reg signed [13:0] Data[42:0][2:0];


То есть, сдвиговый регистр - это массив, в ктором 43 элемента, кажый из которых - это массив, в котором 3 элемента, каждый из которых - знаковое 14-битное число. Как-то так. sm.gif

P.S. Да, писать [2:0] или [0:2] - дело вкуса, но я всегда за одинаковую запись. sm.gif
iiv
Цитата(bogaev_roman @ Apr 28 2011, 19:12) *
Если сами руками дублируете/разбиваете, то следующие настройки надо выставить:
в physical synthesis optimization - perform register duplication
и в analysis & synthesis settings - remove duplicate registers - OFF

Спасибо, это тоже идейно, так тоже попробую!

Цитата(des333 @ Apr 28 2011, 19:15) *
Только у Вас размерности в массивах перепутаны.
Ну, это не страшно, работать будет также, но размерности по старшинству идут так (3 - самая старшая):
1 0 reg 3 2

Поэтому, на мой взгляд, логичней, сдвиговый регистр представлять так:
Код
reg signed [13:0] Data[42:0][2:0];


То есть, сдвиговый регистр - это массив, в ктором 43 элемента, кажый из которых - это массив, в котором 3 элемента, каждый из которых - знаковое 14-битное число. Как-то так. sm.gif

Согласен! Как-то не задумывался об этом.
bogaev_roman
Цитата(des333 @ Apr 28 2011, 18:02) *
iiv:
Можете в Assignment Editor для нужного регистра/группы регистров задать Maximum Fan-Out.
И если число фан-аутов превысит указанное, регистр будет автоматически продублирован.

Можно, кстати, сие действие явно прямо в описании для конкретных регистров указать посредством synthesys_altera_attribut
des333
Цитата(bogaev_roman @ Apr 28 2011, 18:39) *
Можно, кстати, сие действие явно прямо в описании для конкретных регистров указать посредством synthesys_altera_attribut

Лично я не люблю загромождать код всевозможными настройками.


Видел один проект, где в top-level'е, написанном на Verilog'e, человек всю распиновку и все настройки расписал - мало приятное зрелище. sm.gif

bogaev_roman
Цитата(des333 @ Apr 28 2011, 18:42) *
Лично я не люблю загромождать код всевозможными настройками.
Видел один проект, где в top-level'е, написанном на Verilog'e, человек всю распиновку и все настройки расписал - мало приятное зрелище. sm.gif

biggrin.gif
Я так делаю, когда приходится мучаться с partition и их очень много, при этом все IO куски приходится отдельно компилировать, а потом вставлять в топовый модуль. Приходится переназначать в каждом куске выводы, что не очень удобно + как с виртуальными пинами быть, назначать их через assign долго, прописывать в qsf руками тоже долго.
Хотя согласен - выглядит не очень красиво, некая смесь RTL и constraints.
iiv
Цитата(bogaev_roman @ Apr 28 2011, 19:39) *
Можно, кстати, сие действие явно прямо в описании для конкретных регистров указать посредством synthesys_altera_attribut

Класс, спасибо! Это мне совсем по душе!

Скажите, пожалуйста, не до конца понял чем keep от preserve отличается, и что правильнее в случае самопально организованного конвейера мне надо использовать?

Спасибо!
des00
Цитата(des333 @ Apr 28 2011, 09:02) *
И если число фан-аутов превысит указанное, регистр будет автоматически продублирован.

помню долго с бубном танцевал, там надо аккуратно этот порог задавать. В итоге плюнул и все сделал руками с указанием preserve. получилось много стабильнее и быстрее %)


Цитата(iiv @ Apr 28 2011, 10:15) *
Скажите, поожалуйста, не до конца понял чем keep от preserve отличается

фразы из квартусовского хелпа сюда вставьте с вашим переводом, вместе и подумаем biggrin.gif
iiv
Ура!!! Заработало!!! fmax=407MHz (85С) совсем без слаков!!!

Всем спасибо!!!!!

А разница между

/* synthesis keep */
и
/* synthesis preserve */

оказалась в том, что keep относится в wire, а preserve - к register'ам, а, так как я их до сих пор частенько путаю, я и не уловил разницы.

ИИВ
des00
Цитата(iiv @ Apr 28 2011, 13:42) *
Ура!!! Заработало!!! fmax=407MHz (85С) совсем без слаков!!!
......

вот видишь, какой это кайф разобраться в вопросе и сделать самому, а не выпрашивать прямое решение на форуме wink.gif

ЗЫ. жду схему, помни про паровоз wink.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.