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

как на RTL заставить синтезатор использовать выделенные межкаскадные связи BCOUT-> BCIN в DSP48 Xilinx?

Теперь вот самый обычный сумматор не хочет на DSP-блоках синтезироваться... то ли лыжи не едут по запарке...

BEAM_BW = 16. Предположил, что синтезатор "считает", что слишком жирно ставить сумматор для складывания 16 битов. Поставил 30 - не полегчало.

В настройках синтеза в ISE стоит -use_dsp48 = Auto. Предположил, что в коде что-то криво описано, и такой сумматор в принципе невпихуем в DSP. Поставил Auto Max - реализовало на DSP. Т.е. код получается нормальный? Тогда почему же не синтезирует при Auto? Ему же русским по белому написано в коде:

(* use_dsp48 = "yes" *)

Не могу сказать за XST (это нигде явно в доках не описано), но Синплифай ведёт себя так : сумматор будет сделан на DSP только если один из операндов суммирования есть результат умножения (это если речь про выходной сумматор) или если сумма далее по коду умножается на что-то (входной сумматор). В остальных случаях лепит сумматоры на логике.

 

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


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

Странно, что аккумулятор со входом сброса синтезируется в DSP-блоке нормально...

// separating I and Q components of the input signal
wire signed [DIN_BW-1 : 0] din_i, din_q;
assign din_i = din_axis_tdata[DIN_BW-1 : 0];
assign din_q = din_axis_tdata[AXIS_DATA_BW-1 : DIN_BW];

// pipeline register inside of adder block
(* use_dsp48 = "yes" *) reg signed [sUM_DATA_BW-1 : 0] din_i_pp_int, din_q_pp_int;
reg din_valid_pp; // register to time align with internal data pipeline above
// result of adder
(* use_dsp48 = "yes" *) reg signed [sUM_DATA_BW-1 : 0] sum_i_acc, sum_q_acc;
always @(posedge clk) begin
   din_i_pp_int   <= {{DBF_BW_INCR{din_i[DIN_BW-1]}}, din_i};
   din_q_pp_int   <= {{DBF_BW_INCR{din_q[DIN_BW-1]}}, din_q};
   din_valid_pp   <= din_axis_tvalid;
end

// accumulator with reset
always @(posedge clk) begin
   if(!din_valid_pp) begin
       sum_i_acc <= 0;
       sum_q_acc <= 0;
   end else begin
       sum_i_acc <= sum_i_acc + din_i_pp_int;
       sum_q_acc <= sum_q_acc + din_q_pp_int;
   end
end

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


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

Странно, что аккумулятор со входом сброса синтезируется в DSP-блоке нормально...

Вообще идея использовать DSP блоки в качестве сумматоров довольно странная. В современных ПЛИС за счёт логики переноса производительность сумматоров на DSP и на "рассыпухе" практически сравнялась.

Поэтому гробить DSP блоки на банальное суммирование как-то не очень рационально.

 

 

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


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

вопрос чисто принципиальный. Синтезатор ослушался прямого указания в виде (* use_dsp48 = "yes" *).

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


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

...прямого указания в виде (* use_dsp48 = "yes" *).

За XST не скажу, но в Симплифае это всего лишь рекомендация.

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


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

ну понятно, что оно везде "рекомендация", т.к. если я атрибутом попрошу разместить какой-то элемент там, где он размещён быть не может чисто физически (например опишу массив памяти под атрибутом USE_DSP48), то такая "рекомендация" будет проигнорирована. А в моём случае всё реально.

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


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

Теперь вот самый обычный сумматор не хочет на DSP-блоках синтезироваться... то ли лыжи не едут по запарке...

// separating I and Q components of the local beamformers signal and the one from adjacent FPGA
wire signed [bEAM_BW-1 : 0] loc_i, loc_q, adj_i, adj_q;
assign loc_i = fifo_out         [bEAM_BW   -1 : 0      ];
assign loc_q = fifo_out         [bEAM_BW*2 -1 : BEAM_BW];
assign adj_i = adj_data_f_al    [bEAM_BW   -1 : 0      ];
assign adj_q = adj_data_f_al    [bEAM_BW*2 -1 : BEAM_BW];

// pipeline registers inside of adder DSP block
(* use_dsp48 = "yes" *) reg signed [bEAM_BW-1 : 0] loc_i_int, loc_q_int, adj_i_int, adj_q_int;
always @(posedge clk) begin
   loc_i_int <= loc_i;
   loc_q_int <= loc_q;
   adj_i_int <= adj_i;
   adj_q_int <= adj_q;
end
// adder itself
(* use_dsp48 = "yes" *) reg signed [bEAM_BW-1 : 0] sum_i, sum_q;
always @(posedge clk) begin                                     
   sum_i <= loc_i_int + adj_i_int;
   sum_q <= loc_q_int + adj_q_int;
end

BEAM_BW = 16. Предположил, что синтезатор "считает", что слишком жирно ставить сумматор для складывания 16 битов. Поставил 30 - не полегчало.

В настройках синтеза в ISE стоит -use_dsp48 = Auto. Предположил, что в коде что-то криво описано, и такой сумматор в принципе невпихуем в DSP. Поставил Auto Max - реализовало на DSP. Т.е. код получается нормальный? Тогда почему же не синтезирует при Auto? Ему же русским по белому написано в коде:

(* use_dsp48 = "yes" *)

 

Не знаю, как на verilog, а на VHDL мне помогло атрибут прописать не для сигнала, а для entity, в котором сделал обычный сумматор как отдельный компонент.

 

attribute use_dsp48 : string;
attribute use_dsp48 of add_example : entity is "yes";

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


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

Мне "как отдельный компонент" не хочется - нарушается читабельность. У меня этих DSP-шек в одном файле описывается несколько, и умещается всё это в один экран кода, читабельность на высоте )))

Если уж делается "отдельный компонент", то можно и макроблок вставить, а там уже резвиться и использовать полный функционал, который, например, я не смог реализовать на RTL в первом сообщении этой темы.

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


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

Ещё некоторая дополнительная информация от моего коллеги, что невозможно на RTL написать соединение PCOUT -> PCIN, если эти порты находятся в разных модулях: https://forums.xilinx.com/t5/Welcome-Join/C...ros/td-p/754013

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


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

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

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

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

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

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

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

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

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

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