Können Verilog-Variablen einen lokalen Bereich für einen Always-Block erhalten?

8

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.)

    
mksuth 15.09.2014, 22:03
quelle

3 Antworten

10

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!

    
Chiggs 16.09.2014, 16:14
quelle
2

Der standardmäßige sythesisable Weg besteht darin, eine fortlaufende Zuweisung mit wire zu verwenden:

%Vor%     
toolic 16.09.2014 01:08
quelle
2

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.

    
Ari 15.09.2014 22:37
quelle