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

Помогите с GOWIN EDA (set_input/output_delay bug)

Переношу проект с Xilinx на GOWIN (GW2A-18). Выяснилось, что директивы set_input_delay / set_output_delay совсем не влияют на результат трассировки плис. Естественно, отдельно проверил с помощью простенького кода и осцилографа, что задержка выходного тактового сигнала относительно данных не меняется при смене значений этой задержи в директивах. Даже не меняется выходной бинарник (fs-файл). Может кто сталкивался, есть ли способ заставить работать это чудо?

Изменено пользователем Dimitrius

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


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

Вы отчёт анализатора таймингов смотрели? Может быть у вас эти констрейнты не были применены и поэтому по сути проигнорированы?

PS: С чего вы взяли, что при изменении этих параметров должны меняться задержки, наблюдаемые с помощью осциллографа?

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


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

Цитата

Вы отчёт анализатора таймингов смотрели?

Смотрел. Написано, что activated.

Цитата

С чего вы взяли, что при изменении этих параметров должны меняться задержки, наблюдаемые с помощью осциллографа?

С того, что в расчётах параметров min и max участвуют setup и hold для внешнего интерфейса. То есть эти директивы и нужны, чтобы выдержать setup/hold наружу. У gowin вижу, что фронт данных выходит позже клока (setup не выдержан), также не выдерживается hold. 

Также я наблюдал эти изменения осциллографом на Xilinx, когда делал этот интерфейс.

У Xilinx UG949 стр. 155 есть пример расчёта mix/max параметров.

 

Изменено пользователем Dimitrius

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


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

29 минут назад, Dimitrius сказал:

С того, что в расчётах параметров min и max участвуют setup и hold для внешнего интерфейса. То есть эти директивы и нужны, чтобы выдержать setup/hold наружу.

Выдержать каким образом, как вы считаете? За счёт чего это происходит?

Hint: это не механизм управления задержками, это механизм их контроля для обеспечения совместимости по задержкам (таймингам) с внешним окружением.

32 минуты назад, Dimitrius сказал:

Смотрел. Написано, что activated.

Проверьте какие цепи ими накрываются и какие результаты их применения (какой slack).

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


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

1 час назад, makc сказал:

Выдержать каким образом, как вы считаете? За счёт чего это происходит?

За счёт размещения/разводки внутри плис.

1 час назад, makc сказал:

Hint: это не механизм управления задержками, это механизм их контроля для обеспечения совместимости по задержкам (таймингам) с внешним окружением.

Если это только механизм контроля, то после применения директив  должно выйти только сообщение об ошибке, если не получилось сделать так как указано. Однако, так не происходит. После применения директив меняется и сама разводка, так как она опирается на тайминги (в том числе и указанные директивы), что должно привести к изменению задержек setup/hold на выходе. Например на Xilinx без директив интерфейс у меня не работает, с директивами работает. Так что это механизм влияния, а не только контроля.

1 час назад, makc сказал:

Проверьте какие цепи ими накрываются и какие результаты их применения (какой slack).

Slack 12.404
Data Arrival Time 4.561
Data Required Time 16.965
From data_2_s0
To data_i
Launch Clk clk50:[R]
Latch Clk test_clk_gen:[R]

Data Arrival Path:

AT DELAY TYPE RF FANOUT LOC NODE
0.000 0.000         active clock edge time
0.000 0.000         clk50
0.000 0.000 tCL RR 5 PLL_L[1] PLL_CPU/rpll_inst/CLKOUTD
0.243 0.243 tNET RR 1 R33C34[1][A] data_2_s0/CLK
0.475 0.232 tC2Q RF 2 R33C34[1][A] data_2_s0/Q
1.974 1.499 tNET FF 1 IOR40[A] data_i/I
4.561 2.586 tINS FF 1 IOR40[A] data_i/O

Data Required Path:

AT DELAY TYPE RF FANOUT LOC NODE
20.000 20.000         active clock edge time
20.000 0.000         test_clk_gen
19.965 -0.035 tUnc       data_i
16.965 -3.000 tOut     IOR40[A] data_i

 

