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