Tutorial ASIC Alliance VLSI parte 1

Tutorial 1

En este primer tutorial se hará mostrará el desarrollo de uno de los ejemplos que ya trae la suite ALLIANCE. 

1- Para empezar se hará la carga de los parámetros de ~/Alliance/install/etc/profile.d/alc_env.sh, con lo cual se establecen los parámetros de entorno. De esta manera:
> source alc_env.sh
En el directorio donde se encuentra ese archivo. Su ubicación puede variar dependiendo del lugar de instalación.

2-  Con los parámetros cargados se puede realizar la siguiente prueba a ver si están cargadas las variables correctamente.
>graal

Si todo esta bien correrá una aplicación, después de ver que ha arrancado correctamente, cerrarla y pasar al siguiente punto. Presionando crtl+q se sale del programa

3- Genere los siguientes archivos:

inversor.vhdl:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_arith.ALL;
use IEEE.STD_LOGIC_unsigned.ALL;

-- Ejemplo con una compuerta básica, una not
ENTITY Compuerta_INVERSORA IS
PORT(
entrada: IN BIT;

salida: OUT BIT);
--Esta sería la definición de las entrada y salidas de la compuerta
END Compuerta_INVERSORA;

--Ahora se realiza el comportamiento de la compuerta
ARCHITECTURE comportamiento of Compuerta_INVERSORA is
BEGIN
salida<=(NOT entrada);
END comportamiento;


inversor.pat:
-- terminales del inversor
in vdd B;;
in vss B;;
in entrada B;;
out salida B;;
begin
-- colocación de los patrones a evaluar, se coloca ?
-- para que el simulador coloque la salida
-- los intervalos de tiempo están en picosegundos en este caso.
--                      v g i o
--                      d n n u
--                      d d   t
<0 ps> comentario: 1 0 0 ?*;
<+1 ns> entrada_baja: 1 0 0 ?*;
<+1 ns> : 1 0 0 ?*;
<+1 ns>: 1 0 0 ?*;
<+1 ns> entrada_alta: 1 0 1 ?*;
<+1 ns>: 1 0 1 ?*;
<+1 ns> : 1 0 1 ?*;
<+1 ns>: 1 0 1 ?*;
<+1 ns> : 1 0 0 ?*;
<+1 ns>: 1 0 0 ?*;
<+1 ns> : 1 0 0 ?*;
<+1 ns>: 1 0 0 ?*;
<+1 ns> : 1 0 1 ?*;
<+1 ns>: 1 0 1 ?*;
<+1 ns> : 1 0 1 ?*;
<+1 ns>: 1 0 1 ?*;
end;

inversor.ioc:

#      
###################################################################
# In each of TOP()/BOTTOM()/LEFT()/RIGHT() section, there are     #
# placed IOs. In the IGNORE() section, the IOs are ignored        #
# by the IOPlacer. In every section, the IO syntax could be:      #
#        for pin:       (IOPIN iopinName.0 );                       #
#        for pad:       iopadName orientation ;                   #
#        for space:     SPACE  value;                             #
# The capital words are keywords. orientation is not required.    #
# The value is the space between the IO above and the IO below it.#
###################################################################

TOP ( # IOs are ordered from left to right

   (IOPIN entrada.0 );

)
BOTTOM ( # IOs are ordered from left to right

   (IOPIN salida.0 );
)
IGNORE ( # IOs are ignored(not placed) by IO Placer
)

También crear el Makefile:

# /*------------------------------------------------------------\
# |                                                             |
# | File   :                    Makefile                        |
# |                                                             |
# | Author :                 Jacomme Ludovic                    |
# | Modificado: MEF                                                            |
# \------------------------------------------------------------*/
# /*------------------------------------------------------------\
# |                                                             |
# |                              Cells                          |
# |                                                             |
# \------------------------------------------------------------*/
# /*------------------------------------------------------------\
# |                                                             |
# |                             Binary                          |
# |                                                             |
# \------------------------------------------------------------*/

include ../etc/alliance-env.mk

