auch wenn man die reihenfolge der always zeilen verändert wird wohl
richtig synthetisiert und es kommt wie gewuenscht eine pipeline heraus
(reihenschaltung von flipflops).
aber warum ist das so? muesste nicht immer etwas anderes synthetisiert
werden, je nach dem was das ergebnis mit unterschiedlichen race
conditions ist?
Nun, das ist keine Software. Du beschreibst Hardware. Und die
funktioniert immer gleichzeitig.
Hier die drei FFs übernehmen jeweils mit der steigenden Taktflanke das
was an deren Eingang zu genau diesem Zeitpunkt der Taktflanke anliegt.
Du könntest auch schreiben:
1
always @(posedge clk)
2
begin
3
q1=d;
4
q2=q1;
5
q3=q2;
6
end
Da gibt es keinen Unterschied weil sichergestellt wird, dass der Takt
die FFs zeitgleich erreicht.
ich glaub du irrst dich... in deinem beispiel werden ja blocking
assignments verwendet. damit wird
1
q1=d;
2
q2=q1;
3
q3=q2;
hintereinander im simulator ausgeführt und damit wird q3 direkt d
zugewiesen. das beschreibt somit nicht das verhalten einer pipeline und
es wird keine pipeline synthetisiert.
Ihr habt beide sowohl recht als auch unrecht.
Gustl hat zwar zu recht auf die gleichzeitige Ausführung in Hardware
hingewiesen, aber dummerweise genau den falschen Beispielcode
aufgeführt, siehe:
https://www.nandland.com/articles/blocking-nonblocking-verilog.html
Somit ist Sinas Hinweis auf blocking assignments durchaus korrekt.
Bei synchroner Logik in einem FPGA o.ä. werden innerhalb einer clock
domain alle getakteten Zuweisungen gleichzeitig ausgeführt, da
sichergestellt ist, dass die Taktflanken der jeweiligen Register
hinreichend dicht beieinander liegen. Damit werden die befürchteten race
conditions vermieden.
Würde man jedoch solch eine Schaltung mit diskreter Logik ("TTL-Grab")
aufbauen, gäbe es diese race conditions, da so manches
Register/Flip-Flop durch eine erstaunlich große Setup-Zeit besitzt.
Daher würde man in solch einem Aufbau einen mehrphasigen Takt verwenden.
Ähnlich sieht es bei sehr großen, mehrlagigen FPGA (Xilinx 3D mit SSI)
aus, bei denen die Taktflanken zwischen verschiedenen Lagen nicht
hinreichend synchron sind bzw. auch Datensignale erhebliche Laufzeiten
besitzen können.
Andreas S. schrieb:> Ihr habt beide sowohl recht als auch unrecht.> Gustl hat zwar zu recht auf die gleichzeitige Ausführung in Hardware> hingewiesen, aber dummerweise genau den falschen Beispielcode> aufgeführt, siehe:> https://www.nandland.com/articles/blocking-nonblocking-verilog.html> Somit ist Sinas Hinweis auf blocking assignments durchaus korrekt.> Bei synchroner Logik in einem FPGA o.ä. werden innerhalb einer clock> domain alle getakteten Zuweisungen gleichzeitig ausgeführt, da> sichergestellt ist, dass die Taktflanken der jeweiligen Register> hinreichend dicht beieinander liegen. Damit werden die befürchteten race> conditions vermieden.> Würde man jedoch solch eine Schaltung mit diskreter Logik ("TTL-Grab")> aufbauen, gäbe es diese race conditions, da so manches> Register/Flip-Flop durch eine erstaunlich große Setup-Zeit besitzt.> Daher würde man in solch einem Aufbau einen mehrphasigen Takt verwenden.> Ähnlich sieht es bei sehr großen, mehrlagigen FPGA (Xilinx 3D mit SSI)> aus, bei denen die Taktflanken zwischen verschiedenen Lagen nicht> hinreichend synchron sind bzw. auch Datensignale erhebliche Laufzeiten> besitzen können.
Tatsache. Sorry.
Ist das etwas dass es nur bei Verilog gibt? Bei VHDL das ich meistens
verwende kenne ich das nicht.
führt wieder zu dem gleichen Ergebnis.
Bernhard K. schrieb:> Ich meine: non-blocking verhält sichs in etwa wie eine VHDL variable:
Ja sehe ich auch gerade.
Edith dankt Bernhard K. der schneller war (-:
Seltsam dieses Verilog:
Jetzt habe ich zwei Eingänge d1 und d2.
1
always @(posedge clk)
2
begin
3
q1 = d1;
4
q2 = d2;
5
q3 = d1 ^ d2;
6
end
Und was kommt dabei raus? Nur q3 ist ein getaktetes FF, der Rest ist
Kombinatorik. Das bedeutet, dass dieser always @(posedge clk) Teil immer
und völlig unabhängig von dem Takt "läuft" und nur der Ausgang dann
getaktet ist. Also sehr ähnlich wie Variablen in VHDL. Aber die ersten
beiden Blocking Statements blockieren hier genau nichts, da wird
Kombinatorik draus. Und weil das so ist, macht es bei diesem Beispiel
auch keinen Unterschied ob man = oder <= verwendet.
Und Beides, also Blocking in Verilog und Variablen in VHDL bräuchte man
nicht. Man kann das immer auch anders beschreiben. Der Mehrwert ist
Bequemlichkeit. (Finde ich schon auch nützlich)