Tutorial #2: Diseño Físico

Elaborado por Erick Carvajal Barboza

Email: erick punto carvajal punto barboza arroba ucr punto ac punto cr

Escuela de Ingeniería Eléctrica, Universidad de Costa Rica

FAQs

Para encontrar una lista actualizada de las preguntas más comunes puede ir al siguiente enlace.

Introducción

Los sistemas digitales pueden ser descritos en varios dominios distintos (Kaeslin, 2008), de más a menos abstracto se tiene: (1) el dominio conductual, (2) el dominio estructural y (3) el dominio físico.

En el dominio conductual únicamente es importante la funcionalidad del sistema, y no tiene relevancia el cómo está construido. En el dominio estructural se especifican las interconexiones de cada bloque que conforma el sistema sin embargo, es únicamente en el dominio físico en el cuál se tiene información sobre cómo está construido cada componente, que ubicación tiene en el chip y cómo se deben realizar las conexiones entre bloques. El flujo de diseño de circuitos integrados se encarga de convertir la especificación conductual de un sistema digital en una especificación física, y para eso tiene, como paso intermedio, que obtener une especificación estructural.

El paso que permite la conversión de una especificación conductual de un sistema digital a una especificación estructural se conoce como síntesis lógica (Weste & Harris, 2015) y fue estudiado ampliamente en el tutorial anterior. El presente tutorial se enfoca en el paso que se encarga de convertir la especificación estructural a una especificación física, el cual se conoce como diseño físico (Weste & Harris, 2015).

Antes de iniciar...

Asegúrese de haber completado todos los experimentos del primer tutorial, en particular el sumador de 4 bits, y el sumador de 8 bits con pipeline. Es indispensable que ya haya agregado ambos diseños al flujo de OpenLane (mediante el la ejecución del archivo flow.tcl con las banderas -init_design_config y -add_to_designs, lo cual fue realizado en el tutorial anterior).

Diseño Físico de un Sumador de 4 bits

En esta sección se ejecutará el flujo de diseño de OpenLane para el sumador de 4 bits utilizado en el tutorial anterior.

Corrida Inicial

Para este paso, utilice como el nombre inicial

Para ejecutar el flujo de OpenLane, abra el Docker de OpenLane y ejecute el siguiente comando:

   
   :/openlane$ ./flow.tcl -design adder_4b -tag 
  
 

Durante la ejecución de este comando el flujo fallará. Revise todos los WARNING y ERROR mostrados por OpenLane. ¿Cuál es el problema que impide que la ejecución del flujo se complete satisfactoriamente?

Usando la herramienta Magic se puede observar el resultado intermedio que se tenía hasta el momento en el que falló la corrida. Para esto, utilice el comando mostrado a continuación :

  
    :/openlane$ magic -T pdks/sky130A/libs.tech/magic/sky130A.tech lef read designs/adder_4b/runs//tmp/merged.nom.lef def read designs/adder_4b/runs//results//adder_4b.def
 

Deberá sustituir por el nombre de la etapa del flujo de la cual desea abrir el layout. Revise los errores que obtuvo al ejecutar el flujo para determinar el paso que debe abrir. Analice las características principales de dicho layout. ¿Por qué están todas las celdas de lógica amontonadas en una esquina?

Configurar archivo config.json

Para solucionar el problema del apartado anterior, se deberá modificiar el archivo de configuración config.json que se encuentra en la carpeta designs/adder_4b/. Ingrese las siguientes configuraciones en su archivo.

  
    {
        "DESIGN_NAME": "adder_4b",
        "VERILOG_FILES": "dir::src/*.v",
        "CLOCK_PORT": null,
        "CLOCK_PERIOD": 10.0,
        "DESIGN_IS_CORE": true,
        "FP_PDN_AUTO_ADJUST": false,
        "FP_PDN_VPITCH": 20,
        "FP_PDN_HPITCH": 20,
        "FP_PDN_VOFFSET": 0,
        "FP_PDN_HOFFSET": 0,
        "FP_SIZING": "absolute",
        "DIE_AREA": "0 0 35 60"
    }
 

Investigue en la documentación de OpenLane sobre el significado de cada una de las opciones que se están configurando.

Ahora, utilizando como el nombre area_pdn_config, vuelva a intentar ejecutar el flujo de diseño de OpenLane, utilizando el comando brindado en la sección anterior. En esta ocasión, el flujo debería completarse satisfactoriamente.

Note que durante la ejecución del flujo, se ejecutan una serie de pasos, los cuales aparecen enumerados en la terminal. Investigue sobre los siguientes pasos del flujo de diseño de circuitos integrados:

Utilizando la herramienta Magic, abra el layout final obtenido por OpenLane. La dirección del archivo lef se mantiene idéntica a la utilizada anteriormente, mientras que el def será: designs/adder_4b/runs//results/final/def/adder_4b.def. Analice el layout obtenido.

Exploración de configuraciones

  1. Modifique de nuevo el archivo config.json, pero en esta ocasión cambie el FP_PDN_HPITCH a 10. Abra el nuevo layout y compárelo con el layout obtenido cuando FP_PDN_HPITCH era 20. Explique ¿Cómo afectó este cambio el resultado final del layout?
  2. Manteniendo FP_PDN_HPITCH en 10, modifique la variable de configuración DIE_AREA para que, manteniendo un lado de 60 y otro de 35, el circuito ahora sea más alto que ancho. Abra el layout, y compárelo con los layouts obtenidos anteriormente. Explique ¿Cómo afectó este cambio el resultado final del layout?

Síntesis Física de un Sumador de 8 bits con pipeline

En esta sección se ejecutará el flujo de diseño de OpenLane para el sumador de 8 bits con pipeline utilizado en el tutorial anterior.

Corrida Inicial

Para este paso, utilice como el nombre inicial.

Utilice la siguiente configuración en su archivo config.json:

  
    {
      "DESIGN_NAME": "adder_8b_pipeline",
      "VERILOG_FILES": "dir::src/*.v",
      "CLOCK_PORT": "clk",
      "CLOCK_PERIOD": 10.0,
      "DESIGN_IS_CORE": true,
      "FP_SIZING": "absolute",
      "DIE_AREA": "0 0 30 50",
      "FP_PDN_AUTO_ADJUST": false,
      "FP_PDN_VPITCH": 20,
      "FP_PDN_HPITCH": 20,
      "FP_PDN_VOFFSET": 0,
      "FP_PDN_HOFFSET": 0
    }
 

Para ejecutar el flujo de OpenLane, abra el Docker de OpenLane y ejecute el siguiente comando:

  
    :/openlane$ ./flow.tcl -design adder_8b_pipeline -tag 
  

Durante la ejecución de este comando el flujo fallará. Revise todos los WARNING y ERROR mostrados por OpenLane. ¿Cuál es el problema que impide que la ejecución del flujo se complete satisfactoriamente?

Utilizando el parámetro de configuración DIE_AREA cambie el ANCHO del chip. Encuentre una dimensión que permita que el flujo se ejecute correctamente, manteniendo el área lo más pequeña posible. Abra el layout.

Análisis de temporización

Utilizando la corrida anterior, determine si existe algún path que produzca una violación de timing. Para esto, revise los logs y reports de la etapa signoff del flujo. Analice el reporte de temporización de las trayectorias críticas (las que tengan el slack más pequeño) para el análisis de setup y de hold.

Ahora, modifique el archivo \texttt{config.json} para que el período del reloj sea 4.0 y vuelva a correr el flujo de diseño.

Revise los resultados de temporización para el diseño con la nueva frecuencia de reloj, tanto los de Single-Corner STA como los de Multi-Corner STA. ¿Se cumplen los requerimientos de temporización (tanto para análisis máximo como mínimo) en este caso? ¿Es el peor path el mismo (inicio y final) en ambos períodos de reloj? ¿Sufrió cambios la lógica del path ante el cambio en la frecuencia?

Posición de puertos

