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

Констрейны в Vivado и культура описания проекта

17 hours ago, RobFPGA said:

А смысл?  Если  цепь  false_path то разницы куда впихнет не должно быть. Если разница есть - то это уже не   false_path - значит нужно обконстрейнить чем то другим - set_max_delay,  set_multicycle_path, ...  

Оно то так, но я работаю на пороговых частотах для Артикса. Там немного сложно объявлять через set_max_delay

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


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

21 минуту назад, Nick_K сказал:

Там немного сложно объявлять через set_max_delay

Вам правильно посоветовали насчёт set_max_delay. Только тут есть тонкость - директива эта для привязки времянок (чтобы они не разъезжались) сигналов асинхронных тактовых доменов используется обязательно с ключом -datapath_only. Это нестандартное расширение от Xilinx, но очень полезное. Подробнее тут: https://forums.xilinx.com/t5/Vivado-TCL-Community/set-clock-groups-and-constraint-propagation/td-p/407547, ответы от avrumv.

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


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

38 minutes ago, dxp said:

Вам правильно посоветовали насчёт set_max_delay. Только тут есть тонкость - директива эта для привязки времянок (чтобы они не разъезжались) сигналов асинхронных тактовых доменов используется обязательно с ключом -datapath_only. Это нестандартное расширение от Xilinx, но очень полезное. Подробнее тут: https://forums.xilinx.com/t5/Vivado-TCL-Community/set-clock-groups-and-constraint-propagation/td-p/407547, ответы от avrumv.

Воу, так это же всё решает! Спасибо огромное!

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


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

Как принять LVDS DDR сигнал у которого данные и клоки меняются одновременно?

Допустим я описал в топе

IBUFDS #(.DIFF_TERM("FALSE"), .IBUF_LOW_PWR("FALSE"),.IOSTANDARD("LVDS_25") ) IBUFDS_CLK64   (.O(CLK64),   .I(CLK64_P),   .IB(CLK64_N) );
IBUFDS #(.DIFF_TERM("FALSE"), .IBUF_LOW_PWR("TRUE"), .IOSTANDARD("DEFAULT") ) IBUFDS_AD00_01 (.O(AD00_01), .I(AD00_01_P), .IB(AD00_01_N) );
IBUFDS #(.DIFF_TERM("FALSE"), .IBUF_LOW_PWR("TRUE"), .IOSTANDARD("DEFAULT") ) IBUFDS_AD02_03 (.O(AD02_03), .I(AD02_03_P), .IB(AD02_03_N) );

потом добавил

create_clock -add -name sys_clk_pin   -period 15.625  -waveform {0  7.8125}  [get_ports { CLK64_P }];
# DDR System Synchronous Inputs

Spoiler

#
# A Double Data Rate (DDR) System Synchronous interface is
# an interface where the external device and the FPGA use
# the same clock, and a new data is captured half a clock
# cycle after being launched
#
# input      _______________________________                                  ________
# clock    _|                               |________________________________|     
#           |                               |
#           |-> (trco_min+trce_dly_min)     |-> (tfco_min+trce_dly_min)
#           |-----> (trco_max+trce_dly_max) |-----> (tfco_max+trce_dly_max)
#          ____    ____________________________    ____________________________    ___
# data     ____XXXX__________Rise_Data_________XXXX__________Fall_Data_________XXXX___
#

set input_clock     sys_clk_pin;   # Name of input clock
set trco_max        4.000;          # Maximum clock to output delay from rising edge (external device)
set trco_min        0.000;          # Minimum clock to output delay from rising edge (external device)
set tfco_max        4.000;          # Maximum clock to output delay from falling edge (external device)
set tfco_min        0.000;          # Minimum clock to output delay from falling edge (external device)
set trce_dly_max    0.000;          # Maximum board trace delay
set trce_dly_min    0.000;          # Minimum board trace delay
set input_ports     [get_ports AD00_01_P];  # List of input ports

# Input Delay Constraint
set_input_delay -clock $input_clock -max [expr $trco_max + $trce_dly_max] [get_ports $input_ports];
set_input_delay -clock $input_clock -min [expr $trco_min + $trce_dly_min] [get_ports $input_ports];
set_input_delay -clock $input_clock -max [expr $tfco_max + $trce_dly_max] [get_ports $input_ports] -clock_fall -add_delay;
set_input_delay -clock $input_clock -min [expr $tfco_min + $trce_dly_min] [get_ports $input_ports] -clock_fall -add_delay;

# Report Timing Template
# report_timing -rise_from [get_ports $input_ports] -max_paths 20 -nworst 2 -delay_type min_max -name sys_sync_ddr_in_rise -file sys_sync_ddr_in_rise.txt;        
# report_timing -fall_from [get_ports $input_ports] -max_paths 20 -nworst 2 -delay_type min_max -name sys_sync_ddr_in_fall -file sys_sync_ddr_in_fall.txt;

