Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Introducción

Magic es un programa Libre para diseñar y fabricar circuitos integrados utilizando diferentes tecnologías

En este tutorial vamos a ver cómo diseñar el layout de un transistor MOSFET-N, utilizando la tecnología Libre Sky130, cómo simularlo y cómo generar el fichero GDS para su fabricación. En la parte final utilizaremos la herramienta KLayout para mostrar el diseño tanto en 2D como en 3D

Instalación

En este tutorial utilizaremos Magic junto con la Tecnología sky130 , que es la que podemos fabricar. Tenemos que realizar 2 instalaciones:

Instalación de Magic

La manera más directa de instalar mágic, usando la última versión, es utilizando el ejecutabe appimage que se encuentra en la zona de las Releases: https://github.com/RTimothyEdwards/magic/releases

La que usamos para este tutorial es la versión 8.3.681

Descargamos el ejecutable appimage correspondiente, que en nuestro caso es: Magic-8.3.681.20260807.4432d7ec-x86_64-EL10.AppImage

Lo renombramos a magic y lo copiamos en un directorio accesible desde el path. Yo voy a instalarlo en ~/.local/bin

Para comprobar que arranca correctamente abrimos un terminal y escribimos magic:

obijuan@JANEL:~$ magic
-- # Starting Magic

Esto es lo que nos aparece:

De momento vamos a Cerrar la aplicación, pinchando en File/Quit

¡Ya tenemos Magic funcionando!

Instalando el gestor ciel

Magic es un programa para diseño de chips que puede trabajar con diferentes tecnologías, o PDK (Process Design Kit), proporcionados por los fabricantes

Nosotros estamos interesados en trabajar con OPEN PDKs, que han sido liberados por el fabricante. En concreto, usaremos el Sky130 de Skywater

Para su instalación hay que realizar compilaciones. Todo esto se simplifica si usamos un gestor de paquetes, que nos instala la versión ya compilada, para el PDK que necesitemos

El gestor recomendado es ciel

Para instalar ciel seguimos estos pasos:

  1. Crear un entorno virtual de python
    Ciel es un paquete python, por lo que en vez de instalarlo directamente en el sistema, vamos a crear el entorno virtual asic, y dentro de él lo instalaremos
obijuan@JANEL:~$ python -m venv $HOME/venv/asic
  1. Entrar en el entorno virtual
obijuan@JANEL:~$ . $HOME/venv/asic/bin/activate
(asic) obijuan@JANEL:~$
  1. Instalación de ciel
(asic) obijuan@JANEL:~$ python3 -m pip install ciel

Una vez instalado realizamos una comprobación para verificar que efectivamente se ha instalado correctamente

(asic) obijuan@JANEL:~$ ciel --version
Ciel v2.6.1 ©2022-2025 Efabless Corporation and Contributors

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this program except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
(asic) obijuan@JANEL:~$

Instalación de sky130

Desde Ciel comprobamos los PDKs precompilados listos para instalar, con el comando ciel ls-remote --pdk-family sky130:

(asic) obijuan@JANEL:~$ ciel ls-remote --pdk-family sky130
Pre-built sky130 PDK versions
├── 026824c7969ce6f4fc9678e6ca04b0a06a596c4b (2026.08.04)
├── f6eeac7dad085ffcc829ccfd721f7b4ce39edcf7 (2026.07.14)
├── d658698bd8bcf4e05fc7b5991a701247ba0d744c (2026.07.04)
[...]

Salen muchos, pero sólo hemos mostrado los 3 primeros

Con el comando ciel ls --pdk-family sky130 comprobamos los que están instalados:

(asic) obijuan@JANEL:~$ ciel ls --pdk-family sky130
No PDKs installed.
(asic) obijuan@JANEL:~$

Como es la primera instalación, de momento NO nos aparece ninguno. Vamos a instalar el último (2026.08.04). Hay que utilizar su hash:

(asic) obijuan@JANEL:~$ ciel enable --pdk-family sky130 026824c7969ce6f4fc9678e6ca04b0a06a596c4b
Version 026824c7969ce6f4fc9678e6ca04b0a06a596c4b not found locally, attempting 
to download…
Downloading common.tar.zst… ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00
Downloading sky130_fd_io.tar.zst… ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00
Downloading sky130_fd_pr.tar.zst… ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00
Downloading sky130_fd_sc_hd.tar.zst… ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00
Downloading sky130_fd_sc_hvl.tar.zst… ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00
Downloading sky130_ml_xx_hd.tar.zst… ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00
Downloading sky130_sram_macros.tar.zst… ━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00
Version 026824c7969ce6f4fc9678e6ca04b0a06a596c4b enabled for the sky130 PDK.
(asic) obijuan@JANEL:~$

Ahora ya sí que aparece que tengo uno instalado:

