С дизайном HDL, как и когда мы узнаем, что нам нужен многоцикловый путь, как мы его реализуем

Я понимаю, что мы используем путь multi_cycle, когда задержка между запуском и регистром-защелкой должна быть больше 1 такта. Как при дизайне HDL можно предсказать, что комбинационная логика между двумя регистрами будет больше, чем тактовый цикл, и, следовательно, необходимо использовать ограничение пути multi_cycle? Помимо этого, для дизайна HDL, где мы можем не знать точно, о каких регистрах мы говорим, как мы можем ввести ограничение пути multi_cycle? Важно ли, чтобы эта задержка превышала 1 такт как в наилучших, так и в наихудших условиях?

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

Можем ли мы также заставить установщик подгонять логику таким образом, чтобы данные достигли регистра-защелки за 2 такта? Мое замешательство возникает потому, что когда у нас есть дизайн HDL, мы находимся на более высоком уровне абстракции и не знаем обо всех физических регистрах, которые существуют в проекте, то есть до тех пор, пока мы не сделаем STA в списке соединений после синтеза.

Ответы (1)

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

Как при дизайне HDL можно предсказать, что комбинационная логика между двумя регистрами будет больше, чем тактовый цикл, и, следовательно, необходимо использовать ограничение пути multi_cycle?

Это заложено в дизайне. Если вам требуется, чтобы результат был доступен за один тактовый цикл (как указано в поведении), тактовый цикл должен быть достаточно длинным, чтобы это произошло. Если поведение написано таким образом, что для результата требуется 2 или 3 такта, тогда вам также нужно добавить ограничение на несколько циклов. Вы не делаете последнее, не делая при этом первое.

Помимо этого, для дизайна HDL, где мы можем не знать точно, о каких регистрах мы говорим, как мы можем ввести ограничение пути multi_cycle?

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

Важно ли, чтобы эта задержка превышала 1 такт как в наилучших, так и в наихудших условиях?

Нет.

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

Вроде, как бы, что-то вроде. Инструменты синтеза будут усердно работать над реализацией логики, чтобы она соответствовала уже установленным временным ограничениям, включая задержки маршрутизации. Если он не может, он скажет вам.

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

Можем ли мы также заставить установщик подгонять логику таким образом, чтобы данные достигли регистра-защелки за 2 такта?

В общем, нет. Но особой необходимости в этом нет.

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

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

Мой собственный опыт связан с EE, поэтому я всегда пишу свой синтезируемый код как RTL, поскольку именно так я думаю о дизайне оборудования. Я использую только высокоуровневый, чисто поведенческий код в своих тестовых стендах моделирования, который никогда не предназначен для синтеза.

Скажем иначе. Предполагая, что я сделал дизайн, скомпилировал его и увидел множество нарушений сроков. Теперь, в этих обстоятельствах, как мне узнать, следует ли мне использовать многоцикловый путь, чтобы избавиться от некоторых из этих нарушений и упростить сборщику? Я имею в виду, что мы не обязательно узнаем о таких проблемах, пока не проведем весь цикл компиляции и подгонки, верно?
На самом деле, вы должны знать, но это то, чему вы учитесь на собственном опыте. Поначалу вы должны рассчитывать на множество итераций в процессе оптимизации. И, как я уже говорил ранее, вы не просто добавляете ограничения многоциклового пути, не изменяя при этом дизайн для фактического создания многоциклового пути. Если вы просто объявите длинный комбинаторный путь «многоцикловым», вы получите замыкание по времени, но схема не будет работать правильно.
Вау, Дэйв, большое спасибо. Очень древняя путаница теперь разрешена в моей голове :D