miércoles, 20 de abril de 2011

Otro uso del 'if-generate'

La instrucción 'generate' generalmente es usada para replicar instanciaciones de componentes, usando el típico 'for-generate' y algunas veces el 'if-generate' dentro del 'for-generate' (ejemplo típico: un registro de desplazamiento).
Sin embargo el 'if-generate' tiene otro uso que no es muy conocido, pero es muy útil: condicionalmente puede incluir u omitir cierta parte del diseño. Usualmente la inclusión u omisión depende del valor de una constante genérica (generic), de modo que la expresión del 'if-generate' es globalmente estática.
Cuáles son los típicos usos de este 'if-generate'?, normalmente son dos :
- Lógica que se agrega al diseño solo con propósito de debug, pero que no se desea que sea implementada en el diseño final.
- Procesos o instanciación de componentes usados solos durante simulación.

A continuación hay un esquema de como se usa el 'if-generate'  para generar o no cierta lógica del diseño en función del generic 'debug' definido en la entity:

 1 entity my_system is 
 2   generic ( debug: boolean := true)
 3   port (
 4        . . .
 5     ); 
 6 end entity my_system;
 7
 8 architecture rtl of my_system is 
 9 . . .
10 begin
11  . . .
12  debug_comp: if debug generate
13   .. .
14  end generate debug_comp;
15  . . . 
16 end architecture; 



Have a grrrrrrrrreat day !

sábado, 2 de abril de 2011

Atributos de Sintesis, Directivas y Restricciones (constraints)

Atributos (de síntesis en HDL):
Es una propiedad asociada con un dato objeto (señal, variable, …)  que es usada por la herramienta de síntesis y, en ciertos atributos, por la herramienta de mapeo. Los atributos de síntesis son definidos y aplicados en el código VHDL o Verilog que se deseen usar. Sin embargo, no se puede usar cualquier atributo, sino los definidos por la herramienta de síntesis a usar. Para agregarle portabilidad al código VHDL/Verilog algunos atributos pueden ser reemplazados por restricciones establecidas en el archivo de restricciones (.ucf para el caso de Xilinx).
Un ejemplo de atributo muy usado es que selecciona el tipo de coodifiacion que se asigna a casa estado de una maquina de estados descripta en VHDL:

type my_fsm_state is (reset, load, count, hold);
attribute syn_encoding: string;
attribute syn_encoding of my_fsm_state: type is “gray”;

Otro ejemplo de uso de atributo de sintesis, se detalla a continuación. En este caso se define un arreglo de vectores, que se desea sea sintetizado en los bloques de memoria RAM del FPGA, y no en los bloques de memoria distribuida:

type ram_type is array(63 downto 0) of  std_logic_vector(15 downto 0);
signal ram: ram_type;
attribute syn_ramstyle: string;
attribute syn_ramstyle of ram: signal is “block_ram”;

Un ejemplo de atributo que pueder ser usado en el codigo VHDL pero que en realidad es mejor que se use una restriccion en el .ucf es el siguiente:

attribute loc: string;
attribute loc of {signal_name| label_name}: {signal |label} is “location”;

En este ejemplo se define la locacion de un pin del FPGA especifico para una determinada senial. Al hacerlo en el código VHDL le quita portabilidad al código, como asi también, si existen un gran numero de pines de E/S se agregan muchas líneas al código que complican su comprensión.

Directivas
Controlan el modo que el diseño es analizado antes de la síntesis. Algunas directivs en realidad se escriben como si fueran comentarios dentro del código VHDL. Es decir comienzan con los dos guiones ‘- -‘, y a continuación la palabra ‘pragma’ o ‘synposys’ (para el caso de usar herramienta de síntesis de Synposys).
Una directiva comúnmente encontrada y usada en los códigos VHDL es:
- - pragma translate_off
- - pragma translate_on

Estas directivas instruyen al compilador VHDL a deshabilitar y habilitar la síntesis del código VHDL. Recuerde que la síntesis del código es automáticamente habilitada al comienzo de cada archivo VHDL. A partir de ahí, en cualquier lugar del archivo se pueden usar estar directivas.
Otra directiva que es usualmente usada es:
- - pragma synthesis_off
- - pragma synthesis_on

Estas se usan cuando se requiere o necesita ‘ocultar’ a la herramienta de síntesis instrucciones VHDL usadas solo para simulación. Cualquier texto entre estas directivas será chequeado por sintaxis pero no será sintetizado.

