Während der Ausführung eines Prozesses wird niemals ein Ereignis auftreten!
Wenn ein Prozess von einem Ereignis ausgelöst wird, wird er bis zum Abschluss ("end process") oder einer expliziten "wait" -Anweisung ausgeführt und in den Ruhezustand versetzt. Dies erfordert fiktiv Null Zeit. Das bedeutet, dass wenn Sie Schleifen in Ihrem Prozess haben, diese effektiv vollständig ausgerollt werden, und wenn Sie synthetisieren, werden Sie genug Hardware generieren, um JEDE Iteration parallel auszuführen. Außerdem benötigen alle Prozeduren, Funktionen usw. null Zeit - es sei denn, sie enthielten eine explizite "wait" -Anweisung (in diesem Fall wird der Prozess bei "wait" unterbrochen, als ob die Prozedur inline gewesen wäre).
Während dieses Vorgangs haben alle Signale den Wert, den sie ursprünglich hatten, als der Prozess aufwachte, und alle Signalzuweisungen werden gespeichert, um später zu geschehen. (Variablen werden sofort aktualisiert; spätere Anweisungen im Prozess sehen den neuen Wert).
Wenn der Prozess ausgesetzt wird (bei "warten" oder "Prozess beenden"), passiert nichts, bis ALLE anderen Prozesse ebenfalls ausgesetzt werden. (Aber denk daran, dass sie alle null Zeit brauchen!). Wenn ein Prozess bei "Ende Prozess" aussetzt, wird er von Anfang an neu gestartet, wenn seine Empfindlichkeitsliste ihn aufweckt. Wenn es bei einem expliziten "Warten" aussetzt, wird dieses "Warten" ein Ereignis oder eine zukünftige Zeit angeben, die es nach dem "Warten" neu startet. (ANMERKUNGEN: 1: nicht die Empfindlichkeitsliste und Wait Styles im selben Prozess mischen! 2: Warten bis ein Ereignis synthetisch sein kann (obwohl einige Werkzeuge einwenden können); Warte einige Zeit nur auf Simulation)
DANN alle Signalzuweisungen werden durchgeführt. Da alle Prozesse eingeschlafen sind, werden alle Race-Bedingungen und Timing-Hazards eliminiert. Einige dieser Zuweisungen (wie '1' zu einer Uhr) werden dazu führen, dass Ereignisse in für sie empfindlichen Prozessen geplant werden.
Nachdem alle Signalzuweisungen vorgenommen wurden, schreitet die Zeit um einen unendlich kurzen Tick vorwärts (Delta-Zyklus genannt), und dann werden alle Prozesse mit geplanten Ereignissen geweckt.
Dies wird fortgesetzt, bis ein Delta-Zyklus auftritt, in dem KEINE neuen Ereignisse geplant sind, und schließlich kann die Simulation um einen Echtzeitschritt fortschreiten.
So
process(clk)
begin
if rising_edge(clk) then
A <= B;
B <= A;
end if;
end process;
ist gefährdungsfrei in VHDL.
Wenn Sie Verilog verwenden müssen, beachten Sie, dass dies teilweise anders vorkommt und Sie sich nicht auf die gleiche Vorhersagbarkeit in den Simulationsergebnissen verlassen können.
In der Synthese, natürlich, erzeugen wir Hardware, die etwas Zeit braucht, um diesen Prozess auszuführen. Die Synthese- und Back-End-Tools (Ort und Route) garantieren jedoch, dass dieses Modell getreu gehorcht wird, oder fehlschlagen und melden, warum sie fehlgeschlagen sind. Zum Beispiel addieren sie alle tatsächlichen Verzögerungen und verifizieren, dass die Summe weniger als die angegebene Taktperiode ist. (Es sei denn, Sie haben die Taktgeschwindigkeit zu hoch eingestellt!).
Also das Ergebnis ist, solange die Tools Erfolg melden (und Sie die Timing-Einschränkungen wie Taktgeschwindigkeit richtig einstellen) können Sie vorgeben, das oben genannte "Zero Time" -Modell ist wahr, und das reale Hardware-Verhalten entspricht Simulation. Garantierte Tool-Bugs!
Vielleicht möchten Sie Ihre Frage zu klären – briantyler
Können Sie mit einigen Beispielcode der Situation klären? Ich glaube, ich weiß, was Sie fragen, aber es ist schwer zu beantworten ohne ein konkretes Problem. –