Archivo Liberty

también en: Português · English

El archivo Liberty Timing (Lib) contiene información detallada sobre la temporización y el consumo de energía de las celdas lógicas (std cells) de una biblioteca de celdas para un nodo tecnológico determinado. En esencia, Liberty es un modelo de temporización que incluye datos como el retardo de las celdas, el tiempo de transición, los tiempos de setup y hold, leakage power, entre otros. Este archivo, normalmente con la extensión .lib, es un estándar desarrollado por Synopsys y distribuido como código abierto. Se usa ampliamente en el diseño de circuitos porque describe las características de las celdas, que son fundamentales para el análisis de timing en varias etapas del flujo de diseño.

Tipos de archivos Liberty

Los parámetros de temporización y consumo de potencia de una celda lógica se obtienen mediante simulaciones eléctricas realizadas en diferentes condiciones de operación — como variaciones de proceso, temperatura y tensión. Los resultados de estas simulaciones se organizan y almacenan en los llamados archivos Liberty (.lib), que las herramientas EDA usan para el análisis de temporización (STA) y de consumo. Existen tres modelos principales para caracterizar celdas y generar estos archivos .lib:

  • NLDM (Non-Linear Delay Model)
  • CCS (Composite Current Source)
  • ECSM (Effective Current Source Model)

NLDM (Non-Linear Delay Model)

Es el modelo más tradicional y más usado. En él, la celda se modela con tablas que relacionan el retardo de propagación y la transición de salida con dos parámetros principales:

  • Transición en la entrada (input net transition)
  • Capacitancia de carga en la salida (Cload)

Las simulaciones se hacen con fuentes de tensión y los resultados se almacenan en tablas 2D en el archivo .lib. El modelo NLDM es más simple y ligero, lo que garantiza una ejecución rápida de las herramientas de STA y archivos más pequeños. Sin embargo, tiene limitaciones de precisión, sobre todo en diseños de alto rendimiento, donde los efectos secundarios tienen mayor impacto.

CCS (Composite Current Source)

Es un modelo más avanzado, desarrollado por Synopsys, en el que la celda se caracteriza con una fuente de corriente para modelar con mayor fidelidad su comportamiento eléctrico, incluyendo efectos como la caída de tensión (IR drop), el acoplamiento y las variaciones de forma de onda. El archivo generado, llamado CCS Lib, ofrece mayor precisión en el análisis de temporización e integridad de señal y es ideal para tecnologías más avanzadas (por ejemplo, por debajo de 28 nm). Por otro lado, CCS requiere más parámetros de entrada, tarda más en simularse y genera archivos .lib más grandes.

ECSM (Effective Current Source Model)

ECSM es una alternativa a CCS, también basada en una fuente de corriente, pero con un modelo más compacto y eficiente. Busca equilibrar precisión y rendimiento, con resultados comparables a CCS, pero con menor complejidad computacional y archivos más pequeños. ECSM es muy usado por las herramientas de Cadence y destaca por modelar con precisión la forma de onda de salida y las transiciones internas, sin penalizar tanto el rendimiento del análisis. Cada modelo tiene sus pros y contras, y la elección entre NLDM, CCS y ECSM depende de los requisitos de precisión, tiempo de ejecución y tecnología de proceso del proyecto. La Figura 1 compara el tamaño de un archivo CCS y uno NLDM.

Comparación del tamaño de archivos Liberty CCS y NLDM
Figura 1: Comparación del tamaño de archivos Liberty CCS y NLDM.

Contexto en VLSI

En el proceso de diseño de circuitos integrados, especialmente en las etapas de síntesis lógica y análisis estático de temporización (STA), es fundamental disponer de información precisa sobre los retardos y el consumo de las celdas que componen el circuito, como puertas lógicas y flip-flops. Hacer simulaciones SPICE del circuito completo sería demasiado complejo y lento. Por eso se usan modelos de temporización simplificados (timing models), que permiten estimar los retardos de forma eficiente.