Abra en Magic el layout generado para el sumador de 8 bits con pipeline en la sección anterior. Observe el orden y la posición en la que fueron ubicados los puertos de entradas y salidas al diseño (A[0-7], B[0-7], C\_in, Sum[0-7], C\_out, clk y rst). Dibuje un diagrama donde indique la posición de los puertos en el diseño. ¿Considera usted que el ordenamiento actual es el ideal? ¿Por qué? Agregue un diagrama con un ordenamiento que usted considere podría mejorar los resultados.

Abra en Magic el layout generado para el sumador de 8 bits con pipeline en la sección anterior. Observe el orden y la posición en la que fueron ubicados los puertos de entradas y salidas al diseño (A[0-7], B[0-7], C\_in, Sum[0-7], C\_out, clk y rst). Dibuje un diagrama donde indique la posición de los puertos en el diseño. ¿Considera usted que el ordenamiento actual es el ideal? ¿Por qué? Realice un diagrama con un ordenamiento que usted considere podría mejorar los resultados.

Ahora, se procederá a implementar el ordenamiento que usted propuso en el diseño. Para esto debe crear un archivo llamado pin_order.cfg en el directorio del diseño (designs/adder_8b_pipeline/) e indicarle a OpenLane que el archivo nuevo es el que debe utilizarse. Para eso declare la variable FP_PIN_ORDER_CFG en el archivo config.json y use "dir::pin\_order.cfg" como valor.

El archivo pin_order.cfg define el ordenamiento que se utilizará para colocar los puertos en cada lado del chip. Para esto se indicara uno de los costados #N, #W, #S, #E (North, West, South, East), seguido de los puertos que desean colocar. Los puertos se colocarán según el orden dado y de izquierda a derecha (para #N y #S) o de abajo hacia arriba (para #W y #E).

Por ejemplo, considere el ordenamiento mostrado para el layout de la siguiente figura.

Ordenamiento de Puertos
Fig. 1 - Ejemplo de ordenamiento de Puertos.

Para lograr dicho acomodo, se deberá utilizar un archivo pin_order.cfg como el siguiente:

  
#N
A\[0\]
A\[1\]
A\[2\]

#S
B\[0\]

#E
Y

#W
B\[1\]
C
  

Note que los paréntesis cuadrados son interpretados como caracteres especiales, por lo que se debe usar \ para poder usarlos como parte de los nombres de las señales.

Escriba el pin_order.cfg para implementar el ordenamiento que usted sugirió y corra de nuevo el flujo de OpenLane. Utilice una etiqueta distinta, para evitar que los resultados de esta corrida sobrescriban los de el ordenamiento anterior. Abra el layout para verificar que el ordenamiento deseado fue implementado. Haga zoom para que sea posible visualizar los nombres de los puertos.

Realice además una comparación de los resultados de temporización de ambas implementaciones. Revise tanto los reportes de \textit{Total Negative Slack} (TNS) como \textit{Worst Negative Slack} (WNS). ¿Fueron efectivos sus cambios para mejorar el rendimiento?

Síntesis Física de un controlador USB

Revise el reporte de exploración del espacio de diseño de síntesis del controlador USB realizado en el tutorial anterior. Determine las configuraciones de síntesis que brindaron la mejor área y el mejor retardo. Por ejemplo, en la figura la configuración AREA 0 brinda la mejor área, mientras la configuración AREA 3 da el mejor retardo.

Exploración del espacio de diseño
Fig. 2 - Resultados de Exploración del Espacio de Diseño.

Ejecute el flujo de diseño de OpenLane para cada una de las dos configuraciones de síntesis (mejor área y mejor retardo), para esto, modifique la variable SYNTH_STRATEGY en el archivo config.json del diseño usb. Modifique también la variable FP_CORE_UTIL y asígnele un valor de 30.

Modifique también el archivo para que el período del reloj sea 4.0 en la configuración de menor retardo y 8.0 para la de menor área. Corra de nuevo los pasos para ejecutar OpenLane (utilice un tag diferente para no sobrescribir la corrida anterior). Utilice etiquetas distintas para cada configuración, para no sobrescribir los datos. Incluya un análisis completo que compare ambos resultados. En específico analice:

Referencias