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

1

[icarus verilog]

¿Hay alguna bandera / 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. Desde un fondo de programación, esperaría que el compilador (iverilog) al menos emita una advertencia. En su lugar, el compilador genera felizmente un archivo de simulación con el valor de en establecido en z .

    
pregunta Autodidact

2 respuestas

4

Sí, en realidad se parece mucho a los indicadores de advertencia -W con los que probablemente estés familiarizado cuando usas un compilador de C como clang o gcc.

Si desea tener mucho cuidado, pase -Wall a iverilog. Esto activará todas las advertencias. Sin embargo, si solo está interesado en la situación específica de su pregunta, esto es simplemente una declaración implícita. Estás usando un cable llamado en, pero como no hay un cable 'en' en el módulo, donde se usa es también donde se declara implícitamente (lo cual es ciertamente útil, pero como has descubierto, también puede confundir errores) o simple error humano). Si activa la advertencia para esto con -Wimplicit, iverilog le avisará sobre esto.

También hay otras clases prácticas que puede querer o no, y puede habilitar cualquier combinación de ellas simplemente emitiendo varios conmutadores -W. Aquí es un buen desglose de las opciones disponibles.

Esperemos que esto es lo que querías. Buena suerte!

    
respondido por el metacollin
5

Por defecto, Verilog 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 macro 'define_nettype . Al establecerlo en 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 IEEE Std 1364-2001.

Agregue la línea 'default_nettype none a 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 que otros lo permitan implícitamente, entonces para todos los módulos que necesiten una declaración explícita tienen 'default_nettype none arriba 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

    
respondido por el Greg

Lea otras preguntas en las etiquetas