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

Быстрое умножение с накоплением

Всем доброго дня.

Задача такая: надо за 2 такта умножить много пар чисел и сложить все результаты. Много- это 256. Причем одно число 8 бит, второе 16. В вивадо решил проверить как он это сделает.

Код такой (схематично):
 

input [15:0] X [8];

input [7:0] Y[8];

reg [23:0] mult_data [8];

reg [31:0] sum;

assign s0=mult_data[0]+mult_data[1];

assign s1=mult_data[2]+mult_data[3];

assign s2=mult_data[4]+mult_data[5];

assign s3=mult_data[6]+mult_data[7];

assign s4=s0+s1;

assign s5=s2+s3;


always @(posedge clk)

begin


  sum = s4+s5;


  for (i=0;i<8;i++)

  begin

       mult_data[i] = x[i]*y[i];

  end

end

Суть думаю понятна: хочу за один такт сделать умножение, за второй все сложить. Причем сложить хочу сначала попарно, затем результат опять попарно, затем результат опять попарно, чтобы сократить цепочку логики от регистра до регистра, примерно так:

2126749371_.png.3fc003bcc86023a7c1e38839c5557323.png

При синтезе в вивадо получаю в схематике примерно такое:

 

272799186_.thumb.png.2b89da91bcc6a743443cb02a6cc55f33.png

Т.е. он все 8 суммирований производит последовательно через перенос в DSP.

Понятно, что это дольше чем в первом рисунке. Хотя и расход DSP блоков меньше.

Вопрос: как заставить вивадо последовательную цепочку ограничить, например до 2-х ?

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


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

у DSP блока вход PCIN (бит переноса старшего разряда) однобитный

в вашем видении там 2 бита должно быть

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


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

Приветствую!

 

На сколько помню в Vv нет опций синтеза для контроля длинны каcкскада  DSP. 
Зато есть опция -cascade_dsp управляющая  как реализовывать  дерево  сумматоров  - на встроенных сумматорах или деревом на обычной логике.

Так что единственный путь вручную в RTL управлять структурой умножителей/сумматоров либо через атрибуты на сигналах (типа keep, ...) либо (что IMHO надежнее)  через использование примитивов  DSP/DSP_MACRO.

Но стоит ли это делать вручную вопрос?  Вам ведь надо получить функционал и не важно как автоматом Vv  реализует это. Главное чтобы во времянку уложилось.  
А выделенные цепи переноса между DSP обычно быстрее чем при обычной коммутации через матрицу и если сумматоры в каскаде укладываются во времянку то и хорошо.

Так что попробуйте сначала реализовать ваш полный сумматор на 256 входов и оценить полученные рабочие частоты. 
Но кажется мне что для полного 256 входов сумматора 24-битных значений за один такт вы много MHz не получите (еще бы - длина крит. цепочки переноса как минимум 24+8+7). :cray:

 

Удачи! Rob.

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


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

Цитата

у DSP блока вход PCIN (бит переноса старшего разряда) однобитный

в вашем видении там 2 бита должно быть

В схематике показывает, что перенос 48бит.

 

16 минут назад, RobFPGA сказал:

Так что попробуйте сначала реализовать ваш полный сумматор на 256 входов и оценить полученные рабочие частоты. 

Но кажется мне что для полного 256 входов сумматора 24-битных значений за один такт вы много MHz не получите (еще бы - длина крит. цепочки переноса 24*8+7). :cray:

 

Удачи! Rob.

Так в том-то и дело, что даже 8 произведений за такт на ultrascale+ (speedgrade -1) на 150МГц не пролазит. Вот и пытаюсь вручную колдонуть. Ну бог с ним, за такт, я уже морально готов к 3 тактам :) Но ведь не пролезет... А больше 3 мне никак нельзя. Думал может кто знает волшебное слово для вивадо. 

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


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

Несколько вопросов:
1. Входные триггеры, от которых такты считать, можно расположить в ДСП? А выходные?
2. Сколько ДСП можно использовать и какую частоту(150?) нужно получить?
3. Операнды знаковые или без знаковые?

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


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

https://www.xilinx.com/support/documentation/user_guides/ug479_7Series_DSP48E1.pdf

вариантов имплементации умножителя-сумматора в DSP-блок два - когда он упаковывает A[24:0]*B[17:0]+C[47:0] (там возможна вставка промежуточных регистров после умножителя и/или после сумматора), либо когда он упаковывает A[24:0]*B[17:0]+PCIN[0:0]

 

