Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Задание констрейнов
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Среды разработки - обсуждаем САПРы
Anton1990
Всем привет.
Есть проект работающий на частоте clkA (~200 МГц). И сигнал CE сопровождающий весь проект. СЕ реально не превышает 50 МГц. Как задать констрейн для учета сигнала CE ведь всем проекту нет необходимости тикать на clkA.

Есть регистр "А" (32 разряда) куда записывается некоторое число из программы по сигналу clkrd. Выход данного регистра идет на вход другого регистра "В" работающего на частоте clkB. Запись в регистр "А" осуществляется из программы очень редко, а может и вообще не меняться. Как сообщить vivado не пытаться совместить частоты clkA и clkB?
Заранее всем спасибо.
Tausinov
Цитата(Anton1990 @ Oct 17 2017, 18:41) *
Всем привет.
Есть проект работающий на частоте clkA (~200 МГц). И сигнал CE сопровождающий весь проект. СЕ реально не превышает 50 МГц. Как задать констрейн для учета сигнала CE ведь всем проекту нет необходимости тикать на clkA.


Это так не работает, если возможна работа на меньшем клоке, то и перейдите на него, избавившись от CE.

Цитата
Есть регистр "А" (32 разряда) куда записывается некоторое число из программы по сигналу clkrd. Выход данного регистра идет на вход другого регистра "В" работающего на частоте clkB. Запись в регистр "А" осуществляется из программы очень редко, а может и вообще не меняться. Как сообщить vivado не пытаться совместить частоты clkA и clkB?
Заранее всем спасибо.


Если клоки кратные и синфазные, то проблем не будет. Если нет, то можно добавить что-то такое
set_clock_groups -asynchronous -group [get_clocks clkA -include_generated]
set_clock_groups -asynchronous -group [get_clocks clkB -include_generated]

-include_generated можно использовать только, если все производные клоки кратны исходному, иначе придется описывать их отдельно.

Пы. Сы. Есть еще немного "колхозный" метод
set_false_path -from [get_clocks clkA ] -to [get_clocks clkB]
Flip-fl0p
Цитата
Всем привет.
Есть проект работающий на частоте clkA (~200 МГц). И сигнал CE сопровождающий весь проект. СЕ реально не превышает 50 МГц. Как задать констрейн для учета сигнала CE ведь всем проекту нет необходимости тикать на clkA.

Если не ошибусь, тут надо применять констрейн мультицикла: set multi cycle path (это на Altera, на сколько я знаю у Xilinx почти такой-же формат SDC)

Цитата
Есть регистр "А" (32 разряда) куда записывается некоторое число из программы по сигналу clkrd. Выход данного регистра идет на вход другого регистра "В" работающего на частоте clkB. Запись в регистр "А" осуществляется из программы очень редко, а может и вообще не меняться. Как сообщить vivado не пытаться совместить частоты clkA и clkB?
Заранее всем спасибо.

Если переход между клоковыми доменами выполнен по всем правилам тогда достаточнро будет set_false_path или set_clock_groups -exclusive Но лучше конечно прочитать соответствующий Tutorial. Не исключены различия между Altera и Xilinx.
Anton1990
Цитата(Tausinov @ Oct 17 2017, 18:52) *
Это так не работает, если возможна работа на меньшем клоке, то и перейдите на него, избавившись от CE.

-include_generated можно использовать только, если все производные клоки кратны исходному, иначе придется описывать их отдельно.

Пы. Сы. Есть еще немного "колхозный" метод
set_false_path -from [get_clocks clkA ] -to [get_clocks clkB]

Перейти на меньшую частоту невозможно. Устройство принимает данные с АЦП на высокой частоте, обрабатывает и выдает на той же частоте но с сигналом CE (символы)

