Asignando x en verilog

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?

OR probablemente no sea más o menos eficiente que XOR. Creo que la única razón por la que elige XOR es porque el árbol if-elseif-elseif se convierte en una serie de multiplexores con el último else ignorado, lo que conduce al valor en la penúltima declaración elseif. Si hizo la penúltima línea else if ( !a && b ) c = 0;, probablemente resultaría cser 0 cuando ay bson 1

Respuestas (4)

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)

En algunos casos es muy difícil identificar la implementación más fácil y hacerlo puede hacer que el código sea muy confuso. Además, ¿por qué tomarse la molestia si la herramienta puede hacerlo por usted?
Si sabes lo que estás haciendo, puede estar bien. De lo contrario, el código defensivo puede ser más seguro y confiable. A menos que tenga pruebas exhaustivas de corrección.
Prefiero el código confiable a la microoptimización.
Si bien estoy de acuerdo con esa filosofía, no estoy convencido de que se aplique aquí. Supongo que el problema que ves es que usar don't cares podría darte un circuito que produce '0 para un conjunto dado de entradas en una compilación, luego '1 en la siguiente. Si cumple esta condición en la simulación y obtiene la propagación 'x, verá el problema de inmediato. Si no está alcanzando la condición, ¿qué le asegura que cualquier comportamiento que haya codificado ('0, '1, el valor del registro anterior, etc.) proporcione el comportamiento correcto?
X en la simulación no se selecciona automáticamente. Puedo asegurarle que los diseños reales, con una validación extensa, pueden generar errores extraños o dar como resultado erratas divergentes, de ahí el 'errar por el lado de la precaución'.

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

¿Qué herramientas de síntesis ignorarán las asignaciones a 'x? Para 'z, los FPGA modernos generalmente no tienen buses tristate internos como usted dice, pero las herramientas generalmente aún admiten modelos de bus tristate y los sintetizarán en multiplexores.
@pc3e: Todos ellos, que yo sepa. ¿Conoces alguno que no?
Todos ellos, que yo sepa ;) Ver mi respuesta. ¿Qué herramientas Estas usando?
@ pc3e: Su respuesta habla de simulación, que cubrí en mi primera oración.
Me refiero a Synopsys Design Compiler, Altera Quartus y Xilinx Vivado, que son todas herramientas de síntesis.
@ pc3e: Todos ellos cubren tanto la síntesis como la simulación, que son procesos distintos.
Design Compiler no es un simulador, tampoco lo es Quartus. Estoy hablando de herramientas de síntesis que tratan a 'x como si no les importara al optimizar el diseño. Mi respuesta se refiere parcialmente a la simulación porque la pregunta menciona problemas con la propagación 'x. ¿Vas a decirme qué herramienta de síntesis has visto ignorando las asignaciones a 'x?
No. Todavía no puedo pensar en un solo ejemplo de cómo tal asignación podría hacer la más mínima diferencia en la lógica sintetizada, por lo que no es algo que haga en la práctica. Si puede mostrar un ejemplo concreto de cómo ayuda, debe editarlo en su respuesta y me retractaré de mi declaración.
Hay un ejemplo simple en la pregunta. Por cierto, afirma que Cadence también optimiza 'x, por lo que creo que cubre las cuatro herramientas principales.

El soporte de herramientas para 'xas 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, 'xla propagación en la simulación no debería ocurrir, porque a otra lógica no debería importarle cuál ces 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.