restricciones de tiempo de ASIC a través de SDC: ¿Cómo especificar correctamente un reloj multiplexado?

10

Introducción

Después de haber encontrado información múltiple, a veces conflictiva o incompleta en Internet y en algunas clases de capacitación sobre cómo crear restricciones de tiempo en formato SDC correctamente, me gustaría pedirle ayuda a la comunidad de EE con algunas estructuras generales de generación de reloj que he encontrado.

Sé que hay diferencias sobre cómo se podría implementar una determinada funcionalidad en un ASIC o FPGA (he trabajado con ambos), pero creo que debería haber una forma general y correcta de restringir la sincronización de una estructura dada , independiente de la tecnología subyacente; por favor, avíseme si me equivoco al respecto.

También existen algunas diferencias entre las diferentes herramientas para la implementación y el análisis de temporización de diferentes proveedores (a pesar de que Synopsys ofrece un código fuente de analizador SDC), pero espero que sean principalmente un problema de sintaxis que se puede consultar en la documentación.

Pregunta

Se trata de la siguiente estructura de multiplexor de reloj, que forma parte del módulo clkgen , que también forma parte de un diseño más grande:

Sibienseasumequelaentradaext_clksegeneraexternamentealdiseño(ingresandoatravésdeunpindeentrada),lasseñalesdeclk0yclk4tambiénsongeneradasyutilizadasporelclkgenmódulo(consultemi pregunta sobre el reloj de rizo relacionado) y tenga restricciones de reloj asociadas denominadas baseclk y div4clk , respectivamente.

La pregunta es cómo especificar las restricciones de manera que el analizador de tiempo

  1. Trata a cpu_clk como un reloj multiplexado que puede ser uno de los relojes de origen ( fast_clk o slow_clk o ext_clk ), teniendo en cuenta los retrasos a través de las diferentes puertas AND y OR
  2. Mientras que al mismo tiempo no se cortan las rutas entre los relojes de origen que se utilizan en otras partes del diseño.

Si bien el caso más simple de un multiplexor de reloj en chip parece requerir solo La declaración set_clock_groups SDC :

set_clock_groups -logically_exclusive -group {baseclk} -group {div4clk} -group {ext_clk}

... en la estructura dada, esto se complica por el hecho de que clk0 (a través de la salida fast_clk ) y clk4 (a través de slow_clk ) todavía se usan en el diseño, incluso si cpu_clk está configurado para ser ext_clk cuando solo se confirma use_ext .

Tal como se describe en here , el comando set_clock_groups como anteriormente causaría lo siguiente:

  

Este comando es equivalente a llamar a set_false_path desde cada reloj   en cada grupo a cada reloj en cada otro grupo y viceversa

... lo que sería incorrecto, ya que los otros relojes todavía se usan en otros lugares.

Información adicional

Las entradas use_clk0 , use_clk4 y use_ext se generan de tal manera que solo una de ellas es alta en un momento dado. Si bien esto podría usarse para detener todos los relojes si todas las entradas use_* son bajas, el foco de esta pregunta es la propiedad de multiplexación de reloj de esta estructura.

La instancia X2 (un búfer simple) en el esquema es solo un marcador de posición para resaltar el problema de que las herramientas de ruta y ubicación automáticas suelen ser libres de colocar búferes en cualquier lugar (por ejemplo, entre el and_cpu_1/z y or_cpu1/in2 pines). Idealmente, las restricciones de tiempo no deberían verse afectadas por eso.

    
pregunta FriendFX

2 respuestas

3

Defina dividir por 1 relojes en las redes and_ * y declare que son físicamente exclusivos. El compilador RTL de Cadence maneja la situación correctamente al generar 3 rutas de tiempo para registros cronometrados por cpu_clk (una ruta para cada reloj). Los registros controlados directamente por clk0, clk4 y clk_ext tienen sus propios arcos de tiempo.

create_generated_clock -source [get_ports clk0] \
-divide_by 1 -name and_clk0    [get_pins and_cpu_1/Y]

create_generated_clock -source [get_ports clk4] \
-divide_by 1 -name and_clk4    [get_pins and_cpu_2/Y]

create_generated_clock -source [get_ports clk_ext] \
-divide_by 1 -name and_clk_ext [get_pins and_cpu_ext1/Y]

set_clock_groups \
-physically_exclusive \
-group [get_clocks and_clk0] \
-group [get_clocks and_clk4] \
-group [get_clocks and_clk_ext]
    
respondido por el Revanth Kamaraj
1

Aunque este es un hilo antiguo sin respuesta ... cubre algunos conceptos básicos de los relojes sincronizados vs asíncronos

  • Básicamente, los relojes síncronos deben permanecer sincronizados en fase con demoras mínimas agregadas para que Mux'ing no cree un problema técnico.
    • Esto se logra a menudo volviendo a muestrear todas las fuentes de reloj cerradas a velocidad máxima.
  • Los relojes asíncronos no son críticos para el tiempo, por lo que se permiten retrasos. como los contadores de ondulación.

    
respondido por el Tony EE rocketscientist

Lea otras preguntas en las etiquetas