Колхозный метод наверное подошел бы (и я его пробовал), только вот задать просто имена клоков не получается. Один клок идет с clock_wizarda, а второй из ядра pcie. При указании названия клоков как они объявлены в моем блоке ничего не получается, vivado выдает критическое предупреждение. ВМожет нужно указывать не имена линий клоков, а имена пинов-источников этих клоков. Короче я не понял.
Tausinov
Цитата(Anton1990 @ Oct 17 2017, 19:21) *
Перейти на меньшую частоту невозможно. Устройство принимает данные с АЦП на высокой частоте, обрабатывает и выдает на той же частоте но с сигналом CE (символы)


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

Цитата
Колхозный метод наверное подошел бы (и я его пробовал), только вот задать просто имена клоков не получается. Один клок идет с clock_wizarda, а второй из ядра pcie. При указании названия клоков как они объявлены в моем блоке ничего не получается, vivado выдает критическое предупреждение. Может нужно указывать не имена линий клоков, а имена пинов-источников этих клоков. Короче я не понял.


В первом варианте такой проблемы быть не должно, если использовать в качестве клоков
create_clock -period 10.000 -name clkAparent [get_ports ext_clk_A]
create_clock -period 10.000 -name clkBparent [get_ports ext_clk_B]
клоки с верхнего уровня, из которых получаются ваши clkA и clkB.

А во втором, можно попробовать поиграться с get_clock - там есть разные способы указания источника. Путь в иерархии проекта можно взять из дизайна после разводки.
Shivers
Правила такие: констрейнить надо всегда по максимальной частоте, даже если в реальной схеме сигнал сопровождения возникает раз в тысячу тактов. После этого, надо смотреть связи между триггерами: если есть триггер А, выход которого поступает на триггер Б гарантированно через 2 и более тактов (но никогда в следующем такте), то на этот путь накладывается малтисайкл. Но все остальные пути (которые могут придти в следующем такте) должны анализироваться без малтисайкла.

Представить себе ситуацию, когда в схеме выходы ВСЕХ триггеров приходят на приемники через 2 и более такта, я не могу, потому что это будет означать, что дизайн написан по-лоховски, ведь опорный клок надо было делить еще на входе, до реальной частоты схемы. Т.е. если у топикстартера реальная частота схемы 50 МГц, а опорная частота 200, значит надо делить частоту на 4, а потом уже заводить в схему. И констрейнты тогда надо писать относительно клока 50 МГц, который объявить как генерейтед от 200 МГц.

Еще один момент. У топикстартера в первом посте какая то каша с клоками. Если в проекте используются две частоты clkA и clkB, где одна не получается из другой делением (т.е. оба генератора асинхронны друг другу), то это вообще другая история - читайте про CDC.
RobFPGA
Приветствую!

Цитата(Anton1990 @ Oct 17 2017, 19:21) *
Перейти на меньшую частоту невозможно. Устройство принимает данные с АЦП на высокой частоте, обрабатывает и выдает на той же частоте но с сигналом CE (символы)

set_multicycle_path тут скорее не подойдет. Точнее использовать то его можно но надо описывать им ВСЕ пути от источников до получателей которые работают через CE wacko.gif Наверное всеж проще и правильнее будет поставить FIFO и перейти на частоту CE.

Цитата(Anton1990 @ Oct 17 2017, 19:21) *
Колхозный метод наверное подошел бы (и я его пробовал), только вот задать просто имена клоков не получается. Один клок идет с clock_wizarda, а второй из ядра pcie. При указании названия клоков как они объявлены в моем блоке ничего не получается, vivado выдает критическое предупреждение. ВМожет нужно указывать не имена линий клоков, а имена пинов-источников этих клоков. Короче я не понял.

Для получения имен:
Простой вариант - открываете дизайн после синтеза находитеи Ваш клок и смотрите полное название название цепи.
Продвинутый - get_clocks -of [get_pins {полный/путь_вашего/модуля/имя_порта_clk}]
Опять же - открываете дизайн после синтеза и тестите команды в Tcl console