(asic) obijuan@JANEL:~$ ciel ls --pdk-family sky130
In /home/obijuan/.ciel/ciel/sky130/versions:
└── 026824c7969ce6f4fc9678e6ca04b0a06a596c4b (2026.08.04) (enabled)
(asic) obijuan@JANEL:~$

Todos los ficheros relacioandos con el PDK de Sky130 se encuentran en el directorio ~/.ciel/sky130A

¡¡Ya lo tenemos todo listo!!

Arrancando Magic

Para arrancar Magic seguimos estos pasos:

  1. Exportar la variable PDK_ROOT: export PDK_ROOT=$HOME/.ciel
(asic) obijuan@JANEL:~/Develop/Tutorial-Magic$ export PDK_ROOT=$HOME/.ciel
  1. Arrancar Magic con magic -rc ~/.ciel/sky130A/libs.tech/magic/sky130A.magicrc

Hay que arrancar Magic pasándole como argumento un script de arranque para configurar la Tecnología sky130

(asic) obijuan@JANEL:~/Develop/Tutorial-Magic$ magic -rc ~/.ciel/sky130A/libs.tech/magic/sky130A.magicrc
-- # Starting Magic

Esto es lo que nos aparece ahora

En la parte de la derecha vemos TODAS las capas definidas para trabajar con la tecnología Sky130

Además, hay una segunda ventana de Magic: la Consola de Magic. Aquí es donde Magic nos saca sus mensajes de salida y donde el usuario puede escribir comandos

Esta es toda la información que aparece inicialmente en la consola de Magic, que se deja aquí como referencia

loading history file ... 3 events added
Use openwrapper to create a new GUI-based layout window
Use closewrapper to remove a new GUI-based layout window

Magic 8.3 revision 681 - Compiled on Sat Aug  8 07:04:03 UTC 2026.
Starting magic under Tcl interpreter
Using Tk console window
Using TrueColor, VisualID 0x21 depth 24
Processing system .magicrc file
Switching to WIRING tool.
Switching to NETLIST tool.
Switching to PICK tool.
Switching to BOX tool.
Sourcing design .magicrc for technology sky130A ...
2 Magic internal units = 1 Lambda
Input style sky130(): scaleFactor=2, multiplier=2
The following types are not handled by extraction and will be treated as non-electrical types:
    ubm 
Scaled tech values by 2 / 1 to match internal grid scaling
Loading sky130A Device Generator Menu ...
New windows will not have a title caption.
New windows will not have scroll bars.
New windows will not have a border.
Repainting console in magic layout window colors
Using technology "sky130A", version 1.0.588-56-g026824c
Root cell box:
           width x height  (   llx,  lly  ), (   urx,  ury  )  area (units^2)

microns:   0.010 x 0.010   ( 0.000,  0.000), ( 0.010,  0.010)  0.000     
lambda:     1.00 x 1.00    (  0.00,  0.00 ), (  1.00,  1.00 )  1.00      
internal:      2 x 2       (     0,  0    ), (     2,  2    )  4         
Main console display active (Tcl9.0.4 / Tk9.0.4)
% 

¡Ya está todo listo para comenzar el tutorial!

Preparativos iniciales

Antes de diseñar nuestro primer MOSFET-N, vamos a ir configurando Magic, así como aprendiendo su interfaz

Magic es un programa antiguo, aunque muy potente. Por ello la interfaz resulta actualmente un poco extraña. Sin embargo, cuando se aprenden sus fundamentos, resulta muy sencilla

PERO es muy importante leer esta documetanción y NO intentar hacer nada por tu cuenta

Ventana principal

Al arrancar Magic como se indica en el apartado anterior, nos aparece la ventana principal

Esta es la pantalla donde haremos nuestro diseño. Vamos a destacar algunos de los elementos de la interfaz

  • DRC: Reglas de diseño. Se indica si se están violando o no las reglas de diseño del chip, con la tecnología actual. Inicialmente no hay diseño, y por eso no se están violando ninguna de las reglas de diseño. Aparece un check en verde
  • Nombre del diseño actualmente cargado. Por defecto es UNLOADED
  • Tecnología: Sky130A
  • Bloque cursor: Zona del chip con la zona activa, donde afectarán los diferentes comandos que se usen

Una cosa muy importante es que los elementos de diseño dentro del chip siempre son zonas rectangulares. Por eso el cursor es un bloque, que puede tener las dimensiones que le demos, pero siempre es un rectángulo. No es posible crear otras geometrías diferentes a rectángulos

El bloque cursor lo vamos a nombre como la caja

Las unidades por defecto que vamos a utilizar son micrómetros (µm), que en magic se usa el prefijo um. Las dimensiones de la caja por defecto, la que aparece al inicio son de 0.010um x 0.010um

Haciendo zoom

Cuando se trabaja con programas de diseño visuales, es importantísimo conocer el manejo de la cámara, y saber cómo acercarse para ver detalles, alejarse para ver más información, así como centrar la vista actual. En Magic todo esto se realiza mediante teclas. NO SE HACE CON EL RATÓN, como en los programas modernos