VASY   = $(ALLIANCE_BIN)/vasy
ASIMUT = $(ALLIANCE_BIN)/asimut
BOOM   = $(ALLIANCE_BIN)/boom
BOOG   = $(ALLIANCE_BIN)/boog
LOON   = $(ALLIANCE_BIN)/loon
OCP    = $(ALLIANCE_BIN)/ocp
NERO   = $(ALLIANCE_BIN)/nero
COUGAR = $(ALLIANCE_BIN)/cougar
LVX    = $(ALLIANCE_BIN)/lvx
DRUC   = $(ALLIANCE_BIN)/druc
S2R    = $(ALLIANCE_BIN)/s2r

DREAL  = $(ALLIANCE_BIN)/dreal
GRAAL  = $(ALLIANCE_BIN)/graal
XSCH   = $(ALLIANCE_BIN)/xsch
XPAT   = $(ALLIANCE_BIN)/xpat
XFSM   = $(ALLIANCE_BIN)/xfsm

TOUCH  = touch

TARGET_LIB      = $(CELLS_TOP)/sxlib
METAL_LEVEL     = 2

# /*------------------------------------------------------------\
# |                                                             |
# |                            Environement                     |
# |                                                             |
# \------------------------------------------------------------*/

ENV_VASY = MBK_WORK_LIB=.; export MBK_WORK_LIB;\
           MBK_CATAL_NAME=NO_CATAL; export MBK_CATAL_NAME

ENV_BOOM = MBK_WORK_LIB=.; export MBK_WORK_LIB;\
           MBK_CATAL_NAME=CATAL; export MBK_CATAL_NAME

ENV_BOOG = MBK_WORK_LIB=.; export MBK_WORK_LIB; \
           MBK_IN_LO=vst; export MBK_IN_LO; \
  MBK_OUT_LO=vst; export MBK_OUT_LO; \
           MBK_TARGET_LIB=$(TARGET_LIB); export MBK_TARGET_LIB; \
           MBK_CATAL_NAME=CATAL; export MBK_CATAL_NAME

ENV_LOON = MBK_WORK_LIB=.; export MBK_WORK_LIB; \
           MBK_IN_LO=vst; export MBK_IN_LO; \
  MBK_OUT_LO=vst; export MBK_OUT_LO; \
           MBK_TARGET_LIB=$(TARGET_LIB); export MBK_TARGET_LIB; \
           MBK_CATA_LIB=$(TARGET_LIB); export MBK_CATA_LIB; \
           MBK_CATAL_NAME=CATAL; export MBK_CATAL_NAME

ENV_ASIMUT_VASY = MBK_WORK_LIB=.; export MBK_WORK_LIB;\
             MBK_CATAL_NAME=CATAL_ASIMUT_VASY; export MBK_CATAL_NAME;\
             MBK_IN_LO=vst; export MBK_IN_LO;\
    MBK_OUT_LO=vst; export MBK_OUT_LO

ENV_ASIMUT_SYNTH = MBK_WORK_LIB=.; export MBK_WORK_LIB;\
             MBK_CATAL_NAME=CATAL; export MBK_CATAL_NAME;\
             MBK_CATA_LIB=$(TARGET_LIB); export MBK_CATA_LIB; \
             MBK_IN_LO=vst; export MBK_IN_LO;\
    MBK_OUT_LO=vst; export MBK_OUT_LO

ENV_OCP =  MBK_WORK_LIB=.; export MBK_WORK_LIB; \
           MBK_IN_LO=vst; export MBK_IN_LO; \
  MBK_OUT_LO=vst; export MBK_OUT_LO; \
           MBK_CATA_LIB=$(TARGET_LIB); export MBK_CATA_LIB; \
           MBK_IN_PH=ap; export MBK_IN_PH; \
           MBK_OUT_PH=ap; export MBK_OUT_PH; \
           MBK_CATAL_NAME=CATAL; export MBK_CATAL_NAME

ENV_NERO =  MBK_WORK_LIB=.; export MBK_WORK_LIB; \
           MBK_IN_LO=vst; export MBK_IN_LO; \
  MBK_OUT_LO=vst; export MBK_OUT_LO; \
           MBK_CATA_LIB=$(TARGET_LIB); export MBK_CATA_LIB; \
           MBK_IN_PH=ap; export MBK_IN_PH; \
           MBK_OUT_PH=ap; export MBK_OUT_PH; \
           MBK_CATAL_NAME=CATAL; export MBK_CATAL_NAME



ENV_COUGAR_SPI =  MBK_WORK_LIB=.; export MBK_WORK_LIB; \
           MBK_IN_LO=spi; export MBK_IN_LO; \
  MBK_OUT_LO=spi; export MBK_OUT_LO; \
           MBK_SPI_MODEL=$(SPI_MODEL); export MBK_SPI_MODEL; \
           MBK_SPI_ONE_NODE_NORC="true"; export MBK_SPI_ONE_NODE_NORC; \
           MBK_SPI_NAMEDNODES="true"; export MBK_SPI_NAMEDNODES; \
           RDS_TECHNO_NAME=$(RDS_TECHNO_REAL); export RDS_TECHNO_NAME; \
           RDS_IN=cif; export RDS_IN; \
           RDS_OUT=cif; export RDS_OUT; \
           MBK_CATA_LIB=$(TARGET_LIB); export MBK_CATA_LIB; \
           MBK_IN_PH=ap; export MBK_IN_PH; \
           MBK_OUT_PH=ap; export MBK_OUT_PH; \
           MBK_CATAL_NAME=CATAL; export MBK_CATAL_NAME

ENV_COUGAR =  MBK_WORK_LIB=.; export MBK_WORK_LIB; \
           MBK_IN_LO=al; export MBK_IN_LO; \
  MBK_OUT_LO=al; export MBK_OUT_LO; \
           RDS_TECHNO_NAME=$(RDS_TECHNO_REAL); export RDS_TECHNO_NAME; \
           RDS_IN=cif; export RDS_IN; \
           RDS_OUT=cif; export RDS_OUT; \
           MBK_CATA_LIB=$(TARGET_LIB); export MBK_CATA_LIB; \
           MBK_IN_PH=ap; export MBK_IN_PH; \
           MBK_OUT_PH=ap; export MBK_OUT_PH; \
           MBK_CATAL_NAME=CATAL; export MBK_CATAL_NAME

ENV_LVX =  MBK_WORK_LIB=.; export MBK_WORK_LIB; \
           MBK_IN_LO=vst; export MBK_IN_LO; \
  MBK_OUT_LO=vst; export MBK_OUT_LO; \
           MBK_CATA_LIB=$(TARGET_LIB); export MBK_CATA_LIB; \
           MBK_CATAL_NAME=CATAL; export MBK_CATAL_NAME

ENV_DRUC = MBK_WORK_LIB=.; export MBK_WORK_LIB; \
           RDS_TECHNO_NAME=$(RDS_TECHNO_SYMB); export RDS_TECHNO_NAME; \
           MBK_IN_PH=ap; export MBK_IN_PH; \
           MBK_OUT_PH=ap; export MBK_OUT_PH; \
           MBK_CATA_LIB=$(TARGET_LIB); export MBK_CATA_LIB; \
           MBK_CATAL_NAME=CATAL; export MBK_CATAL_NAME

ENV_S2R  = MBK_WORK_LIB=.; export MBK_WORK_LIB; \
           RDS_TECHNO_NAME=$(RDS_TECHNO_REAL); export RDS_TECHNO_NAME; \
           RDS_IN=cif; export RDS_IN; \
           RDS_OUT=cif; export RDS_OUT; \
           MBK_IN_PH=ap; export MBK_IN_PH; \
           MBK_OUT_PH=ap; export MBK_OUT_PH; \
           MBK_CATA_LIB=$(TARGET_LIB); export MBK_CATA_LIB; \
           MBK_CATAL_NAME=CATAL; export MBK_CATAL_NAME


all :  inversor.cif

# /*------------------------------------------------------------\
# |                                                             |
# |                             Vasy                            |
# |                                                             |
# \------------------------------------------------------------*/

inversor.vbe : inversor.vhdl
$(ENV_VASY); $(VASY) -a -B -o -p -I vhdl inversor

# /*------------------------------------------------------------\
# |                                                             |
# |                             Asimut                          |
# |                                                             |
# \------------------------------------------------------------*/

res_vasy_1.pat : inversor.vbe
$(ENV_ASIMUT_VASY); $(ASIMUT) -b inversor inversor res_vasy_1 

res_synth_1.pat : inversor.vst 
$(ENV_ASIMUT_SYNTH); $(ASIMUT) inversor inversor res_synth_1

# /*------------------------------------------------------------\
# |                                                             |
# |                             Boom                            |
# |                                                             |
# \------------------------------------------------------------*/

