Suponga que existe un puerto de salida de datos de 1 bit y un puerto de salida dataValid de 1 bit para un módulo. ¿Está bien asignar 1'dx a la salida de datos cuando se asigna 0 a dataValid? ¿Esto creará problemas de síntesis?
EDITAR: las optimizaciones X parecen ocurrir tanto en Synopsys DC como en Cadence RC. Considere este código (a y b son entradas de 1 bit y c es una salida de 1 bit).
always_comb
if ( !a && !b ) c= 0;
else if ( a && !b ) c = 1;
else if ( !a && b ) c = 1;
else c = 1'dx; // Don't care about this value.
da una puerta OR que es una solución optimizada en oposición a un XOR que se habría inferido si c se hubiera establecido como 1'd0. Este es un ejemplo simple, pero parece probar que las herramientas de síntesis realizan la optimización X. Teniendo en cuenta los desagradables errores de propagación de X y los problemas de verificación, ¿valen la pena las asignaciones de X en el área guardada?
Nunca asigne una X en una ruta de código accesible, solo use X para propagar incógnitas de simulación. Esto hará la vida un poco más fácil a largo plazo. Si desea optimizar la lógica no importa, hágalo explícitamente (y elija el valor óptimo para el estado no utilizado). De esa manera, obtienes un comportamiento consistente la mayor parte del tiempo (con suerte, siempre)
Tal asignación es útil durante la simulación, para que los gráficos de forma de onda sean un poco más claros.
La mayoría de las herramientas de síntesis simplemente ignorarán cualquier asignación a x
. YMMV.
La asignación z
a un pin externo se puede usar para denotar un controlador de tres estados, pero la mayoría de los FPGA tienen soporte limitado, si es que tienen alguno, para buses de tres estados internos .
El soporte de herramientas para 'x
as don't care parece ser bastante bueno. DC lo admite, al igual que las herramientas Intel FPGA (Altera) y Xilinx.
Creo que en general es una buena idea. Por lo general, y para su ejemplo, 'x
la propagación en la simulación no debería ocurrir, porque a otra lógica no debería importarle cuál c
es el valor de bajo las condiciones que escriben 'x
. (De lo contrario, no es "no me importa", ¿verdad?) De hecho, usar 'x cuando cree que el valor no importa puede ayudar a identificar errores.
Sin embargo, hay casos en los que puede causar problemas. Por ejemplo, los protocolos de transceptores en serie a menudo usan codificadores de sincronización automática, que se descompondrían en la simulación si algunos de los bits en los datos de entrada son 'x
, incluso si no le importa cómo terminan esos bits en el receptor, incluso si funciona bien en hardware.
No hay nada como X para la síntesis. Se utiliza principalmente para la simulación para detectar cualquier problema relacionado con la línea de datos.
tom carpintero
else if ( !a && b ) c = 0;
, probablemente resultaríac
ser 0 cuandoa
yb
son 1