Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> Verilog

Verilog Display Tasks meistern: Effizientes Debugging & Logging

Display-System-Tasks werden hauptsächlich verwendet, um Informations- und Debug-Meldungen anzuzeigen, um den Simulationsfluss aus Log-Dateien zu verfolgen und auch schneller zu debuggen. Es gibt verschiedene Gruppen von Display-Tasks und Formate, in denen sie Werte ausgeben können.

Display/Write Tasks

Syntax

Sowohl $display als auch $write zeigen Argumente in der Reihenfolge an, in der sie in der Argumentliste erscheinen.

$display(<list_of_arguments>);
$write(<list_of_arguments>);

$write fügt das Newline-Zeichen \n nicht am Ende seines Strings an, während $display dies tut, was am folgenden Beispiel zu sehen ist.

Beispiel

module tb;
  initial begin
    $display ("This ends with a new line ");
    $write ("This does not,");
    $write ("like this. To start new line, use newline char ");
    $display ("This always start on a new line !");
  end
endmodule

Simulationslog:

ncsim> run
This ends with a new line
This does not,like this. To start new line, use newline char
Hi there !
ncsim: *W,RNQUIE: Simulation is complete.

Verilog Strobes

$strobe gibt die endgültigen Werte von Variablen am Ende des aktuellen Delta-Zeitschritts aus und hat ein ähnliches Format wie $display.

module tb;
  initial begin
    reg [7:0] a;
    reg [7:0] b;
    a = 8'h2D;
    b = 8'h2D;
    #10; // Warten bis Simulation 10ns erreicht
    b <= a + 1; // a+1 Wert zu b zuweisen
    $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

Beachten Sie, dass $strobe den endgültigen aktualisierten Wert der Variable b zur Zeit 10ns anzeigt, der 0x2E ist, und $display diesen erst im nächsten Simulations-Delta bei 11ns erfasst.

Simulationslog:

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

Verilog Continuous Monitors

$monitor hilft dabei, Variablen- oder Ausdruckswerte automatisch auszugeben, wann immer sich die Variable oder der Ausdruck in seiner Argumentliste ändert. Es erzielt einen ähnlichen Effekt wie der Aufruf von $display nach jeder Aktualisierung eines seiner Argumente.

module tb;
  initial begin
    reg [7:0] a;
    reg [7:0] b;
    a = 8'h2D;
    b = 8'h2D;
    #10; // Warten bis Simulation 10ns erreicht
    b <= a + 1; // a+1 Wert zu b zuweisen
    $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

Beachten Sie, dass $monitor wie ein Task ist, der im Hintergrund des Hauptthreads gespawnt wird und Wertänderungen seiner Argumentvariablen überwacht und anzeigt. Ein neuer $monitor-Task kann beliebig oft während der Simulation ausgestellt werden.

Simulationslog:

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.

Verilog Format Specifiers

Um Variablen innerhalb von Display-Funktionen auszugeben, müssen für jede Variable geeignete Format-Spezifizierer angegeben werden.

Argument Beschreibung
%h, %H Hexadezimalformat anzeigen
%d, %D Dezimalformat anzeigen
%b, %B Binärformat anzeigen
%m, %M Hierarchischen Namen anzeigen
%s, %S Als String anzeigen
%t, %T Im Zeitformat anzeigen
%f, %F 'real' im Dezimalformat anzeigen
%e, %E 'real' im Exponentialformat anzeigen
module tb;
  initial begin
    reg [7:0] a;
    reg [39:0] str = "Hello";
    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

Simulationslog:

ncsim> run
a = 0e
a = 14
a = 00001110
str = Hello
time = 200
float_pt = 3.142000
float_pt = 3.142000e+00
ncsim: *W,RNQUIE: Simulation is complete.

Verilog Escape-Sequenzen

Einige Zeichen werden als speziell betrachtet, da sie für andere Anzeigezwecke stehen wie Newline, Tabs und Form Feeds. Um diese speziellen Zeichen auszugeben, muss jedes Vorkommen solcher Zeichen escaped werden.

Argument Beschreibung
\n Newline-Zeichen
\t Tab-Zeichen
\\ Das \ Zeichen
\" Das " Zeichen
%% Das % Zeichen
module tb;
  initial begin
    $write ("Newline character \n");
    $display ("Tab character \t stop");
    $display ("Escaping \" %%");
    /* // Kompilierungsfehler
    $display ("Without escaping ");
    // ERROR : Unterminated string
    $display ("Without escaping "");
    // ERROR : Unterminated string
    */
  end
endmodule

Simulationslog:

ncsim> run
Newline character
Tab character  stop
Escaping " %
ncsim: *W,RNQUIE: Simulation is complete.

Verilog

  1. Verilog meistern: Komplettes Tutorial für digitales Schaltungsdesign
  2. Verilog Concatenation meistern: Praktischer Leitfaden
  3. Verilog Assignments verstehen: Typen, Syntax und Best Practices
  4. Verilog Blocking vs. Non-Blocking: Wichtige Unterschiede erklärt
  5. Verilog Functions meistern für effizientes RTL-Design
  6. Verilog Tasks verstehen: Functions vs. Tasks, Syntax und Verwendung
  7. Verilog `ifdef: Bedingte Kompilierung erklärt
  8. Verilogs hierarchischen Referenz-Gültigkeitsbereich meistern: Namenskonflikte in Modulen und Blöcken vermeiden
  9. Verilog Clock Generator: Design & Implementierungsleitfaden
  10. Verilog Display Tasks meistern: Effizientes Debugging & Logging