реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Как ускорить компиляцию проекта на квартусе, при этом не уронив fmax
iiv
сообщение Mar 18 2011, 20:47
Сообщение #1


вопрошающий
*****

Группа: Свой
Сообщений: 1 726
Регистрация: 24-01-11
Пользователь №: 62 436



Всем привет,

есть незадачка - мой системверилог проект очень долго компилится (2-5 часов) и не всегда его fmax бывает приемлим.

Сам проект - всего-то около 600 строк без ниоса и наворотов, используется только мегафункции памяти (M9K, M144), altpll и altmult_add.

В самом проекте есть два параметра, назову из K и M, где K - это объем кольцевого буффера памяти, M - число использующихся умножителей.

Если K примерно 70% от всей доступной памяти, M - 10% от всех доступных умножителей, fmax на основной клок получается хороший (490МГц). Компилится все около часу на хорошем i5.

Если
1) K примерно 10-20% от всей доступной памяти, M - любое, или
2) K и M примерно по 30%,
fmax получается еще приемлимый, окло 400МГц (мне не меньше надо) но компилится уже около 2-5 часов.

Если я пытаюсь задействовать почти все умножители и хотя бы 70% памяти, то обычно квартус через 1-2 часа падает со своей какой-то внутренней ошибкой или через 5-7 часов все-таки заканчивает работу, но fmax получается очень маленьким - около 300МГц.

Алгоритмически все упирается в одну простую конструкцию:
Код
...
parameter   N=42;
input                   Clk;
input       [13:0]      In[0:2];
...

reg  signed [13:0]      D[0:2][0:1];
reg  signed [13:0]      Data[0:2][0:N];
wire signed [31:0]      ScalY[0:8][0:N-1];

...

// Generating modules

generate
genvar i, j, k;
for(i=0; i<N; i+=2) begin : aaa
   for(j=0; j<3; j++) begin : bbb
     for(k=0; k<3; k++) begin : ccc
       MultOne MultOne_Module(Clk, D[j][0], D[j][1], Data[k][i], Data[k][i+1], Clk2, ScalY[j+3*k][i], ScalY[j+3*k][i+1]);
end end end
endgenerate

...


module MultOne(Clk, A1, A2, B1, B2, Clk2, Res1, Res2);
parameter SHR=18;
input Clk, Clk2;
input signed [13:0] A1, A2, B1, B2;
output reg signed [31:0] Res1, Res2;

reg signed [13:0] P1, P2, Q1, Q2;
reg signed [28:0] Sum;
reg signed [28:0] SumR0, SumR1, SumR2, SumDM0, SumDM1;
reg signed [28+SHR:0] ScalX1, ScalX2;
reg signed [31:0] Z_Res1, Z_Res2;

//   Sum<=P1*Q1+P2*Q2;
my_madd my_madd_module(Clk, P1, Q1, P2, Q2, Sum);

always @(posedge Clk)
begin
   P1<=A1;
   P2<=A2;
   Q1<=B1;
   Q2<=B2;
   SumR0<=Sum;
   SumR1<=SumR0;
   SumR2<=SumR1;
end

always @(posedge Clk2) // этот клок в два раза медленнее Clk
begin
   SumDM0<=SumR1;
   SumDM1<=SumR2;
   ScalX1<=ScalX1+SumDM0-(ScalX1>>>SHR);
   ScalX2<=ScalX2+SumDM1-(ScalX2>>>SHR);
   Z_Res1<=ScalX1[28+SHR:SHR-3];
   Z_Res2<=ScalX2[28+SHR:SHR-3];
   Res1<=Z_Res1;
   Res2<=Z_Res2;
end
endmodule


Как я понимаю, основная загвоздка у Квартуса возникает тогда, когда я пытаюсь поместить сотни дублей моего MultOne модуля (в мой кристал влазит 384) мне очень хочется вычислять при N=42, то есть когда задействовано 378 умножителей.

Теперь мой вопрос... Могу ли я как-то помочь квартусу, чтобы он стал быстрее компилировать, например, можно ли скомпилить сколько-то этих модулей и физически куда-то в кристалле разместить? Шаманил вокруг LogicLock Regions and Design Partitions Window, но, кажется так запутался, что ничего не могу поделать сам, поэтому прошу помощи у Вас!

Пожалуйста, посоветуйте, что мне сделать, чтобы увеличить fmax и не ждать по 5 часов на компиляцию этих нескольких строк кода!

ЗЫ: при компиляции в квартусе стоят все опции, которые ускоряют fmaxна основе адвизора! Если их отключать, компиляция конечно за пол часа заканчивается но и fmax даже до 200МГц не дотягивает!

Спасибо

И
Go to the top of the page
 
+Quote Post
Shtirlits
сообщение Mar 18 2011, 21:26
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 845
Регистрация: 18-10-04
Из: Pereslavl-Zalessky, Russian Federation
Пользователь №: 905



Ключевое слово верное - logic lock.

С квартусом лет 6 подробно не работал, но когда-то надо было отдельно синтезировать netlist,
потом один экземпляр разместить и развести, сохранить файлы и потом в основном дизайне все экземпляры расставить указывая либо все три файла, либо netlist и placement, либо только netlist.
Могут быть трудности с copy-paste-ом, так как микросхема не однородна и может понадобиться не один "штамп".
Во-первых, это позволяет зафиксировать fmax.
Во-вторых, радикально уменьшает время разработки, даже с учетом нескольких дней на чтение документации и игры с logic lock и virtual pins, так как не только ускоряет разводку, но и уменьшает количество ненужных итераций.
Go to the top of the page
 
+Quote Post
des00
сообщение Mar 19 2011, 03:56
Сообщение #3


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



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


--------------------
Go to the top of the page
 
+Quote Post
iiv
сообщение Mar 19 2011, 09:12
Сообщение #4


вопрошающий
*****

Группа: Свой
Сообщений: 1 726
Регистрация: 24-01-11
Пользователь №: 62 436



Цитата(des00 @ Mar 19 2011, 07:56) *
помочь можно только в том случае, если будет видно модуль умножения сложения. И надо понимать что на таких проекта трассы перевешивают все, поэтому регистры, регистры и еще раз регистры. На входе умножителя регистр, внутри умножителя все регистры, на выходе регистр, тоже самое с памятью и т.д.

С Вашим советом я полностью согласен, но, и модуль два умножения плюс сложение - это системная процедура altmult_add, и на входе по два регистра, и на выходе по два... Проверял - больше двух - уже не помогает. Это я уже прошел. Иначе 490МГц я бы не получал!!!

И даже если у меня только умножительный модуль, но забитый под 70-80%, то я тоже получаю необходимые мне 400МГц, и ОТДЕЛЬНО, модуль с памятью, тоже нормально работает. Кстати, у меня память работает только на 1/6 от основного клока, то есть мне достаточно клока в 66МГц на запись, а на чтение и того меньше - всего-то 15МГц.

Основная проблема возникает только при объединении двух модулей - такое чувство, что квартус не в сосотянии решить такую сложную задачу по размещению - фиттер висит по 5 часов а иногда падает с системной ошибкой.

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

Спасибо

И

Цитата(Shtirlits @ Mar 19 2011, 01:26) *
Ключевое слово верное - logic lock.

Спасибо Вам большое, разбираюсь в этом направлении, надеюсь поможет!
Go to the top of the page
 
+Quote Post
jojo
сообщение Mar 19 2011, 10:49
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 574
Регистрация: 9-10-04
Из: FPGA-city
Пользователь №: 827



Цитата(iiv @ Mar 19 2011, 12:12) *
Основная проблема возникает только при объединении двух модулей - такое чувство, что квартус не в сосотянии решить такую сложную задачу по размещению - фиттер висит по 5 часов а иногда падает с системной ошибкой.



Можно попробовать Design Space Explorer, или как он сейчас называется в Altera.
В Xilinx ISE нарвался на аналогичную проблему: на одних настройках (таблицах) MAP проект в итоге трассируется, на других - нет.
Причём при минимальных правках нужно искать новую "счастливую таблицу" из 100*5 возможных.
Проблема появилась при большом количестве плотных макросов с размещением (RPM) и большом количестве блоков ОЗУ.

Для получения fmax пришлось навтыкать "ненужные" регистры с запасом, хотя при малом тираже макросов доп. регистры не требовались.
Go to the top of the page
 