Note

Recordemos que Magic es un programa desarrollado hace décadas, donde todavía el ratón era un elemento que podía NO estar presente en los ordenadores. Por eso está todo pensado para hacerse con el teclado

Para hacer zoom y acercarnos a un detalle de nuestro diseño pulsamos en la tecla z. Vemos que ahora la caja se ve más grande

Para alejar el zoom (zoom out) y visualizar más información de nuestro diseño pulsamos shift-z

Podemos centrar la caja con la tecla ctrl-z

Aunque conviene tener siempre en la cabeza estas teclas, también se encuentran disponibles en el menú windows

Configurando el grid

Antes de empezar a diseñar vamos a configurar el grid. Magic es un programa de diseño 2D, donde los elementos que se añaden son siempre rectángulos. Por eso resulta muy conveniente definir una cuadrícula (grid) y configurarla para el tamaño más adecuado según la tecnología que estamos usando.

Nosotros vamos a establecer la resolución de la cuadrícula en 0.05µm (50nm). Pinchamos en windows y luego Set grid 0.05um

Se activa automáticamente, y veremos la cuadrícula:

Si echamos el zoom hacia atrás vemos más cuadrículas

Hay un punto negro en la esquina inferior izquierda de la caja. Indica donde se encuentra el origen de coordenadas (0, 0)
Ahora pinchamos en la opción windows/Snap-to-grid-on para que la caja esté siempre sobre el grid. Esto facilita mucho el trabajo con los diseños

Midiendo el tamaño de la caja

La caja resalta la zona activa dentro del diseño, que es siempre un rectángulo. Esta caja la podemos agrandar y cambiar, como veremos más adelante, para señalar la zona de interés

Para saber el tamaño que tiene esta caja, y por tanto saber el tamaño de la zona de interés, utilizamos la opción Windows/Measure box o apretamos la tecla b. Nos apareceren las dimensiones en la ventana de texto:

La caja por defecto tiene el tamaño de una celda del grid, que comprobamos que es de 0.05umx0.05um

Otra forma de obtener el tamaño de la caja es escribiendo el comando box

Guardando el diseño en un fichero

En este tutorial vamos a construir un mosfet N. El diseño actual, que está en blanco, lo guardamos en el fichero mosfet-n.mag, que contendrá nuestro mosfet futuro. Para ello pinchamos en cell/save as

Se nos abre una ventana de diálogo donde escribimos el nombre del diseño. Escribimos mosfet-n y pinchamos en ok

Vemos en la parte superior cómo ha cambiado el nombre a mosfet-n

También se nos ha generado el fichero mosfet-n.mag en el directorio de trabajo

obijuan@JANEL:~/Develop/Tutorial-Magic/src/examples$ ls
mosfet-n.mag
obijuan@JANEL:~/Develop/Tutorial-Magic/src/examples$

El diseño es un fichero de texto, que podemos ver y editar:

magic
tech sky130A
timestamp 0
<< end >>

Creando un MOSFET N

Vamos a crear nuestro primer MOSFET-N con Magic. Se construye dibujando 2 rectángulos: uno para marcar las zonas N, y otro para el polisilicio de la puerta. A partir de estos dos rectángulos, magic calcula los parámetros necesarios para la fabricación del mosfet

Lo construiremos de forma incremental, a la vez que aprendemos las diferentes opciones de Magic, y practicamos con ellas

Dibujando una Zona N mínima

La zona N mínima que podemos dibujar está determinada por el tamaño del grid, que lo hemos fichado en 0.050um x 0.050um (50nm x 50nm). Este es el tamaño que tiene la caja actual. Pulsamos ctrl-z para verlo centrado y a su mayor tamaño

Nos fijamos que se cumples las reglas DRC (básicamente porque NO hay diseñado nada todavía)

Para dibujar una zona N en la caja actual, ejecutamos este comando: paint ndiffusion. Esto es lo que nos aparece en la consola de magic:

En la ventana del diseño vemos que la caja se pone de color verde, y en los cuadrados del grid superior y derecho aparece un patrón de puntitos

También observamos que el DRC FALLA: Hay 2 errores. Esto es debido a que NO se puede construir una zona N tan pequeña, con la tecnología sky130, sino que hay unas dimensiones mínimas. Pero vamos a investigar sobre esto

Para ver el diseño completo, pinchamos en windows/full view o bien apretamos la tecla v

Ahora se ven todas las cuadrículas nuevas. Por la parte superior hay 2 que indican la presencia de errores, y por la parte derecha hay otras 2 también de errores. Los patrones de relleno de estas capas se pueden ver en la parte derecha. Ahí vemos las capas ndifussion y errors

Viendo los errores de DRC

Para ver los errores pinchamos en Options/DRC Manager

Se nos abre una ventana nueva, donde nos indica la regla que se está violando: Diffusion width < 0.15um (diff/tap.1)

Lo que significa es que la zona de difusión N tiene unas dimensiones menores que las mínimas permitidas. Las mínimas son de 0.15um. Esto es lo que nos indican las cuadrículas de la capa de error: Al menos, tanto la anchura como la altura de la zona n tiene que ocupar 3 cuadrículas

Ampliando la anchura de la zona N

Vamos a solucionar primero el problema de la anchura. La anchura actual es de 0.050um, pero debe ser al menos de 0.150um. Situamos el puntero del ratón cerca de la zona donde queremos que se sitúe la esquina superior derecha de la nueva caja y pulsamos el botón derecho del ratón

Se dibuja una nueva caja que mantiene la esquina inferior izquierda en el mismo sitio que antes, pero sitúa la esquina superior derecha en el nuevo punto (alineado con la cuadrícula)

Ahora pintamos la nueva zona, ejecutando el comando paint ndiffusion, igual que antes

Ahora sólo queda 1 error de DRC. Se muestra en la capa errors las cuadrículas que deberían ser zonas de difusión n, es decir, hay que ampliar la altura para que sea de al menos 0.150um

Ampliando la altura de la Zona N

Repetimos el proceso. Con el botón derecho seleccionamos el punto de la cuadrícula donde queremos que se sitúe la esquina superior derecha de la caja

Y la convertimos en zona de difusión n. Ahora ya sí se cumplen las reglas DRC, y no hay errores

Hemos dibujado la zona N mínima

Zona N definitiva

Cuando creamos un mosfet N, la zona N tiene que ser más grande, para cumplir con todas las reglas de diseño. Su tamaño tiene que ser al menos de 0.650um x 0.450um. Así que la vamos a crear desde 0

Partimos del estado anterior, donde la caja rodea toda la zona N. Ejecutamos el comando erase y la zona desaparece, pero la caja sigue estando

Ahora vamos a poner una zona N de 0.65 x 0.45 (um) en el origen. Utilizamos el comando box 0 0 0.65 0.45 seguido de paint ndiffusion

La Zona N definitiva está lista

Colocando el Polisilicio

Lo siguiente es colocar la zona de polisilicio que atraviesa la zona N, para generar las dos zonas N, una a la izquierda y otra a la derecha, y la conexión con la puerta. Para no violar las reglas DRC, el polisilicio debe sobresalir 0.15um por arriba y por abajo

Primero marcamos la casilla donde va a estar la esquina inferior izquierda del polisilicio. Esto lo hacemos apretando el botón izquierdo del ratón

Se sitúa la caja actual con su esquina inferior izquierda en la cuadrícula indicada, ajustada al grid. Ahora posicionamos el ratón en la esquina superior derecha de la zona donde queremos que esté el polisicio

Apretamos el botón derecho y aparece la nueva caja

Escribimos paint polysilicon para convertirla en la zona de polisilicio

En la pantalla gráfica vemos el polisilicio. Observamos que NO HAY ERRORES DE DRC

¡Ya tenemos la base de nuestro primer MOSFET!

En el MOSFET N hay 3 capas:

  • ndifussion: Las 2 zonas N, que aparecen delimitadas por el polisilicio. Se dibuja una única zona N y magic calcula las dos a partir de la intersección con el polisilicio
  • polysilicon: La capa de polisilicio que hemos dibujado. Magic calcula su intersección con la zona N y divide esta capa en dos zonas. Una de polisilio puro, que sobresale por la zona N y la zona de intersección que conforma la siguiente capa (ntransistor)
  • ntransistor: Es la capa de intersección entre la zona N y el polisilicio. En la fabricación del chip esta zona se dopa para que haya muchos electrones libres y la puerta del transistor conduzca

Mostrando/ocultando capas

Todas las capas definidas en la tecnología Sky130A se encuentran en el panel de la derecha, como ya hemos visto. Es posible ocultar las capas visibles, así como volver a mostrarlas. Para ocultar hay que pinchar en la capa correspondiente usando el botón derecho del ratón

En esta imagen vemos cómo se ha ocultado la capa ntransistor. Podemos ver que efectivamente ahora la zona N se ha dividido en 2 zonas N

Para volver a visualizar cualquier capa basta con pinchar en la capa y usar el botón izquierdo

Conectando la fuente

Vamos a aprender a realizar conexiones a la fuente y el drenador, que son iguales. Ambos parten de la capa ndiffusion

El punto de partida es una zona N cruzada por el polisilicio, como en el apartado anterior, pero con la geometría ligeramente cambiada: más espacio en las zonas N para que quepan los contactos nuevos que vamos a añadir. Ampliar esta zona es algo que ya sabemos hacer, y se deja como ejercicio. Para saber las dimensiones exactas, sólo hay que contar cuadrículas de la rejilla

El objetivo es conectar la zona N de la fuente con un contacto metálico, que es el que sale fuera del chip. Las conexiones están en capas independientes a mayor altura que el substrato. Estas capas de conexión están separadas, y son independientes. Por eso hay que añadir contactos entre ellas, que reciben el nombre de vías

