alexPec 3 6 сентября, 2022 Опубликовано 6 сентября, 2022 · Жалоба Всем доброго дня. Есть такая задача. На входе имеем 32-разрядное число А и индекс N (от 0 до 38). В зависимости от индекса, число А добавляется к одному из 39 аккумуляторов B (тоже 32-х разрядных). Т.е. B[N]+=A Сделать это можно и просто регистром и сумматором, или с использованием памяти. Но охота сделать это на DSP48 (семейство xilinx ultrascale+), там вроде как уже есть регистр. Как-то это можно описать в verilog или sv, чтобы vivado (2020.1) понял все вышеизложенное и реализовал это на DSP блоках, не используя регистры логики? Конечно, можно использовать IP DSP48 macro, но хотелось бы как-то более читаемо описать это верилогом или sv. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stealthisname 7 6 сентября, 2022 Опубликовано 6 сентября, 2022 · Жалоба при объявлении аккумуляторов, указываем напрямую, что необходимо использовать блоки 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 без использования регистров логики я проверял на вот таком модуле: Спойлер 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexPec 3 6 сентября, 2022 Опубликовано 6 сентября, 2022 · Жалоба Супер! Спасибо! PS что-то у меня сам DSP48 криво работает, кто использовал их, подскажите, все ли правильно сделал? Что-то он совсем не то на выход P шлет. Функция P+A*B (sel=0) или C (sel=1). Вот входы/выходы сгенеренного DSP: Настройки IP: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
stealthisname 7 6 сентября, 2022 Опубликовано 6 сентября, 2022 · Жалоба результат умножения 0x6CD * 0x3F = 0x1AC73 весь регистр P равен 0x00000001AC73 выбранные в настройках 32 разряда - это старшие разряды, они равны 0x00000001 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 6 сентября, 2022 Опубликовано 6 сентября, 2022 · Жалоба 1 hour ago, stealthisname said: в результатах синтеза, проверяем, что сгенерились именно DSP без использования регистров логики вот только требуется 4 дсп ячейки, для математики когда сложение осуществляется с одной за такт. а ДСП ресурс намного более ценен, чем логика, регистры и память. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexPec 3 6 сентября, 2022 Опубликовано 6 сентября, 2022 · Жалоба 1 час назад, stealthisname сказал: результат умножения 0x6CD * 0x3F = 0x1AC73 весь регистр P равен 0x00000001AC73 выбранные в настройках 32 разряда - это старшие разряды, они равны 0x00000001 В точку!! Еще раз спасибо! Дааа. Век живи - век учись. Был уверен, что 32 разряда будут младшие, а старшие просто отбросятся - типа как в С, если надо - переполнение используй или разряды увеличивай. 1 час назад, des00 сказал: вот только требуется 4 дсп ячейки, для математики когда сложение осуществляется с одной за такт. а ДСП ресурс намного более ценен, чем логика, регистры и память. У меня после сборки заняло это как раз 39 DSP блоков, накопление с умножением за 1 такт... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 6 сентября, 2022 Опубликовано 6 сентября, 2022 · Жалоба 10 minutes ago, alexPec said: У меня после сборки заняло это как раз 39 DSP блоков, накопление с умножением за 1 такт... Ну вот и получается что ушел дефицитный ресурс на математику с требуемой мощностью 1/39. Если вам не нужны сразу все 39 результатов, то решение на одном дсп блоке + распределенной памяти гораздо выгоднее по ресурсу. А с учетом того что дсп слайсы не раскиданы по чипу, а стоят в колонках, решение на памяти + аккумулятор на логике может быть самым оптимальным. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться