Check out IEEE Std 1800-2012 § 3,4 & § 24. Ausführliche Beschreibung program
Blöcke.
In einer kurzen, unvollständigen Zusammenfassung, ein program
Block:
- kann nicht nicht
always
Verfahren enthalten, primitive
Fälle module
Fälle interface
Instanzen (virtual interface
und Port interface
erlaubt ist) oder andere program
Instanzen.
- legt die Zeitplanung in der reaktiven Region fest. Dies verhindert Rennbedingungen.
- hat eine zusätzliche Systemtask
$exit
, die die program
Instanzen beendet, die es aufrufen.
- Die Simulation wird beendet, wenn alle
program
Instanzen beendet wurden.
ist meist wie ein module
Block außer wie oben angegeben.
Die Idee eines program
Blocks besteht darin, eine klare Trennung zwischen Test und Design zu schaffen. In früheren Versionen von SystemVerilog (vor IEEE 1800) war die Instanziierung einer class
oft auf program
Blöcke beschränkt. Dies betonte die Trennung von Test und Design. Es machte auch program
Blöcke für Verifikationsingenieure, die objektorientierte Programmierung in ihrem Fluss verwenden wollten. Seit IEEE 1800 kann ein class
fast überall definiert und instanziiert werden. Als Ergebnis wurden program
Blöcke weniger ausreichend.
Heute ist die Meinung der Nützlichkeit eines program
Blocks geteilt. Von den letzten Konventionen, die ich gemacht habe, scheint der Trend zu sein, program
Blöcke aufzugeben. Dies liegt daran, dass die Vorteile durch andere Verfahren erreicht werden können. Die Planung im Bereich "Reaktiv" kann mit clocking
Blöcken erfolgen. A mailbox
, Warteschlange ([$]
) oder assoziatives Array ([*]
) können für die intelligente Behandlung von Simulationen verwendet werden, um mehrere Tests zu beenden. Persönlich mag ich immer noch program
Blöcke verwenden und als always
gleichwertig, wenn nötig. Wenn Sie planen, UVM zu verwenden, könnte ein Blockprüfstand, der nicht program
ist, für Sie besser funktionieren.
Am Ende kommt es wirklich auf eine Methodologiepräferenz an. Es ist am besten, zu bewerten und es selbst zu versuchen.
Danke!Ich habe mit Programmblöcken herumgespielt und festgestellt, dass einige grundlegende Funktionen nicht von meinem Simulator unterstützt werden, obwohl grundlegende Programmblöcke funktionieren (Kompilierungsfehler von "SystemVerilog-Konstrukt noch nicht implementiert"). Scheint es nicht wert zu versuchen, herauszufinden, welche Funktionen von Programmblöcken funktionieren und was nicht, da es sich anhört, als könnte ich alle Vorteile von Programmblöcken mit anderen Mitteln nutzen. – dan