La cantidad de capas de interconexión y de vías a diferentes niveles depende de la tecnología usada. Para el caso de sky130, que es el que estamos utilizando, la información se encuentra en una figura en este enlace de Tinytapeout: Skywater’s 130 nm. Se reproduce aquí la figura para tenerla más a mano:

En esta figura se definen todos los parámetros de esta tecnología, así como las diferentes capas. Como hemos visto en magic, la cosa es más compleja, y existen muchas más capas, pero en este tutorial iremos resumiento la información necesaria, para simplificarlo todo

Este es el modelo 3D con las capas que tenemos de partida

Las capas de conexionado están a diferentes niveles. Para pasar de una a otra hay que utilizar las vías. La primera capa que hay se denomina li en la documentación (local interconection). Su uso es para realizar conexiones locales dentro del diseño actual. Se definen conexiones locales como aquellas que NO salen al exterior. Típicamente son conexiones cortas. A nivel de fabricación se usa un material especial (Nitruro de titanio) que soporta altas temperaturas

La capa li recibe el nombre de locali en magic. Para acceder a ella hay que colocar una vía. Las vías de conexión a li dependen del material que hay en la capa 0. En nuestro caso el material es tipo N y la vía tiene que ser capaz de conectarse bien a ese material. Por ello a nivel genérico estas vías, las que van del sustrato al bus li reciben el nombre genérico de licon (Conexiones a li). Pero en la práctica hay que usar tipos diferentes según el material del sustrato

Como la fuente es tipo n, tenemos que usar en magic la capa ndcontact, que define un contacto entre la zona N y li. Magic además genera las capas intermedias necesarias para realizar este contacto, pero no necesitamos entrar en tantos detalles

Así que vamos a colocar el contacto ndcontact. Colocamos la caja como se indica en esta figura. El tamaño mínimo del contacto es de 4x4 cuadros del grid

Pinchamos con el botón central del ratón en la capa ndcontact. Nos aparece el contacto. En magic todos los contactos tiene forma de X.

Además observamos que aparecen errores de DRC. Son debidos a que todavía NO hemos metido la capa locali. Nos indican que esta capa no tiene el área mínima requerida (claro, al no estar, tiene área 0), y que tampoco hay un solape entre el contacto y esta área

Colocamos la caja como se indica en la figura para crear la capa locali. Tiene que tener un tamaño lo suficientemente grande como para contener el ndcontact y también la vía que pondremos después para conectar con la capa metal1

Nos aparece la capa locali. Ahora ya NO hay errores de DRC

Ya tenemos conectada la capa locali con la capa ndifussion de nuestra fuente, a través de la vía ndcontact. Vamos a verificar que magic detecta que ambas capas están conectadas. Situamos el cursor dentro de la capa locali

Pulsamos la tecla s. Se nos selecciona la parte de locali que llega hasta el comienzo de ndcontact

Si volvemos a pulsar s, se seleccion la capa completa locali y la vía ndcontact. Es así porque ambas están conectadas

Si apretamos s una vez más, se selecciona también la zona N de la fuente

Se han selecciona todas las zonas que están conectas. Si no hubiésemos conectado la vía ndcontact serían capas independiente. Es una forma sencilla de comprobar que nuestro diseño está bien hecho

El siguiente paso es conectar la fuente del transistor a la capa metálica, porque la queremos llevar a las patas del chip para realizar pruebas. La siguiente capa de condución es metal1 y para llegar a ella hay que colocar una vía en la capa locali que se llama viali (en la documentación de skywater la denomina mcon). NO ES POSIBLE conectar la fuente directamente a metal1, sino que hay que pasar obligatoriamente por locali

En este dibujo 3D se muestran las dos nuevas capas que necesitamos, viali y metal1

Vamos a crear ambas capas en magic. Antes hemos empezado colocando primero la vía, y hemos visto cómo aparecían errores de DRC porque una vía debe conectar dos capas. Ahora, para probar, vamos a colocar primero la capa metal1. Lo primero es dibujar la caja. Tiene que superposerse con locali (para que la vía que coloquemos luego entre en contacto con ambas capas) y extenderse hacia la izquierda

Ahora pinchamos con el botón central sobre la capa metal1, para crearla

Comprobamos que NO HAY ERRORES DRC. Si ponemos el cursor en la parte saliente de metal1 (donde NO hay interseccion con locali) y apretamos la tecla s, veremos que NO SE SELECCIONA ningún rectangulo adicional. Esto significa que metal1 está AISLADA. Es una capa SIN CONECTAR

Para conectar ambas capas usamos viali. Hacemos como siempre. Primero situamos la caja. Le damos unas dimensiones igual que la otra vía, de 4x4 con este grid

Con el botón central pinchamos en viali para colocar la vía

Ahora todas las capas están unidas, desde metal1 (superior) hasta ndiffusion (inferior), pasando por la intermedia locali