Ну и для второго случая правильнее будет использовать как выше советовали set_clock_groups -asynchronous -group [get_clocks ...

Успехов! Rob.




yes
а почему не пойдет set_multicycle_path ? вроде как это одно из основных применений - только нужно задавать на hold и setup (чтоб тул не офигел)
как-то так

set_multicycle_path -setup N -from {список всех триггеров с СЕ} -to {список всех триггеров с СЕ}
set_multicycle_path -hold N-1 -from {список всех триггеров с СЕ} -to {список всех триггеров с СЕ}

N - это сколько тактов пропускается СЕ

--------------

дисклеймер: пишу по памяти, а set_multicycle_path самый хитровыдуманый констрейн %)
RobFPGA
Приветствую!

Цитата(yes @ Oct 17 2017, 21:55) *
а почему не пойдет set_multicycle_path ? вроде как это одно из основных применений - только нужно задавать на hold и setup (чтоб тул не офигел)
как-то так
...

Да так и есть но вот получить полный и корректный список всех примитивов которые на CE будет то еще удовольствие
например все регистры
get_cells -of [get_pins -of [get_nets -segments CE_net_name]] -filter {PRIMITIVE_GROUP==REGISTER}
или все BRAM
get_cells -of [get_pins -of [get_nets -segments CE_net_name]] -filter {PRIMITIVE_GROUP==BLOCKRAM}
ну или все скопом
get_cells -of [get_pins -of [get_nets -segments CE_net_name]] -filter {IS_PRIMITIVE==1}

Но в любом случае для большого дизайна надо будет несколько итераций чтобы проверить все на корректность.
Да и смысла нет проще через клоки перетянуть и грется будет меньше и разводится быстрее.
Но это конечно от дизайна зависит ну и TC виднее что там у него.

Успехов! Rob.
andrew_b
Вообще по сравнению с ucf описание мультицикла в sdc ещё тот геморрой. В ucf пишется просто: от СE до СE.

TIMESPEC TS_CLKA = PERIOD CLKA 200 MHz;
TIMESPEC TS_CE = FROM CE TO CE TS_CLKA/4;
Maverick
Цитата(Anton1990 @ Oct 17 2017, 18:41) *
Всем привет.
Есть проект работающий на частоте clkA (~200 МГц). И сигнал CE сопровождающий весь проект. СЕ реально не превышает 50 МГц. Как задать констрейн для учета сигнала CE ведь всем проекту нет необходимости тикать на clkA.

Есть регистр "А" (32 разряда) куда записывается некоторое число из программы по сигналу clkrd. Выход данного регистра идет на вход другого регистра "В" работающего на частоте clkB. Запись в регистр "А" осуществляется из программы очень редко, а может и вообще не меняться. Как сообщить vivado не пытаться совместить частоты clkA и clkB?
Заранее всем спасибо.

не проще двухклоковое фифо применить...
_Anatoliy
Цитата(RobFPGA @ Oct 17 2017, 22:22) *
Да так и есть но вот получить полный и корректный список всех примитивов которые на CE будет то еще удовольствие

Странно. Уже давно пользуюсь мультициклами и никогда не составлял никаких списков. Просто указываю между какими клоками применить команду.
RobFPGA
Приветствую!

Цитата(_Anatoliy @ Oct 18 2017, 09:37) *
Странно. Уже давно пользуюсь мультициклами и никогда не составлял никаких списков. Просто указываю между какими клоками применить команду.

У TC на одном клоке сидит часть дизайна которому нужна задержка <1 такта, и часть дизайна которому нужно <N тактов.
Вы бы пример констрэйна привели.

Успехов! Rob.
_Anatoliy
Цитата(RobFPGA @ Oct 18 2017, 14:28) *
Приветствую!
У TC на одном клоке сидит часть дизайна которому нужна задержка <1 такта, и часть дизайна которому нужно <N тактов.
Вы бы пример констрэйна привели.
Успехов! Rob.

Код
set_multicycle_path -from [get_clocks {clk2x2sps}] -to [get_clocks {clk2x1sps}] -setup -start 2
set_multicycle_path -from [get_clocks {clk2x2sps}] -to [get_clocks {clk2x1sps}] -hold -start 1


