|
TimeQuest, кто ж тебя выдумал?, поговорим на простом нестандартном примере |
|
|
|
Jan 7 2018, 11:06
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Возясь со своим реальным проектом, сделал простой учебный. Пытаюсь разобраться в констрейнах (хотя некогда считал себя достаточно грамотным в этой теме). Вот SystemVerilog проект. Ниже - констрейны для него. Работаю в Quartus 13.1, ПЛИС EP3C5E144I7. Код module ClockDivider ( (* chip_pin = "84" *) input ResetN, (* chip_pin = "89", altera_attribute = "-name io_standard lvds" *) input ClkIn, (* chip_pin = "28" *) output ClkOut, (* chip_pin = "30" *) input ClkSel, (* chip_pin = "32" *) input DataIn, (* chip_pin = "33" *) output DataOut );
bit ClkDiv; always_ff @(posedge ClkIn, negedge ResetN) if (!ResetN) ClkDiv <= 0; else ClkDiv <= !ClkDiv;
always_comb if (!ClkSel) ClkOut = ClkIn; else ClkOut = ClkDiv; always_ff @(posedge ClkOut, negedge ResetN) if (!ResetN) DataOut <= 0; else DataOut <= DataIn;
endmodule : ClockDivider Код set_time_format -unit ns -decimal_places 3
create_clock -name clk_in -period "100 MHz" -waveform {0 5.0} ClkIn
create_clock -name clk_virt -period "100 MHz"
create_generated_clock -name clk_div ClkDiv -divide_by 2 -source ClkIn
# derive_clocks
derive_clock_uncertainty
set_input_delay -clock clk_virt -min 0.0 ClkSel set_input_delay -clock clk_virt -max 1.0 ClkSel
set_input_delay -clock clk_virt -min 0.0 ResetN set_input_delay -clock clk_virt -max 1.0 ResetN
set_input_delay -clock clk_virt -min 0.0 DataIn set_input_delay -clock clk_virt -max 1.0 DataIn
set_output_delay -clock clk_virt -min -2.0 ClkOut set_output_delay -clock clk_virt -max -1.0 ClkOut
set_output_delay -clock clk_virt -min -2.0 DataOut set_output_delay -clock clk_virt -max -1.0 DataOut Вопросы. Почему работает описание триггера - делителя тактовой частоты, просто делить частоту на 2, без задержек в самом триггере? Как учитываются задержки в триггере? Почему для выходных сигналов пришлось сделать отрицательную задержку, иначе ограничения не выполнялись? Когда смотрел в TimeQuest временнЫе пути, Launch Clock запускался по срезу. Прикладываю картину ниже. Правильные ли вообще эти констрейны? Любые советы почитаю с интересом. (К сожалению, ответить смогу только завтра, ибо предстоит культурное мероприятие). Вот картина-отчет. Как ее интерпретировать? Нужно ли описывать сигнал после мультиплексора как тактовый? Пишут, вроде, нужно. А что же TimeQuest не ругается?
Эскизы прикрепленных изображений
|
|
|
|
3 страниц
< 1 2 3
|
 |
Ответов
(30 - 41)
|
Jan 11 2018, 05:30
|

Знающий
   
Группа: Свой
Сообщений: 680
Регистрация: 11-02-08
Из: Msk
Пользователь №: 34 950

|
Виртуальный клок нужен чтобы достроить граф STA на интерфейсах: по входу он создает входную арку, а по выходу - выходную. При этом можно варьировать тип арки, к примеру - выбирать фронт (rise или fall), выбирать тип проверки для этой арки (setup или hold). Но поскольку арка должна иметь два конца (иначе путь будет unconstrained), то виртуальный клок должен быть синхронен принимающему клоку (по входу) и/или запускающему (по выходу). Виртуальных клоков можно создавать сколько угодно. Но и в схеме может быть много асинхронных клоков, и тогда надо следить - какой виртуальный клок синхронен какому внутреннему клоку. Соответственно, при создании виртуальных клоков потребуется задавать дополнительные фалзпасы.
Требование алтеры констрейнить интерфейсы виртуальным клоком выглядит странно. Если констрейнить синхронный вход не относительно собственного клока, а относительно виртуального, то действительно - тайминг будет отличаться на величину uncertainty и drive adjustment клокового пина (поскольку к виртуальному клоку эти твики не применяются). Но эту разницу в тайминге куда проще упрятать в величину задержки констрейнта, чем плодить виртуальные клоки. Обычно виртуальный клок используется, чтобы констрейнить асинхронные входы, чтобы они хоть как то контролировались тулом. Либо для каких то тонких моментов вроде DDR, где констрейнить интерфейс надо по обоим фронтам клока, и может оказаться проще задать два виртуальных клока со сдвигом фазы 50%, и написать констрейнт относительно переднего фронта каждого из них. Т.е. виртуальный клок - вещь специфическая, почти как кунгфу (применяется при необходимости). Но, альтере виднее, конечно. Возможно, у них тул так специфически работает, что необходимо заводить виртуальную копию каждому интерфейсному клоку.
|
|
|
|
|
Jan 11 2018, 07:45
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(_Anatoliy @ Jan 11 2018, 09:15)  Здесь похожая арифметика. Смотрели? Timing_ConstraintsДа, смотрел, спасибо. Хороший документ. И этот тоже покажем для коллекции. http://www.alterawiki.com/wiki/TimeQuest_User_GuideЖаль, на дописал его Райан Сковиль. Цитата(Shivers @ Jan 11 2018, 08:30)  Возможно, у них тул так специфически работает, что необходимо заводить виртуальную копию каждому интерфейсному клоку. Это несложно.  Все задержки снаружи ПЛИС описывать виртуальными тактами. Я описываю задержки в АЦП и в дорожках на плате, подключенных к ПЛИС. И т.п. Все, как в учебниках.
|
|
|
|
|
Jan 11 2018, 09:45
|
Частый гость
 
