Ich verstehe, dass es in Verilog/SystemVerilog-Standards verschiedene Regionen für die Ereignisplanung gibt, wodurch das Verhalten gleichzeitiger Hardware nachgeahmt wird. Aber in welcher Beziehung steht dies zu den Delta-Zyklen, die ich in Simulatoren sehe (wie das Erweitern zu einem bestimmten Zeitpunkt, um zu sehen, dass Signale in verschiedenen Zyklen aktualisiert werden)?
Ich kann nur Delta-Zyklus-Konzepte finden, die in VHDL-Simulationen definiert sind, nicht in Verilog. Kann jemand diese beiden Konzepte erklären?
"Delta-Zyklen sind ein HDL-Konzept, das verwendet wird, um Ereignisse zu ordnen, die in null physikalischer Zeit auftreten." sigasi.com
Ausgehend von der Definition für Sigasi, was VHDL Delay Cycles nennt, nennt Verilog einen Scheduler. Wie VHDL und Verilog die Reihenfolge von Nullzeitereignissen bestimmen, ist sehr unterschiedlich.
VHDL ist ein determinierter Simulator, bei dem Nullzeitereignisse durch Aktualisieren aller Werte (Werte aus dem vorherigen Zyklus) angeordnet werden, bevor in jedem Zeitschritt etwas ausgewertet wird.
Verilog ist ein unbestimmter Simulator, bei dem Nullzeitereignisse mithilfe eines priorisierten Planers mit fünf Regionen angeordnet werden (Hinweis: SystemVerilog hat 17 Regionen). Jede Region wird in einer priorisierten Reihenfolge ausgeführt. Die Ereignisse in jeder Region können in beliebiger Reihenfolge ausgeführt werden. Event kann neue Events für jede Region planen (nicht ausführen). Wenn eine Region die Ausführung ihrer Ereignisse beendet, wechselt der Planer zu der Region mit der höchsten Priorität, die Ereignisse geplant hat. Die letzte Region plant keine Ereignisse im aktuellen Zyklus, sie plant Ereignisse in zukünftigen Zeitschritten. Die Regionen sind:
#0
):=
)-Zuweisungen auswerten und zuweisen ( always
block)assign
Statements)$display
und $write
aufrufen#0
tf_synchronize()
(veraltet in IEEE 1364-2005) undvpi_register_cb(cbReadWriteSynch)
<=
) Zuweisungen zu$monitor
und $strobe
telefonierenreason_rosynchronize
(in IEEE 1364-2005 veraltet)#N
(wo N>0
) in den Zeitschritten in der Zukunft stattfindenIn Verilog kann ein "Delta-Zyklus" der Reihenfolge folgen:
Aktiv⇒Inaktiv⇒Aktiv⇒NBA⇒Aktiv⇒NBA⇒Inaktiv⇒NBA⇒Aktiv⇒Monitor⇒Zukunft ODER Aktiv⇒Inaktiv⇒NBA⇒Aktiv⇒Monitor⇒Zukunft
Es kann sehr verwirrend aussehen und es ist möglich, in eine Endlosschleife zu geraten. Es ist etwas, das mehrere VHDL-Blogs ( Beispiel ) und Artikel zu einem großen Fehler in Verilog erklären . In Wirklichkeit sieht der „Delta-Zyklus“ einer typischen Verilog-RTL-Simulation so aus, wenn dem grundlegenden Codierungsstil gefolgt wird, nur blockierende Zuweisungen in kombinatorischen Blöcken und nur nicht blockierende Zuweisungen in sequentiellen Blöcken zu verwenden:
Active(init & clk)⇒NBA(flop update)⇒Active(comb logic)⇒Future(plan clk)
Der erste aktive Bereich dient zum Initialisieren und Aktualisieren der Uhr. Der größte Teil des Designs ist NBA (Update) und dann Active (Evaluate), dieselbe Ausführung wie VHDL. Die anderen Regionen (einschließlich der zusätzlichen Regionen von SystemVerilog) existieren für die beabsichtigte nicht synthetisierbare Verhaltensmodellierung, die Verknüpfung mit externen Sprachen (z. B. C/C++) und Verifizierungsprüfstände.
Ich werde hinzufügen, dass die inaktive Region historisch als Design erstellt wurde. Es war ein fehlgeschlagener Versuch festzustellen, welchen Wert ein Flop haben sollte. NBA wurde danach erstellt und ist seitdem die empfohlene Lösung. Jedes Design, das immer noch den inaktiven Bereich ( #0
Verzögerungen) verwendet, folgt einer Praxis, die seit etwa 20 Jahren oder länger veraltet ist.
cbReadWriteSynch
ist die beste Wahl, wenn es cbNBASynch
nicht unterstützt wird ...
user_1818839
Entzauberte Kröte
user_1818839