Jump to content

    

pipeline_design Design Compiler

Имеется два вопроса по логическому синтезу.

 

1. В версии DC E-2010.12 поддерживается команда pipeline_design, которая позволяет "взять" комбинационную схему и "положить" ее на цепочку регистров, обеспечив необходимую частоту работы. В версии DC J-2014.09 такой команды я не обнаружил. Есть ли какая-либо альтернатива?

 

2. Существует ли команда (подход), которая позволяет сделать нечто подобное из последовательностной схемы? Что есть: триггер 1 - логика - триггер 2. Хочу получить триггер 1 - логика - триггер 3* - логика - триггер 2.

 

Share this post


Link to post
Share on other sites

Называется ретайминг. Работает, к примеру, так - на выход комбинационной схемы ставите несколько последовательно включенных флопов, разрешаете ретайминг, зажимаете частоту и запускаете синтез. В результате, флопы переместятся по логике влево - ровно на столько, чтобы обеспечить fmax. Разумеется, число регистров изменится, поскольку ширина комбинационной схемы в разных разрезах разная. В реальных проектах это не используется, поскольку метод ну очень топорный. Грамотный инженер сам разместит флопы там где они нужны. Но для пристрелки/оценки метод вполне годится. Не забывайте запускать LEC, поскольку тул изредка сбивается во время ретайминга, и результат может отличаться от исходника.

Share this post


Link to post
Share on other sites

3-й триггер сломает логику. Результат на выходе отличается от исходного кода.

Ретайминг поправит частоты исходя из исходной длинны пайплайна.

Share this post


Link to post
Share on other sites

Интересное утверждение, не согласен. Как триггер может сломать логику, обьясните. Добавление стадий в конвейер должно отразиться только на лэтенси (в тактах), но никак не на функции. Если функция таки изменилась, это ошибка работы тула(вполне вероятный сценарий), которая ловится прогоном LEC, я об этом писал.LEC вообще обязательная процедура после ретайминга, если в коде присутствуют fsm, умножения через * и прочие вещи, которые синтезатор может исполнить неоднозначно.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Иногда люди не понимают этого

Share this post


Link to post
Share on other sites
On 12/8/2018 at 10:33 AM, Aleх said:

Называется ретайминг. Работает, к примеру, так - на выход комбинационной схемы ставите несколько последовательно включенных флопов, разрешаете ретайминг, зажимаете частоту и запускаете синтез. В результате, флопы переместятся по логике влево - ровно на столько, чтобы обеспечить fmax. Разумеется, число регистров изменится, поскольку ширина комбинационной схемы в разных разрезах разная. В реальных проектах это не используется, поскольку метод ну очень топорный. Грамотный инженер сам разместит флопы там где они нужны. Но для пристрелки/оценки метод вполне годится. Не забывайте запускать LEC, поскольку тул изредка сбивается во время ретайминга, и результат может отличаться от исходника.

Да спасибо, дошел до этого, опробовал. Не понравилось. Поправил verilog описание и уложился в частоту. Однако ведь можно столкнуться с задачей, когда необходимо разложить по триггерам БОЛЬШОЙ дешифратор, который описан с помощью case. Переписать его как-то алгоритмически не представляется возможным. Как быть в такой ситуации, не сталкивались?

Edited by Dantist2k17

Share this post


Link to post
Share on other sites

У Синопсиса есть pipelined DesignWare blocks (попробовать их использовать в RTL):

The DesignWare library supports many pipelined arithmetic components.
Most of the DesignWare pipelined components have the optimize_registers command in the synthesis model. During synthesis, it enables DC-Ultra's retiming feature to find the optimal register location. The following list of DesignWare components uses the DC-Ultra's retiming feature.

DesignWare Building Blocks

  DW_div_pipe               Stallable Pipelined Divider
  DW02_mult_2_stage         Two-Stage Pipelined Multiplier
  DW02_mult_3_stage         Three-Stage Pipelined Multiplier
  DW02_mult_4_stage         Four-Stage Pipelined Multiplier
  DW02_mult_5_stage         Five-Stage Pipelined Multiplier
  DW02_mult_6_stage         Six-Stage Pipelined Multiplier
  DW_prod_sum_pipe          Stallable Pipelined Generalized Sum of Products
  DW_sqrt_pipe              Stallable Pipelined Square Root

 

Либо, в RTL вставлять перед выходными (например) портами дополнительную стадию, и надеяться, что optimize_registers справится с таймингом.

Share this post


Link to post
Share on other sites

Синопсис не рекомендует напрямую указывать designware компоненты. Лучше правильно описать и потом он сам их раскидает как нужно (не перемудрите с разрядностью). Почитайте про QoR  функцию, там все просто описано.

Share this post


Link to post
Share on other sites

Это, да, напрямую лучше не инстанциировать, но нам же нужно pipelined mult, а не простой. Так, что придется как-то это специфицировать.

Share this post


Link to post
Share on other sites

Поддерживаю, designware - отличная штука. Если подходит под задачу :-) На мой взгляд, такие вещи надо руками вписывать в код, прямо вызовы инстансов. Для их симуляции есть верилог-модельки, которые, кажется, даже синтезируемые (можно в ПЛИС запихнуть).

Большой дешифратор можно разбить руками, уменьшив разрядность, вставить флопы, использовать в коде pragma вроде full_case parallel_case.

Edited by Aleх

Share this post


Link to post
Share on other sites

А по мне прямой вывоз инстансов избыточен. Теряется логика и читабельность кода. И потом: Synopsys, по возможности, не рекомендует использовать прямой вызов designware компонентов. Пишите код в соответствие с иерархией и все будет хорошо.

См. Coding Guidelines for Datapath Synthesis, part 11.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this