Jump to content

    

Партишининг идентичных инстанций в GENUS

Всем привет!

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

По умолчанию генус делает uniquify, в результате имеем N разных модулей - для каждой инстанции свой модуль, а хотелось бы N-инстанций и один модуль( конечно с осознанием того что нетлист уже не уникальный).

Есть крыжик minimize_uniquify но он не работает, кроме того по описанию не должен работать на 100%.

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

Share this post


Link to post
Share on other sites

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

Альтернатива - можно дополнительно этот модуль довести до конца в инновусе, отдельно от проекта, выписать либу и использовать ее в синтезе большого проекта. А в P&R использовать ILM модель + LEF модуля.

Edited by Aleх

Share this post


Link to post
Share on other sites
12 часов назад, Aleх сказал:

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

Альтернатива - можно дополнительно этот модуль довести до конца в инновусе, отдельно от проекта, выписать либу и использовать ее в синтезе большого проекта. А в P&R использовать ILM модель + LEF модуля.

 

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

Сейчас нащупал вариант, синтезировать все а потом выполнять change_link(меняет модуль инстанции), но нужны видимо доп констрейны из-за разных нагрузок на порты клонов.

Edited by MickeyMouse

Share this post


Link to post
Share on other sites
On 3/14/2019 at 5:25 PM, MickeyMouse said:

Всем привет!

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

По умолчанию генус делает uniquify, в результате имеем N разных модулей - для каждой инстанции свой модуль, а хотелось бы N-инстанций и один модуль( конечно с осознанием того что нетлист уже не уникальный).

Есть крыжик minimize_uniquify но он не работает, кроме того по описанию не должен работать на 100%.

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

 

Насчет Genus не скажу, в DC делал следующим образом:

    #register_write
    current_design register_data
    characterize reg_dev_low
    current_design register_write
    compile_ultra -no_autoungroup 
    #register_data
    current_design $top_level
    current_design mem
    characterize gen_reg[0].register_data
    current_design register_data
    set_dont_touch {reg_dev_low reg_dev_most}
    compile_ultra -no_autoungroup 
    #MEM
    current_design mem
    set_dont_touch {gen_reg[*].register_data}
    compile_ultra -no_autoungroup 
    #fdt
    current_design $top_level
    characterize gen_fdt[0].fdt
    current_design fdt
    compile_ultra -no_autoungroup 
    #register_synch_negedge
    current_design $top_level
    current_design spi
    characterize synch_ncs
    current_design register_synch_negedge
    compile_ultra -no_autoungroup 
    
current_design $top_level
set_dont_touch {spi/synch_ncs spi/synch_sclk gen_fdt[*].fdt mem}
compile_ultra -no_autoungroup 

Т.е. изначально характеризуем модуль ссылаясь на любой instance, затем делаем этот модуль текущим дизайном и компилируем. 

А перед синтезом верхнего уровня ставим dont touch. В принципе это тоже самое что посоветовал Alex. Я делал это процессе, не напрягало.

Однако, encounter вероятней всего выдаст сообщение о том что netlist не уникален.

Edited by Dantist2k17

Share this post


Link to post
Share on other sites

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

Что касается p&r тулов, то по понятным причинам они требуют унифицированный нетлист. Исключение - когда повторяемый блок был сделан отдельно, и присутствует в проекте в виде леф/либ/ilm. 

Share this post


Link to post
Share on other sites

To Dantist

Зачем делать characterize блока до полного синтеза,  информации по окружению ещё нет.

Share this post


Link to post
Share on other sites
11 hours ago, lexx said:

To Dantist

Зачем делать characterize блока до полного синтеза,  информации по окружению ещё нет.

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

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

Share this post


Link to post
Share on other sites

Вообще если говорить все-таки про genus, то получилось 2 способа решения проблемы:

1) Как предложил Alex, делать отдельный маршрут с последующим донттатчем

2) Использовать маршрут партишининга(derive_environment/geterate_ilm/read_ilm/design_assemble)

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

А указать тулу, как это можно сделать в innovus, через master/clone (т.е. не унифицировать модули) так и не удалось. Скорее всего этого сделать нельзя...

Но и первый способ с подводными камнями: почему-то в финальном нетлисте остаются процедуры assign(remove_assign не работает, возможно это из-за неуникальность нетлиста). Это можно поправить на бэкэнде.

Edited by MickeyMouse

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