3.1. Formato del archivo de proyecto

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.

Ejemplo 3-1. Sintaxis para las opciones en un .xilprj

       Parámetro=Valor
       

Los parámetros válidos se describen a continuación.

3.1.1. Board

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.

3.1.2. Project

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.

3.1.3. Top

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.

3.1.4. DirLevel

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.

Ejemplo 3-2. Proyecto con profundidad 3

   \-CoreA
   |
   \-CoreB
   |
   \-mi_micro
            \-FPGA
                 \-hello
                       \-gen
         

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.

Ejemplo 3-3. Proyecto con profundidad 4

   \-CoreA
   |
   \-CoreB
   |
   \-micros
          \-mi_micro
                   \-FPGA
                        \-hello
                              \-gen
         

3.1.5. Goal

Especifica el tipo de síntesis que deseamos. En la actualidad hay cuatro casos soportados:

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.

3.1.6. Frequency

Especifica la frecuencia del reloj. Actualmente sólo se usa para la síntesis con Synplify Pro usando iCE40.

3.1.7. Source

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).

3.1.8. Include

Permite incluir una biblioteca (core) o un único fuente de una biblioteca. Este parámetro posee tres formas de uso.

3.1.8.1. Include de un core completo

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:

  1. La primera línea es una "firma": # xil_tools group 1

  2. 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.

  3. 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.

  4. 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.

3.1.8.2. Include de un fuente aislado

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.

3.1.9. ExtraClean

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.

Copyright © 2006-2013 INTI - Ing. Salvador E. Tropea