Forum: FPGA, VHDL & Co. Verilog: Verhalten zwischen begin und end


von Marc85 (Gast)


Lesenswert?

Hallo zusammen,

ich habe hier
http://sus.ziti.uni-heidelberg.de/Lehre/DSTVorlesung06/DST06_09_Verilog.pdf
auf Seite 26 gelesen, das Verilog zwischen begin und end, alle Anweisung 
sequentiell ausführt.
Andererseits heißt es das
a <= b;
nicht blockierend (parallel) und
a = b;
blockierend (sequentiell) ist.
Was also passiert, wenn ich z.B.

always @ (clk)
begin
 a <= b;
 c <= d;
end

schreibe?
Werden die Zusweisungen nun parallel oder sequentiell ausgeführt?

Danke euch und guten Rutsch!

von Johannes E. (cpt_nemo)


Lesenswert?

Marc85 schrieb:
> Werden die Zusweisungen nun parallel oder sequentiell ausgeführt?

Die Anweisungen sind doch voneinander unabhängig, so dass es keinen 
Unteschied macht, in welcher Reihenfolge diese ausgeführt werden.

von Lattice User (Gast)


Lesenswert?

Schau dir Seite 29 deines Links an.

von Marc85 (Gast)


Lesenswert?

Lattice User schrieb:
> Schau dir Seite 29 deines Links an.

Hm, da sachste was ;)
Aber irgendwie hätte man sich das
"Die Anweisungen zwischen „begin“ und „end“ werden sequentiell 
ausgeführt"
dann sparen können, ziemlich verwirrend.

Danke euch

von Georg A. (georga)


Lesenswert?

Hätte man sich nicht sparen können, da es für sofortige Zuweisung mit = 
schon wichtig ist, in welcher Reihenfolge das abläuft. Aus der Sicht 
eines C-Programmierers arbeitet das = eben ganz "normal".

Das <= ist die Besonderheit beim HW-Entwurf, weil das @always ja einen 
"Triggerpunkt" definiert, der quasi beliebig (infinitesimal) kurz ist. 
In quasi Nullzeit gibt es aber kein vorher und kein nachher, und genau 
das Verhalten wird vom <= nachgebildet.

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Marc85 schrieb:
> "Die Anweisungen zwischen „begin“ und „end“ werden sequentiell
> ausgeführt" dann sparen können, ziemlich verwirrend.

Ohne hier Haare spalten zu wollen, werden die Anweisungen tatsächlich 
sequentiell ausgeführt. Das folgende führt dazu, dass die Variable a 
immer den Wert '0 zugewiesen bekommt, da das zugehörige Statement dem 
das '1 zuweist nachfolgt.
1
always @ (clk)
2
begin
3
 a <= '1;
4
 a <= '0;
5
end

Anders wäre das bei echter Parallelität:
1
always @ (clk)
2
fork
3
 a <= '1;
4
 a <= '0;
5
join
Hier ist der Zustand von a nach jeder Taktflanke unbekannt.

Viele Grüße
Marcus

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.