Para comprobarlo situamos el cursor en la parte saliente de metal1

Al apretar s la primera vez se selecciona la parte metálica hasta llegar a viali. Si se aprieta una segunda vez, se selecciona toda la capa metal1 y viali, y si pulsamos una tercera vez se seleccionan todas las capas: metal1, locali, viali, ndcontact y ndiffusion. Son todas las capas relacionadas con la fuente del MOSFET N

El último paso para finalizar la conexión es nombrar el contacto metálico. Lo vamos a denotar como SOURCE. Para ello situamos el cursor en el punto de la capa metálica donde queremos colocar el nombre y pulsamos el botón izquierdo y derecho del ratón para obtener un punto (es un rectángulo degenerado en un punto)

En la consola de magic escribimos el comando label SOURCE

En el diseño vemos que aparece la etiqueta SOURCE en el punto que teníamos seleccionado

Si usamos la tecla s para seleccionar todo el nodo completo, también veremos el nombre de ese nodo: SOURCE

El último paso es convertir la etiqueta en un puerto. Ejecutamos el comando port make

La etiqueta cambia a color azul para indicar que es un puerto

Ya está la FUENTE terminada

Conectando la puerta

Para conectar la puerta primero temos que agrandar la parte del polysilicio para que rodee por completo la vía que pondremos más adelante

Lo siguiente es colocar el contacto, que se denomina pcontact. Lo situamos en el interior del polisilicio

Y pulsamos el botón central del ratón

Aparece la vía, pero salen errores de DRC porque todavía NO hemos colocado la capa locali. La añadimos a continuación, como ya sabemos

Desaparecen los errores de DRC. Ahora añadimos la vía viali para la conexión con la capa de metal. Salen también errores de DRC porque todavía no tenemos la capa metal1

Colocamos la capa metal1 y desaparecen los errores de DRC

Por útimo ponemos la etiqueta GATE y la convertimos a un puerto ejecutando los comandos

label GATE
port make

Utilizamos la tecla s para seleccionar toda la puerta, y comprobar que las conexiones son correctas

Así es como queda en 3D lo que llevamos construido

Conexión con el sustrato

El sustrato-p hay que sacarlo también al exterior, para conectarlo a GND. Para su conexión primero hay que crear una zona con extra de portadores p que se denomina psubstratepdiff. Primero dibujamos la caja y luego apretamos con el botón central del ratón en la capa psubstratepdiff

Aparece la capa sin ningún error de DRC

Colocamos la capa locali, con un tamaño igual a las aneriores. No aparecen errores de DRC

Para conectar el sustrato-p con locali hay que utilizar un contacto de tipo psusbstratepcontact

Colocamos la capa metal1 y la vía viali, igual que con la fuente y la puerta

Por último creamos la etiqueta VSUBS y la convertimos en un puerto con los comandos:

label VSUBS
make port

Comprobamos con la tecla s que hay conexión entre todas las capas

El sustrato P ya lo tenemos accesible desde un contacto metálico

Este es el modelo 3D de lo que llevamos hasta ahora

Conexión con el drenador

Para conectar el drenador hacemos exactamente lo mismo que con la fuente. Hay que colocar una vía ndcontact, la capa locali, la vía viali y la capa metal1. Con la tecla s comprobamos que todas las capas del drenador están conectadas

Así es como queda el diseño final del mosfet, con la rejilla activada:

Y este es el diseño final sin la rejilla

Y este es el modelo 3D final

Simulando el MOSFET N

Una vez que tenemos diseñado el MOSFET-N, el siguiente paso es simularlo en spice. Desde Ubuntu/Linux instalamos ngspic mediante el comando:

sudo apt install ngspice

La versión instalada es:

obijuan@JANEL:~$ ngspice --version
******
** ngspice-42 : Circuit level simulation program
** Compiled with KLU Direct Linear Solver
** The U. C. Berkeley CAD Group
** Copyright 1985-1994, Regents of the University of California.
** Copyright 2001-2023, The ngspice team.
** Please get your ngspice manual from https://ngspice.sourceforge.io/docs.html
** Please file your bug-reports at http://ngspice.sourceforge.net/bugrep.html
** Creation Date: Sun Mar 31 20:15:14 UTC 2024
******
obijuan@JANEL:~$

Para realizar la simulación ejecutamos primero el comando extract all. Esto es lo que sale:

Este comando extrae todos los parámetros del diseño y genera el fichero mosfet_n.ext, que es un formato utilizado por magic. Este es su contenido, que se incluye aquí por curiosidad

