fsm de un solo calor en vhdl

Me gustaría codificar un fsm one-hot en vhdl. He hecho muchos en verilog pero mi empleador actual prefiere vhdl. En verilog, usaría la "declaración de caso inverso" (caso 1'b1) para comparar cada bit en el vector de estado en paralelo. Luego, con un pragma de caso paralelo, o una declaración "única" en system verilog, sintetizamos el resultado correcto.

Pero... Vhdl no parece permitir una declaración de caso inverso. No hay necesidad de paralelo_caso ya que el caso siempre es paralelo en vhdl. El mejor ejemplo que encontré, del artículo de Steve Golson (¡en 1994!) usa sentencias if en cascada. No hay "más", pero me parece que estos deberían convertirse en codificadores de prioridad y no en una verificación de estado paralela. Así que estoy un poco perdido.

Preguntar a los compañeros de trabajo no ayudará, nadie usa este estilo de codificación y estoy tratando de mostrarles lo bien que funciona. Pero tal vez haya una razón por la que estos tipos de vhdl no lo usan...

Las herramientas de síntesis son (en su mayoría) capaces de reconocer el patrón de la máquina de estado y elegir el método de codificación óptimo. Entonces, en VHDL, generalmente usa enumeraciones para estados sin indicar explícitamente la codificación. Y deja que la herramienta lo optimice por ti. Esto probablemente también sea cierto para Verilog.
Buen punto sobre las herramientas de sintetizador. Creo que enviaré un correo electrónico a nuestro AE para ver qué recomiendan.
Tampoco estoy muy seguro de cómo funcionan las enumeraciones con tipos lógicos en vhdl. En system verilog puede declarar una enumeración de tipo lógico. Eso no funciona en vhdl, por lo que pierde los estados Z y X. Tal vez ese modelado sea innecesario con los estados enumerados.
Además, ¿podría la equivalencia formal comparar codificaciones optimizadas por herramientas? Es interesante cómo algunos de los diseños de chips de gama alta son muy regresivos con respecto a los flujos de herramientas, probablemente porque saben lo que ha funcionado y tienen miedo de hacer cambios.
Pensándolo mejor, no se inferirá un codificador de prioridad. Esto captura completamente la lógica prevista, de la que solo me di cuenta después de escribir un mensaje largo a mi AE, antes de presionar enviar. Voy a pensar en esto un poco más, pero parece que no es un problema.
¿La documentación de su herramienta de síntesis incluye ejemplos de cómo codificar una máquina de estado caliente en VHDL? Si usa esos patrones, sabe que la herramienta de síntesis los reconocerá.
No hay ningún ejemplo que pueda encontrar en la documentación.

Respuestas (1)

En VHDL, describe los estados de FSM con un tipo de enumeración como este:

type T_STATE is (ST_IDLE, ST_READING, ST_WRITING, ST_FINISHED, ST_ERROR);

Este tipo no tiene significado sobre cómo representar los literales de enumeración (los nombres de estado) como valores binarios en su dispositivo de destino. Puede ser: * secuencial * código gris * código johnson * código one-hot * ...

Incluso puede especificar su propia codificación definida por el usuario.

La herramienta de síntesis elegirá en función de: * número de estados * número de transiciones * patrones de transición, por ejemplo, rutas paralelas en su FSM * formato de salida necesario * requisitos de tiempo * estrategia de optimización

cuál será la mejor codificación. Por ejemplo, si habilita la optimización de la velocidad, podría elegir one-hot con más frecuencia, porque es más fácil de verificar y puede manejar frecuencias más altas. Si optimiza por área, optará por códigos más compactos como gris o secuencial (números binarios).

He visto FSM codificado en caliente con hasta 31 registros (estados) en las herramientas de síntesis de Xilinx.

Puede especificar una codificación FSM predeterminada globalmente por opciones de sintetizador o por FSM o por tipo de enumeración con atributos VHDL.


Un tipo de enumeración es un tipo discreto. Todos los literales de enumeración tienen un número de posición ( T_STATE'pos(ST_ERROR)es 4). Por eso, las herramientas pueden manejar los literales de enumeración internamente como enteros, porque una posición en la escala numérica es un valor entero. Pero este hecho no significa que cada estado se codificará como el formato binario de su número de posición.

Pero eso no es tan bueno cuando sabes que quieres uno caliente (por ejemplo, por respeto al medio ambiente y el hecho de que somos de alta frecuencia, bajo voltaje y cada picosegundo cuenta) y no parece haber una forma independiente de la herramienta para especificar la codificación. Desafortunadamente, seguí el camino que mencioné en mi publicación inicial, como se describe en el artículo de 1994. Por otra parte, mi equipo normalmente no permite el "proceso" para la lógica combinatoria, por lo que podría ser derribado de todos modos ...
Al principio, las herramientas conocen sus restricciones de tiempo (es por eso que tiene archivos SDC/XDC/LDC, ...). En segundo lugar, puede establecer opciones globales para que todas las FSM utilicen una codificación específica (opción de sintetizador). Y finalmente, puede definir la codificación con restricciones de diseño o atributos VHDL. Busque los atributos FSM_ENCODINGy ENUM_ENCODINGen los manuales de usuario de síntesis de sus proveedores.
¿Qué tan portátil es ENUM_ENCODING? Si cambiamos de proveedor, ¿es necesario reescribirlo? Y si lo hago de esta manera, cuando comparo para ver si estamos en un estado específico, lo compararía con el valor de enumeración... ¿se sintetizaría en una comparación de un solo bit (si es uno)?
Los proveedores rechazaron el estándar de síntesis VHDL hace tiempo. Pero por lo que recuerdo, el nombre del atributo es el mismo, mientras que algunos nombres de codificación son diferentes. Xilinx lo llama "secuencial", Intel lo llama "binario". Puede escribir una función (a la que se puede llamar en declaraciones de atributos) para manejar esto.