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

Timing Constraints

Доброго дня,
Для меня очевидно, что временные ограничения придумали в аду, поэтому хотелось бы попросить помощи сообщества, чтобы лучше их понять.

Дизайн простой:
- clk - тактовая частота 50 МГц
- PLL создаёт две частоты clk[0] и clk[1] по 100 МГц. Никаких сдвигов между частотами нет.
- Двунаправленная шина данных data_io. Все регистры входные и выходные регистры тактируются от clk[0]
- Внешнее устройство тактируется от clk[1]

Как я знаю есть два вида синхронизации: System Synchronous и Source Synchronous.
System Synchronous это когда FPGA и внешнее устройство тактируются от одного внешнего по отношению к FPGA тактового генератора.
Source Synchronous в свою очередь делится на:
- Source Synchronous Outputs - тактовая частота рождается в FPGA и тактирует внешнее устройство, данные передаются от FPGA к внешнему учстройству.
- Source Synchronous Inputs - тактовая частота рождается во внешнем устройстве и тактирует FPGA, данные передаются от внешнего устройства к FPGA.
Далее Source Synchronous интерфей делется на целый зоопарк различных вариантов: Center-Aligned, Edge-Aligned, Skew Based, Setup/Hold Based. Причём различные производители Intel и AMD имеют разную терминологию.


Выходит, что дизайн описанный выше при работе на выход подходит под Source Synchronous Outputs, а при работе как вход уже не подходит под Source Synchronous Inputs, т.к. тактовая частота генерируется внутри FPGA, а не внешним устройством.

SDC файл такой:
 


#(tSU внешнего устройства)
set tSU 1.7

#(tH внешнего устройства)
set tH 1.0

#(max задержка дорожек печатной платы)
set trce_dly_max 0.2

#(min задержка дорожек печатной платы)
set trce_dly_min 0.1


set t_out_max [expr $trce_dly_max + $tSU] # 1.9 ns
set t_out_min [expr $trce_dly_min - $tH] # -0.9 ns


create_clock -name clk -period 20.000 [get_ports {clk}]
derive_pll_clocks -create_base_clocks
derive_clock_uncertainty
create_generated_clock -name output_clock -source [get_pins {pll_top_1_inst|altpll_component|auto_generated|pll1|clk[1]}] [get_ports {clk_out}]


set_output_delay -max -clock output_clock $t_out_max [get_ports {data_io[*]}] -add_delay
set_output_delay -min -clock output_clock $t_out_min [get_ports {data_io[*]}] -add_delay

 

Как расчитать set_input_delay?

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


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

8 часов назад, djhall сказал:

Как расчитать set_input_delay?

Тут ничего рассчитывать не нужно, нужно просто задать задержку, вносимую внешними цепями в пути данных. set_input_delay как бы говорит анализатору (STA), что, мол, там снаружи сигнал ещё задерживается на столько-то, поэтому у тебя вот бюджет таймингов уменьшается на эту величину. Например, если снаружи нет ничего, кроме проводников на плате, и их длина такая, что задержкой в них можно пренебречь, то следует указать значение ноль. Если есть какие-то ощутимые задержки, то их и указать. Особенно это касается случаев, когда данные, например, проходят через какой-то буфер, который вносит пару нс, причём, там ещё и разброс значений присутствует -- тогда для max и min будут разные значения.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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