¿Hay algún indicador/pragma que pueda ayudarme a detectar nombres de variables falsos en una definición de módulo?

[ícaro verilog]

¿Hay algún indicador/pragma que pueda ayudarme a detectar nombres de variables falsos en una definición de módulo?

Considere el siguiente fragmento de código...

module binary_decoder_2to4
(
    input wire enable,
    input wire[1:0] a,
    output wire[3:0] y
);

assign y[0] =  en & ~a[1] & ~a[0];
assign y[1] =  en & ~a[1] &  a[0];
assign y[2] =  en &  a[1] & ~a[0];
assign y[3] =  en &  a[1] &  a[0];

endmodule

Como puede ver, cambié el nombre del puerto ena enablepero olvidé actualizar el cuerpo del módulo. Viniendo de un fondo de programación, esperaría que el compilador (iverilog) al menos suene una advertencia. En su lugar, el compilador genera felizmente un archivo de simulación con el valor enestablecido en z.

Lo único que sé sobre verilog: "ninguno implícito" es tu amigo.
¿Qué debo escribir para obtener "ninguno implícito"?
En realidad, se trata de un error de herramienta. Las redes implícitas solo son implícitas cuando aparecen en una lista de puertos o en el LHS de una asignación continua. Aquí enaparece en el RHS y no debe convertirse en una declaración implícita.

Respuestas (2)

Sí, en realidad se parece mucho a las banderas de advertencia -W con las que probablemente esté familiarizado al usar un compilador de C como clang o gcc.

Si quiere ser más cuidadoso, pase -Wall a iverilog. Esto activará todas las advertencias. Sin embargo, si solo está interesado en la situación específica de su pregunta, esta es simplemente una declaración de cable implícita. Está utilizando un cable llamado en, pero dado que no hay un cable 'en' en el módulo, donde se usa también es donde se declara implícitamente (lo que ciertamente es útil, pero como descubrió, también puede ofuscar errores tipográficos o simple error humano). Si activa la advertencia para esto con -Wimplicit, iverilog le advertirá sobre esto.

Hay otras clases útiles que puede o no querer usar también, y puede habilitar cualquier combinación de ellas simplemente emitiendo varios interruptores -W. Aquí hay un buen desglose de las opciones disponibles.

Esperemos que esto sea lo que querías. ¡Buena suerte!

Verilog por defecto tratará cualquier variable no declarada como un cable de un solo bit. Desde IEEE Std 1364-2001 (también conocido como Verilog-2001), puede anular el valor predeterminado con la `define_nettypemacro. Al configurarlo, nonetodas las redes deben declararse explícitamente. Esta es una solución universal que funciona en todos los simuladores modernos; la línea base es el cumplimiento de IEEE Std 1364-2001.

Agregue la línea `default_nettype noneen la parte superior del primer archivo que se está compilando y la regla se aplicará a todos los archivos. Si desea que algunos módulos tengan una declaración explícita y otros que permitan una declaración implícita, entonces para todos los módulos que necesitan una declaración explícita, tenga `default_nettype noneencima y `default_nettype wiredebajo de esos módulos.

Puede obtener más detalles sobre default_nettype leyendo IEEE Std 1364-2001 § 19.2 `default_nettype o IEEE Std 1800-2012 § 22.8 `default_nettype