Остался такой вопрос: в каких сценариях может понадобиться показанное ручное размещение блоков на кристалле с помощью pblockов? Не будет ли автоматическая имплементация всегда эффективнее по таймингам?
Прив. Утверждение "автоматическая имплементация всегда эффективнее по таймингам" не всегда верно. В некоторых случаях нам нужно "помочь" среде, указав границы допустимой разводки для блоков. К тому же, в скоростных проектах может применяться техника, при которых мы сами размещаем компоненты и запрещаем их перемещать. Сейчас у меня проект на спартан-6 и если не ограничивать область размещения и трассировки, элементы буду разбросаны по кристаллу "абы как", что соответственно, приводит к проблемам. Но как только ограничиваем область pblock'ом, все сразу становится лучше: и тайминги и проект. Конечно, инструменты трассировки совершенствуются, но иногда - лучшее враг хорошего
Отличное видео, спасибо! У меня такая проблема, я использую mux7 в линии задержки, и после синтеза я вижу, что они на своих местах как и должно быть. Но после имплементации половина mux7 заменяться на lut, причём в шахматном порядке, то есть через одну пару. Вот мой код для delay line: library IEEE; use IEEE.STD_LOGIC_1164.ALL; library work; use work.parameters.all; entity delay_line is port ( ipulse : in std_logic; ichallenge : in std_logic_vector (C_LENGTH - 1 downto 0); oout_1 : out std_logic; oout_2 : out std_logic ); end delay_line; architecture struct of delay_line is signal net: std_logic_vector(2*C_LENGTH + 1 downto 0) := (others => '0');
attribute dont_touch: string; attribute dont_touch of net: signal is "true"; begin -- net(0) net(2*i) );
inst_mux_2: entity work.mux(rtl) port map( ia => net(2*i - 1), ib => net(2*i - 2), isel => ichallenge(i - 1), oout => net(2*i + 1) ); end generate;
@@FPGASystems Покопался в доках, проблема была в retargeting opimization во время implementation. Пытался победить её с помощью донт_тач, не получилось, по всей видимости оптимизация происходила сразу в библиотечном блоке MUXF7, а до него добрать не получилось. В итоге пришлась полностью отключить Logic Optimization, и всё случилось!
Greetings from Malaysia, I've emailed you a question about how in your synthesized design, you get the muxf7 while i get only the LUT. Can you assist me on this ? I've followed all the steps taken. But i guess there is something that i've been doing wrong. Maybe because i dont understand russian. im sorry kinda need your help here. thank you.
hi, muxf7 was as a home work ) you can replace behavioral description of mux, by hardware component muxf7. Find his description here www.xilinx.com/support/documentation/sw_manuals/xilinx2020_2/ug953-vivado-7series-libraries.pdf pp460-461
@@FPGASystems Hi Michael, what do you mean by replace behavioral description of mux, does I need to change the coding in the mux ? With the muxf7 coding ?
Молодца, без флуда и по делу.
Спасибо огромное! очень понравилось!
Отличное видео, всё очень понятно и доступно, спасибо!
надеюсь весь курс будет тоже понятным
Thanks!
Отличные видео! Планируется продолжение или нет?
Да, курс записан полностью.
Остался такой вопрос: в каких сценариях может понадобиться показанное ручное размещение блоков на кристалле с помощью pblockов? Не будет ли автоматическая имплементация всегда эффективнее по таймингам?
Прив. Утверждение "автоматическая имплементация всегда эффективнее по таймингам" не всегда верно. В некоторых случаях нам нужно "помочь" среде, указав границы допустимой разводки для блоков. К тому же, в скоростных проектах может применяться техника, при которых мы сами размещаем компоненты и запрещаем их перемещать.
Сейчас у меня проект на спартан-6 и если не ограничивать область размещения и трассировки, элементы буду разбросаны по кристаллу "абы как", что соответственно, приводит к проблемам. Но как только ограничиваем область pblock'ом, все сразу становится лучше: и тайминги и проект.
Конечно, инструменты трассировки совершенствуются, но иногда - лучшее враг хорошего
Отличное видео, спасибо! У меня такая проблема, я использую mux7 в линии задержки, и после синтеза я вижу, что они на своих местах как и должно быть. Но после имплементации половина mux7 заменяться на lut, причём в шахматном порядке, то есть через одну пару.
Вот мой код для delay line:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
library work;
use work.parameters.all;
entity delay_line is
port (
ipulse : in std_logic;
ichallenge : in std_logic_vector (C_LENGTH - 1 downto 0);
oout_1 : out std_logic;
oout_2 : out std_logic
);
end delay_line;
architecture struct of delay_line is
signal net: std_logic_vector(2*C_LENGTH + 1 downto 0) := (others => '0');
attribute dont_touch: string;
attribute dont_touch of net: signal is "true";
begin
-- net(0) net(2*i)
);
inst_mux_2: entity work.mux(rtl)
port map(
ia => net(2*i - 1),
ib => net(2*i - 2),
isel => ichallenge(i - 1),
oout => net(2*i + 1)
);
end generate;
oout_1
тут надо немного пошаманить с атрибутами кип и донт тач для архитектур модулей
@@FPGASystems Покопался в доках, проблема была в retargeting opimization во время implementation. Пытался победить её с помощью донт_тач, не получилось, по всей видимости оптимизация происходила сразу в библиотечном блоке MUXF7, а до него добрать не получилось. В итоге пришлась полностью отключить Logic Optimization, и всё случилось!
Greetings from Malaysia, I've emailed you a question about how in your synthesized design, you get the muxf7 while i get only the LUT. Can you assist me on this ? I've followed all the steps taken. But i guess there is something that i've been doing wrong. Maybe because i dont understand russian. im sorry kinda need your help here. thank you.
hi, muxf7 was as a home work )
you can replace behavioral description of mux, by hardware component muxf7. Find his description here www.xilinx.com/support/documentation/sw_manuals/xilinx2020_2/ug953-vivado-7series-libraries.pdf pp460-461
@@FPGASystems
@@FPGASystems Hi Michael, what do you mean by replace behavioral description of mux, does I need to change the coding in the mux ? With the muxf7 coding ?
@@haziqishak612 yes, u r correct.
А есть это все в книжном варианте?
В книжном варианте этого нет
Тоже столкнулся с проблемой чередования lut3 и mux7 в шахматном порядке при:
(* DONT_TOUCH = "yes" *)
module mux()
...
Вылечилось костылем в виде еще одного (*dont_touch = "yes"*) MUXF7 MUXF7_inst ( ...
прямо перед модулем MUXF7
`timescale 1ns / 1ps
`include "parameters.vh"
(* DONT_TOUCH = "yes" *)
module mux(
input ia,
input ib,
input isel,
output oout
);
generate
if (MUX_TYPE == "LUT3") begin: LUT3_generic
assign oout = isel ? ia : ib;
end
endgenerate
generate
if (MUX_TYPE == "MUXF7") begin: MUXF7_generic
(*dont_touch = "yes"*) MUXF7 MUXF7_inst (
.O(oout), // Output of MUX to general routing
.I0(ia), // Input (tie to LUT6 O6 pin)
.I1(ib), // Input (tie to LUT6 O6 pin)
.S(isel) // Input select to MUX
);
end
endgenerate
endmodule