Para cada cell arc, es decir, cada camino específico entre una entrada y una salida de una celda lógica, como se ilustra en la Figura 2, se determinan dos parámetros principales: el retardo de propagación (propagation delay, tpd) y la transición de salida (output transition time, trise/tfall). El propagation delay representa el tiempo que tarda un cambio en la entrada en reflejarse en la salida. El output transition time indica cuánto tarda la salida en estabilizarse después de ese cambio.

Ejemplos de diferentes cell arcs de una standard cell
Figura 2: Ejemplos de diferentes cell arcs de una standard cell.

Los modelos NLDM (Non-Linear Delay Models) se usan ampliamente para este fin. Toman dos factores principales como entrada: la transición de entrada (input net transition, trise/tfall) y la capacitancia de carga en la salida (output load capacitance, cload). Con estos dos parámetros, que están tabulados en el archivo .lib, las herramientas EDA de STA pueden calcular tanto el retardo de propagación como la transición de salida, como se ilustra en la Figura 3.

Parámetros usados y calculados con NLDM
Figura 3: Parámetros usados y calculados con NLDM.

Estos datos del archivo Liberty los proporciona la foundry, que los obtiene mediante simulaciones detalladas durante la caracterización eléctrica de las celdas estándar (standard cells). Es importante destacar que cada archivo Liberty se genera para unas condiciones de operación concretas — variaciones de proceso, temperatura y tensión (llamadas corners). Así, los valores de retardo de propagación y transición de salida dependen directamente del corner usado en el análisis de temporización.

Liberty se construye con declaraciones (statements) que pueden ocupar varias líneas. Toda la información de un liberty se describe con tres tipos de declaraciones:

  • Declaraciones de grupo (Group Statements)
  • Declaraciones de atributo (Attribute Statements)
  • Declaraciones define (Define Statements)
Declaraciones básicas del archivo Liberty
Figura 4: Declaraciones básicas del archivo Liberty.

Grupo (Group Statements)

Un grupo es una colección de declaraciones que puede describir una biblioteca, una celda, un pin, un arco de temporización, etc. Las llaves ({}) se usan en pares para delimitar el contenido del grupo. Además, un grupo puede contener varios atributos e incluso otros grupos como elementos.

    group_name (name) {
        … statements …
    }

Atributo (Attribute Statements)

Una declaración de atributo define una característica específica de un objeto de la biblioteca, como una celda, un pin, etc. Los atributos siempre se colocan dentro de una declaración de grupo. Según su sintaxis, los atributos pueden dividirse en dos tipos: atributos simples y atributos complejos.

  • Atributo simple (Simple Attributes)

    Los atributos simples tienen una sintaxis básica, independientemente del valor. Hay que separar el nombre del atributo de su valor con un espacio, seguido de dos puntos y otro espacio. Las declaraciones de atributo deben estar en una sola línea.

        attribute_name : attribute_value ;

  • Atributo complejo (Complex Attributes)

    Un atributo complejo incluye uno o más parámetros entre paréntesis. La sintaxis de la declaración de atributo complejo es:

        attribute_name (parameter1, [parameter2, parameter3 …] );

Define (Define Statements)

También puedes crear nuevos atributos simples personalizados con la declaración define.

    define (attribute_name, group_name, attribute_type) ;

Los archivos liberty grandes pueden comprometer la capacidad del disco y los recursos de memoria. Para reducir el tamaño del archivo Lib y facilitar su gestión, la sintaxis permite combinar varios archivos fuente. Las referencias se hacen en el archivo fuente que contiene la descripción del grupo library. Al compilar la biblioteca, la información referenciada se recupera, se incluye en el punto de referencia y la compilación continúa. La sintaxis de la declaración include es:

    include_file (file_nameid) ;

Principales campos del Liberty

Grupo library

El grupo library define la estructura principal de un archivo Liberty y abarca toda la descripción de la biblioteca de celdas. Dentro de este grupo se organizan todos los atributos y subgrupos. Además, es en el nivel library donde se establecen los atributos globales que se aplican a todas las celdas de la biblioteca. Cada archivo .lib debe contener un único grupo library, y su declaración debe ser la primera línea ejecutable del archivo. La Figura 5 muestra un ejemplo de cómo se declara este grupo en un archivo Liberty.