где увидеть что клок защёлкивает данные в середине?

или надо через SelectIO?
 

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


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

On 7/29/2019 at 6:29 PM, Nick_K said:

Можно и в коде. Но это не всегда нужно/удобно, хотя вполне реально. Также детальнее тут

А можно пример как в верилоге задать временные констрейны?

А то в AR#55853 на вопрос Can I embed timing constraints within my Verilog or VHDL file?

ответили:

Quote

Vivado tools do not support timing constraints embedded in RTL. Users should create a set_max_delay command and enter these constraints in an XDC file.

Сославшись на тот же UG903, как и вы...

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


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

Пробую генерировать на выход синус, так чтобы тайминги сошлись.

Vivado ругается на output delay.

 

Есть такая схемка:

bufg.png.cabb967291257d8c5c9e5e0227ac42d4.png

Пытаюсь для уменьшения задержки на выходе попробовать использовать не клок с порта, а уже после BUFG:

 

create_clock -add -name sys_clk_pin          -period 15.625  -waveform {0  7.8125}  [get_ports { CLK64_P }];
create_clock -add -name int_clk_CLK64_BUFG   -period 15.625  -waveform {0  7.8125}  [get_nets { CLK64_BUFG }];

Spoiler

set fwclk           sys_clk_pin;    # forwarded clock name (generated using create_generated_clock at output clock port)
set fwclk_period     15.625;            # forwarded clock period
set bfe_skew         -3.000;            # skew requirement before falling edge
set afe_skew          3.000;            # skew requirement after falling edge
set output_ports     {IO2 IO3 IO4 IO5 IO6 IO7 IO8 IO9 IO10 IO11};    # list of output ports

# Output Delay Constraints
set_output_delay -clock $fwclk -max [expr $fwclk_period - $afe_skew] [get_ports $output_ports] -clock_fall;
set_output_delay -clock $fwclk -min $bfe_skew                        [get_ports $output_ports] -clock_fall;

set fwclk           int_clk_CLK64_BUFG;    # forwarded clock name (generated using create_generated_clock at output clock port)
set fwclk_period     15.625;          # forwarded clock period
set bre_skew         -3.000;            # skew requirement before rising edge
set are_skew          3.000;            # skew requirement after rising edge
set output_ports     {IO12};    # list of output ports

# Output Delay Constraints
set_output_delay -clock $fwclk -max [expr $fwclk_period - $are_skew] [get_ports $output_ports];
set_output_delay -clock $fwclk -min $bre_skew                        [get_ports $output_ports];

 

Почему-то Vivado хранически не хочет подцеплять клоки с пинов и нетов, только с порта получается:

Quote

[Vivado 12-507] No nets matched 'CLK64_BUFG'. ["*.xdc":87]
[Vivado 12-646] clock 'int_clk_CLK64_BUFG' not found. ["*.xdc":158]
[Vivado 12-4739] create_clock:No valid object(s) found for '-objects [get_nets CLK64_BUFG]'. ["*.xdc":87]

 

Посоветуйте как избавится от варнинга:

Quote

TIMING #11 Warning There is a large setup violation of -5.188 ns between RadioDAC1/DAC_C_reg/C (clocked by sys_clk_pin) and IO12 (clocked by sys_clk_pin).
Large setup violations at the end of those stages might be difficult to fix during the post-placement implementation flow and could be the result of non-optimal XDC constraints or non-optimal design architecture

TIMING #11 Warning There is a large setup violation of -5.200 ns between RadioDAC1/DAC_D_reg[0]/C (clocked by sys_clk_pin) and IO11 (clocked by sys_clk_pin).
Large setup violations at the end of those stages might be difficult to fix during the post-placement implementation flow and could be the result of non-optimal XDC constraints or non-optimal design architecture

 

попробовать set_multicycle_path?

создать int_clk_CLK64_BUFG и отвязать его от sys_clk_pin?

 

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


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

On 8/9/2019 at 11:29 AM, _4afc_ said:

А можно пример как в верилоге задать временные констрейны?

Честно, не сталкивался с таким. Все временные констрейны прописываю в XDCи не морочу голову. Там (Vivado)есть даже какой-никакой интерфейс, который позволяет с матом напополам прописывать нужные констрейны.

По остальным вопросам увы не подскажу. Нужно смотреть нужные констрейны и место применения. В своих проектах я просто обходился асинхронным интерфейсом + логика согласования, поэтому ничего особо и не констрейню

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


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

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

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

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

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

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

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

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

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

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