2011-11-04 19 views
5

No soy de ninguna manera un experto en Verilog, y me preguntaba si alguien sabía cuál de estas formas de incrementar un valor era mejor. Lo siento si esta es una pregunta demasiado simple.Verilog Best Practice - Incrementando una variable

Camino A:

En un bloque de lógica combinatoria, probablemente en una máquina de estados:

//some condition 
count_next = count + 1; 

Y a continuación, en algún lugar de un bloque secuencial:

count <= count_next; 

O Way B:
Bloque combinatorio:

//some condition 
count_en = 1; 

bloques secuencial:

if (count_en == 1) 
    count <= count + 1; 

he visto así una mayor frecuencia. Un beneficio potencial del Modo B es que si está incrementando la misma variable en muchos lugares en su máquina de estado, tal vez usaría solo un sumador en lugar de muchos; o es eso falso?

¿Qué método es preferido y por qué? ¿Tiene alguna desventaja importante?

Gracias.

Respuesta

1

Un beneficio potencial de la Vía B es que si se está incrementando la misma variable en muchos lugares en su máquina de estados, tal vez sería utilizar sólo una serpiente en lugar de muchos; o es eso falso?

Cualquier herramienta de síntesis intentará compartir recursos automáticamente. Lo bien que lo hacen depende de la herramienta y el código escritos. Aquí hay un documento que describe algunas características de Design Compiler.Observe que en algunos casos, menos área significa peor tiempo.

¿Qué método es preferido y por qué? ¿Tiene alguna desventaja importante?

Depende. Verilog (para síntesis) es un medio para implementar algún circuito lógico pero la especificación no especifica exactamente cómo se hace esto. El Camino A puede ser igual que el Camino B en un FPGA, pero el Camino A no es consistente con el diseño de baja potencia en un ASIC debido a la asignación secuencial incondicional. El uso de redes de reinicio es casi un requisito en un ASIC, pero dado que muchos FPGA comienzan en un estado conocido, puede ahorrar bastante recursos al no tenerlos.

+0

¿De qué manera usas? –

+0

Debe usar lo que recomienda la documentación de su herramienta de síntesis. –

1

Utilizo Way A en mi código Verilog. Mis bloques secuenciales casi no tienen lógica en ellos; simplemente asignan registros basados ​​en los valores de las "reglas de cable" calculadas en los bloques combinatorios siempre. Simplemente hay menos para salir mal de esta manera. Y con Verilog necesitamos toda la ayuda que podamos obtener.

1

¿Cuál es su definición de "mejor"? Puede ser un mejor rendimiento (frecuencia máxima más rápida del circuito sintetizado), un área más pequeña (menos puertas lógicas) o una ejecución de simulación más rápida.

Consideremos la caja de área más pequeña para FPGA Xilinx y Altera. Los registros en esas familias de FPGA tienen permiten entrada. En su "Modo B", * count_en * se mapeará directamente en esa entrada de registro enable, lo que dará como resultado menos puertas lógicas. Esencialmente, "Way B" proporciona más "pistas" a una herramienta de síntesis sobre cómo sintetizar mejor ese circuito. También es posible que la mayoría de las herramientas de síntesis de FPGA (estoy hablando de Xilinx XST, Altera MAP, Mentor Precision y Synopsys Synplify) infieran correctamente el registro habilite la entrada de la "Forma A".

Si count_en * * se sintetiza como permiten la entrada de registro, que se traducirá en un mejor funcionamiento del circuito, debido a su lógica de incremento del contador tendrá menos niveles lógicos.

Gracias

+0

No estoy seguro de entender lo que quieres decir. Me parece que la señal count_en habilitará el Adder, no el registro en sí. ¿Podrías explicar más? Gracias. –