warum non-blocking assignment nur in procedural block?

OP #6929483
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?
Gast #6935153
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
Gast #6935769
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.