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

Красивое решение с использованием DSP48

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

Есть такая задача. На входе имеем 32-разрядное число А и индекс N (от 0 до 38). В зависимости от индекса, число А добавляется к одному из 39 аккумуляторов B (тоже 32-х разрядных).

Т.е. B[N]+=A

Сделать это можно и просто регистром и сумматором, или с использованием памяти. Но охота сделать это на DSP48 (семейство xilinx ultrascale+), там вроде как уже есть регистр.

Как-то это можно описать в verilog или sv, чтобы vivado (2020.1) понял все вышеизложенное и реализовал это на DSP блоках, не используя регистры логики? Конечно, можно использовать IP DSP48 macro, но хотелось бы как-то более читаемо описать это верилогом или sv.

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


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

 

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

(* use_dsp48="yes" *)
reg [31:0] sig_B_dsp [0:3];

 

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

integer i;
always @(posedge clk)
begin
    for (i = 0; i < 4; i = i + 1)
    begin
        if (reset)
        begin
            sig_B_dsp[i] <= 0;
        end
        else
        begin
            if (sig_ind == i)
            begin
                sig_B_dsp[i] <= sig_B_dsp[i] + sig_A;
            end
        end
    end
end

 

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

image.thumb.png.d673e80f8ba0c0d6b59e832ce5bd03b6.png

 

я проверял на вот таком модуле:

Спойлер
module sum_with_dsp_blk
(
    input wire          clk,
    input wire          reset,
    input wire [31:0]   sig_A,
    input wire [1:0]    sig_ind,
    output wire [31:0]   sig_B_0,
    output wire [31:0]   sig_B_1,
    output wire [31:0]   sig_B_2,
    output wire [31:0]   sig_B_3
);


//
(* use_dsp48="yes" *)
reg [31:0] sig_B_dsp [0:3];

integer i;
always @(posedge clk)
begin
    for (i = 0; i < 4; i = i + 1)
    begin
        if (reset)
        begin
            sig_B_dsp[i] <= 0;
        end
        else
        begin
            if (sig_ind == i)
            begin
                sig_B_dsp[i] <= sig_B_dsp[i] + sig_A;
            end
        end
    end
end

//
assign sig_B_0 = sig_B_dsp[0];
assign sig_B_1 = sig_B_dsp[1];
assign sig_B_2 = sig_B_dsp[2];
assign sig_B_3 = sig_B_dsp[3];

endmodule

 

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


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

Супер! Спасибо!

PS что-то у меня сам DSP48 криво работает, кто использовал их, подскажите, все ли правильно сделал? Что-то он совсем не то на выход P шлет. Функция P+A*B (sel=0) или C (sel=1). Вот входы/выходы сгенеренного DSP:

396090455_2.thumb.jpg.3527d88f13102604a9b53282f0982878.jpg

Настройки IP:

1717904926_5.thumb.jpg.97f048a40326fd4727ada59f49f08d43.jpg

928384042_6.thumb.jpg.59c58f4d1966765390a2e480281555a9.jpg1804583121_7.thumb.jpg.71cf480686e4a666c26c19d091f2f353.jpg

 

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


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

 

результат умножения 0x6CD * 0x3F = 0x1AC73

весь регистр P равен 0x00000001AC73

выбранные в настройках 32 разряда  - это старшие разряды, они равны 0x00000001

 

 

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


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

1 hour ago, stealthisname said:

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

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

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


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

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

 

результат умножения 0x6CD * 0x3F = 0x1AC73

весь регистр P равен 0x00000001AC73

выбранные в настройках 32 разряда  - это старшие разряды, они равны 0x00000001

 

 

В точку!! Еще раз спасибо!

 

Дааа. Век живи - век учись. Был уверен, что 32 разряда будут младшие, а старшие просто отбросятся - типа как в С, если надо - переполнение используй или разряды увеличивай. 

 

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

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

У меня после сборки заняло это как раз 39 DSP блоков, накопление с умножением за 1 такт...

 

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


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

10 minutes ago, alexPec said:

У меня после сборки заняло это как раз 39 DSP блоков, накопление с умножением за 1 такт...

Ну вот и получается что ушел дефицитный ресурс на математику с требуемой мощностью 1/39. Если вам не нужны сразу все 39 результатов, то решение на одном дсп блоке + распределенной памяти гораздо выгоднее по ресурсу. А с учетом того что дсп слайсы не раскиданы по чипу, а стоят в колонках, решение на памяти + аккумулятор на логике может быть самым оптимальным.

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


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

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

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

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

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

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

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

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

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

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