Dominar las tareas de visualización en Verilog: Depuración y registro eficientes
Las tareas de sistema de visualización se usan principalmente para mostrar mensajes informativos y de depuración para rastrear el flujo de simulación desde archivos de log y también ayuda a depurar más rápido. Hay diferentes grupos de tareas de visualización y formatos en los que pueden imprimir valores.
Tareas Display/Write
Sintaxis
Tanto $display como $write muestran argumentos en el orden en que aparecen en la lista de argumentos.
$display(<lista_de_argumentos>);
$write(<lista_de_argumentos>);
$write no agrega el carácter de nueva línea al final de su cadena, mientras que $display sí lo hace y puede verse en el ejemplo mostrado a continuación.
Ejemplo
module tb;
initial begin
$display ("Esto termina con una nueva línea ");
$write ("Esto no,");
$write ("como esto. Para nueva línea, use char de nueva línea ");
$display ("¡Esto siempre empieza en nueva línea!");
end
endmodule
ncsim> run Esto termina con una nueva línea Esto no,como esto. Para nueva línea, use char de nueva línea Hi there ! ncsim: *W,RNQUIE: Simulation is complete.
Strobes en Verilog
$strobe imprime los valores finales de las variables al final del paso de tiempo delta actual y tiene un formato similar a $display.
module tb;
initial begin
reg [7:0] a;
reg [7:0] b;
a = 8'h2D;
b = 8'h2D;
#10;
// Esperar hasta que la simulación alcance 10ns
b <= a + 1; // Asignar valor a+1 a b
$display ("[$display] time=%0t a=0x%0h b=0x%0h", $time, a, b);
$strobe ("[$strobe] time=%0t a=0x%0h b=0x%0h", $time, a, b);
#1;
$display ("[$display] time=%0t a=0x%0h b=0x%0h", $time, a, b);
$strobe ("[$strobe] time=%0t a=0x%0h b=0x%0h", $time, a, b);
end
endmodule
Tenga en cuenta que $strobe muestra el valor final actualizado de la variable b en tiempo 10ns que es 0x2E, y $display lo recoge solo en el siguiente delta de simulación a 11ns.
ncsim> run [$display] time=10 a=0x2d b=0x2d [$strobe] time=10 a=0x2d b=0x2e [$display] time=11 a=0x2d b=0x2e [$strobe] time=11 a=0x2d b=0x2e ncsim: *W,RNQUIE: Simulation is complete. ncsim> exit
Monitores continuos en Verilog
$monitor ayuda a imprimir automáticamente valores de variables o expresiones cada vez que la variable o expresión en su lista de argumentos cambia. Logra un efecto similar a llamar $display después de cada vez que cualquiera de sus argumentos se actualiza.
module tb;
initial begin
reg [7:0] a;
reg [7:0] b;
a = 8'h2D;
b = 8'h2D;
#10;
// Esperar hasta que la simulación alcance 10ns
b <= a + 1; // Asignar valor a+1 a b
$monitor ("[$monitor] time=%0t a=0x%0h b=0x%0h", $time, a, b);
#1 b <= 8'hA4;
#5 b <= a - 8'h33;
#10 b <= 8'h1;
end
endmodule
Tenga en cuenta que $monitor es como una task que se genera para ejecutarse en segundo plano del hilo principal que monitorea y muestra cambios de valor de sus variables de argumento. Una nueva task $monitor puede emitirse cualquier número de veces durante la simulación.
ncsim> run [$monitor] time=10 a=0x2d b=0x2e [$monitor] time=11 a=0x2d b=0xa4 [$monitor] time=16 a=0x2d b=0xfa [$monitor] time=26 a=0x2d b=0x1 ncsim: *W,RNQUIE: Simulation is complete.
Especificadores de formato en Verilog
Para imprimir variables dentro de funciones de visualización, se deben dar especificadores de formato apropiados para cada variable.
| Argumento | Descripción |
|---|---|
| %h, %H | Mostrar en formato hexadecimal |
| %d, %D | Mostrar en formato decimal |
| %b, %B | Mostrar en formato binario |
| %m, %M | Mostrar nombre jerárquico |
| %s, %S | Mostrar como cadena |
| %t, %T | Mostrar en formato de tiempo |
| %f, %F | Mostrar 'real' en formato decimal |
| %e, %E | Mostrar 'real' en formato exponencial |
module tb;
initial begin
reg [7:0] a;
reg [39:0] str = "Hola";
time cur_time;
real float_pt;
a = 8'h0E;
float_pt = 3.142;
$display ("a = %h", a);
$display ("a = %d", a);
$display ("a = %b", a);
$display ("str = %s", str);
#200 cur_time = $time;
$display ("time = %t", cur_time);
$display ("float_pt = %f", float_pt);
$display ("float_pt = %e", float_pt);
end
endmodule
ncsim> run a = 0e a = 14 a = 00001110 str = Hola time = 200 float_pt = 3.142000 float_pt = 3.142000e+00 ncsim: *W,RNQUIE: Simulation is complete.
Secuencias de escape en Verilog
Algunos caracteres se consideran especiales ya que representan otros propósitos de visualización como nueva línea, tabulaciones y avances de página. Para imprimir estos caracteres especiales, cada ocurrencia de tales caracteres debe ser escapada.
| Argumento | Descripción |
|---|---|
| \n | Carácter de nueva línea |
| \t | Carácter de tabulación |
| \\ | El carácter \ |
| \" | El carácter " |
| %% | El carácter % |
module tb;
initial begin
$write ("Carácter de nueva línea \n");
$display ("Carácter de tabulación \t stop");
$display ("Escapando \" %%");
/* // Errores de compilación
$display ("Sin escapar \n"); // ERROR: String no terminado
$display ("Sin escapar \""); // ERROR: String no terminado
*/
end
endmodule
ncsim> run Carácter de nueva línea Carácter de tabulación stop Escapando " % ncsim: *W,RNQUIE: Simulation is complete.
Verilog
- Dominar Verilog: Tutorial completo para diseño de circuitos digitales
- Dominar la concatenación en Verilog: Guía práctica
- Comprender las asignaciones en Verilog: tipos, sintaxis y mejores prácticas
- Bloqueante vs. No bloqueante en Verilog: Diferencias clave explicadas
- Dominar las funciones en Verilog para diseño RTL eficiente
- Comprender las Tasks en Verilog: Funciones vs Tasks, sintaxis y uso
- Compilación condicional en Verilog: `ifdef explicado
- Dominar el alcance de referencia jerárquica en Verilog: Evitar colisiones de nombres en módulos y bloques
- Generador de reloj en Verilog: Guía de diseño e implementación
- Dominar las tareas de visualización en Verilog: Depuración y registro eficientes
- Dominar las funciones matemáticas en Verilog para diseño de hardware eficiente