Для дизайна которому нужно <N тактов можно ввести дополнительный клок. Клок clk2x1sps имеет ту же частоту что и клок clk2x2sps, только с СЕ. Можно взять частоту в 2 раза ниже но без СЕ.

Ещё вроде можно и одним клоком обойтись с СЕ, но я так не пробовал.
Код
set mc_group [get_fanouts [get_pins enable_reg|q]]
set_multicycle_path -setup 2 -from $mc_group -to $mc_group
set_multicycle_path -hold 1 -from $mc_group -to $mc_group
Anton1990
Цитата(Shivers @ Oct 17 2017, 20:46) *
Представить себе ситуацию, когда в схеме выходы ВСЕХ триггеров приходят на приемники через 2 и более такта, я не могу, потому что это будет означать, что дизайн написан по-лоховски, ведь опорный клок надо было делить еще на входе, до реальной частоты схемы. Т.е. если у топикстартера реальная частота схемы 50 МГц, а опорная частота 200, значит надо делить частоту на 4, а потом уже заводить в схему. И констрейнты тогда надо писать относительно клока 50 МГц, который объявить как генерейтед от 200 МГц.

Еще один момент. У топикстартера в первом посте какая то каша с клоками. Если в проекте используются две частоты clkA и clkB, где одна не получается из другой делением (т.е. оба генератора асинхронны друг другу), то это вообще другая история - читайте про CDC.


Поясняю ситуацию. Частота дискретизации сигнала 100 МГц, принимаемый сигнал 100 кГц. На выходе дема принятые символы идут на 100 МГц в сопровождении CE (равной символьной скорости т.е. 100 кГц). Сигнал децемировать заранее нельзя т.к. демов стоит несколько и соседний вполне может принимать сигнал с шириной 40 МГц.

По второму вопросу: дем работает на частоте 100 МГц а управление идет из регистров записываемых из программы с шины с ее частотой clkRD. Запись статична, т.е записали значение и забыли, но vivado ведь незнает что запись происходит очень редко (по желанию пользователя) и пытается совместить "несовместимые" и независимые частоты.
Shivers
Цитата(Anton1990 @ Oct 19 2017, 18:32) *
Поясняю ситуацию. Частота дискретизации сигнала 100 МГц, принимаемый сигнал 100 кГц. На выходе дема принятые символы идут на 100 МГц в сопровождении CE (равной символьной скорости т.е. 100 кГц). Сигнал децемировать заранее нельзя т.к. демов стоит несколько и соседний вполне может принимать сигнал с шириной 40 МГц.

Т.е., как я понял, у Вас входной интерфейс - состоит из шины данных, сигнала сопровождения СЕ и тактируется 100 МГц.

Цитата(Anton1990 @ Oct 19 2017, 18:32) *
По второму вопросу: дем работает на частоте 100 МГц а управление идет из регистров записываемых из программы с шины с ее частотой clkRD. Запись статична, т.е записали значение и забыли, но vivado ведь незнает что запись происходит очень редко (по желанию пользователя) и пытается совместить "несовместимые" и независимые частоты.

И как я понял, сам проект тактируется clkRD?

Смотрите что получается.
1. Входной интерфейс надо обязательно констрейнить по его частоте, ничего сокращать нельзя. Это нужно, чтобы выровнять задержки входной шины данных, чтобы они сильно не расползались во времени. И частота сигнала СЕ здесь никакой роли не играет -сигнал СЕ тоже нужно констренить относительно 100МГц.
2. Вам надо разобраться, что делать с этим потоком данных. Логичное решение - на вход интерфейса ставить триггеры, работающие на 100Мгц, с разрешением записи по сигналу СЕ - теперь их данные будут меняться уже с периодичностью изменения сигнала СЕ, т.е. частоту потока данных Вы понизили, хотя эти данные все равно остаются синхронными 100 МГц.
3. Надо понять, что делать с этим потоком данных, от какого генератора будут тактироваться триггеры дальше по схеме. Если по клоку clkRD, то ставите пересинхронизационное фифо, получаете поток данных, синхронный clkRD, и делаете с этим потоком что захотите. При этом, между clkRD и 100Мгц - фалзпасы в обе стороны, поскольку это асинхронные частоты, как я понял (т.е. clkRD не получается делением из 100МГц). Это бы Вы делали эсик, а не ПЛИС, то к фалзпасам надо было бы добавить асинхронный констрейнт set_max_delay в обе стороны, чтобы тул совсем уж не бросал эти пути сигналов.
Anton1990
Цитата(Shivers @ Oct 20 2017, 08:45) *
Т.е., как я понял, у Вас входной интерфейс - состоит из шины данных, сигнала сопровождения СЕ и тактируется 100 МГц.
И как я понял, сам проект тактируется clkRD?
Смотрите что получается.


Вначале не хотел всего раскрывать, но что уж теперь.
Схема такова.
Одна плата PCIe оцифровывает данные на 200 МГц и оцифрованные данные передаются по pcie на другу плату pcie (обработчик).
Далее на плате обработчика.
Разумеется по приходу с pcie поток складывается в фифо. Из фифо поток по генератору 210 МГц (чтобы успевать за частотой дискретизации) и сигналу ce (это флаг полноты фифо) данные качаются на линейку демов. С выхода которых имеем множество потоков на частоте 210 МГц в сопровождении сигнала datavalid (эквивалент символьной скорости от 1кГц до 50 МГц).
Управляются (настраиваются) демы из pcie через регистры, которые записываются по частоте pcieRD (~250 МГц), а выходы этих (управляющих) регистров (эти регистры записываются редко, по желанию пользователя) идут на регистры демов, которые тикают на 210 МГц.
Связку фифо-демы и регистры управления-демы, нужно как-то правильно обконстрейнить.
как-то так.
Shivers
Получается два асинхронных клоковых домена: частота PCI-E PHY и регистров (250 МГц), и частота 210 МГц для обработки. Фифо нужно пересинхронизационное, сигналы управления из регистров тоже надо пересинхронизировать - пропустить через два D-триггера на частоте 210. Между обоими клоками ставить фазпасы в обе стороны.
Что касается домена 210 МГц и сигнала datavalid, то на мой взгляд, констрейнить здесь какое то понижение частоты нельзя. Может быть, символьная скорость и снижается, но времена сетап/холд приемных триггеров этих символов, работающих (как я понял) тоже на 210 МГц, никто не отменял.
Anton1990
Цитата(Shivers @ Oct 23 2017, 20:04) *
Получается два асинхронных клоковых домена: частота PCI-E PHY и регистров (250 МГц), и частота 210 МГц для обработки. Фифо нужно пересинхронизационное, сигналы управления из регистров тоже надо пересинхронизировать - пропустить через два D-триггера на частоте 210. Между обоими клоками ставить фазпасы в обе стороны.
Что касается домена 210 МГц и сигнала datavalid, то на мой взгляд, констрейнить здесь какое то понижение частоты нельзя. Может быть, символьная скорость и снижается, но времена сетап/холд приемных триггеров этих символов, работающих (как я понял) тоже на 210 МГц, никто не отменял.

