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/Женуса