[Verilog] Mehrere Zuweisungen in einem Block

Gast #3606414
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! :-)
Persönliche Seite #3606580
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.
Gast #3606597
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.
Persönliche Seite #3606668
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren