|
|
  |
Как заставить Квартус явно продублировать регистры?, чтобы убрать слаки (много) |
|
|
|
Apr 28 2011, 13:39
|
вопрошающий
    
Группа: Свой
Сообщений: 1 726
Регистрация: 24-01-11
Пользователь №: 62 436

|
Всем привет, есть одна незадачка, которую мы с Вами вместе уже ни один раз обсуждали на форуме и мне многие из Вас мне помогли за что я всем Вам сильно благодарен. Сейчас имеется один затык, который не могу пройти. Алгоритмически мне надо выполнить такую операцию. Пусть (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 и, естественно, на плиске  Что получается, я имею на входе модуля по клоку 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 минут... Можно ли заставить Квартус явно продублировать содержимое конвейера, возможно после этого слаки уйдут, или тут надо применить какую-то еще более хитрую стратегию, пожалуйста, посоветуйте! Спасибо ИИВ
|
|
|
|
|
Apr 28 2011, 14:15
|
Профессионал
    
Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079

|
Цитата(iiv @ Apr 28 2011, 18:12)  Спасибо!!! А ларчик просто открывался... Пошел читать как это правильно сделать. Только у Вас размерности в массивах перепутаны. Ну, это не страшно, работать будет также, но размерности по старшинству идут так (3 - самая старшая): 1 0 reg 3 2 Поэтому, на мой взгляд, логичней, сдвиговый регистр представлять так: Код reg signed [13:0] Data[42:0][2:0]; То есть, сдвиговый регистр - это массив, в ктором 43 элемента, кажый из которых - это массив, в котором 3 элемента, каждый из которых - знаковое 14-битное число. Как-то так.  P.S. Да, писать [2:0] или [0:2] - дело вкуса, но я всегда за одинаковую запись.
--------------------
|
|
|
|
|
Apr 28 2011, 14:24
|
вопрошающий
    
Группа: Свой
Сообщений: 1 726
Регистрация: 24-01-11
Пользователь №: 62 436

|
Цитата(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-битное число. Как-то так.  Согласен! Как-то не задумывался об этом.
|
|
|
|
|
Apr 28 2011, 14:56
|
Профессионал
    
Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082

|
Цитата(des333 @ Apr 28 2011, 18:42)  Лично я не люблю загромождать код всевозможными настройками. Видел один проект, где в top-level'е, написанном на Verilog'e, человек всю распиновку и все настройки расписал - мало приятное зрелище.  Я так делаю, когда приходится мучаться с partition и их очень много, при этом все IO куски приходится отдельно компилировать, а потом вставлять в топовый модуль. Приходится переназначать в каждом куске выводы, что не очень удобно + как с виртуальными пинами быть, назначать их через assign долго, прописывать в qsf руками тоже долго. Хотя согласен - выглядит не очень красиво, некая смесь RTL и constraints.
|
|
|
|
|
Apr 28 2011, 15:15
|
вопрошающий
    
Группа: Свой
Сообщений: 1 726
Регистрация: 24-01-11
Пользователь №: 62 436

|
Цитата(bogaev_roman @ Apr 28 2011, 19:39)  Можно, кстати, сие действие явно прямо в описании для конкретных регистров указать посредством synthesys_altera_attribut Класс, спасибо! Это мне совсем по душе! Скажите, пожалуйста, не до конца понял чем keep от preserve отличается, и что правильнее в случае самопально организованного конвейера мне надо использовать? Спасибо!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|