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

    

[полу]авто-ClockGating в ASIC

1. раньше ClockGating вставляли ручками, получалось коряво, но худо-бедно работало, напр:

 

`ifdef FPGA
  BUFGCE (.I(clk_in), .O(clk_out), .CE(enable));
   // or use:
   // assign clk_out = clk_in;
`else
   CLNGTX1 (.ci(clk_in), .co(clk_out), .e(enable), .te(test_en));
`endif

 

- таким образом вставляются обычно технологозависимые штуки, некий workaround для того, чтобы синтезировать под разные технологии (ПЛИС/СБИС) но неудобно - смешивается технологозависимая и технологонезависимая части РТЛ, не очень с точки зрения методологии.

 

2. потом появилась автоматическая вставка ClockGating, когда тул синтеза сам анализирует конструкции наподобие таких:

 

reg [31:0] a;
always @(posedge clk)
if (rst)
  a <= 0;
else if (enable)
  a <= b;

 

- отличный подход, поскольку в проекте таких мест может быть достаточно много, чтобы делать это ручками, притом РТЛ-код остается технологонезависимым.

 

3. Мой случай:

есть память, реализованная на россыпи триггеров (достаточно маленькая, чтобы делать ее как HardMacro)

алгоритм работы таков: в память производится запись (один раз за всё время работы), после чего эта память используется на чтение 5тактов в алгоритме, цикл которого 100 тактов, есть желание всё остальное время эти триггеры выключать, однако автоматически это сделать проблематично: из-за того что синтезатор не понимает как быть с сигналом записи памяти - он приходит в абсолютно произвольный момент (по его анализу), т.е. авто-ClockGating по понятной причине не срабатывает, а вручную (как в пп.1) ставить ячейки клог-гейта не хочется, поэтому вопрос:

 

 

может появилось какое-то средство/директива/прагма/команда/проч. для гайда синтезатору:

мол, эта группа регистров должна гейтиться по клоку этим сигналом?

Мне это нужно только для целевой технологии (ASIC), в ПЛИС и поведенческой симуляции этого не надо, поэтому реализовать такое в скрипте синтеза под ASIC было бы оптимальным решением.

PS: Если говорить про конкретный синтез, то интересует как это делается средствами RC/Женуса

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


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

Различают архитектурный клок-гейтинг (тот что ручками вставляется дизайнером ртл), и как элемент техники лоу пауер. Новых тенденций тут нет уже лет 15 как, используют и тот и другой подход, смотря что хочется получить на выходе.

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

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

 

Советую почитать учебники по лоу пауер, там много полезного есть и для просто разработчиков rtl (не вникая в физ дизайн).

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


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

Раньше в RC делалось так. В мануалах можно уточнить.

 

Capture1.jpg

 

Capture2.jpg

 

 

 

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


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

да, есть такое в Генусе, спасибо.

 

Советую почитать учебники по лоу пауер, там много полезного есть и для просто разработчиков rtl (не вникая в физ дизайн).

а есть что-то помимо LPMM от Синопсис?

 

Раньше в RC делалось так. В мануалах можно уточнить.

 

Спасибо!

Заметил, что в нетлист попадают технолого-зависимые примитивы ICG уже на этапе генерик-синтеза, что как-то странно - они там единственные из технологозависимых примитивов

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


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

 

offtop: Решили перейти из синопсис флоу на кэденс или для себя балуетесь?

 

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


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

/* offtop: на новом месте кейденс всем больше по душе */

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


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

Насколько я понимаю, тулза анализирует схему статически - т.е. ей пофигу когда и в какой последовательности чтото может приходить (как и при STA).

Тулза смотрит есть ли общий сигнал (по функции - enable, но с любым именем) который разрешает запись в группу тригеров и ставит туда клок-гейти (если число тригеров не меньше N).

Почему не ставит в конкретном случае - трудно сказать без RTL

 

 

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти