[í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 en
a enable
pero 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 en
establecido en z
.
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_nettype
macro. Al configurarlo, none
todas 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 none
en 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 none
encima y `default_nettype wire
debajo 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
usuario_1818839
Autodidacta
david_59
en
aparece en el RHS y no debe convertirse en una declaración implícita.