timestamp 1787215117
version 8.3
tech sky130A
style ngspice()
scale 1000 1 500000
resistclasses 4400000 2200000 950000 3050000 120000 197000 114000 191000 120000 197000 114000 191000 48200 319800 2000000 48200 48200 12800 125 125 47 47 29 5
parameters sky130_fd_pr__nfet_01v8 l=l w=w a1=as p1=ps a2=ad p2=pd
port "DRAIN" 4 350 60 350 60 m1
port "SOURCE" 1 -110 60 -110 60 m1
port "GATE" 2 -110 180 -110 180 m1
port "VSUBS" 3 -110 -110 -110 -110 m1
node "DRAIN" 170 157.292 350 60 m1 0 0 0 0 0 0 0 0 12000 440 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12800 480 11200 440 0 0 0 0 0 0 0 0 0 0
node "SOURCE" 170 108.157 -110 60 m1 0 0 0 0 0 0 0 0 12000 440 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12800 480 11200 440 0 0 0 0 0 0 0 0 0 0
node "GATE" 330 310.998 -110 180 m1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12800 660 0 0 12000 460 17600 600 0 0 0 0 0 0 0 0 0 0
substrate "VSUBS" 223 0 -110 -110 m1 0 0 0 0 0 0 0 0 0 0 10000 400 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12800 480 11200 440 0 0 0 0 0 0 0 0 0 0
cap "DRAIN" "GATE" 9.38015
cap "GATE" "SOURCE" 71.4165
cap "DRAIN" "SOURCE" 24.8075
device msubckt sky130_fd_pr__nfet_01v8 100 0 101 1 l=40 w=120 "VSUBS" "GATE" 80 0 "SOURCE" 120 12000,440 "DRAIN" 120 12000,440

El siguiente paso es ejecutar estos comandos para convertir el fichero anterior al formato de spice.

ext2spice lvs
ext2spice

Se genera el fichero mosfet_n.spice, cuyo contenido es el siguiente:

* NGSPICE file created from mosfet_n.ext - technology: sky130A

.subckt mosfet_n SOURCE GATE VSUBS DRAIN
X0 DRAIN GATE SOURCE VSUBS sky130_fd_pr__nfet_01v8 ad=0.3 pd=2.2 as=0.3 ps=2.2 w=0.6 l=0.2
.ends

Se ha creado un subcircuito de spice que tiene como parámetros los 4 puertos que se han definido: SOURCE, DRAIN, GATE y VSUBS

Para comprobar el MOSFET N hay que hacer bancos de pruebas en spice que sitúen las tensiones correspondientes y saquen las gráficas. Vamos a realizar 2 pruebas, una para medir la corriente que atraviesa el mosfet, y la otra para sacar las familias de curvas características. En ambos circuitos hay que indicar la ruta de la libreria spice (sky130.lib.spice) para la tecnología sky130. En mi caso está instalada en el directorio /.ciel/sky130A/libs.tech/ngspice

  • test_mosfet_n.spice: Comprobación de la corriente que atraviesa el transistor
* Testbench para simular el transistor NMOS
.include "mosfet_n.spice"

* Ruta al modelo del PDK Sky130
.lib "/home/obijuan/.ciel/sky130A/libs.tech/ngspice/sky130.lib.spice" tt

* ----------------------------------------------------------
* -- Instanciar el MOSFET N
* -- El orden de los parametros debe ser el mismo indicado
* -- en el fichero mosfet_n.spice
* -----------------------------------------------------------
X1  SOURCE  GATE  VSUBS DRAIN  mosfet_n

* Tensiones aplicadas al transistor
Vss SOURCE 0 DC 0V
Vds DRAIN  0 DC 1.8V
Vgs GATE   0 DC 0V
Vsub VSUBS 0 DC 0V

* Variar Vgs desde 0V hasta 1.8V en pasos de 10mV
.dc Vgs 0 1.8 0.01

.control
run
* Mostrar la gráfica de la corriente que circula por el 
* transistor en funcion de la tension que llega por la puerta
plot -i(Vds)
.endc

.end

Hay que ejecutar el comando ngspice test_mosfet_n.spice

obijuan@JANEL:~/Develop/Learn-open-silicon/wiki/Log/examples/mosfet_n$ ngspice test_mosfet_n.spice 
******
** ngspice-42 : Circuit level simulation program
** Compiled with KLU Direct Linear Solver
** The U. C. Berkeley CAD Group
** Copyright 1985-1994, Regents of the University of California.
** Copyright 2001-2023, The ngspice team.
** Please get your ngspice manual from https://ngspice.sourceforge.io/docs.html
** Please file your bug-reports at http://ngspice.sourceforge.net/bugrep.html
** Creation Date: Sun Mar 31 20:15:14 UTC 2024
******

Note: No compatibility mode selected!


Circuit: * testbench para simular el transistor nmos

Doing analysis at TEMP = 27.000000 and TNOM = 27.000000

Using SPARSE 1.3 as Direct Linear Solver
 Reference value :  0.00000e+00
No. of Data Rows : 181
ngspice 1 ->

Esta es la gráfica que aparece:

  • test_mosfet_n2.spice: Familia de curvas I-V
* Testbench para obtener la familia de curvas I-V (Id vs Vds) para varios Vgs
.include "mosfet_n.spice"

