Jump to content

    
Sign in to follow this  
alexPec

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

Recommended Posts

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

Задача такая: надо за 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-х ?

Share this post


Link to post
Share on other sites

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

 

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

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

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

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

 

Удачи! Rob.

Share this post


Link to post
Share on other sites
Цитата

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

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

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

 

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

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

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

 

Удачи! Rob.

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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-блока только один

 

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

Share this post


Link to post
Share on other sites
41 минуту назад, TRILLER сказал:

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

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

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

3. Знаковые

 

Цитата

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

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

Share this post


Link to post
Share on other sites

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

в первый такт

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

Share this post


Link to post
Share on other sites

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

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.           

Share this post


Link to post
Share on other sites
1 час назад, alexPec сказал:

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

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

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

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

 

Share this post


Link to post
Share on other sites

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

8 minutes ago, stealthisname said:

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

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


Удачи! Rob.

Share this post


Link to post
Share on other sites
Только что, RobFPGA сказал:

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

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

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

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

Удачи! Rob.

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

Share this post


Link to post
Share on other sites

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

Just now, stealthisname said:

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

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

 

Успехов! Rob.

Share this post


Link to post
Share on other sites

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

5 minutes ago, krux said:

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

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

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

 

Удачи! Rob.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this