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?
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
Ops... kleine Korrektur ganz unten: Der Unterschied zum >>Blocking<< ist zudem, dass out sich erst bei der nächsten Clock ändert.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.