Это для set_output_delay -min -3.0 (max 3.0)

Изменено пользователем Dimitrius

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


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

4 часа назад, Dimitrius сказал:

За счёт размещения/разводки внутри плис.

Это позволяет уменьшить задержки путем более оптимального размещения и минимизации длин путей, т.е. позволяет побороться за setup. Но вот hold это уже совсем другое дело и увеличить задержки с помощью обсуждаемых констрейнтов не получится (за исключением редких случаев, но это совсем другая тема).

4 часа назад, Dimitrius сказал:

Если это только механизм контроля, то после применения директив  должно выйти только сообщение об ошибке, если не получилось сделать так как указано.

Естественно САПР пытается оптимизировать проект и минимизировать задержки, но если это у него не получается, то тогда вы уже получаете сообщения об ошибках. При этом если вы задаёте такие значения, которые легко удовлетворяются одним и тем же размещением, то, как вы понимаете, вы будете получать один и тот же результат наблюдаемых с помощью осциллографа задержек, независимо от частного значения заданного в констрейнтах.

4 часа назад, Dimitrius сказал:

Например на Xilinx без директив интерфейс у меня не работает, с директивами работает. Так что это механизм влияния, а не только контроля.

Вам не повезло, что без контроля над таймингами САПР не стал излишне оптимизировать. 😉

В приведенном вами примере у вас есть 12 нс запаса, зачем САПРу ещё стараться, если можно легко и просто выдать результаты?

PS: Hold может быть и отрицательный. Почитайте, как это все обстоит у упомянутого вами Xilinx - https://support.xilinx.com/s/question/0D52E00006hpJcSSAU/hold-time-can-be-negative-zero-and-positive-can-you-explain-it-to-me-with-negative-hold-time?language=en_US

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


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

37 минут назад, makc сказал:

При этом если вы задаёте такие значения, которые легко удовлетворяются одним и тем же размещением

Так вот штука в том, что не удовлетворяется требование, setup на выходе отрицательный.

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


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

Потом, он так лихо добавил целый период к клоку (20нс), и считает, что у него запас остался. 

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


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

1 час назад, Dimitrius сказал:

Так вот штука в том, что не удовлетворяется требование, setup на выходе отрицательный.

Было бы неплохо пояснить картинками что вы хотите сказать этими словами. Что вы хотите получить, что прописали в констрейнтах и что по факту получается.

1 час назад, Dimitrius сказал:

Потом, он так лихо добавил целый период к клоку (20нс), и считает, что у него запас остался. 

Этот тезис тоже нужно пояснить.

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


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

а параметр C_STATIC_DLY у компонента IODELAY от сборки к сборке меняется? И вообще, сам компонент есть в проекте? Если руками поставить этот модуль и поиграть задержкой в статическом или динамическом режиме, будет отклик?

On 10/22/2022 at 4:52 PM, makc said:

Выдержать каким образом, как вы считаете? За счёт чего это происходит?

Справедливости ради, он должен подбирать выходные задержки за счет 128 возможных значений в IODELAY модуле) как интел и зайлинкс)

При этом, судя по даташиту, независимо от размещения триггера в порту ввода/вывода

gowin_out.png

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


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

26 минут назад, des00 сказал:

Справедливости ради, он должен подбирать выходные задержки за счет 128 возможных значений в IODELAY модуле) как интел и зайлинкс)

Где про это написано, что он это должен делать? По моему опыту всё ровно наоборот: я подбираю значения параметра IODELAY для удовлетворения требований таймингов, задаваемых с помощью констрейнтов. И это логично, особенно учитывая что значения задержки могут быть изменены динамически (есть вход динамической подстройки). Я не помню, чтобы в документации от Xilinx где-то было описано подобное влияние timing constraints на значение числа тапов в параметре IODELAY. В ISE вроде был отдельный констрейнт на эту тему (в ucf), но это просто другая форма задания параметра задержки у примитива ПЛИС. Что же касается sdc/xdc, то там я такого не помню. Вот описание ODELAYE2 и здесь ни слова не сказано, что set_output_delay влияет на задание числа тапов при фиксированном задании задержки.

34 минуты назад, des00 сказал:

При этом, судя по даташиту, независимо от размещения триггера в порту ввода/вывода

Это логично, в противном случае функциональность данного блока задержки была бы очень сильно ограничена.

 

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


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

30 minutes ago, makc said:

Где про это написано, что он это должен делать?

в ISE да, ему интеллекта не хватало. А квартус, еще в 9.0 уже умел двигать задержки в режиме Timing Driven Synthesis(который возможен только в режиме использования TQ). Можете взять примеры из моих статей лохматой давности или просто их глянуть, там на примере третьего сыклона показано что он сам, автоматически, их подбирает. Также и вивадо, меняет значение DELAY_VALUE у компонента, если требуется, за исключением ручной вставки компонента в проект с другим значением задержки или в режиме установки с интерфейса. Можете сами проверить, собрать простой проект позадавать констрейны и посмотреть Chip Planner, выходную ячейку, какое значение задержки там стоит.

UPD. Еще по квартусу, есть такой документ "SDC and TimeQuest API Reference Manual", явно в нем не указано, но вот есть такая волшебная оговорка при описании так желаемой многими команды set_max_skew

Quote

The Fitter does not include set_max_skew constraints in design optimization. Use placement, routing, or other timing constraints to drive the fitter to meet any set_max_skew constraints.

Fitter квартуса точно учитывает констрейны, при оптимизации дизайна) Проверено на себе.  Как и вивадо, версии 2018.2 точно.

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


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

UPD2. Вот из древнего документа Quartus II  Handbook Version 9.0 Volume 1: Design and Synthesis в разделе где речь идет про опции фитера

Quote

You can control the effort the Quartus II Fitter expends to achieve your timing requirements with these options:
■ Optimize timing performs timing-based placement using the timing requirements you specify for the design. You can use this option by itself or with one or more of the options below.
■ Optimize hold timing optimizes the hold times within a device to meet timing requirements and assignments you specify. You can select this option only if the Optimize timing option is also chosen.
■ Optimize fast-corner timing instructs the Fitter, when optimizing your design, to consider fast-corner delays, in addition to slow-corner delays, from the fast-corner timing model (fastest manufactured device, operating in low-temperature and high-voltage conditions). You can select this option only if the Optimize timing option is also chosen

И это, лохматый прелохматый год, когда софт наконец то научился делить требуемую задержку на шаг единичной секции задержки и определять допустимые окна значений с выбором среднего)

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


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

27 минут назад, des00 сказал:

А квартус, еще в 9.0 уже умел двигать задержки в режиме Timing Driven Synthesis(который возможен только в режиме использования TQ).

TDS это немного другое, это больше про оптимизацию для удовлетворения сильно затянутых констрейнтов, которые просто так удовлетворить не получается.  А в этой теме, на сколько я понял ТС, речь идёт о том, чтобы добавить задержку исходя из заданных ограничений, т.е. это обратная задача.

29 минут назад, des00 сказал:

Также и вивадо, меняет значение DELAY_VALUE у компонента, если требуется, за исключением ручной вставки компонента в проект с другим значением задержки или в режиме установки с интерфейса. Можете сами проверить, собрать простой проект позадавать констрейны и посмотреть Chip Planner, выходную ячейку, какое значение задержки там стоит.

Честно говоря не обращал на это внимания, т.к. добавляю IODELAYE2 вручную по необходимости. Но при случае обращу на это внимание. Однако, возвращаясь к теме Gowin, я бы не стал полагаться на интеллектуальность среды и, если это необходимо, добавил бы вручную необходимые примитивы для удовлетворения требований констрейнтов.

16 минут назад, des00 сказал:

И это, лохматый прелохматый год, когда софт наконец то научился делить требуемую задержку на шаг единичной секции задержки и определять допустимые окна значений с выбором среднего)

Китайцы ещё вначале большого пути... У них ещё в области поддержки sdc поле непахано, так что говорить про особенную интеллектуальность их софта пока не приходится. Меня в этом плане куда больше напрягает плохая информативность их STA и невозможность полноценного контроля применения констрейнтов.

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


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

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

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

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

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

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

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

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

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

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