El archivo de proyecto es un archivo de texto plano con extensión .xilprj. Dentro de dicho archivo se describen una serie de parámetros utilizando el formato mostrado en el Ejemplo 3-1.
Los parámetros válidos se describen a continuación.
Es el nombre de la placa a utilizar en nuestro proyecto. Estos
son nombre compactos que representan a la placa a utilizar. Para
obtener un listado de las placas soportadas podemos usar la opción
-L
(xil_project.pl -L
).
En el caso en que nuestra placa no esté soportada será necesario crear una descripción tal como se explica en Sección 3.5.
Este es el nombre corto que le daremos a nuestro proyecto de síntesis. Usualmente coincide con el nombre del TopLevel de síntesis y con el nombre del archivo de proyecto, así como también con el nombre del directorio donde se encuentra dicho proyecto.
Ejemplo: tenemos un diseño llamado mi_micro,
el mismo es un microcontrolador. Queremos hacer una síntesis de nuestro
microcontrolador que ejecutará el tradicional "hello world!". Por lo
que decidimos hacer un proyecto de síntesis llamado hello. Se recomienda
entonces usar un archivo de proyecto denominado
mi_micro/FPGA/hello/hello.xilprj.
En el mismo definiremos Project=hello y
sintetizaremos un fuente del toplevel llamado
mi_micro/FPGA/hello/hello.vhdl.
El mismo contendrá la entidad Hello
. De esta manera
se simplifican varios aspectos.
Permite especificar el nombre de la entidad del toplevel de síntesis. Si se siguen los lineamientos antes mencionados se puede omitir este parámetro (ver Sección 3.1.2). Se usa cuando no es posible lograr que el nombre del proyecto y el nombre de la entidad del toplevel coincidan.
Permite indicar cuan profundo en la estructura de directorios se encuentra nuestro proyecto. Si se toma el Ejemplo 1-2 y aplicamos esto al ejemplo expuesto en Sección 3.1.2, obtendríamos lo mostrado en el Ejemplo 3-2.
En este caso la profundidad es 3:
mi_micro/FPGA/hello.
Esto implica que estando dentro del directorio
hello es posible acceder al contenido del CoreA
usando: ../../../CoreA/.
En los casos en que la profundidad sea 3 este parámetro puede omitirse. Pero si tuviéramos un caso como el mostrado en el Ejemplo 3-3 este valor pasaría a ser 4 y sería necesario especificarlo.
Especifica el tipo de síntesis que deseamos. En la actualidad hay cuatro casos soportados:
Area
Area_Strong
Speed
Speed_Strong
Su impacto es muy simple, pero en el futuro podría cambiar.
En la actualidad Area
y Area_Strong
seleccionan optimización por área y Speed
y
Speed_Strong
optimización por velocidad. Las
versiones Strong
seleccionan un esfuerzo de
optimización mayor.
Por defecto se asume Area_Strong
.
Especifica la frecuencia del reloj. Actualmente sólo se usa para la síntesis con Synplify Pro usando iCE40.
Indica el nombre de un archivo fuente a ser incluido en nuestro proyecto. Se toma como referencia el directorio del proyecto.
Se asume que todos los fuentes listados con
Source
pertenecen a la biblioteca por defecto
(work).
Permite incluir una biblioteca (core) o un único fuente de una biblioteca. Este parámetro posee tres formas de uso.
La sintaxis en este caso es la mostrada en el Ejemplo 3-4.
Ejemplo 3-4. Inclusión de una biblioteca completa
Include=DIRECTORIO_CORE,PARTE Include=DIRECTORIO_CORE
El DIRECTORIO_CORE
es el directorio donde se
encuentra el core a incluir. Continuando con el
Ejemplo 3-2, cuando querramos hacer uso del CoreA
usaremos: Include=CoreA,PARTE.
Es importante notar que aquí toma importancia la profundidad
indicada por DirLevel
. El valor por defecto es 3 y eso
implica que desde hello nos estamos refiriendo a:
../../../CoreA/.
PARTE
es una parte de la biblioteca que
queremos utilizar. Esto es básicamente un listado de cuales fuentes
de la biblioteca necesitamos para implementar
PARTE
.
Se asume que los archivos de PARTE
se
encuentran dentro del directorio FPGA del
core incluido. Si por ejemplo usamos Include=CoreA,modo1
significa que xil_project.pl buscará el archivo
../../../CoreA/FPGA/modo1.
Este archivo debe contener un listado de los fuentes que son
necesarios para modo1
. El formato es el
siguiente:
La primera línea es una "firma": # xil_tools group 1
La segunda línea es el nombre de la biblioteca que implementa el core en cuestión. Es conveniente que el nombre del directorio sea el mismo que la biblioteca.
Las siguientes líneas son los nombres de los fuentes
necesarios para la implementación de modo1
,
esto no es necesariamente el nombre de todos los fuentes del
CoreA
, sino sólo los que se necesitan para implementar algo que
denominamos modo1
.
En el caso en que sea necesario incluir partes de
otras bibliotecas para poder implementar modo1
podemos incluir sentencias Include
.
Cuando DIRECTORIO_CORE
y
PARTE
sean iguales es posible omitir
PARTE
, tal como se muestra en la segunda línea del
Ejemplo 3-4.
La sintaxis en este caso es la mostrada en el Ejemplo 3-5.
Ejemplo 3-5. Inclusión de un fuente aislado
Include=DIRECTORIO_CORE,BIBLIOTECA,FUENTE Include=DIRECTORIO_CORE,FUENTE
Este formato está relacionado con el anterior. La segunda forma
de uso es para el caso en que DIRECTORIO_CORE
y
BIBLIOTECA
sean iguales.
Al igual que en el caso anterior DIRECTORIO_CORE
es el directorio donde está el core o biblioteca que
queremos utilizar. En este caso en lugar de referirnos a un listado
de fuentes no referimos a un único fuente.
Es importante tener en cuenta que las extensiones válidas para
FUENTE
son .vhd
o .vhdl
para VHDL y .v
para
Verilog.
Siguiendo con el Ejemplo 3-2 una declaración
del tipo Include=CoreA,xxx.vhdl significa que
incluiremos el fuente ../../../CoreA/xxx.vhdl
en nuestro proyecto, indicando que el mismo es parte de la biblioteca
CoreA
.
El archivo make generado por xil_project.pl incluye un
target clean
para eliminar todos los archivos generados. En el caso
en que necesitemos eliminar otros archivos es posible indicar que el
target clean
ejecute otros targets. Si utilizamos ExtraClean=clean_b clean_c cuando se realice el target
clean
también se realizarán los targets clean_b
y clean_c
. En Sección 3.3 se puede
encontrar un ejemplo de uso de esta opción.