Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Verilog

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

  1. Dominar Verilog: Tutorial completo para diseño de circuitos digitales
  2. Dominar la concatenación en Verilog: Guía práctica
  3. Comprender las asignaciones en Verilog: tipos, sintaxis y mejores prácticas
  4. Bloqueante vs. No bloqueante en Verilog: Diferencias clave explicadas
  5. Dominar las funciones en Verilog para diseño RTL eficiente
  6. Comprender las Tasks en Verilog: Funciones vs Tasks, sintaxis y uso
  7. Compilación condicional en Verilog: `ifdef explicado
  8. Dominar el alcance de referencia jerárquica en Verilog: Evitar colisiones de nombres en módulos y bloques
  9. Generador de reloj en Verilog: Guía de diseño e implementación
  10. Dominar las tareas de visualización en Verilog: Depuración y registro eficientes
  11. Dominar las funciones matemáticas en Verilog para diseño de hardware eficiente