Get_ports против Get_pins против Get_nets против Get_registers

Я делаю дизайн в vhdl для FPGA. У меня есть дизайн верхнего уровня, который состоит из 3 компонентов: делителя часов, Module_1 и Module_2. Сущность верхнего уровня имеет порт ввода часов. Эти часы делятся делителем часов, чтобы получить два других часа: часы_1 и часы_2. Они подаются на тактовые порты Module_1 и Module_2 соответственно.

Я хочу ограничить все эти часы. Итак, как решить, нужно ли использовать get_ports, get_pins, get_nets или get_registers? Я использовал get_ports для основных часов. А как насчет двух других? Я вижу эти сгенерированные часы в get_pins, get_nets и get_registers в анализаторе времени Quartus II. Кроме того, имена часов выглядят по-другому с некоторыми суффиксами, такими как '_var', '~clk' и т. д. Существуют ли какие-либо особые правила для get_pins, get_nets и get_registers?

Ответы (1)

Вводы/выводы блока верхнего уровня называются port , вводы/выводы подблоков называются pin . Таким образом, get_portsи get_pinsкоманды должны использоваться соответственно.

Если основные часы являются входом блока верхнего уровня, get_portsэто соответствующая команда. Например:

create_clock -name CLK [get_ports clock_main] ...

Так как clock_1и clock_2являются входами подблоков, get_pinsв этом случае необходимо использовать.

create_clock -name CLK1 [get_pins Module_1/clock_1] ...
create_clock -name CLK2 [get_pins Module_2/clock_2] ...

Сигналы, отличные от входов/выходов, называются net . Сети могут быть собраны и ограничены с помощью get_netsкоманды, однако большинство инструментов синтеза оптимизируют их или меняют имена. Лучше избегать использования, get_netsесли это не обязательно. В противном случае большинству инструментов синтеза требуется dont_touchатрибут или что-то подобное, чтобы сохранить сеть.

Обычно я не использую get_registersкоманду, потому что она не поддерживается компилятором Synopsys Design Compiler, я использую get_cellsвместо нее. Наоборот, Quartus II поддерживает get_registersв соответствии с руководством Altera SDC .

Его также можно использовать для ограничения часов. В инструкции есть следующий пример:

create_generated_clock -divide_by 2 -source [get_ports clk] -name clkdiv \
  [get_registers clkdiv]

В качестве альтернативы вы можете использовать get_pinsкоманду. Тебе решать.

create_generated_clock -divide_by 2 -source [get_ports clk] -name clkdiv \
  [get_pins clkdiv/Q]

Если в вашей конструкции есть такой делитель тактовых импульсов, лучше ограничить его регистром или выводом Q, чем тактовым входом подблока (например, Module_1). В противном случае инструмент синтеза не знает, несет ли путь тактовый сигнал между регистром и выводом clock_1. Задержка пути не включается в временной анализ и т.д.

Инструменты синтеза обычно добавляют суффиксы к именам сигналов и ячеек. Каждый инструмент имеет свои собственные правила именования. Например, мой инструмент добавляет _regсуффикс к флоп-сигналам.

Вы имеете в виду, что лучше ограничить выходной контакт Q модуля делителя часов (get_register), а не входной контакт (get_pin) модуля_1?
@МИТУРАЙ Да. Есть еще одно преимущество. Если вы позже подключите те же разделенные часы к третьему подблоку (например, Module_3), вам не нужно будет добавлять для этого новое ограничение. Ограничение на выводе Q распространяется на все приемники этих часов.
О да !! Отличный момент. Долго искал этот ответ. Здоровья братан 👍