Forum: FPGA, VHDL & Co. warum non-blocking assignment nur in procedural block?


von Sina A. (sinapse)


Lesenswert?

Hallo,

um den unterschied zwischen blocking and non-blocking assignments zu 
verstehen, lese ich gerade
http://www.sunburst-design.com/papers/CummingsSNUG2000SJ_NBA_rev1_2.pdf

da ist auf seite 4 folgender satz zu finden:

Nonblocking assignments are only made to register data types and are 
therefore only permitted
inside of procedural blocks, such as initial blocks and always blocks. 
Nonblocking assignments
are not permitted in continuous assignments.

kann mir jemand mehr dazu sagen? der nonblocking assignment registriert 
doch nicht nur datentypen, sondern weist einer variable einen wert zu... 
und warum reicht das als grund um nur im prozeduralen sinn zu ergeben?

von egon (Gast)


Lesenswert?

Hi Sina,

gleich vorweg ich bin kein Verilog- oder FPGA-Experte ;) Aber vielleicht 
hilft das ja.

Was mir damals wirklich geholfen hat Blocking und Non-Blocking zu 
verstehen sich klarzumachen wer treibt das Signal?

Ein Beispiel für ein And-Gatter mit Blocking und Non-Blocking:

Blocking:
1
module top(
2
 output  out,
3
 input  a,
4
 input  b
5
 );
6
assign out = a&b;
7
endmodule

In diesem Fall wird out durch kombinatorische Logik getrieben sprich a 
and b wird out zugewiesen. Die Änderung von a oder b hat "sofort" 
Auswirkung auf out. D.h. out ist ein Wire was den Wert von a oder b 
annimmt.

Non-Blocking:
1
module top(
2
 input  clk,
3
 output reg out,
4
 input  a,
5
 input  b
6
 );
7
8
always @( posedge clk )
9
begin
10
out <= a & b;
11
end
12
endmodule

Der Unterschied hier ist das out ein reg (Flipflop) ist. Ein Flipflop 
treibt das Signal selbst. Damit ein Flipflop den neuen Wert übernimmt 
braucht es eine Clock.
Und das ist genau der Punkt warum man für ein Non-Blocking einen 
Always-Block braucht. Nur hier weiss die Synthesesoftware auf welche 
Clock bezieht sich die Zuweisung.
Der Unterschied zum Non-Blocking ist zudem, dass out sich erst bei der 
nächsten Clock ändert.

VG egon

von egon (Gast)


Lesenswert?

Ops... kleine Korrektur ganz unten:
Der Unterschied zum >>Blocking<< ist zudem, dass out sich erst bei der
nächsten Clock ändert.

von Tim (Gast)


Lesenswert?

1
 
2
always @( a, b)
3
begin
4
 out <= a & b;
5
end
6
endmodule

Immer noch Non-Blocking. Die o.g. Begründung ist schon etwas spezifisch. 
Es geht auch allgemeiner. Hier geht es um Signalzuweisung.

Blocking Zuweisungen (der Name ist für mich immer wieder sehr 
irreführend) sind hilfreich um noch Werte während des Prozesses 
zuzuweisen. Z.B. für Zwischwerte:
1
 
2
always @( a, b)
3
begin
4
 out <= 0; // wird überschrieben
5
 temp := a & b;
6
 out <= temp;
7
end
8
endmodule

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.