Ограничения синхронизации ASIC через SDC: Как правильно указать мультиплексированные часы?

10

Вступление

Найдя в Интернете много, иногда противоречивую или неполную информацию и в некоторых учебных классах о том, как правильно создавать временные ограничения в формате SDC , я хотел бы попросить сообщество EE помочь с некоторыми общими структурами генерации тактовых импульсов, с которыми я столкнулся.

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

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

Вопрос

Речь идет о следующей структуре часового мультиплексора, которая является частью модуля clkgen, который снова является частью более крупного проекта: Схема часового мультиплексора

В то время как ext_clkпредполагаются , вход генерируется с внешней стороны конструкции (поступающей через входной контакт), то clk0и clk4сигналы также генерируются и используются clkgen модуль (см моего связанного вопроса пульсации часы для деталей) и связаны часы ограничения по имени baseclkи div4clk, соответственно.

Вопрос в том, как указать ограничения, чтобы анализатор синхронизации

  1. Рассматривается cpu_clkкак мультиплексированный тактовый генератор, который может быть одним из исходных тактовых импульсов ( fast_clkили slow_clkили ext_clk), принимая во внимание задержки через разные вентили И и ИЛИ
  2. В то же время не обрезая пути между исходными часами, которые используются в других местах проекта.

В то время как простейший случай встроенного тактового мультиплексора, кажется, требует только set_clock_groupsоператора SDC :

set_clock_groups -logically_exclusive -group {baseclk} -group {div4clk} -group {ext_clk}

... в данной структуре это осложняется тем фактом, что clk0(через fast_clkвыход) и clk4(через slow_clk) все еще используются в проекте, даже если cpu_clkон настроен на использование, ext_clkкогда use_extутверждается только .

Как описано здесь , set_clock_groupsуказанная выше команда вызовет следующее:

Эта команда эквивалентна вызову set_false_path от каждого тактового генератора в каждой группе до каждого тактового генератора в любой другой группе и наоборот

... что было бы неправильно, так как другие часы все еще используются в другом месте.

Дополнительная информация

В use_clk0, use_clk4и use_extвходы генерируются таким образом , что только один из них является высоким в любой момент времени. Хотя это можно использовать для остановки всех тактовых импульсов, если все use_*входы низкие, основное внимание в этом вопросе уделяется свойству мультиплексирования тактовых импульсов этой структуры.

Х2 экземпляр (простой буфер) в схеме просто место держатель , чтобы выделить проблему автоматические места и маршрут инструментов , как правило , быть свободным место буферов в любом месте (например, между and_cpu_1/zи or_cpu1/in2штифты). В идеале это не должно влиять на временные ограничения.

FriendFX
источник
Не могли бы вы попытаться сделать это более кратким, сузив его до очень конкретного, очень узкого вопроса? Мне трудно понять, что является важной информацией, и что вы действительно ищете здесь.
Трэвисбартли
@ trav1s: я реструктурировал вопрос. Пожалуйста, дайте мне знать, если вам нужны какие-либо разъяснения.
FriendFX

Ответы:

3

Определите деление на 1 такт в сетях and_ * и объявите их физически исключительными. RTL-компилятор Cadence корректно обрабатывает ситуацию, генерируя 3 тактовых пути для регистров, синхронизированных cpu_clk (по одному пути на один такт). Регистры, непосредственно управляемые clk0, clk4 и clk_ext, имеют свои собственные временные дуги.

create_generated_clock -source [get_ports clk0] \
-divide_by 1 -name and_clk0    [get_pins and_cpu_1/Y]

create_generated_clock -source [get_ports clk4] \
-divide_by 1 -name and_clk4    [get_pins and_cpu_2/Y]

create_generated_clock -source [get_ports clk_ext] \
-divide_by 1 -name and_clk_ext [get_pins and_cpu_ext1/Y]

set_clock_groups \
-physically_exclusive \
-group [get_clocks and_clk0] \
-group [get_clocks and_clk4] \
-group [get_clocks and_clk_ext]
Ревант Камарадж
источник
Спасибо за ваше предложение. К сожалению, в настоящее время я не могу это проверить, но ваша концепция выглядит довольно многообещающе для меня. Не могли бы вы проверить пути между cast_clk, cpu_clkи slow_clkвсе еще проверяется (т.е. не исключение из - за исключительных тактовых групп), в то время как в то же время , будучи ограничены их соответствующими входными часами? В конечном итоге, я ищу авторитетный ответ на этот вопрос.
FriendFX
@FriendFX Я тестировал код в RTL-компиляторе, и пути выводятся правильно.
Ревант Камарадж
Просто, чтобы вы знали, я добавил некоторую информацию об одноэлементных часовых мультиплексорах и решении (по крайней мере, для некоторых инструментов).
FriendFX
1

Хотя это старая ветка без ответа ... она охватывает некоторые базовые представления о синхронизации против асинхронных часов

  • По сути, синхронные часы должны оставаться синхронизированными в фазе с добавлением минимальных задержек, чтобы Mux'ing не создавал сбоев.
    • Это часто достигается путем передискретизации всех источников стробируемых тактовых импульсов на полной частоте.
  • Асинхронные часы не являются критичными для синхронизации, поэтому задержки допускаются. такие как счетчики пульсаций.

введите описание изображения здесь

Тони Стюарт Sunnyskyguy EE75
источник
Спасибо за просмотр этого старого вопроса. В моем случае я не хочу синхронизировать часы с полноскоростными, как показано на схеме. Тем не менее, по-прежнему отсутствует основная часть моего вопроса, а именно правильные операторы SDC, чтобы ограничить эту схему, принимая во внимание синхронность исходных тактовых импульсов, а также их использование в той же синхронной схеме, поскольку упомянутая set_clock_groupsссылка на пример утверждает, что неправильно обрезать пути между этими часами.
FriendFX