Ejemplo de definición de un grupo library en un archivo Liberty
Figura 5: Ejemplo de definición de un grupo library en un archivo Liberty.

Templates

En el archivo Liberty, los table templates son modelos que almacenan información común reutilizada por varias lookup tables. Cada template define los parámetros de consulta y los puntos de corte (breakpoints) en cada eje de la tabla. Para que una lookup table pueda usar un template, este debe tener un nombre único. Estos table templates son especialmente útiles para representar diferentes tipos de retardos y pueden tener hasta tres variables: variable_1, variable_2 y variable_3. Estas variables indican los parámetros usados para indexar los datos de la tabla a lo largo de sus ejes, como el tiempo de transición de entrada de un pin restringido, la longitud de la red de salida, o la capacitancia o carga de salida de un pin relacionado. Como se muestra en la Figura 6, los table templates ayudan a organizar y reutilizar los datos de temporización de forma eficiente.

Ejemplo de definición de table templates en un archivo Liberty
Figura 6: Ejemplo de definición de table templates.

Para representar la potencia interna de las celdas en el archivo Liberty, también se pueden crear modelos reutilizables que almacenan información común para varias lookup tables. Para ello se usa el grupo power_lut_template, definido en el nivel de la biblioteca (dentro del grupo library). Este tipo de template especifica los parámetros de la tabla y los puntos de corte (breakpoints) en cada eje, como se ve en la Figura 7. Igual que con los table templates, cada power_lut_template necesita un nombre único para que distintas tablas de potencia puedan referenciarlo a lo largo del archivo.

Ejemplo de definición de power table templates en un archivo Liberty
Figura 7: Ejemplo de definición de un power table template.

Grupo cell

Las descripciones de celdas son una parte fundamental de una biblioteca de tecnología. Proporcionan información sobre el área, la función y la temporización de cada componente de una biblioteca de celdas estándar. El grupo cell contiene los atributos y grupos que declaran esta información. La Figura 8 muestra un ejemplo de definición del grupo cell en un archivo Liberty.

Ejemplo de definición del grupo cell en un archivo Liberty
Figura 8: Ejemplo de definición del grupo cell en un archivo Liberty.

Grupo pin

Para cada pin de una celda de la biblioteca, el grupo cell debe contener una descripción detallada de las características de ese pin. Estas características se definen en un grupo pin, que puede declararse dentro de un grupo cell, test_cell, model o bus. La Figura 9 muestra un ejemplo de definición del grupo pin en un archivo Liberty, destacando sus campos principales. Normalmente, el grupo pin incluye subgrupos importantes como timing, que describe los retardos y la temporización asociados al pin, e internal_power, que detalla el consumo de potencia interno relacionado con el pin.

Ejemplo de definición del grupo pin en un archivo Liberty
Figura 9: Ejemplo de definición del grupo pin y sus campos principales en un archivo Liberty.

Entendiendo los Timing Arcs

Los arcos de temporización (timing arcs), junto con la información de interconexión del netlist, definen los caminos que sigue el analizador de temporización al verificar los caminos críticos del circuito.

Cada timing arc tiene un punto de inicio (startpoint) y un punto final (endpoint). El punto de inicio puede ser un pin de entrada, de salida o de entrada/salida (I/O). El punto final es siempre un pin de salida o I/O, salvo en los arcos de restricción (constraint timing arc), como los de setup o hold, que pueden darse entre dos pines de entrada.

Toda la información de retardo de un archivo Liberty está asociada a pares de pines, como entrada → salida o salida → salida.

Arcos de temporización combinacionales

Los arcos de temporización combinacionales describen el comportamiento de retardo de elementos puramente lógicos, como puertas AND, OR, inversores, etc.
Este tipo de arco está conectado a un pin de salida y el pin relacionado puede ser un pin de entrada u otro pin de salida. Según el tipo de transición y el comportamiento involucrado, el arco puede clasificarse como: combinational, combinational_rise, combinational_fall, three_state_disable, three_state_disable_rise, entre otros.

Estos tipos permiten modelar el comportamiento del circuito con más detalle, teniendo en cuenta las transiciones específicas de subida y bajada, además del control de tres estados.

Arcos de temporización secuenciales

Los arcos secuenciales describen el comportamiento temporal de elementos con memoria, como flip-flops y latches. En estos casos, cuando un arco describe la relación entre una transición de reloj y la salida de datos (entrada → salida), se trata como un arco de retardo (delay arc). Cuando describe la relación entre el reloj y la entrada de datos (entrada → entrada), es un arco de restricción (constraint arc). Los principales tipos de arcos secuenciales son:

  • Sensibles al flanco (rising_edge o falling_edge)
  • Control asíncrono (preset, clear)
  • Restricciones de setup y hold (setup_rising, setup_falling, hold_rising, hold_falling)
  • Setup y hold no secuenciales (non_seq_setup_rising, etc.)
  • Recuperación y remoción (recovery_rising, removal_falling, etc.)
  • Sin cambio de valor esperado (nochange_high_high, nochange_low_low, etc.)

Estos arcos son fundamentales para analizar las restricciones de temporización y la integridad de los datos en celdas secuenciales.

Considera una celda combinacional simple formada por dos inversores en serie. Esta celda puede modelarse de dos formas distintas:

  • Modelo A: define dos timing arcs directos, ambos con punto de inicio en el pin de entrada A. Un arco va de A a Y, y el otro de A a Z. Es un modelo simple y directo.
  • Modelo B: también define dos arcos, pero de forma más precisa. El primer arco es igual al del Modelo A (de A a Y). El segundo, en cambio, empieza en el pin de salida Y y termina en Z. Esto permite modelar con más fidelidad el impacto de la carga conectada a Y en el retardo observado en Z.

Este tipo de arco de salida a salida (output-to-output arc) puede usarse tanto en celdas combinacionales como secuenciales y aporta mayor precisión al análisis de temporización.

Grupo timing

El grupo timing contiene la información para modelar los arcos de temporización (timing arcs) y rastrear caminos durante el STA. Define los arcos de temporización a través de una celda y las relaciones entre las señales de reloj y las entradas de datos.

El grupo timing describe:

  • Relaciones de temporización entre un pin de entrada y un pin de salida.
  • Relaciones de temporización entre dos pines de salida.
  • Arcos de temporización a través de un elemento no combinacional.
  • Tiempos de setup y hold en entradas de flip-flop o latch.
  • Opcionalmente, los nombres de los arcos de temporización.

El grupo timing también describe la información de setup y hold cuando la información de restricción se refiere a un par de pines de entrada. La Figura 10 muestra la estructura del grupo timing en un archivo Liberty, con sus campos principales y cómo se organizan dentro del grupo pin.

Ejemplo de definición del grupo timing en un archivo Liberty
Figura 10: Ejemplo de definición del grupo timing y sus campos principales en un archivo Liberty.

Dentro del grupo timing es posible identificar el nombre o los nombres de distintos arcos de temporización. Un único arco puede darse entre un pin identificado y un único pin relacionado, identificado con el atributo related_pin. Los arcos de temporización múltiples pueden darse de varias formas. La siguiente lista muestra seis configuraciones posibles:

  • Entre un único pin relacionado y los múltiples miembros identificados de un bundle.
  • Entre múltiples pines relacionados y los múltiples miembros identificados de un bundle.
  • Entre un único pin relacionado y los múltiples bits identificados de un bus.
  • Entre múltiples pines relacionados y los múltiples bits identificados de un bus.
  • Entre los múltiples bits identificados de un bus y los múltiples pines de un bus relacionado (con un ancho determinado).
  • Entre el pin interno y todos los bits del grupo de bus del punto final.

La Figura 11 ilustra estas configuraciones posibles de arcos de temporización múltiples dentro del grupo timing.

Ejemplo de múltiples arcos de temporización en el grupo timing de un archivo Liberty
Figura 11: Ejemplo de las distintas configuraciones posibles de múltiples arcos de temporización dentro del grupo timing.

Ahora que ya exploramos los principales elementos de la estructura de un archivo Liberty, podemos representar su organización de forma más clara mediante una jerarquía, como se muestra en la Figura 12. Esta representación visual ayuda a entender cómo está estructurada la información dentro del archivo .lib y facilita la lectura y la navegación por los distintos bloques de datos, como celdas, pines, arcos de temporización y parámetros tecnológicos.

Representación jerárquica del archivo Liberty
Figura 12: Representación jerárquica del archivo Liberty.

Ejemplo de cálculo de retardo con el Non-Linear Delay Model (NLDM)

Supongamos que queremos calcular el retardo de propagación (tpd) de un inversor (sg13g2_inv_1) en una biblioteca caracterizada con NLDM, mostrada en la Figura 13. Para ello necesitamos dos parámetros de entrada:

  • Transición de la entrada (input net transition): 0.174 ns
  • Capacitancia de carga en la salida (Cload): 0.039 pF

Estos dos valores se usan como índices para consultar una tabla de retardo (delay table) en el archivo .lib. Las tablas suelen ser 2D, con una dimensión para la transición de entrada y otra para la carga de salida.

Ejemplo de cálculo de retardo con NLDM
Figura 13: Ejemplo de cálculo de retardo con NLDM.

Ubicamos los índices en la tabla:

  • Input net transition = 0.174 ns → fila intermedia.
  • Cload = 0.039 pF → columna del medio.

El valor correspondiente en la tabla es 0.0156287 ns, por lo que el retardo de propagación (tpd) de la puerta en esta condición es 0.0156287 ns.

Cuando los valores de entrada, como el input net transition y Cload, no coinciden exactamente con los puntos definidos en las tablas del archivo .lib, las herramientas EDA usan técnicas de interpolación. Este proceso permite estimar con bastante precisión los valores intermedios de propagation delay a partir de los datos tabulados más cercanos.

Design Liberty

También se pueden generar archivos Liberty para bloques o IPs digitales o analógicos ya sintetizados. Esto permite análisis de Static Timing Analysis (STA) más precisos en niveles superiores del diseño, como la integración top-level. La información incluida en estos archivos depende de las restricciones de temporización y de los requisitos específicos del bloque, y es fundamental para garantizar que el comportamiento del IP se modele correctamente durante el análisis de temporización y las etapas de optimización del diseño final.

La Figura 14 muestra un ejemplo de archivo Liberty generado para un bloque funcional (un contador), con su información principal estructurada.

Ejemplo de archivo Liberty para el diseño de un contador
Figura 14: Ejemplo de un liberty para el diseño de un contador.

Normalmente, un IP con restricciones de temporización se caracteriza (memorias, celdas estándar, bloques digitales personalizados) y se genera un archivo .lib (con un script Perl o una herramienta EDA). Si no hay restricciones de temporización que cumplir, la información mínima del archivo .lib es la sección de pines, sin las secciones de temporización/potencia.

En general, un IP analógico sin restricciones se entrega como LEF/Lib, y el .lib contiene:

  • Pines de salida (obligatorio, alineado con el módulo Verilog)

  • Valores máximos de capacitancia/transición/etc. (reglas de diseño) (no obligatorio, pero ayuda al posicionamiento/enrutamiento o a la síntesis a corregir y/o anticipar el valor de capacitancia).

Puedes crear un .lib copiando y pegando de un archivo existente y reemplazando las secciones de celdas/pines, etc.

Referencias

https://www.ispd.cc/contests/18/lefdefref.pdf. Consultado el 24-jul-2023

http://coriolis.lip6.fr/doc/lefdef/lefdefref/LEFSyntax.html.. Consultado el 24-jul-2023