Jump to content

    
Sign in to follow this  
_4afc_

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

Recommended Posts

17 hours ago, RobFPGA said:

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

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

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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.

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

Share this post


Link to post
Share on other sites

Как принять 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?
 

Share this post


Link to post
Share on other sites
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, как и вы...

Share this post


Link to post
Share on other sites

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

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?

 

Share this post


Link to post
Share on other sites
On 8/9/2019 at 11:29 AM, _4afc_ said:

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

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

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

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