Nick_K 0 31 июля, 2019 Опубликовано 31 июля, 2019 · Жалоба 17 hours ago, RobFPGA said: А смысл? Если цепь false_path то разницы куда впихнет не должно быть. Если разница есть - то это уже не false_path - значит нужно обконстрейнить чем то другим - set_max_delay, set_multicycle_path, ... Оно то так, но я работаю на пороговых частотах для Артикса. Там немного сложно объявлять через set_max_delay Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 34 31 июля, 2019 Опубликовано 31 июля, 2019 · Жалоба 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 31 июля, 2019 Опубликовано 31 июля, 2019 · Жалоба 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. Воу, так это же всё решает! Спасибо огромное! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_4afc_ 25 5 августа, 2019 Опубликовано 5 августа, 2019 · Жалоба Как принять 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? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_4afc_ 25 9 августа, 2019 Опубликовано 9 августа, 2019 · Жалоба 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, как и вы... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_4afc_ 25 9 августа, 2019 Опубликовано 9 августа, 2019 · Жалоба Пробую генерировать на выход синус, так чтобы тайминги сошлись. Vivado ругается на output delay. Есть такая схемка: Пытаюсь для уменьшения задержки на выходе попробовать использовать не клок с порта, а уже после 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? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 12 августа, 2019 Опубликовано 12 августа, 2019 · Жалоба On 8/9/2019 at 11:29 AM, _4afc_ said: А можно пример как в верилоге задать временные констрейны? Честно, не сталкивался с таким. Все временные констрейны прописываю в XDCи не морочу голову. Там (Vivado)есть даже какой-никакой интерфейс, который позволяет с матом напополам прописывать нужные констрейны. По остальным вопросам увы не подскажу. Нужно смотреть нужные констрейны и место применения. В своих проектах я просто обходился асинхронным интерфейсом + логика согласования, поэтому ничего особо и не констрейню Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться