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

Verilog-Simulation

Verilog ist eine Hardwarebeschreibungssprache und Designer müssen ihre RTL-Designs nicht simulieren, um sie in Logikgatter umwandeln zu können. Was muss also simuliert werden?

Simulation ist eine Technik, bei der verschiedene Eingangsstimuli zu unterschiedlichen Zeiten auf das Design angewendet werden, um zu überprüfen, ob sich der RTL-Code wie beabsichtigt verhält. Im Wesentlichen ist die Simulation eine gut befolgte Technik, um die Robustheit des Designs zu überprüfen. Es ist auch ähnlich, wie ein hergestellter Chip in der realen Welt verwendet wird und wie er auf verschiedene Eingaben reagiert.

Das obige Design stellt zum Beispiel einen Detektor für positive Flanken mit Eingängen Takt und Signal dar, die in periodischen Intervallen ausgewertet werden, um den Ausgang pe zu finden wie gezeigt. Die Simulation ermöglicht es uns, das Zeitdiagramm verwandter Signale anzuzeigen, um zu verstehen, wie sich die Designbeschreibung in Verilog tatsächlich verhält.

Es gibt mehrere EDA-Unternehmen, die Simulatoren entwickeln in der Lage, die Ausgaben für verschiedene Eingaben in das Design herauszufinden. Verilog wird in Bezug auf ein diskretes Ereignis definiert Ausführungsmodell und verschiedenen Simulatoren steht es frei, verschiedene Algorithmen zu verwenden, um dem Benutzer konsistente Ergebnisse zu liefern. Der Verilog-Code ist in mehrere Prozesse und Threads unterteilt und kann zu verschiedenen Zeitpunkten im Laufe einer Simulation ausgewertet werden, worauf später noch eingegangen wird.

Beispiel

Die Testbench namens tb ist ein Container für ein Designmodul. In diesem Beispiel haben wir jedoch keine Designinstanzen verwendet. Es gibt zwei Variablen oder Signale denen zu bestimmten Zeiten bestimmte Werte zugeordnet werden können. clk stellt eine Uhr dar, die innerhalb der Testbench generiert wird. Dies erledigt der always Anweisung, indem der Wert der Uhr alle 5 ns geändert wird. Die initial block enthält eine Reihe von Anweisungen, die beiden Signalen zu unterschiedlichen Zeiten unterschiedliche Werte zuweisen.

  
  
module tb;
  reg clk;
  reg sig;
 
  // Clock generation 
  // Process starts at time 0ns and loops after every 5ns
  always #5 clk = ~clk;   
 
  // Initial block : Process starts at time 0ns
  initial begin            
    // This system task will print out the signal values everytime they change
    $monitor("Time = %0t clk = %0d sig = %0d", $time, clk, sig);
    
    // Also called stimulus, we simply assign different values to the variables
    // after some simulation "delay"
    sig = 0;
    #5 clk = 0;        // Assign clk to 0 at time 5ns
    #15  sig = 1;      // Assign sig to 1 at time 20ns (#5 + #15)
    #20  sig = 0;      // Assign sig to 0 at time 40ns (#5 + #15 + #20)
    #15  sig = 1;      // Assign sig to 1 at time 55ns (#5 + #15 + #20 + #15)
    #10  sig = 0;      // Assign sig to 0 at time 65ns (#5 + #15 + #20 + #15 + #10)
    #20 $finish;       // Finish simulation at time 85ns
  end
endmodule

  

Der Simulator liefert nach Ausführung der obigen Testbench die folgende Ausgabe.

Simulationsprotokoll
ncsim> run
Time = 0 clk = x sig = 0
Time = 5 clk = 0 sig = 0
Time = 10 clk = 1 sig = 0
Time = 15 clk = 0 sig = 0
Time = 20 clk = 1 sig = 1
Time = 25 clk = 0 sig = 1
Time = 30 clk = 1 sig = 1
Time = 35 clk = 0 sig = 1
Time = 40 clk = 1 sig = 0
Time = 45 clk = 0 sig = 0
Time = 50 clk = 1 sig = 0
Time = 55 clk = 0 sig = 1
Time = 60 clk = 1 sig = 1
Time = 65 clk = 0 sig = 0
Time = 70 clk = 1 sig = 0
Time = 75 clk = 0 sig = 0
Time = 80 clk = 1 sig = 0
Simulation complete via $finish(1) at time 85 NS + 0