boom.done : inversor_o.vbe
@$(TOUCH) boom.done

inversor_o.vbe : inversor.vbe inversor.boom res_vasy_1.pat
$(ENV_BOOM); $(BOOM) -VP inversor inversor_o

# /*------------------------------------------------------------\
# |                                                             |
# |                             Boog                            |
# |                                                             |
# \------------------------------------------------------------*/

boog.done : inversor_o.vst
@$(TOUCH) boog.done

inversor_o.vst : inversor_o.vbe
$(ENV_BOOG); $(BOOG) inversor_o

# /*------------------------------------------------------------\
# |                                                             |
# |                             Loon                            |
# |                                                             |
# \------------------------------------------------------------*/

loon.done : inversor.vst
@$(TOUCH) loon.done

inversor.vst : inversor_o.vst
$(ENV_LOON); $(LOON) inversor_o inversor

# /*------------------------------------------------------------\
# |                                                             |
# |                             OCP                             |
# |                                                             |
# \------------------------------------------------------------*/

inversor_p.ap : res_synth_1.pat
$(ENV_OCP); $(OCP) -v -gnuplot -ioc inversor  inversor inversor_p

# /*------------------------------------------------------------\
# |                                                             |
# |                             NERO                            |
# |                                                             |
# \------------------------------------------------------------*/

inversor.ap : inversor_p.ap inversor.vst
$(ENV_NERO); $(NERO) -V -$(METAL_LEVEL) -p inversor_p inversor inversor

# /*------------------------------------------------------------\
# |                                                             |
# |                             Cougar                          |
# |                                                             |
# \------------------------------------------------------------*/

inversor_e.spi : inversor.ap
$(ENV_COUGAR_SPI); $(COUGAR) -v -ac inversor inversor_e

inversor_erc.spi : inversor.ap
$(ENV_COUGAR_SPI); $(COUGAR) -v -ar inversor inversor_erc

inversor_erc.al : inversor.ap
$(ENV_COUGAR); $(COUGAR) -v -ar inversor inversor_erc

inversor_e.al : inversor.ap
$(ENV_COUGAR); $(COUGAR) -v -ac inversor inversor_e

inversor_et.al : inversor.ap
$(ENV_COUGAR); $(COUGAR) -v -ac -t inversor inversor_et

inversor_et.spi : inversor.ap
$(ENV_COUGAR_SPI); $(COUGAR) -v -ac -t inversor inversor_et

inversor_er.al : inversor.cif
$(ENV_COUGAR); $(COUGAR) -v -r -t inversor inversor_er

inversor_real.al : inversor.ap
$(ENV_COUGAR); $(ENV_S2R); $(COUGAR) -v -ac inversor inversor_real

inversor_real_t.al : inversor.ap
$(ENV_COUGAR); $(ENV_S2R); $(COUGAR) -v -t -ac inversor inversor_real_t

# /*------------------------------------------------------------\
# |                                                             |
# |                             Lvx                             |
# |                                                             |
# \------------------------------------------------------------*/

lvx.done : inversor.vst inversor_e.al inversor_e.spi
$(ENV_LVX); $(LVX) vst al inversor inversor_e -f
$(TOUCH) lvx.done

# /*------------------------------------------------------------\
# |                                                             |
# |                             Druc                            |
# |                                                             |
# \------------------------------------------------------------*/

druc.done : lvx.done inversor.ap
$(ENV_DRUC); $(DRUC) inversor
$(TOUCH) druc.done

# /*------------------------------------------------------------\
# |                                                             |
# |                             S2R                             |
# |                                                             |
# \------------------------------------------------------------*/

inversor.cif : druc.done
$(ENV_S2R); $(S2R) -v inversor

# /*------------------------------------------------------------\
# |                                                             |
# |                             TOOLS                           |
# |                                                             |
# \------------------------------------------------------------*/

graal :
$(ENV_S2R); $(GRAAL)

graal_inversor_p : inversor_p.ap
$(ENV_S2R); $(GRAAL) -l inversor_p

graal_inversor : inversor.ap
$(ENV_S2R); $(GRAAL) -l inversor

xsch:
$(ENV_LOON); $(XSCH)

xsch_inversor_o : inversor.vst
$(ENV_LOON); $(XSCH) -l inversor_o

xsch_inversor : inversor.vst
$(ENV_LOON); $(XSCH) -l inversor

