Цитата(DSIoffe @ Jun 27 2007, 12:36)

Во-во, пожалуйста, я давно хотел понять: что можно получить из такого констрейна? А заодно и вообще из информации о разветвлённости выходного сигнала какой-либо ячейки? А входного?
Что такое "разветвленность входного сигнала" и зачем она нужна?. Про выходной я расскажу.
Пример из живого проекта. ПЛИС - Спартан-3. Синтез - Synplify.
Ставим fanout_limit = 100. В логе появляются строчки:
pin:Q inst:map_frame_descr_gen.dmmisccnt[1] of UNILIB.FDCPE(PRIM) - loads: 102, segments 2, replicating source
pin:Q inst:map_frame_descr_gen.dmmisccnt[2] of UNILIB.FDCPE(PRIM) - loads: 105, segments 2, replicating source
Added 2 Registers via replication
Увеличиваем fanout_limit do 200, и ничего подобного нет. Но в этом месте это не критично. Критично оказалось в другом.
Тот же проект. Есть интерфейс с DSP TI320C6416 по EMIF. Интерфейс синхронный, 100 МГц. Шина данных -- 32 разряда, шина адреса -- 20 разрядов.
В FPGA реализовано несколько десятков регистров с режимом доступа "чтение/запись", некоторые -- "только чтение", многие из регистров 32-разрядные. Сами понимаете, мультиплексор, объединяющий все регистры в выходную шину данных, получается неслабый. Поэтому он сделан multi-cycle. Задан констрейн от начала этого multi-cycle-пути (clock enable -- выход триггера) до его конца (другой clock enable -- выход другого триггера). Но поскольку конечная точка -- это несколько сотен триггеров (нескольско сотен --- это больше, чем установленный fanout), то синтезатор размножил триггер, формирующий clock enable для конечной точки и, естественно, дал этому новому триггеру какое-то заранее неизвестное имя. Раз имя другое, то констрейн на этот сигнал не распространяется. Получается, что часть мультиплексора обконстрейнена, часть нет. В результате тайминги не сходятся. То, что легко укладывается в 2 такта частоты EMIF (20 нс), par пытается уложить в один (10 нс) и у него не получается.
Увеличиваем fanout до такого значения, чтобы покрывался весь мультиплексор, и все со свистом разводится.