Was ist eine Simulationswellenform?

Simulationen ermöglichen es uns, Design- und Testbench-Signale in eine Wellenform zu übertragen, die grafisch dargestellt werden kann, um die Funktionalität des RTL-Designs zu analysieren und zu debuggen. Die unten gezeigte Wellenform wird von einem EDA-Tool erhalten und zeigt den Verlauf jedes Signals in Bezug auf die Zeit und ist dasselbe wie das zuvor gezeigte Zeitdiagramm.

Jede Änderung des Werts einer Variablen oder eines Netzes wird als Update-Ereignis bezeichnet . Und Prozesse reagieren empfindlich auf Aktualisierungsereignisse so dass diese Prozesse immer dann ausgewertet werden, wenn das Aktualisierungsereignis eintritt und als Evaluierungsereignis bezeichnet wird . Aufgrund der Möglichkeit, dass mehrere Prozesse willkürlich ausgewertet werden, muss die Reihenfolge der Änderungen in einer sogenannten Ereigniswarteschlange verfolgt werden .

Sie sind natürlich nach der Simulationszeit geordnet. Die Platzierung eines neuen Ereignisses in der Warteschlange wird als Planung bezeichnet . Simulationszeit wird verwendet, um sich auf den Zeitwert zu beziehen, der von dem Simulator beibehalten wird, um die tatsächliche Zeit zu modellieren, die für die Simulation der Schaltung benötigt würde. Die Zeitwerte für das obige Beispiel werden in Nanosekunden ns angezeigt im Zeitdiagramm.

  
  
module des;
	wire abc;
	wire a, b, c;
	
	assign abc = a & b | c;  // abc is updated via the assign statement (process) whenever a, b or c change -> update event
endmodule

  

Aktualisieren Sie Verilog und sehen Sie sich ein Beispiel an !

Regionen in Ereigniswarteschlange

Die Verilog-Ereigniswarteschlange ist logisch in fünf Bereiche unterteilt, und Ereignisse können zu jedem von ihnen hinzugefügt werden. Es kann jedoch nur aus dem aktiven Bereich entfernt werden.

Ereignisse Beschreibung
Aktiv Treten zur aktuellen Simulationszeit auf und können in beliebiger Reihenfolge verarbeitet werden
Inaktiv Tritt zur aktuellen Simulationszeit auf, wird aber verarbeitet, nachdem alle aktiven Ereignisse abgeschlossen sind
Nicht blockierend Zu einem früheren Zeitpunkt ausgewertet, aber die Zuweisung erfolgt in der aktuellen Simulationszeit, nachdem aktive und inaktive Ereignisse abgeschlossen sind
Monitor Verarbeitet, nachdem alle aktiven, inaktiven und nicht blockierenden Ereignisse abgeschlossen sind
Zukunft Treten zu einem zukünftigen Simulationszeitpunkt auf

In einem Simulationszyklus werden alle aktiven Ereignisse verarbeitet. Der Standard garantiert bis auf wenige Fälle eine bestimmte Terminierungsreihenfolge. Beispielsweise werden Anweisungen innerhalb eines begin-end-Blocks nur in der Reihenfolge ausgeführt, in der sie erscheinen.

  
  
module tb;
	reg [3:0] a;
	reg [3:0] b;
	
	initial begin		// Statements are executed one after the other at appropriate simulation times
		a = 5;			// At time 0ns, a is assigned 5
		b = 2;			// In the same simulation step (time 0ns), b is assigned 2
		
		#10 a = 7;		// When simulation advances to 10ns, a is assigned 7
	end
endmodule

  

Die Ereigniswarteschlange definiert diese Zuordnung zu b sollte nach der Zuweisung zu a geschehen .


Verilog

  1. Verilog-Tutorial
  2. Verilog-Verkettung
  3. Verilog-Aufgaben
  4. Verilog-Blockierung und Nicht-Blockierung
  5. Verilog-Funktionen
  6. Verilog-Aufgabe
  7. Verilog `ifdef Bedingte Kompilierung
  8. Verilog Scheduling Semantik
  9. Verilog-Taktgenerator
  10. Verilog-Anzeigeaufgaben