+Quote Post
iiv
сообщение Mar 19 2011, 11:11
Сообщение #6


вопрошающий
*****

Группа: Свой
Сообщений: 1 726
Регистрация: 24-01-11
Пользователь №: 62 436



Цитата(jojo @ Mar 19 2011, 14:49) *
Для получения fmax пришлось навтыкать "ненужные" регистры с запасом, хотя при малом тираже макросов доп. регистры не требовались.


один в один как у меня было, пока я в проект памяти не напихал, а сейчас и это не помогает.
Go to the top of the page
 
+Quote Post
Shtirlits
сообщение Mar 19 2011, 11:20
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 845
Регистрация: 18-10-04
Из: Pereslavl-Zalessky, Russian Federation
Пользователь №: 905



Logic lock не такой уж и сложный механизм!
Попробуйте на небольшой кошке.
Go to the top of the page
 
+Quote Post
jojo
сообщение Mar 19 2011, 13:05
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 574
Регистрация: 9-10-04
Из: FPGA-city
Пользователь №: 827



Да, и частоту в констрейнах можно уменьшить, чтобы понапрасну не ждать.

После трассировки для неправильно размещаемых элементов можно задавать (уточнять) области, где им положено быть. Это если элементы в макрос не входят.
Go to the top of the page
 
+Quote Post
iiv
сообщение Mar 19 2011, 14:21
Сообщение #9


вопрошающий
*****

Группа: Свой
Сообщений: 1 726
Регистрация: 24-01-11
Пользователь №: 62 436



Благодарю Вас за ответы и советы!

Цитата(jojo @ Mar 19 2011, 17:05) *
Да, и частоту в констрейнах можно уменьшить, чтобы понапрасну не ждать.

и так по минимуму sm.gif


Цитата(jojo @ Mar 19 2011, 17:05) *
После трассировки для неправильно размещаемых элементов можно задавать (уточнять) области, где им положено быть. Это если элементы в макрос не входят.

Будьте любезны, разъясните, пожалуйста, как это делается. Вот получил я, например, fmax=330MHz вместо ожидаемых 400МГц. И как я это исправлю, куда смотреть?

Спасибо
Go to the top of the page
 
+Quote Post
jojo
сообщение Mar 19 2011, 15:33
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 574
Регистрация: 9-10-04
Из: FPGA-city
Пользователь №: 827



Цитата(iiv @ Mar 19 2011, 17:21) *
Будьте любезны, разъясните, пожалуйста, как это делается. Вот получил я, например, fmax=330MHz вместо ожидаемых 400МГц. И как я это исправлю, куда смотреть?


Нужно сопоставлять отчёт анализатора задержек (Timequest др.) и вид проблемного пути на кристалле (FloorPlan Editor и т.п.).

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

Ресурсы ПЛИС расположены немонотонно, например, узкими колонками, простым констрейном размещения дело может не обойтись. В этом случае добавляем в конвейер пустые регистры, которые по алгоритму вроде не нужны, но задержку сокращают.

Покажите, если можете, аналогичную картинку своего проекта с подсвечиванием сбойных путей.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
iiv
сообщение Mar 19 2011, 19:47
Сообщение #11


вопрошающий
*****

Группа: Свой
Сообщений: 1 726
Регистрация: 24-01-11
Пользователь №: 62 436



Уважаемый jojo,

очень Вам благодарен за классные советы и разъяснения.

Я, к сожалению, новичек в квартусе (только один год опыта) и, некоторые вещи пока еще не знаю.

Цитата(jojo @ Mar 19 2011, 19:33) *
Покажите, если можете, аналогичную картинку своего проекта с подсвечиванием сбойных путей.


вот как это сделать, не понимаю. Допустим у меня есть собранный проект.
; Logic utilization ; 50 % ;
; Combinational ALUTs ; 23,937 / 113,600 ( 21 % ) ;
; Memory ALUTs ; 84 / 56,800 ( < 1 % ) ;
; Dedicated logic registers ; 60,800 / 113,600 ( 54 % ) ;
; Total registers ; 60800 ;
; Total block memory bits ; 4,131,624 / 5,630,976 ( 73 % ) ;
; DSP block 18-bit elements ; 210 / 384 ( 55 % ) ;

Это последний из максимальных, который у меня собирается, но его fmax=398MHz (85С) и 420МГц (0С), то есть чуть-чуть меньше, чем надо. Я кстати заметил, что хоть кристалл и до 60С разогревается во время работы, но данные бывают битые, если fmax меньше 420МГц, хотя у меня клок системы через плл из плиски задается и составляет ровно 400МГц. Возможно где-то нестабильность имеется, ну да ладно, главное я знаю на какую частоту мне все затачивать.

По спидгрейдам кристалла, умножители могут работать до 490МГц, все остальное - совсем простое - суммы примерно 40 битных чисел, работающие на полуклоке, то есть на 200МГц от основного клока.

Вот получил я Technology Map Viewver на 615 страницах sm.gif или Resource Property Editor с огромным числом информации, большая часть которой мне не понятна, или получил картинку от Chip Planner, красивая конечно, но что мне с ней делать, можно по разному ее покрасить, но путей там не видно... Если FanIn кнопку нажимаю, получается сначала какое-то мессиво, а потом квартус зависает с полной загрузкой компьютера. Это здесь именно я должен был увидеть картинку сбойных путей, подскажите, мне, если Вас не затруднит, пожалуйтса!

ЗЫ: вроде и компьютер не совсем тормознутый, 2*2.2ГГц с 8 ГБ оперативки.

Спасибо

И
Go to the top of the page
 
+Quote Post
jojo
сообщение Mar 19 2011, 21:17
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 574
Регистрация: 9-10-04
Из: FPGA-city
Пользователь №: 827



Возможно, из-за дрожания тактового сигнала данные сбиваются.

Я сейчас больше с Xilinx работаю. По памяти, вроде надо в Timequest провести анализ путей на Fmax, потом построить список путей в отчёте, потом нажать на сбойный путь и сделать Locate in Chip Planner. Там подсветятся ресурсы сбойного пути. Наверное, можно прямее сделать это же.

В том же отчёте TimeQuest можно увидеть, из чего складывается задержка. Нажмите на сбойный путь и Locate in Technology Map Viewer.

Что-то в документации должно быть на эту тему.

Надо либо законстрейнить положение, либо добавить регистры, либо перестроить сбойный путь.
Go to the top of the page
 
+Quote Post
bogaev_roman
сообщение Mar 20 2011, 10:50
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082



Цитата(iiv @ Mar 19 2011, 22:47) *
Если FanIn кнопку нажимаю, получается сначала какое-то мессиво, а потом квартус зависает с полной загрузкой компьютера. Это здесь именно я должен был увидеть картинку сбойных путей

Что именно мешает посмотреть все критические пути на timequest анализатор? Там все расписано подробно - посмотрите примерно в каких пропорциях задержки критичекого пути распределены - если большие задержки на IC (т.е. от элемента до элемента) то советую идти по пути partition и logic lock, то что Shtirlits советовал. Если основные задержки на самих элементах - то только переделка самого алгоритма.
Go to the top of the page
 
+Quote Post
slawikg
сообщение Mar 20 2011, 14:17
Сообщение #14


Частый гость
**

Группа: Свой
Сообщений: 135
Регистрация: 31-07-06
Пользователь №: 19 224



Цитата
По спидгрейдам кристалла, умножители могут работать до 490МГц, все остальное - совсем простое - суммы примерно 40 битных чисел, работающие на полуклоке, то есть на 200МГц от основного клока.

Непонятно как у вас законстрейнена времянка, цепи из цитаты должны быть ослабланы мультициклами.
Go to the top of the page
 
+Quote Post
bogaev_roman
сообщение Mar 20 2011, 14:28
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082



Цитата(iiv @ Mar 19 2011, 22:47) *
По спидгрейдам кристалла, умножители могут работать до 490МГц, все остальное - совсем простое - суммы примерно 40 битных чисел, работающие на полуклоке, то есть на 200МГц от основного клока.

Да, кстати, вот это очень интересное место. Еще не понятно как раскидал фиттер эту сумму. Ну и как у Вас чатоты в проекте соотносятся или Вы работаете на основной частоте, а 200МГц получаете используя разрешающий сигнал на триггер?
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th June 2025 - 09:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.01499 секунд с 7
ELECTRONIX ©2004-2016