Forum: FPGA, VHDL & Co. warum wird hier korrekt synthetisiert?


von Sina A. (sinapse)


Lesenswert?

Hallo,

hier
http://www.sunburst-design.com/papers/CummingsSNUG2000SJ_NBA_rev1_2.pdf

ist auf seite 9 folgendes beispiel mit race condition gegeben:
1
module pipeb3 (q3, d, clk);
2
 output [7:0] q3;
3
 input [7:0] d;
4
 input clk;
5
 reg [7:0] q3, q2, q1;
6
 always @(posedge clk) q1=d;
7
 always @(posedge clk) q2=q1;
8
 always @(posedge clk) q3=q2;
9
endmodule
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?

von Gustl B. (-gb-)


Lesenswert?

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.

von Sina A. (sinapse)


Lesenswert?

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.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

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.

von Gustl (Gast)


Lesenswert?

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.

von Bernhard K. (bkom)


Angehängte Dateien:

Lesenswert?

Ich meine: non-blocking verhält sichs in etwa wie eine VHDL variable:
1
 reg [7:0] q3, q2, q1;
2
always @(posedge clk) q1=d; // non blocking

Und blocking verhält sichs in etwa wie ein VHDL Signal:
1
reg [7:0] q3, q2, q1;
2
always @(posedge clk) q1<=d; // blocking

Mal sehen was ISE 14.7 so dazu sagt:
Version 1 nonblocking
1
always @(posedge clk)
2
    begin
3
    q1=d; 
4
    q2=q1;
5
    q3=q2;
6
    end
Wird im ISE-RTL-schematic eine Stufe (Bild pipeb3_version1)

Und aus diesem macht ISE drei FF-Stufen: (pipeb3_version2)
1
 always @(posedge clk) q1=d;
2
 always @(posedge clk) q2=q1;
3
 always @(posedge clk) q3=q2;

Und so werden es auch drei Stufen:
1
always @(posedge clk)
2
    begin
3
    q1<=d;
4
    q2<=q1;
5
    q3<=q2;
6
    end

von Gustl B. (-gb-)


Angehängte Dateien:

Lesenswert?

OK, aber
1
always @(posedge clk)
2
   begin
3
      q1 <= d;
4
      q2 <= q1;
5
      q3 <= q2;
6
   end

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)

: Bearbeitet durch User
von Sina A. (sinapse)


Lesenswert?

vielen dank für die antworten.

jetzt ist es klar.

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.