Forum: FPGA, VHDL & Co. [Verilog] Mehrere Zuweisungen in einem Block


von MadMike (Gast)


Lesenswert?

Hallo,

Frage: was passiert genau in folgenden Zuweisungen von q, bei nicht 
"voll ausdekodierten" Bedingungen?
1
wire clk;
2
wire test1;
3
wire test2;
4
reg q;
5
 
6
always @(posedge clk)
7
begin
8
  q <= test1;
9
10
  if( bedingung ) begin
11
    q <= test2;
12
  end
13
end

Spielt die Reihenfolge eine Rolle, so dass folgender Code anders 
reagiert? Ähnlich der VHDL Variablen?
1
always @(posedge clk)
2
begin
3
  if( bedingung ) begin
4
    q <= test2;
5
  end
6
  q <= test1;
7
end

Was ist das Stichwort für das Problem, so dass ich mich mehr einlesen 
kann?

Mir ist klar, dass man die Zuweisungen voll ausdekodieren kann und sich 
die Frage dann nicht stellt. Mich interessiert aber genau das Verhalten 
o.g. Codes.

Danke! :-)

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

MadMike schrieb:
>
1
> wire clk;
2
> wire test1;
3
> wire test2;
4
> reg q;
5
> 
6
> always @(posedge clk)
7
> begin
8
>   q <= test1;
9
> 
10
>   if( bedingung ) begin
11
>     q <= test2;
12
>   end
13
> end
14
>

q bekommt den Wert von test2 falls bedingung wahr ist, sonst den 
Wert von test1.

>
1
> always @(posedge clk)
2
> begin
3
>   if( bedingung ) begin
4
>     q <= test2;
5
>   end
6
>   q <= test1;
7
> end
8
>

q bekommt immer den Wert von test1. bedingung hat keinen Einfluss 
auf das Ergebnis.

Bei Verilog gewinnt immer die letzte Zuweisung an eine Variable.

von wosnet (Gast)


Lesenswert?

Ich würde sagen das kommt auf den Simulator/Synthesizer an.

<= in Verilog ist eine konkurrierende Zuweisung, d.h. die Zuweisung 
erfolgt parallel. Wenn die Bedingung wahr wird, entsteht eine 'race 
condition', d.h. es ist grundsätzlich erstmal unklar was passiert.
Man könnte die Zuweisungen in sequentielle Zuweisungen mit = ändern, die 
werden dann sicher nacheinander abgearbeitet. Das ist allerdings in 
einem getakteten Block schlechter Coding-Stil.

q ist übrigens keine Variable, sondern ein Register.

von MadMike (Gast)


Lesenswert?

race condition? Es können doch nicht vor dem q - FlipFlop (also dessen 
Eingang) mehrere Ausgänge der möglichen Logikvarianten miteinander 
verbunden sein?

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

wosnet schrieb:
> <= in Verilog ist eine konkurrierende Zuweisung, d.h. die Zuweisung
> erfolgt parallel.

Nein. Das findet alles in einem Block statt. Da gibt es keine parallelen 
Zuweisungen.

> Wenn die Bedingung wahr wird, entsteht eine 'race
> condition', d.h. es ist grundsätzlich erstmal unklar was passiert.

Verilog ist zwar voll von Möglichkeiten race conditions zu produzieren, 
hier ist der Fall aber klar.

> Man könnte die Zuweisungen in sequentielle Zuweisungen mit = ändern, die
> werden dann sicher nacheinander abgearbeitet. Das ist allerdings in
> einem getakteten Block schlechter Coding-Stil.

Ein blocking assignment mit dem = Operator wird hier nicht "sicherer 
nacheinander" abgearbeitet. Auch ist das Verwenden desselben innerhalb 
eines Blocks kein schlechter Stil, wohl aber bei Variablen, die von 
mehreren Blöcken zugewiesen werden, da man dann in der Tat nicht weiß, 
in welcher Reihenfolge die Zuweisungen erfolgen.

> q ist übrigens keine Variable, sondern ein Register.

Verilog kennt die Konzepte "variable" und "net". Verwirrenderweise wird 
ersteres durch das Schlüsselwort "reg" (seit 1364-2001 auch "var") 
definiert, letzteres durch "wire". Daneben gibt es für beide auch 
exotischere Konstrukte, die allerdings selten in RTL code verwendet 
werden.
Der wesentliche Unterschied ist, dass eine Variable den letzten ihr 
zugewiesenen Wert behält (speichert), während ein "net" einem Knoten in 
einem elektrischen Netzwerk entspricht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.