* Ruta al PDK de Sky130
.lib "/home/obijuan/.ciel/sky130A/libs.tech/ngspice/sky130.lib.spice" tt

* ----------------------------------------------------------
* -- Instanciar el MOSFET N
* -- El orden de los parametros debe ser el mismo indicado
* -- en el fichero mosfet_n.spice
* -----------------------------------------------------------
X1  SOURCE  GATE  VSUBS DRAIN  mosfet_n

* Tensiones aplicadas al transistor
Vss  SOURCE 0 DC 0V
Vds  DRAIN  0 DC 0V
Vgs  GATE   0 DC 0V
Vsub VSUBS 0 DC 0V

* Barrido anidado DC:
* 1. Barrido principal: Variar Vds de 0V a 1.8V (pasos de 10mV)
* 2. Barrido secundario: Variar Vgs de 0.6V a 1.8V en pasos de 0.3V
.dc Vds 0 1.8 0.01 Vgs 0.6 1.8 0.3

.control
run
* Dibujar la corriente de drenador para cada curva de Vgs
plot -i(Vds) xlabel "Vds [V]" ylabel "Id [A]" title "Familia de Curvas Id vs Vds (Parametrizado por Vgs)"
.endc

.end

Hay que ejecutar el comando ngspice test_mosfet_n2.spice

obijuan@JANEL:~/Develop/Learn-open-silicon/wiki/Log/examples/mosfet_n$ ngspice test_mosfet_n2.spice 
******
** ngspice-42 : Circuit level simulation program
** Compiled with KLU Direct Linear Solver
** The U. C. Berkeley CAD Group
** Copyright 1985-1994, Regents of the University of California.
** Copyright 2001-2023, The ngspice team.
** Please get your ngspice manual from https://ngspice.sourceforge.io/docs.html
** Please file your bug-reports at http://ngspice.sourceforge.net/bugrep.html
** Creation Date: Sun Mar 31 20:15:14 UTC 2024
******

Note: No compatibility mode selected!


Circuit: * testbench para obtener la familia de curvas i-v (id vs vds) para varios vgs

Doing analysis at TEMP = 27.000000 and TNOM = 27.000000

Using SPARSE 1.3 as Direct Linear Solver
 Reference value :  0.00000e+00
No. of Data Rows : 905
ngspice 1 -> 

Esta es la gráfica que aparece:

¡¡El transistor está FUNCIONANDO!!!

Formato de fabricación GDS

Para la fabricación de los chips se necesita generar un archivo que contiene la información sobre todas las máscaras que hay que generar para la construcción de las diferentes capas del chip. Uno de los formatos utilizado es el GDS

Desde Magic podemos generar el archivo de fabricación muy fácilmente con el comando gds write

Como ejemplo vamos a exportar el mosfet N. Una vez cargado en Magic, ejecutamos gds write mosfet_n.gds

Se nos genera el fichero mosfet_n.gds. ¡Listos para fabricar!

Herramienta Klayout

Para visualizar los archivos GDS podemos utilizar la herramienta Klayout. Para instalarlo en Ubuntu hay que descargar el fichero .deb desde aquí: https://www.klayout.de/build.html

Yo he bajado la versión 0.30.10. Se instala con sudo apt install klayout_0.30.10-1_amd64.deb. Luego hay que ejecutar sudo apt --fix-broken install para que se instalen todas las dependencias

Esto es lo que aparece una vez arrancado:

Vamos a visualizar el fichero mosfet_n.gds generado anteriormente. Pinchamos en File/Open y seleccionamos el fichero

Lo interesante de esta herramienta es que también puede abrir los ficheros de Magic. Abrimos el fichero mosfet_n.mag para comprobarlo:

Visualizacion en 3D

Desde Klayout también se puede visualizar el archivo .gds en 3D. Para ello hay que seguir los siguientes pasos

  • Instalar el paquete Efabless_sky130 de KLayout

Entrar en el menú en Tools/Manage packages

Buscar sky130. De los paquetes que aparecen, seleccionar Efabless sky130 y pinchar en Apply

Pulsamos en OK

Se empiezan a instalar los paquetes

Cuando se termina, pinchamos en Close

En el siguiente diálogo que aparece pinchamos en YES

Ahora vamos a la opción Tools/2.5d View/New 2.5d script

Desplegamos donde pone Technology sky130

Hacemos doble click en Sky130 - D25 View. Se nos abre un script en la pestaña sky130. Pinchamos en Run script from the current tab

Y se nos abre la venta 3D!!. Con el ratón y los deslizantes superiores ajustamos la vista a lo que nos interese

Conclusiones

Hemos diseñado nuestro primer mosfet N desde 0 utilizando Magic. Lo hemos simulado, lo hemos exportado al formato GDS para su fabricación y por último lo hemos visualizado en 3D con el programa KLayout

Autor

Licencia

Créditos

Enlaces