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

BSACPLD

Свой
  • Постов

    915
  • Зарегистрирован

  • Посещение

  • Победитель дней

    5

Весь контент BSACPLD


  1. Дело в том, что в некоторых моделях для симуляции той же DDR, timescale может стоять отличным от того что хотите Вы и он переопределит шаг временного моделирования во всех нижестоящих файлах. Если это память программ, то да. Ее нужно инициализировать. А во всех остальных случаях это лишь потенциальное место для некорректного состояния системы из которого она может никогда не выйти. Вот X как раз и нужны для проверки того как система выходит из некорректных состояний.
  2. Так ведь нехороший человек может и не вписать себя в шапку ;) Для таких случаев как раз и есть svn / git и другие системы контроля версий.
  3. Коллеги, существует ли литература / сайты где подробно описаны основные правила хорошего тона при проектировании под FPGA? - что рекомендуется делать. - что не рекомендуется. - за что бить по рукам. Самому как-то лень писать, да и я тоже могу чего-нибудь не знать... Лично для себя я выработал следующий набор правил: - полностью синхронный проект, асинхронные блоки допускаются только если я точно понимаю как это будет работать, как обконстрейнить и их количество должно стремится к нулю. - чем меньше разных тактовых доменов, тем лучше. - для понижения частоты работы блоков использовать clock enable, а не generated clock. - асинхронный сброс при отпускании должен быть синхронизирован с тактовой частотой триггеров которые он сбрасывает. - все переменные объявляются в начале файла, а не по мере их использования. - все переменные объявляются явно. - для знаковых чисел указывается их знаковость (signed). - аппаратно зависимые блоки оборачиваются во врапперы. - никаких LPM в проекте (Altera/Intel). - никакой схематики и устаревших языков (исключение Block Design в Xilinx и QSYS в Altera). - по возможности использовать стандартные шины (APB, AXI, Avalon, Wishbone). - код пишется максимально кроссплатформенным и параметризованным. - в начале файла обязательно налиличе timescale. - все переменные инициализируются X при моделировании. - код проверяется на соответствие стандарту в ModelSim/NCSim. Это так сказать набор правил выработанный за долгие годы работы, но не факт что он полный / достаточный. Хотелось бы почитать подходящую литературу и узнать мнение знающих людей.
  4. Поставил VX2.7 есть пара вопрсов. - как переключить язык на Английский? В схемном редакторе нашел, а вот Layout никак не могу найти :( - куда пропали кнопки переключения режима выделения Place, Route, Draw и как включить их отображение?
  5. Под 1G есть стандартные покупные свичи под тот же CompactPCI, например. https://www.kontron.com/products/boards-and-standard-form-factors/cpci/6u-switches/cp6925.html И там стандартизована разводка (какие дифпары на какие пины). См. стандарт PICMG 2.16. Сам Ethernet обычный 1000Base-T на медь через трасформатор. Я делал платы как раз для такого форм-фактора. PHY был 88E1111. Работало на ура без каких-либо проблем.
  6. Да там не только плату, а саму идеологию передачи данных нужно переделывать :(
  7. У меня тоже получалось достичь нормальных частот на той же ПЛИС на другом проекте. Разница только в распиновке и количестве каналов. UPD. Да даже на этом проекте. Один из каналов укладывается во времянки (задержка 1,5 нс), а остальные нет (задержка 3,4 нс).
  8. Так ведь там PLL для этого отдельный нужен. У меня 8 каналов. Нет у меня столько PLL... Вся загвоздка в том, что нельзя ее подобрать. У разных типов плат подключаемых к данному коммутатору она будет разной. А платы нужно иметь возможность подключать в любом порядке.
  9. Разместил вручную прямо рядом с DDIO. Все равно задержка от DDIO до триггера больше 3 нс.
  10. Да. Но только если память объявлена как двумерный массив. Если сделать трехмерный, то получим кучу логики. Причем это давняя проблема: https://www.xilinx.com/support/answers/53507.html
  11. Вот отчет с ковейером увеличенным в 3 раза. Ругань на путь от DDIO до триггера. Хотя теперь там их уже 3 подряд и Quartus если бы мог, сделал ретайминг. print.pdf
  12. Нет. Это 8 независимых 1-битных линков. Текущий проект это что-то вроде роутера Ethernet в 8 независимых LVDS линков. Вот отчет. На 150МГц собирается без мультициклов. На 300МГц нужно ставить мультицикл 2. print.pdf
  13. Так после DDIO сразу идет триггер. Там больше ничего нет. rx_ddr #( .WIDTH (1), .FPGA_VENDOR (FPGA_VENDOR), .DEVICE_FAMILY (DEVICE_FAMILY) ) rx_ddr_0 ( .datain (ser_in), .inclock (clk_sys_2x), .dataout_h (ser_in_2x[0]), .dataout_l (ser_in_2x[1]) ) ; always @(negedge clk_sys_2x) begin ser_in_2x_reg <= ser_in_2x ; end Данные я забираю каждый такт, но частота изменения данных в 4 раза ниже частоты семплирования данных. Высокая частота семплирования нужна чтобы в цифре можно было динамически выбирать момент семплирования данных. Что-то вроде управляемой ЛЗ.
  14. Получилось :) Я забыл еще на hold мультицикл прописать :( Вот так нормально собирается: set_multicycle_path -from {rx_8b_10b:loop_ser[0].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|rx_ddr:rx_ddr_0|altddio_in:RXDDR|ddio_in_s6f:auto_generated|dataout_l[0]} -to {rx_8b_10b:loop_ser[0].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|ser_in_2x_reg[1]} -setup -end 2 set_multicycle_path -from {rx_8b_10b:loop_ser[1].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|rx_ddr:rx_ddr_0|altddio_in:RXDDR|ddio_in_s6f:auto_generated|dataout_l[0]} -to {rx_8b_10b:loop_ser[1].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|ser_in_2x_reg[1]} -setup -end 2 set_multicycle_path -from {rx_8b_10b:loop_ser[2].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|rx_ddr:rx_ddr_0|altddio_in:RXDDR|ddio_in_s6f:auto_generated|dataout_l[0]} -to {rx_8b_10b:loop_ser[2].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|ser_in_2x_reg[1]} -setup -end 2 set_multicycle_path -from {rx_8b_10b:loop_ser[3].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|rx_ddr:rx_ddr_0|altddio_in:RXDDR|ddio_in_s6f:auto_generated|dataout_l[0]} -to {rx_8b_10b:loop_ser[3].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|ser_in_2x_reg[1]} -setup -end 2 set_multicycle_path -from {rx_8b_10b:loop_ser[4].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|rx_ddr:rx_ddr_0|altddio_in:RXDDR|ddio_in_s6f:auto_generated|dataout_l[0]} -to {rx_8b_10b:loop_ser[4].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|ser_in_2x_reg[1]} -setup -end 2 set_multicycle_path -from {rx_8b_10b:loop_ser[5].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|rx_ddr:rx_ddr_0|altddio_in:RXDDR|ddio_in_s6f:auto_generated|dataout_l[0]} -to {rx_8b_10b:loop_ser[5].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|ser_in_2x_reg[1]} -setup -end 2 set_multicycle_path -from {rx_8b_10b:loop_ser[6].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|rx_ddr:rx_ddr_0|altddio_in:RXDDR|ddio_in_s6f:auto_generated|dataout_l[0]} -to {rx_8b_10b:loop_ser[6].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|ser_in_2x_reg[1]} -setup -end 2 set_multicycle_path -from {rx_8b_10b:loop_ser[7].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|rx_ddr:rx_ddr_0|altddio_in:RXDDR|ddio_in_s6f:auto_generated|dataout_l[0]} -to {rx_8b_10b:loop_ser[7].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|ser_in_2x_reg[1]} -setup -end 2 set_multicycle_path -from {rx_8b_10b:loop_ser[0].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|rx_ddr:rx_ddr_0|altddio_in:RXDDR|ddio_in_s6f:auto_generated|dataout_h[0]} -to {rx_8b_10b:loop_ser[0].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|ser_in_2x_reg[0]} -setup -end 2 set_multicycle_path -from {rx_8b_10b:loop_ser[1].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|rx_ddr:rx_ddr_0|altddio_in:RXDDR|ddio_in_s6f:auto_generated|dataout_h[0]} -to {rx_8b_10b:loop_ser[1].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|ser_in_2x_reg[0]} -setup -end 2 set_multicycle_path -from {rx_8b_10b:loop_ser[2].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|rx_ddr:rx_ddr_0|altddio_in:RXDDR|ddio_in_s6f:auto_generated|dataout_h[0]} -to {rx_8b_10b:loop_ser[2].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|ser_in_2x_reg[0]} -setup -end 2 set_multicycle_path -from {rx_8b_10b:loop_ser[3].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|rx_ddr:rx_ddr_0|altddio_in:RXDDR|ddio_in_s6f:auto_generated|dataout_h[0]} -to {rx_8b_10b:loop_ser[3].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|ser_in_2x_reg[0]} -setup -end 2 set_multicycle_path -from {rx_8b_10b:loop_ser[4].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|rx_ddr:rx_ddr_0|altddio_in:RXDDR|ddio_in_s6f:auto_generated|dataout_h[0]} -to {rx_8b_10b:loop_ser[4].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|ser_in_2x_reg[0]} -setup -end 2 set_multicycle_path -from {rx_8b_10b:loop_ser[5].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|rx_ddr:rx_ddr_0|altddio_in:RXDDR|ddio_in_s6f:auto_generated|dataout_h[0]} -to {rx_8b_10b:loop_ser[5].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|ser_in_2x_reg[0]} -setup -end 2 set_multicycle_path -from {rx_8b_10b:loop_ser[6].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|rx_ddr:rx_ddr_0|altddio_in:RXDDR|ddio_in_s6f:auto_generated|dataout_h[0]} -to {rx_8b_10b:loop_ser[6].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|ser_in_2x_reg[0]} -setup -end 2 set_multicycle_path -from {rx_8b_10b:loop_ser[7].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|rx_ddr:rx_ddr_0|altddio_in:RXDDR|ddio_in_s6f:auto_generated|dataout_h[0]} -to {rx_8b_10b:loop_ser[7].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|ser_in_2x_reg[0]} -setup -end 2 set_multicycle_path -from {rx_8b_10b:loop_ser[0].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|rx_ddr:rx_ddr_0|altddio_in:RXDDR|ddio_in_s6f:auto_generated|dataout_l[0]} -to {rx_8b_10b:loop_ser[0].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|ser_in_2x_reg[1]} -hold -end 1 set_multicycle_path -from {rx_8b_10b:loop_ser[1].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|rx_ddr:rx_ddr_0|altddio_in:RXDDR|ddio_in_s6f:auto_generated|dataout_l[0]} -to {rx_8b_10b:loop_ser[1].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|ser_in_2x_reg[1]} -hold -end 1 set_multicycle_path -from {rx_8b_10b:loop_ser[2].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|rx_ddr:rx_ddr_0|altddio_in:RXDDR|ddio_in_s6f:auto_generated|dataout_l[0]} -to {rx_8b_10b:loop_ser[2].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|ser_in_2x_reg[1]} -hold -end 1 set_multicycle_path -from {rx_8b_10b:loop_ser[3].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|rx_ddr:rx_ddr_0|altddio_in:RXDDR|ddio_in_s6f:auto_generated|dataout_l[0]} -to {rx_8b_10b:loop_ser[3].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|ser_in_2x_reg[1]} -hold -end 1 set_multicycle_path -from {rx_8b_10b:loop_ser[4].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|rx_ddr:rx_ddr_0|altddio_in:RXDDR|ddio_in_s6f:auto_generated|dataout_l[0]} -to {rx_8b_10b:loop_ser[4].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|ser_in_2x_reg[1]} -hold -end 1 set_multicycle_path -from {rx_8b_10b:loop_ser[5].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|rx_ddr:rx_ddr_0|altddio_in:RXDDR|ddio_in_s6f:auto_generated|dataout_l[0]} -to {rx_8b_10b:loop_ser[5].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|ser_in_2x_reg[1]} -hold -end 1 set_multicycle_path -from {rx_8b_10b:loop_ser[6].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|rx_ddr:rx_ddr_0|altddio_in:RXDDR|ddio_in_s6f:auto_generated|dataout_l[0]} -to {rx_8b_10b:loop_ser[6].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|ser_in_2x_reg[1]} -hold -end 1 set_multicycle_path -from {rx_8b_10b:loop_ser[7].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|rx_ddr:rx_ddr_0|altddio_in:RXDDR|ddio_in_s6f:auto_generated|dataout_l[0]} -to {rx_8b_10b:loop_ser[7].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|ser_in_2x_reg[1]} -hold -end 1 set_multicycle_path -from {rx_8b_10b:loop_ser[0].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|rx_ddr:rx_ddr_0|altddio_in:RXDDR|ddio_in_s6f:auto_generated|dataout_h[0]} -to {rx_8b_10b:loop_ser[0].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|ser_in_2x_reg[0]} -hold -end 1 set_multicycle_path -from {rx_8b_10b:loop_ser[1].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|rx_ddr:rx_ddr_0|altddio_in:RXDDR|ddio_in_s6f:auto_generated|dataout_h[0]} -to {rx_8b_10b:loop_ser[1].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|ser_in_2x_reg[0]} -hold -end 1 set_multicycle_path -from {rx_8b_10b:loop_ser[2].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|rx_ddr:rx_ddr_0|altddio_in:RXDDR|ddio_in_s6f:auto_generated|dataout_h[0]} -to {rx_8b_10b:loop_ser[2].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|ser_in_2x_reg[0]} -hold -end 1 set_multicycle_path -from {rx_8b_10b:loop_ser[3].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|rx_ddr:rx_ddr_0|altddio_in:RXDDR|ddio_in_s6f:auto_generated|dataout_h[0]} -to {rx_8b_10b:loop_ser[3].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|ser_in_2x_reg[0]} -hold -end 1 set_multicycle_path -from {rx_8b_10b:loop_ser[4].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|rx_ddr:rx_ddr_0|altddio_in:RXDDR|ddio_in_s6f:auto_generated|dataout_h[0]} -to {rx_8b_10b:loop_ser[4].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|ser_in_2x_reg[0]} -hold -end 1 set_multicycle_path -from {rx_8b_10b:loop_ser[5].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|rx_ddr:rx_ddr_0|altddio_in:RXDDR|ddio_in_s6f:auto_generated|dataout_h[0]} -to {rx_8b_10b:loop_ser[5].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|ser_in_2x_reg[0]} -hold -end 1 set_multicycle_path -from {rx_8b_10b:loop_ser[6].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|rx_ddr:rx_ddr_0|altddio_in:RXDDR|ddio_in_s6f:auto_generated|dataout_h[0]} -to {rx_8b_10b:loop_ser[6].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|ser_in_2x_reg[0]} -hold -end 1 set_multicycle_path -from {rx_8b_10b:loop_ser[7].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|rx_ddr:rx_ddr_0|altddio_in:RXDDR|ddio_in_s6f:auto_generated|dataout_h[0]} -to {rx_8b_10b:loop_ser[7].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|ser_in_2x_reg[0]} -hold -end 1
  15. Там гораздо хитрее чем 8b/10b. Самодельный приемопередатчик с автоопределнием момента семплирования входного сигнала (передискретизация в 4 раза). Проблема именно в переходе от DDIO к логике. Этот модуль замечательно работает на 400МГц в Cyclone IV E и MAX 10. А вот с Cyclone V пока проблема. Точнее в железе все работает. Вопрос как правильно описать констрейны для случая когда задержка от DDIO до логики больше одного такта. rx_tx_8b_10b.7z
  16. Пытаюсь решить проблему через мультициклы. 1. Собираю проект без мультициклов. TQ ругается на задержки. 2. Прописываю мультицикл. set_multicycle_path -from {rx_8b_10b:loop_ser[0].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|rx_ddr:rx_ddr_0|altddio_in:RXDDR|ddio_in_s6f:auto_generated|dataout_l[0]} -to {rx_8b_10b:loop_ser[0].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|ser_in_2x_reg[1]} -setup -end 2 set_multicycle_path -from {rx_8b_10b:loop_ser[0].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|rx_ddr:rx_ddr_0|altddio_in:RXDDR|ddio_in_s6f:auto_generated|dataout_h[0]} -to {rx_8b_10b:loop_ser[0].rx_8b_10b_0|rx_8b_10b_4x:rx_8b_10b_4x_0|ser_in_2x_reg[0]} -setup -end 2 TQ перестает ругаться на задержки. 3. Собираю проект с новым sdc. TQ опять ругается на задержки. ???????????????
  17. Нда... Похоже эта самая гадость. Проблема с большой задержкой лишь по нескольким пинам. Остальные нормально укладываются в тайминги.
  18. Коллеги, подскажите, пожалуйста, в чем может быть дело. ALTDDIO подключен к триггеру: rx_ddr #( .WIDTH (1), .FPGA_VENDOR (FPGA_VENDOR), .DEVICE_FAMILY (DEVICE_FAMILY) ) rx_ddr_0 ( .datain (ser_in), .inclock (clk_sys_2x), .dataout_h (ser_in_2x[0]), .dataout_l (ser_in_2x[1]) ) ; always @(negedge clk_sys_2x) begin ser_in_2x_reg <= ser_in_2x ; end altddio_in #( .intended_device_family (DEVICE_FAMILY), .invert_input_clocks ("ON"), .lpm_hint ("UNUSED"), .lpm_type ("altddio_in"), .power_up_high ("OFF"), .width (WIDTH) ) RXDDR ( .datain (datain), .inclock (inclock), .dataout_h (dataout_h), .dataout_l (dataout_l), .aclr (1'b0), .aset (1'b0), .inclocken (1'b1), .sclr (1'b0), .sset (1'b0) ) ; Задержка от ALTDDIO до триггера какая-то огромная получается. Этот же код спокойно даёт 400МГц в Cyclone IV E и MAX 10, а в Cyclone V получается от силы 150МГц :(
  19. Quartus пишет, что сходятся, но судя по тому что выдает Datasheet Report они сходиться не должны (tsu 0.1 нс). И на железе глючит именно этот канал. Если вручную подкрутить задержки в Resource Property Editor так чтобы Datasheet Report выдавал tsu в районе -1.0 нс, то глюки исчезают. Еще заметил, что если написать задержки без min/max и увеличить значение до 1.2, то tsu получается нормальный. Увеличение значения до 1.2 в выше приведенном коде не приводило к желаемому результату. set_multicycle_path -setup -end -fall_from [get_clocks {s_clk_virtual[3]}] -rise_to [get_clocks {s_clk[3]}] 0 set_multicycle_path -setup -end -rise_from [get_clocks {s_clk_virtual[3]}] -fall_to [get_clocks {s_clk[3]}] 0 set_false_path -setup -fall_from [get_clocks {s_clk_virtual[3]}] -rise_to [get_clocks {s_clk[3]}] set_false_path -setup -rise_from [get_clocks {s_clk_virtual[3]}] -fall_to [get_clocks {s_clk[3]}] set_false_path -hold -rise_from [get_clocks {s_clk_virtual[3]}] -rise_to [get_clocks {s_clk[3]}] set_false_path -hold -fall_from [get_clocks {s_clk_virtual[3]}] -fall_to [get_clocks {s_clk[3]}] set_input_delay -add_delay -clock [get_clocks {s_clk_virtual[3]}] 1.2 [get_ports {fast_data_3[0]}] set_input_delay -add_delay -clock [get_clocks {s_clk_virtual[3]}] 1.2 [get_ports {fast_data_3[1]}] set_input_delay -add_delay -clock [get_clocks {s_clk_virtual[3]}] 1.2 [get_ports {fast_data_3[2]}] set_input_delay -add_delay -clock [get_clocks {s_clk_virtual[3]}] 1.2 [get_ports {fast_data_3[3]}] set_input_delay -add_delay -clock [get_clocks {s_clk_virtual[3]}] 1.2 [get_ports {fast_read_valid_3}] set_input_delay -add_delay -clock [get_clocks {s_clk_virtual[3]}] 1.2 [get_ports {fast_ready_3}] set_input_delay -add_delay -clock [get_clocks {s_clk_virtual[3]}] 1.2 [get_ports {fast_data_3[0]}] -clock_fall set_input_delay -add_delay -clock [get_clocks {s_clk_virtual[3]}] 1.2 [get_ports {fast_data_3[1]}] -clock_fall set_input_delay -add_delay -clock [get_clocks {s_clk_virtual[3]}] 1.2 [get_ports {fast_data_3[2]}] -clock_fall set_input_delay -add_delay -clock [get_clocks {s_clk_virtual[3]}] 1.2 [get_ports {fast_data_3[3]}] -clock_fall set_input_delay -add_delay -clock [get_clocks {s_clk_virtual[3]}] 1.2 [get_ports {fast_read_valid_3}] -clock_fall set_input_delay -add_delay -clock [get_clocks {s_clk_virtual[3]}] 1.2 [get_ports {fast_ready_3}] -clock_fall
  20. Коллеги, подскажите, пожалуйста, что я делаю не так. Есть синхронный интерфейс с передачей по двум фронтам и 8 одинаковыми каналами. Клок и данные переключаются одновременно. На приемной стороне пишу следующие констрейны: create_clock -name {s_clk_virtual[3]} -period $period_s_clk create_clock -name {s_clk[3]} -period $period_s_clk [get_ports {fast_data_3[6]}] set_multicycle_path -from [get_clocks {s_clk_virtual[3]}] -to [get_clocks {s_clk[3]}] 1 set_multicycle_path -setup -end -fall_from [get_clocks {s_clk_virtual[3]}] -rise_to [get_clocks {s_clk[3]}] 0 set_multicycle_path -setup -end -rise_from [get_clocks {s_clk_virtual[3]}] -fall_to [get_clocks {s_clk[3]}] 0 set_false_path -setup -fall_from [get_clocks {s_clk_virtual[3]}] -rise_to [get_clocks {s_clk[3]}] set_false_path -setup -rise_from [get_clocks {s_clk_virtual[3]}] -fall_to [get_clocks {s_clk[3]}] set_false_path -hold -rise_from [get_clocks {s_clk_virtual[3]}] -rise_to [get_clocks {s_clk[3]}] set_false_path -hold -fall_from [get_clocks {s_clk_virtual[3]}] -fall_to [get_clocks {s_clk[3]}] set_input_delay -clock [get_clocks {s_clk_virtual[3]}] -max 0.5 [get_ports {fast_data_3[0]}] set_input_delay -clock [get_clocks {s_clk_virtual[3]}] -max 0.5 [get_ports {fast_data_3[1]}] set_input_delay -clock [get_clocks {s_clk_virtual[3]}] -max 0.5 [get_ports {fast_data_3[2]}] set_input_delay -clock [get_clocks {s_clk_virtual[3]}] -max 0.5 [get_ports {fast_data_3[3]}] set_input_delay -clock [get_clocks {s_clk_virtual[3]}] -max 0.5 [get_ports {fast_read_valid_3}] set_input_delay -clock [get_clocks {s_clk_virtual[3]}] -max 0.5 [get_ports {fast_ready_3}] set_input_delay -clock [get_clocks {s_clk_virtual[3]}] -min -0.5 [get_ports {fast_data_3[0]}] set_input_delay -clock [get_clocks {s_clk_virtual[3]}] -min -0.5 [get_ports {fast_data_3[1]}] set_input_delay -clock [get_clocks {s_clk_virtual[3]}] -min -0.5 [get_ports {fast_data_3[2]}] set_input_delay -clock [get_clocks {s_clk_virtual[3]}] -min -0.5 [get_ports {fast_data_3[3]}] set_input_delay -clock [get_clocks {s_clk_virtual[3]}] -min -0.5 [get_ports {fast_read_valid_3}] set_input_delay -clock [get_clocks {s_clk_virtual[3]}] -min -0.5 [get_ports {fast_ready_3}] set_input_delay -clock [get_clocks {s_clk_virtual[3]}] -clock_fall -max 0.5 [get_ports {fast_data_3[0]}] -add_delay set_input_delay -clock [get_clocks {s_clk_virtual[3]}] -clock_fall -max 0.5 [get_ports {fast_data_3[1]}] -add_delay set_input_delay -clock [get_clocks {s_clk_virtual[3]}] -clock_fall -max 0.5 [get_ports {fast_data_3[2]}] -add_delay set_input_delay -clock [get_clocks {s_clk_virtual[3]}] -clock_fall -max 0.5 [get_ports {fast_data_3[3]}] -add_delay set_input_delay -clock [get_clocks {s_clk_virtual[3]}] -clock_fall -max 0.5 [get_ports {fast_read_valid_3}] -add_delay set_input_delay -clock [get_clocks {s_clk_virtual[3]}] -clock_fall -max 0.5 [get_ports {fast_ready_3}] -add_delay set_input_delay -clock [get_clocks {s_clk_virtual[3]}] -clock_fall -min -0.5 [get_ports {fast_data_3[0]}] -add_delay set_input_delay -clock [get_clocks {s_clk_virtual[3]}] -clock_fall -min -0.5 [get_ports {fast_data_3[1]}] -add_delay set_input_delay -clock [get_clocks {s_clk_virtual[3]}] -clock_fall -min -0.5 [get_ports {fast_data_3[2]}] -add_delay set_input_delay -clock [get_clocks {s_clk_virtual[3]}] -clock_fall -min -0.5 [get_ports {fast_data_3[3]}] -add_delay set_input_delay -clock [get_clocks {s_clk_virtual[3]}] -clock_fall -min -0.5 [get_ports {fast_read_valid_3}] -add_delay set_input_delay -clock [get_clocks {s_clk_virtual[3]}] -clock_fall -min -0.5 [get_ports {fast_ready_3}] -add_delay После сборки смотрю Datasheet Report и вижу, что tsu в райное +-0.1, хотя я ожидал получить менше -0.5. Причем проблема только с 3 каналом, для остальных tsu как я и рассчитывал в районе -0.6, -1.2.
  21. Я сейчас так и сделал, просто хочется красивое решение :)
×
×
  • Создать...