2016-07-18 8 views

Antwort

8

Der Unterschied ist die Initialisierung als Teil einer Variablendeklaration, die vor jedem Prozess ausgeführt wird, der von initial oder always Konstrukten gestartet wird. Wenn Sie schrieb:

bit clk; 
initial clk = 1; 
always #5 clk++; 
always @(posedge clk) ...; 

Es gibt eine Race-Bedingung, ob die @(posedge clk) zum Zeitpunkt 0 oder Zeit ausgelöst wird 10. jedoch mit:

bit clk = 1; 
always #5 clk++; 
always @(posedge clk) ...; 

Es gibt keine Rennen mit dem oben. Die erste Figur wird in 10 Zeiteinheiten kommen.

+1

Ist diese Unterscheidung Simulator spezifisch oder sollte dies bei allen Simulatoren Standard sein? – supernun

+1

LRM 1800-2012 Abschnitt 6.8 sagt _Setting der Anfangswert einer statischen Variablen als Teil der Variablendeklaration (einschließlich der statischen Klasse Mitglieder) soll auftreten, bevor alle anfänglichen oder immer Verfahren gestartet werden –

+0

Ich denke, das ist richtig für System-Verilog, aber nicht korrekt für Verilog. Ich denke, Ihr zweites Beispiel wird Ihnen immer noch ein Rennen in Verilog geben (ignorieren Sie die Tatsache, dass Bit kein Verilog-Typ ist). –

2

Das Endergebnis ist das gleiche, d. H. Es wird keinen Unterschied zur Endbenutzerperspektive geben. Der Unterschied besteht darin, dass Sie den Wert im ersten Fall zur Laufzeit zuweisen und im zweiten Fall den Wert während der Kompilierungszeit zuweisen.

+0

Hat es dann Auswirkungen auf Signale, die von 'a' abhängen? Zum Beispiel, b = # 1 a; – supernun

+4

Parameter erhalten ihren Wert zur Kompilierzeit. Variable Initialisierungen geschehen zum Zeitpunkt 0, der Laufzeit ist. –

+0

Ich denke, das ist richtig für Verilog, aber nicht korrekt für System-Verilog. –

0

Auf ähnliche Notiz:

int val = 0 ; 
int val1 = val + 10 ; 

wird ein konsistentes Ergebnis produzieren, wie das Ergebnis bei der Kompilierung festgelegt ist, wo als

initial val = 0 ; 
initial val1 = val + 10; 

ein inkonsistentes Ergebnis führt [wie die Reihenfolge der Zuordnung geschieht zur Laufzeit und ist simulatorabhängig]

+2

Das ist auch nicht richtig. Die Reihenfolge der Initialisierung statischer Variablen ist nicht definiert. Dies ist bekannt als das [statische Variable Fiasko] (https://isocpp.org/wiki/faq/ctors#static-init-order). –

+0

okay, hab es. .. –

1

Es gibt eine wichtige Unterscheidung: Sie haben Ihre Frage "verilog" und "system-verilog" markiert. Was meinst du? Die Antwort hängt davon ab, was Sie meinen, weil das Verhalten in beiden unterschiedlich ist.

In Verilog:

Beide

reg a; 
initial a = 1'b0; 

und

reg a = 1'b0; 

die gleiche Art und Weise verhalten. In werden beide Fälle a zur Zeit 0 initialisiert, dh bei Laufzeit. Dies kann zu Simulationsrennen und nicht-deterministischem Verhalten führen. Zum Beispiel:

reg a; 
initial a = 1'b1; 
initial $display(a); 

könnte 0 angezeigt werden oder könnte 1 angezeigt - es ist ein Rennen zwischen den ersten Blöcken.Und genau das gleiche wird mit diesem Code geschehen:

reg a = 1'b1; 
initial $display(a); 

In-System-Verilog:

reg a; 
initial a = 1'b0; 

und

reg a = 1'b0; 

anders verhalten wird. Im ersten Fall wird a zum Zeitpunkt 0, dh unter Laufzeit initialisiert, was wiederum zu Simulationsläufen und nicht-deterministischem Verhalten führen kann. Allerdings gibt es kein solches Problem mit diesem Code ist:

reg a = 1'b1; 
initial $display(a); 

In diesem Fall wird a bei Kompilierung und daher initialisiert werden gibt es keine Rennen und daher 1 wird immer angezeigt.

0

Die Initialisierung der Variablen erfolgt vor jeder anderen prozeduralen Blockausführung.

Wie pro Systemverilog LRM 1800-2012, Topic 6,8

Eine Variable kann mit einem Initialisierer deklariert werden, zum Beispiel:

int i = 0;

den Anfangswert einer statischen Variablen als Teil der Variablendeklaration Einstellung (einschließlich statische Klassenmitglieder) sind vor allen Erst- oder immer Verfahren auftreten gestartet werden (auch 6,21 und 10.5 auf Variableninitialisierung mit statischen und automatischen sehen Lebenszeiten).