Get_ports vs Get_pins vs Get_nets vs Get_registers

Estoy haciendo un diseño en vhdl para FPGA. Tengo un diseño de nivel superior que consta de 3 componentes: divisor de reloj, Módulo_1 y Módulo_2. La entidad de nivel superior tiene un puerto de entrada de reloj. Este reloj se divide por el divisor de reloj para obtener otros dos relojes: clock_1 y clock_2. Se alimentan a los puertos de reloj de Module_1 y Module_2 respectivamente.

Quiero restringir todos estos relojes. Entonces, ¿cómo decidir si se deben usar get_ports o get_pins o get_nets o get_registers? Usé get_ports para el reloj principal. ¿Qué hay de los otros dos? Puedo ver estos relojes generados en get_pins y get_nets y get_registers en el analizador de tiempo de Quartus II. Además, los nombres de los relojes se ven diferentes allí con algunos sufijos como '_var', '~clk', etc. ¿Existen reglas específicas para get_pins, get_nets y get_registers?

Respuestas (1)

Las E/S del bloque de nivel superior se denominan puerto , las E/S de los subbloques se denominan pin . Entonces , los comandos get_portsy get_pinsdeben usarse en consecuencia.

Si el reloj principal es una entrada del bloque de nivel superior, get_portses el comando apropiado. Por ejemplo:

create_clock -name CLK [get_ports clock_main] ...

Dado que clock_1y clock_2son las entradas de los subbloques, get_pinsdebe utilizarse en este caso.

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

Las señales distintas de las E/S se denominan net . Las redes se pueden recopilar y restringir mediante get_netsel comando, sin embargo, la mayoría de las herramientas de síntesis las optimizan o cambian los nombres. Es mejor evitar el uso get_netssi no es obligatorio. De lo contrario, la mayoría de las herramientas de síntesis requieren dont_touchatributos o algo similar para mantener la red.

Normalmente no uso get_registersel comando, porque Synopsys Design Compiler no lo admite, lo uso get_cellsen su lugar. Por el contrario, Quartus II soporta get_registerssegún el manual SDC de Altera .

También se puede utilizar para restringir el reloj. El manual tiene el siguiente ejemplo:

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

Alternativamente, puede usar get_pinsel comando. Tu decides.

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

Si tiene un divisor de reloj de este tipo en su diseño, es mejor restringirlo en el registro o pin Q que en la entrada de reloj de un subbloque (por ejemplo, Module_1). De lo contrario, la herramienta de síntesis no sabe si la ruta lleva una señal de reloj entre el registro y el clock_1pin. El retraso de la ruta no se incluye en el análisis de tiempos, etc.

Las herramientas de síntesis comúnmente agregan sufijos a los nombres de las señales y las celdas. Cada herramienta tiene sus propias reglas de nomenclatura. Por ejemplo, mi herramienta agrega _regsufijos a las señales que fallan.

¿Quiere decir que es mejor restringir el pin Q de salida del módulo divisor de reloj (get_register) en lugar del pin de entrada (get_pin) de module_1?
@MITURAJ Sí. Hay una ventaja más. Si conecta el mismo reloj dividido a un tercer subbloque (por ejemplo, Module_3) más tarde, no necesitará agregar una nueva restricción para eso. Una restricción en el pin Q se propaga a todos los sumideros de ese reloj.
¡Oh, sí! Gran punto. Estaba buscando esta respuesta durante mucho tiempo. Saludos hermano 👍