посмотрите на размерность входов  DSP на вашей последней стадии сложения.

предыдущие результаты имеют разрядность 48 бит и 48 бит.

а 48-разрядный вход у DSP-блока только один

 

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

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


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

41 минуту назад, TRILLER сказал:

Несколько вопросов:
1. Входные триггеры, от которых такты считать, можно расположить в ДСП? А выходные?
2. Сколько ДСП можно использовать и какую частоту(150?) нужно получить?
3. Операнды знаковые или без знаковые?

1.Умножитель с регистром на выходе (внутри ДСП), выходной регистр за пределами ДСП.

2. ДСП можно использовать 256. Частота нужна максимальная. Сейчас сложение 7 произведений укладывается в 150МГц, 8 произведений - порядка 130МГц

3. Знаковые

 

Цитата

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

Результат всей суммы укладывается в 36 бит - это по мат. модели.

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


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

я бы попробовал запихнуть

в первый такт

s1 <= X[0]*Y[0] + X[1]*Y[1]

s2 <= X[2]*Y[2] + X[3]*Y[3]

s3 <= X[4]*Y[4] + X[5]*Y[5]

s4 <= X[6]*Y[6] + X[7]*Y[7]

во второй такт

sum <= s1+s2+s3+s4

 

первый такт полностью уложится на внутренние умножители, сумматоры и регистры DSP

второй такт ляжет на LUT+FF

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


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

Приветствую.

1 hour ago, krux said:

вариантов имплементации умножителя-сумматора в DSP-блок два

На самом деле вариантов 3. Для US+ еще возможна комбинация  P = A*B + C + PCIN. 
 

1 hour ago, alexPec said:

2. ДСП можно использовать 256. Частота нужна максимальная. Сейчас сложение 7 произведений укладывается в 150МГц, 8 произведений - порядка 130МГц

Сделайте сумматор на 4 входа (с развязками регистрами на входе и выходе), разведите в маленьком тестовом дизайне. Посмотрите какие задержки получаются на одном сумматоре и на связях между этим сумматором и следующим.  А затем умножьте на  8 (число слоев сумматоров для 256 входов).  Получите  прогноз задержек  и частоты, и скорее всего это будет лучший прогноз (сильно лучший), в заполненном дизайне задержки могут быть хуже  (если не предпринимать определенных действий).
А потом  сравните  с требуемыми вам 6.6 ns, если не влезет  пробуйте  "разбит" цепочку на 2-е по 4 добавив регистр в середину.
Если и тут не получится  то увы  за 2-3 такта на  -1 speed grade такое не сделать.   :cray: 

 

Удачи! Rob.           

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


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

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

Результат всей суммы укладывается в 36 бит - это по мат. модели.

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

2126749371_.png.3fc003bcc86023a7c1e38839c5557323.png.2cf489525b1afe8fc95a03dca9e9e600.png

если перенос с достаточной разрядностью для суммирования в DSP всего один, то такая схема не реализуемая

 

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


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

Приветствую!

8 minutes ago, stealthisname said:

если перенос с достаточной разрядностью для суммирования в DSP всего один, то такая схема не реализуемая

Что значит "не укладываются входы DSP на последней стадии сложения"? 


Удачи! Rob.

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


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

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

Что значит "не укладываются входы DSP на последней стадии сложения"? 

"Результат всей суммы укладывается в 36 бит - это по мат. модели. "

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

4 минуты назад, RobFPGA сказал:

Удачи! Rob.

Вам тоже, удачи!

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


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

Приветствую!

Just now, stealthisname said:

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

Ну так DSP может суммировать  3 числа: P = AB+C+PCIN каждое по 48 бит (AB тут не произведение а просто конкатенация входов).  

 

Успехов! Rob.

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


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

как у PCIN может быть разрядность в 48 бит я ума не приложу.

надо будет попробовать собрать. ultrascale+ говорите?

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


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

Приветствую!

5 minutes ago, krux said:

как у PCIN может быть разрядность в 48 бит я ума не приложу.

Очень просто  - PCIN это P выход предыдущего DSP в каскаде.  А просто перенос (однобитный) это CARRYIN/CARRYCASCIN  :wink2:  

То есть может быть и так P = AB+C+PCIN+CARRYIN

 

Удачи! Rob.

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


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

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

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

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

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

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

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

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

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

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