Jump to content

    
Sign in to follow this  
Krys

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

Recommended Posts

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

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

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

(* use_dsp48 = "yes" *)

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

 

Share this post


Link to post
Share on other sites

Странно, что аккумулятор со входом сброса синтезируется в 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

Share this post


Link to post
Share on other sites
Странно, что аккумулятор со входом сброса синтезируется в DSP-блоке нормально...

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

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

 

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Теперь вот самый обычный сумматор не хочет на 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";

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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