Verilog Scheduling Semantik
Das Design und die Testbench von Verilog haben normalerweise viele Codezeilen, die aus always
bestehen oder initial
Blöcke, fortlaufende Zuweisungen und andere prozedurale Anweisungen, die zu unterschiedlichen Zeitpunkten im Verlauf einer Simulation aktiv werden.
Jede Wertänderung eines Signals im Verilog-Modell wird als Aktualisierungsereignis betrachtet . Und Prozesse wie always
und assign
Blöcke, die für diese Aktualisierungsereignisse empfindlich sind, werden in einer willkürlichen Reihenfolge ausgewertet und als Evaluierungsereignis bezeichnet . Da diese Ereignisse zu unterschiedlichen Zeiten stattfinden können, werden sie besser verwaltet und ihre korrekte Ausführungsreihenfolge sichergestellt, indem sie in Ereigniswarteschlangen eingeplant werden die nach Simulationszeit geordnet sind.
module tb;
reg a, b, c;
wire d;
// 'always' is a process that gets evaluated when either 'a' or 'b' is updated.
// When 'a' or 'b' changes in value it is called an 'update event'. When 'always'
// block is triggered because of a change in 'a' or 'b' it is called an evaluation
// event
always @ (a or b) begin
c = a & b;
end
// Here 'assign' is a process which is evaluated when either 'a' or 'b' or 'c'
// gets updated
assign d = a | b ^ c;
endmodule
Ereigniswarteschlange
Ein Simulationsschritt kann in vier verschiedene Bereiche segmentiert werden. Eine aktive Ereigniswarteschlange ist nur eine Reihe von Prozessen, die zur aktuellen Zeit ausgeführt werden müssen, was dazu führen kann, dass mehr Prozesse in aktive oder andere Ereigniswarteschlangen eingeplant werden. Ereignisse können zu jeder Region hinzugefügt, aber immer aus der aktiven entfernt werden Region.
- Aktiv Ereignisse treten zum aktuellen Simulationszeitpunkt auf und können in beliebiger Reihenfolge abgearbeitet werden.
- Inaktiv Ereignisse treten zur aktuellen Simulationszeit auf, werden jedoch verarbeitet, nachdem alle aktiven Ereignisse verarbeitet wurden
- Nicht blockierende Zuweisung Zuvor ausgewertete Ereignisse werden zugewiesen, nachdem alle aktiven und inaktiven Ereignisse verarbeitet wurden.
- Überwachen Ereignisse werden verarbeitet, nachdem alle aktiven, inaktiven und nicht blockierenden Zuweisungen abgeschlossen sind.
Wenn alle Ereignisse in der aktiven Warteschlange für den aktuellen Zeitschritt ausgeführt wurde, rückt der Simulator die Zeit zum nächsten Zeitschritt vor und führt seine aktive Warteschlange aus.
module tb;
reg x, y, z
initial begin
#1 x = 1;
y = 1;
#1 z = 0;
end
endmodule
Die Simulation beginnt zum Zeitpunkt 0, und die erste Anweisung soll ausgeführt werden, wenn die Simulationszeit 1 Zeiteinheit erreicht, bei der sie x und y 1 zuweist. Dies ist die aktive Warteschlange für die aktuelle Zeit, die 1 Zeiteinheit ist. Simulator plant dann die nächste Anweisung nach einer weiteren Zeiteinheit, bei der z 0 zugewiesen wird.
Was macht die Simulation nicht deterministisch?
Während der Simulation können Rennbedingungen auftreten, die am Ende zu unterschiedlichen Ergebnissen für dasselbe Design und denselben Prüfstand führen. Einer der Gründe für nichtdeterministisches Verhalten ist aktiv Ereignisse können aus der Warteschlange entfernt und in beliebiger Reihenfolge verarbeitet werden.
Verilog