Zusammenhang zwischen Deltazyklus und Ereignisplanung in der Verilog-Simulation?

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?

Ich bin mir nicht sicher, ob Sie in Verilog etwas so klares wie das Delta-Zyklus-Konzept finden werden. Das nächste, woran ich denken kann, ist [diese Diskussion] [1], die mich jedes Mal, wenn ich sie lese, nur noch verwirrter zurücklässt. [1][ sunburst-design.com/papers/…
Danke Brian, dieses Papier ist ein Klassiker und ich habe es gelesen, bevor ich diese Frage gestellt habe. Aber es erklärt die Dinge nur aus der Sicht des IEEE-Standards.
Ich hatte gehofft, Sie würden von einem Verilog-Experten zu diesem Thema hören, ich bin ein absoluter VHDL-Typ.

Antworten (1)

"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:

  1. Aktive Region (vor allen #0):
  • Alle prozeduralen Blocking( =)-Zuweisungen auswerten und zuweisen ( alwaysblock)
  • Alle fortlaufenden Aufgaben auswerten und zuordnen ( assignStatements)
  • Werten Sie nicht blockierende Zuweisungen aus
  • Werten Sie Eingaben aus und ändern Sie Ausgaben aller Primitiven
  • Auswerten und ausgeben $displayund $writeaufrufen
  1. Inaktive Region:
  • Fügen Sie dem Planer von jedem Verfahrensblock bis zum nächsten zusätzliche Ereignisse hinzu#0
  • Mit PLI-Routinen geplante Callback-Prozeduren wie tf_synchronize()(veraltet in IEEE 1364-2005) undvpi_register_cb(cbReadWriteSynch)
  1. NBA-Region:
  • Weisen Sie die nicht blockierenden ( <=) Zuweisungen zu
  1. Region überwachen
  • Auswerten und schreiben $monitorund $strobetelefonieren
  • PLI aufrufen mit reason_rosynchronize(in IEEE 1364-2005 veraltet)
  1. Zukünftige Region:
  • Planen Sie Ereignisse, die #N(wo N>0) in den Zeitschritten in der Zukunft stattfinden

In 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 ( #0Verzögerungen) verwendet, folgt einer Praxis, die seit etwa 20 Jahren oder länger veraltet ist.

Leider ist die inaktive Region, obwohl sie seit 20 Jahren veraltet ist, in vielen Simulatoren immer noch das einzige, auf das der VPI Zugriff gewährt. cbReadWriteSynchist die beste Wahl, wenn es cbNBASynchnicht unterstützt wird ...