Manchmal finde ich es nützlich Blockierungszuweisungen für "lokale Variablen" in getakteten Blöcken zu verwenden. Dies kann helfen, wiederholten Code zu reduzieren.
Um zu vermeiden, dass Sie versehentlich die gleiche Variable in einem anderen always-Block verwenden (der für die Simulation nicht deterministisch sein kann), möchte ich einen lokalen Bereich angeben. Gibt es eine schöne synthetisierbare Möglichkeit, dies zu tun?
Etwas wie:
%Vor%(ModelSim scheint damit in Ordnung zu sein, aber Synplify scheint es nicht zu mögen.)
Ich bin nicht sicher, die Semantik in einfachen Verilog, aber nach SystemVerilog LRM Abschnitt 6.21:
Variablendeklarationen müssen allen Anweisungen innerhalb eines prozeduralen Blocks vorausgehen.
Daher ist die folgende Syntax in SystemVerilog:
%Vor% Beachten Sie, dass ich die Variablendeklaration sum_temp
in den Prozess verschoben habe, wodurch der Gültigkeitsbereich eingeschränkt und der benannte sum
-Block nicht mehr benötigt wird. Dies kompiliert auf Modelsim und Riviera (Beispiel auf EDA Playground ).
Wenn Ihr Werkzeug diese Syntax nicht unterstützt, rufen Sie einen Fehler auf!
Trotz der allgemeinen Richtlinie ist die Verwendung von Blockierungszuweisungen innerhalb von immer getakteten Blöcken in Ordnung, und manchmal, wie Sie erwähnt haben, nützlich. Siehe hier: Ссылка
Einige Tools unterstützen jedoch möglicherweise keine lokalen Variablen, die in einem Anfangs- / End-Block definiert sind.
Alternativ können Sie versuchen, den gesamten Block des always in eine Aufgabe einzufügen:
%Vor%Verilog-Tasks können sowohl auf globale als auch auf lokale Variablen zugreifen. Sie können auch nicht blockierende Zuweisungen enthalten.
Tags und Links scope blocking nonblocking verilog