Restricciones (de Implementación):
      Controlan la herramienta del mapeo, colocación (placement), frecuencia (timing) y otras opciones de implementación de la lógica generada en el FPGA. Generalmente las resticicones son mantenidas en un archivo diferente del archivo VHDL. Por ejemplo para el entorno ISE de Xilinx las restricciones se deben escribir en el archvio  llamado ‘user define constraint’ (.ucf). Este archivo es leído por la herramientas de mapeo, place and route para aplicar las restricciones en la lógica implementada.
Ejemplo de restricciones del .ucf:

# asignación de un pin (P110) a un seniel de E/S
INST “MUXBUF_D0_OUT” LOC=P110;
# especificacion del periodo del reloj master_clk
TIMESPEC TS_master = PERIOD “master_clk” 50;


Les recomiendo leer la información del manual del usuario de la herramienta de síntesis y de la herramienta de mapeo y place and route para las restricciones. 

martes, 29 de marzo de 2011

Cuidado con la implementación de los sincronizadores en el ISE !

La herramienta ISE tiene una opción no muy conocida que habilita el uso de los SRL (Shift Register Logic) de una LUT (Look-Up Table) como sincronizadores !! So.... se debe chequear el Map report para verificar la inclusión o no de SRLs en la lógica generada cuando se desea describir sincronizadores.


Para los nuevos Virtex-6 y Spartan-6 "shreg_min_size" es una propiedad de la herramienta de síntesis  XST que especifica el tamaño mínimo de registros de desplazamientos para ser inferidos e implementados en recursos SRL. Para los otros FPGAs la propiedad que habilita la inferencia de los SRL es llamada 'shift register extraction'. Un sincronizador compuesto de dos flip-flops, para la herramienta de síntesis es visto como un registro de desplazamiento de 2 estaps. Por defecto el valor de shreg_min_size es 2. Para cambiarlo estas propiedades se debe abrir las opciones de HDL del XST:
- Una vez abierto el proyecto en el ISE, seleccionar el proceso "Synthesize-XST' en la ventana 'Design'.
- Presione boton derecho del mouse y seleccione 'Process Properties'
- Seleccione 'HDL Options'
- Encuentre y modifique las propiedades mencionadas.


SIN EMBARGO, por mas que ese número se fije en un valor alto, por ejemplo 5, la herramienta de mapeo, re-sintetiza el diseño y puede usar los SRLs independientemente del número fijado en el atributo "shreg_min_size". En otras palabras "shreg_min_size" es un atributo que solo lo 've' el XST, y NO es pasado al MAP.

Para evitar este problema hay dos soluciones:


Solución 1- Usar el atributo de síntesis 'keep' en los registros sincronizadores. De este modo estos registros no serán tocados.


Solución 2- Usar una señal de reset para los sincronizadores. Así, los flip-flops sincronizadores no pueden ser llevados a SRL, porque no tienen entrada de reset. . . ..


Una razón mas, no muy conocida tampoco, para evitar el uso de los SRL como sincronizadores, es el hecho de que el tiempo de resolución de metaestabilidad de los  flip-flops de los SRL es muuuuuy malo.....(dicho por Austin Lesea de Xilinx.


Entonces, CUIDADO con la implementación de sincronizadores !

jueves, 30 de diciembre de 2010

Error: Aggregate expression cannot be scalar type . . .


El mensaje de error:  " Aggregate expression cannot be scalar type ieee.std_logic_1164.std_logic" 

Puede tener diferentes fuentes. En este caso analizaremos el error asociado a la siguiente expresión:

dato_out(7 downto 0)   <=   data_shift(7 downto 0);

En realidad el problema acá es que algunos compiladores no permiten el uso de un 'rango' en lado izquierdo de una instrucción de asignación. Por lo que la solución es bastante sencilla, tanto como definir una señal 'temporaria' a la cual se la usara como intermedia para la asignación libre de error:


signal data_out_tmp: std_logic_vector (7 downto 0); 
. . . 
data_out_tmp <=  data_shift(7 downto 0);


data_out          <= data_out_tmp; 


Un error menos ! :) 


HapyyNew Year !
Feliz Año Nuevo ! 

martes, 14 de diciembre de 2010

Slack Positivo/Negativo ?

Slack = Tiempo Requerido - Tiempo de Arribo

Donde:

Tiempo Requerido: usualmente el periodo del reloj
Tiempo de Arribo: tiempo que tarda una señal en llegar a cierto punto.

Un Slack positivo de un valor n, significa que el tiempo de arribo al nodo en cuestión puede ser incrementado por n sin afectar el retardo general del circuito. Si todos los Slacks del reporte son positivos, de 10 !!!!
Contrariamente, un Slack negativo implica que el path es demasiado lento, y deberá ser 'acelerado' si se desea que el diseño trabaje a la frecuencia deseada. Si hay algun Slack negativo, mmmmm a trabajar... primero encontrar la razon (investigar el timing path presentado por el Post P&R Timing report), y después ver como se puede solucionar (pipelining, etc)

El valor del Slack es presentado por el post-P&R Timing Report. Generalmente el reporte ordena los Slacks de menor valor, comenzando con los valores negativos si hay, a los Slacks de mayor valor. La cantidad de información presentada depende del seteo de la herramienta. Por lo general, por defecto se muestran los primeros 5 o 10 paths con menor Slack, pero esta cantidad de paths a presentar es configurable por el usuario. Por ejemplo en ISE 12, seleccione Implement Design->Place & Route -> Generate Post_place & Route Static Timing. Presione botón derecho del mouse, y seleccione Properties. 'Number of Paths in Error/Verbose Report' es la propiedad a cambiar para seleccionar la cantidad de paths a ser mostrados durante el timing report.

Qué significa Timing Score en el Timing Report de ISE (Xilinx) ?

Cuando el proceso 'Place & Route' es ejecutado, se reporta un mensaje como el siguiente:

Timing Score: nnnn

donde nnnn es un numero que puede ser '0' o puede ser cualquier otro número.

Qué significa éste número?
El Timing Score representa el valor total que representa los análisis de los tiempos para todos las restricciones (constraints) y por cuanto las restricciones no se cumplen. Es decir, es la suma en picosegundos de TODAS las restricciones que no se cumplen. También se puede decir que es la suma del valor absoluto de TODOS los Slacks, cuando los slacks son negativos), expresados en picosegundos.
Mientras mas chico es el valor del Timing Score, es mejor el resultado.

Por todo lo dicho qué significa que el Timing Score sea igual a '0'??????

Significa que TODOS los timing constraints se cumplieron satisfactoriamente.

Ahora bien, la información dada por el Timing Score cuando éste numero es distinto de '0', no es muy útil. Por ejemplo, si se obtiene un Timing Score de 20,000; esto número puede significar:
a- Un simple path está fallando el timing constraint por 20ns.
b- 200 paths están fallando el timing constraint por 1 ns.
En el caso a) se puede asegurarse que el path que no cumple el timing por 20ns , seguro que fallara en Hardware. Mientras que en el caso b), el sistema 'puede' llegar a trabajar en Hardware, aunque no en los casos de bajo voltaje o alta temperatura.

Como conclusión, si el Timing Score es '0', todo bien ! ; si el Timing Score es != '0' (distinto de '0'), será necesario chequear en detalle el post P&R Timing Report para ver cual/es son los paths que no cumplen la(s) restricción(es).

miércoles, 3 de noviembre de 2010

Warning: "Port port_name hidden by declaration in architecture" o "Declaration hides port port_name"

Este es un Warning común, y que es difícil de resolver porque una primer lectura del mensaje no da mucha idea donde puede estar el problema. Sin embardo re-leyéndolo con cuidado, y con la ayuda de un buen diccionario de ingles :) .... , se puede tener una idea del problema.


Lo debería dejar como 'tarea para la casa ... ' , pero como me imagino q ya tienen demasiadas tareas lo resolveremos.....


"Port port_name hidden by declaration in architecture" => hay un puerto (port) de E/S, pues todos los ports son o de E o de S, no señal interna ! ..., que esta 'ocultado'/'escondido' por una declaración en la arquitectura. Es decir hay una declaración en la arquitectura que oculta el puerto de E/S... Q' instrucción de declaración puede haber en una arquitectura ??????? -> una declaración de señal interna (signal declaration). .... pero para q' oculte un port específico de E/S, deber ser q' accidentalmente hemos declarado una señal interna con el mismo nombre q' el port de E/S.... De este modo no se podrá acceder al puerto de E/S desde la arquitectura..... y por eso el compilador chilla con el grito.. .Warning.....


Muy    fácil????????????????  entonces el próximo lo deducen Uds :)




bye,