Группа: Свой
Сообщений: 134
Регистрация: 9-11-12
Из: г. Брянск
Пользователь №: 74 311

|
Цитата(ViKo @ Jan 11 2018, 10:45)  и в дорожках на плате, подключенных к ПЛИС Не поделитесь методикой?
|
|
|
|
|
Jan 11 2018, 10:02
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(dima32rus @ Jan 11 2018, 12:45)  Не поделитесь методикой? Все согласно сказанному выше. Проверил только что. Вот фрагменты из sdc файла. Там некоторые данные и такты инверсные используются. Так LVDS развелись. И еще длина дорожек (задержка) разные в разных цепях шины. Это уже разводчики постарались. Убил бы сейчас. CODE # Задержка распространения рассчитана на калькуляторе Saturn PCB # Microstrip, W = 0.250 mm, H = 0.345 mm, FR-4 STD, 0.18 + 0.18 µm (Zo = 77 Ohm) # было Tpd = 0.00563 # Saturn PCB V6.88, Conductor Impedance, Tpd (ns/mm) # Microstrip, W = 0,25 mm, H = 0,34 mm, FR-4 STD, 0,18 um + 0,35 um (Zo = 75.5 Ohms) set Tpd 0.00584
set ADC1clk_min [expr 53.453 * $Tpd] set ADC1clk_max [expr 55.604 * $Tpd] set ADC2clk_min [expr 50.640 * $Tpd] set ADC2clk_max [expr 54.596 * $Tpd]
# Задержки преобразования в АЦП (1.9 valid,min | 2.8 pd,typ | 3.8 pd,max) # Окно верных данных с АЦП set ADCtco_min 3.8 set ADCtco_max [expr 1.9 + 4.0]
# Задержки данных из АЦП по плате set ADC1dat_min [expr 15.893 * $Tpd] set ADC1dat_max [expr 42.767 * $Tpd] set ADC2dat_min [expr 15.325 * $Tpd] set ADC2dat_max [expr 34.516 * $Tpd]
# Задержки тактов для ПЛИС set PLDclk_min [expr 14.693 * $Tpd] set PLDclk_max [expr 15.099 * $Tpd]
# Входные такты (сдвинуты на полпериода, потому что инверсные) create_clock -name plc -period "250 MHz" -waveform {2.0 4.0} [get_ports {PLC_N}]
# Внешние виртуальные такты для тактирования сигналов с АЦП create_clock -name clka -period "250 MHz"
# Канал 1 set_input_delay \ -clock clka -min \ [expr $ADC1clk_min + $ADCtco_min + $ADC1dat_min - $PLDclk_max] \ {S1D_N[*] S1D_P} set_input_delay \ -clock clka -max \ [expr $ADC1clk_max + $ADCtco_max + $ADC1dat_max - $PLDclk_min] \ {S1D_N[*] S1D_P}
# Канал 2 set_input_delay \ -clock clka -min \ [expr $ADC2clk_min + $ADCtco_min + $ADC2dat_min - $PLDclk_max] \ {S2D_P[*] S2D_N[*]} set_input_delay \ -clock clka -max \ [expr $ADC2clk_max + $ADCtco_max + $ADC2dat_max - $PLDclk_min] \ {S2D_P[*] S2D_N[*]}
|
|
|
|
|
Jan 11 2018, 10:45
|
Частый гость
 
Группа: Свой
Сообщений: 134
Регистрация: 9-11-12
Из: г. Брянск
Пользователь №: 74 311

|
Цитата(ViKo @ Jan 11 2018, 13:02)  # Задержки данных из АЦП по плате set ADC1dat_min [expr 15.893 * $Tpd] set ADC1dat_max [expr 42.767 * $Tpd] Простите за любопытство, а что есть эти магические цифры: 15.893, 42.767
|
|
|
|
|
Jan 11 2018, 11:50
|
Частый гость
 
Группа: Свой
Сообщений: 134
Регистрация: 9-11-12
Из: г. Брянск
Пользователь №: 74 311

|
Цитата(_Anatoliy @ Jan 11 2018, 13:52)  Длина дорожки умноженная на удельную задержку Tpd (ns/mm) ADC1dat_min и ADC1dat_max - так это разные дорожки? Мне показалось, что одна и та же, просто рассчитывается мин. и макс. задержка. Если первая цифра - это длина, а Tpd - погонная задержка, тогда не понятно было, как длина одной и той же дорожки может быть разной... Названия сбили с толку.
|
|
|
|
|
Jan 11 2018, 11:55
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(dima32rus @ Jan 11 2018, 14:50)  ADC1dat_min и ADC1dat_max - так это разные дорожки? Мне показалось, что одна и та же, просто рассчитывается мин. и макс. задержка. Если первая цифра - это длина, а Tpd - погонная задержка, тогда не понятно было, как длина одной и той же дорожки может быть разной... Названия сбили с толку. Во-первых, это дифференциальные сигналы, длина дорожек + и - могут отличаться. Во-вторых, с АЦП идет шина данных. В данном случае описана самая короткая и самая длинная дорожки в шине.
|
|
|
|
|
Jan 11 2018, 12:02
|
Частый гость
 
Группа: Свой
Сообщений: 134
Регистрация: 9-11-12
Из: г. Брянск
Пользователь №: 74 311

|
Цитата(ViKo @ Jan 11 2018, 14:55)  Во-первых, это дифференциальные сигналы, длина дорожек + и - могут отличаться. Во-вторых, с АЦП идет шина данных. В данном случае описана самая короткая и самая длинная дорожки в шине. Да, теперь понятно, спасибо
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|