xsch_inversor_e: inversor_e.al
$(ENV_COUGAR); $(XSCH) -l inversor_e

xsch_inversor_et: inversor_et.al
$(ENV_COUGAR); $(XSCH) -l inversor_et

xpat: 
$(ENV_ASIMUT_SYNTH); $(XPAT)

xpat_synth: res_synth_1.pat
$(ENV_ASIMUT_SYNTH); $(XPAT) -l res_synth_1

xpat_vasy : res_vasy_1.pat
$(ENV_ASIMUT_SYNTH); $(XPAT) -l res_vasy_1

dreal: 
$(ENV_S2R); $(DREAL)

dreal_inversor : inversor.cif
$(ENV_S2R); $(DREAL) -l inversor


# /*------------------------------------------------------------\
# |                                                             |
# |                              Clean                          |
# |                                                             |
# \------------------------------------------------------------*/

realclean : clean

clean     :
$(RM) -f *.vst inversor_e.spi inversor_et.spi *.vbe res_*.pat *.boom *.done *.xsc *.gpl \
                 *.ap *.drc *.dat *.gds *.cif *.rep \
*.log *.out *.raw *.al

4- El archivo .ioc contiene los pines a utilizar, el archivo .pat es el patrón que se desea evaluar, el .vhdl contiene el comportamiento y declaración del elemento y el Makefile son una serie de instrucciones y comandos agrupados para que sea más fácil y simple invocar los diversos comandos a utilizar para el diseño del circuito.

5- Una vez creados estos archivos desde la línea de comandos se ingresarán los siguientes código (revisar en comando ingresado los archivos generados en su carpeta del inversor):

>make inversor.vbe  
Genera un archivo .vbe que contiene el código vhdl traducido al subconjunto de comandos soportados por Alliance.

>make res_vasy_1.pat
Toma el archivo .pat y realiza un reformateo del mismo para poder ocuparlo en las siguientes etapas del proceso y además realiza una simulación del vhdl ingresado, coloca los resultados en el archivo .pat generado.

>make res_synth_1.pat
Se generan otros archivos intermedios que contienen una estructura de las compuertas necesarias, realiza otra simulación pero ocupando las compuertas de la librería seleccionada para este proceso.


6- Pruebe con los comandos siguientes lo que se muestra en pantalla, compare los resultados entre una y otra pantalla y anote los resultados:
>make xpat_vasy
>make xpat_synth

7- Ingrese los siguientes comando (en este punto no habrá mayor cambio ya que no hay mucho que optimizar):
>make boom.done
>make inversor_o.vbe
>make boog.done
>make inversor_o.vst
>make loon.done
>make inversor.vst

8- Ahora ingrese el siguiente comando:
>make inversor_p.ap
>make inversor.ap

9- Con lo anterior se llama a OCP y Nero para hacer el ruteado y colocación de celdas, para ver el resultado hasta el momento ingresar el comando:
>make graal_inversor

10- Use la opción Tool>Flat y seleccione el área del dibujo para poder observar todas las capas de su layout.

11- Ingrese ahora los siguientes comandos:
>make inversor_e.spi 
>make inversor_erc.spi
>make inversor_erc.al
>make inversor_e.al
>make inversor_et.al
>make inversor_et.spi
>make inversor_er.al
>make inversor_real.al
>make inversor_real_t.al

12- Los archivos spi generados pueden revisarse con un editor de textos.

13- Para los otros archivos con extensión .al, como inversor_e.al, ocupe la siguiente sintaxis para poder revisarlos:
>make xsch_<nombre_del_archivo_generado>


14- Ejecute los comandos:
>make lvx.done
>make druc.done
>make inversor.cif

15- Los comandos anteriores no son realmente necesarios llamarlos explícitamente pero se dejaran aquí por formar parte de la cadena de procesos. Con ellos se ejecuta la comparación de layout versus el circuito extraído, el DRC y la generación del archivo .cif de la compuerta.

16- Para poder observar el .cif generado usar el siguiente comando:
>make dreal_inversor

17- En el programa DREAL use Tools>Flatten para poder observar mejor las capas del layout.

Y con esto se tendría la geometría y los netlists extraídos de esta compuerta simple utilizando las herramientas de Alliance.





No hay comentarios:

Publicar un comentario