Все верно понято. Пересинхронизационное фифо стоит, но ведь его входную и выходную частоты нужно както обконстрейнить? А что значит "Между обоими клоками ставить фазпасы в обе стороны" ?
Shivers
В общих чертах. Самый главный констрейнт - объявление клока. Он автоматически накладывает ограничения на все триггеры, тактируемые этим клоком. Если есть внешний интерфейс микросхемы, который либо драйверится триггерами на данном клоке, либо принимается этими триггерами, то этот интерфейс надо констрейнить относительно данного клока с помощью set_input_delay/set_output_delay с ключами min/max. Таким образом констрейните один клоковый домен (250), так же констрейните второй клоковый домен (210). Поскольку клоки асинхронные, пути между ними (из домена 250 в домен 210 и наоборот, т.е. в обе стороны) будут нарушаться, и их надо исключить из анализа. Делается это через команды set_false_path -from clk250 -to clk210 и set_false_path -from clk210 -to clk250.
Anton1990
Цитата(Shivers @ Oct 25 2017, 09:18) *
В общих чертах. Самый главный констрейнт - объявление клока. Он автоматически накладывает ограничения на все триггеры, тактируемые этим клоком. Если есть внешний интерфейс микросхемы, который либо драйверится триггерами на данном клоке, либо принимается этими триггерами, то этот интерфейс надо констрейнить относительно данного клока с помощью set_input_delay/set_output_delay с ключами min/max. Таким образом констрейните один клоковый домен (250), так же констрейните второй клоковый домен (210). Поскольку клоки асинхронные, пути между ними (из домена 250 в домен 210 и наоборот, т.е. в обе стороны) будут нарушаться, и их надо исключить из анализа. Делается это через команды set_false_path -from clk250 -to clk210 и set_false_path -from clk210 -to clk250.


Я себе это примерно так и представлял. Но у меня возникла загвоздка: имена clk250 и ck210 откуда брать? Эти цепи находятся не на самом верхнем уровне проекта, поэтому просто указать имена clk250 и ck210 не проходит. Требуется видимо иерархическое имя которое можно выудить из схематика после синтеза (ну по крайней мере так советовали). Я прав?
alexadmin
Цитата(Anton1990 @ Oct 25 2017, 18:42) *
Я себе это примерно так и представлял. Но у меня возникла загвоздка: имена clk250 и ck210 откуда брать? Эти цепи находятся не на самом верхнем уровне проекта, поэтому просто указать имена clk250 и ck210 не проходит. Требуется видимо иерархическое имя которое можно выудить из схематика после синтеза (ну по крайней мере так советовали). Я прав?


Проще всего после компиляции проекта запустить тайминг визард - он сам найдет не обконстрейненные клоки и предложит их задать. По крайней мере оттуда можно взять их имя и написать констрэйн самому. Или просто из репорта - там обычно тоже все найденные клоки проекта есть.
Anton1990
Цитата(alexadmin @ Oct 26 2017, 13:20) *
Проще всего после компиляции проекта запустить тайминг визард - он сам найдет не обконстрейненные клоки и предложит их задать. По крайней мере оттуда можно взять их имя и написать констрэйн самому. Или просто из репорта - там обычно тоже все найденные клоки проекта есть.

Кажется со всем разобрался. Всем спасибо за советы. Тему закрываем.
Maverick
Цитата(Anton1990 @ Oct 26 2017, 18:32) *
Кажется со всем разобрался. Всем спасибо за советы. Тему закрываем.

может поделитесь?
другим вопрошающим будет ответ sm.gif
AVR
Цитата(Anton1990 @ Oct 26 2017, 18:32) *
Кажется со всем разобрался. Всем спасибо за советы. Тему закрываем.

Так не вежливо поступать. Создана тема - в конце темы: решение с подробностями.
Тут не саппорт, где раз решена проблема то и ладно. Это база знаний и решений.
Anton1990
Цитата(Maverick @ Oct 26 2017, 18:37) *
может поделитесь?
другим вопрошающим будет ответ sm.gif

Прошу прощения, конечно. Но чем делится, то?
Сделал так как Вы мне и посоветовали. Вычистил файл констрейнов (кроме распиновки). Синтезировал, имплементировал. Запустил констрейн визард. По ходу нажимания стрелочек он сам (всмысле визард) нашел все мои клоки, я лишь указал частоту, и самое главное предложил создать асинхронные участки между клоком pcie и моей частотой 210МГц в обоих направлениях. Правда написал, что не советует так делать (но я сделал). Вот и все. Сохранил констрейны. Перекомпилил проект. Варнинги по поводу асинхронщины исчезли (по крайней мере в этой части проекта). Как все выше проделанное сказалось на общей работоспособности пока понять не смог, там у меня еще других проблем хватает. Но вопрос правильного "обконстрейнивания" проекта благодаря Вам я пока закрыл. Вот и все.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.