Forum: FPGA, VHDL & Co. FIFO_DC spinnt


von Rick D. (rickdangerus)


Angehängte Dateien:

Lesenswert?

Ich habe mir von Lattice Diamond einen FIFO_DC generieren lassen.
Das DC steht für 'dual clock' aber bei mir kommen alle Signale aus einer 
Taktdomäne.

Nun schreibe ich einige Werte in's FIFO und will die langsam wieder 
auslesen.
In der Simulation passt auch alles.

Allerdings stimmt es nicht mehr im FPGA. Da werden die Werte 
eingeschrieben (rote Kurve) und ein Wert auch ausgelesen (blaue Kurve). 
Aber das FIFO-empty-Signal ist nur am Anfang mit der Simulation 
identisch. Nach ca. 23 µs signalisiert das FIFO plötzlich es wäre leer, 
obwohl da nix weiter gelesen wurde.

Hat jemand so ein Verhalten schon mal beobachtet?
Was tun? Wenn ich mich nicht auf die FIFO-Flags verlassen kann, kommt 
meine State-Machine ins Straucheln.
Bisher waren die von IPExpress generierten FIFOs alle unauffällig und 
haben wie gewünscht funktioniert...

von Andras H. (andras_h)


Lesenswert?

Kommt vielleicht ein Reset?

von Martin S. (strubi)


Lesenswert?

Da fallen mir noch folgende Check-Fragen ein:
- Wie gross ist dein FIFO?
- Ab welcher Position knallt's?
- LSE oder Synplify fuers Mapping?
- RTL-Mapping schon analysiert?

Ich erinnere mich dunkel an ein paar Kopfkratz-Scenarios, mir kam mal 
auf einem ECP3 was unter, wo es dann mit dem portablen Code und einem 
zusaetzlich eingefuegten Register ging, aber nur via Synplify. Leider 
sehr lange her, also kein hilfreiches Detail.

Manchmal hilft post-map Simulation, aber das muss man dann wieder in 
Verilog resp. mixed machen, weil einige VHDL-Primitivenmodelle fehlen.

von Rick D. (rickdangerus)


Lesenswert?

Andras H. schrieb:
> Kommt vielleicht ein Reset?
Schau ich noch mal nach, unwahrscheinlich, da ich den nur einmal kurz am 
Anfang mache.

Martin S. schrieb:
> - Wie gross ist dein FIFO?
Die Tiefe ist 32.

> - Ab welcher Position knallt's?
9x schreiben und 1x lesen und da ist er der Meinung es wäre leer.
Im Timing-Report ist nix auffälliges, aber bei der Sysnthese:
1
Duplicate register/latch removal. send_i0/fifo_i0/FF_58 is a one-to-one match with send_i0/fifo_i0/FF_52.
Die Meldung kommt sehr (zu?) oft.

> - LSE oder Synplify fuers Mapping?
LSE. SYnplify geht gerade nicht, weil der die libxml2 nicht findet :(

> - RTL-Mapping schon analysiert?
Nein, hab ich für so einen Fall auch noch nicht gemacht, ist aber eine 
Idee.

Erstmal hab ich Diamond auf 3.14 gebracht, nutzt aber auch nix.

von Rick D. (rickdangerus)


Lesenswert?

Gerade noch die Idee gehabt, mal etwas weniger in's FIFO zu schreiben, 
aber kurz nach dem letzten wren ist wieder Schluß. Ich muß doch näher 
auf den Reset und die restlichen Steuersignale schauen.

von Rick D. (rickdangerus)


Angehängte Dateien:

Lesenswert?

Reset ist ok und RPReset ist permanent auf '0'.

Ich habe im Generator von 'LUT based' auf 'EBR only' umgestellt und 
jetzt geht es!

Außerdem sind diese Warnungen verschwunden:
1
Duplicate register/latch removal. send_i0/fifo_i0/FF_66 is a one-to-one match with send_i0/fifo_i0/FF_60.
2
Duplicate register/latch removal. send_i0/fifo_i0/FF_48 is a one-to-one match with send_i0/fifo_i0/FF_42.
3
Duplicate register/latch removal. receive_i0/fifo_i0/FF_66 is a one-to-one match with receive_i0/fifo_i0/FF_60.
4
Duplicate register/latch removal. receive_i0/fifo_i0/FF_48 is a one-to-one match with receive_i0/fifo_i0/FF_42.
5
Duplicate register/latch removal. send_i0/fifo_i0/FF_66 is a one-to-one match with send_i0/fifo_i0/FF_60.
6
Duplicate register/latch removal. send_i0/fifo_i0/FF_48 is a one-to-one match with send_i0/fifo_i0/FF_42.
7
Duplicate register/latch removal. receive_i0/fifo_i0/FF_66 is a one-to-one match with receive_i0/fifo_i0/FF_60.
8
Duplicate register/latch removal. receive_i0/fifo_i0/FF_48 is a one-to-one match with receive_i0/fifo_i0/FF_42.
9
Duplicate register/latch removal. send_i0/fifo_i0/FF_66 is a one-to-one match with send_i0/fifo_i0/FF_60.
10
Duplicate register/latch removal. send_i0/fifo_i0/FF_48 is a one-to-one match with send_i0/fifo_i0/FF_42.
11
Duplicate register/latch removal. receive_i0/fifo_i0/FF_66 is a one-to-one match with receive_i0/fifo_i0/FF_60.
12
Duplicate register/latch removal. receive_i0/fifo_i0/FF_48 is a one-to-one match with receive_i0/fifo_i0/FF_42.
13
Duplicate register/latch removal. send_i0/fifo_i0/FF_66 is a one-to-one match with send_i0/fifo_i0/FF_60.
14
Duplicate register/latch removal. send_i0/fifo_i0/FF_48 is a one-to-one match with send_i0/fifo_i0/FF_42.
15
Duplicate register/latch removal. receive_i0/fifo_i0/FF_66 is a one-to-one match with receive_i0/fifo_i0/FF_60.
16
Duplicate register/latch removal. receive_i0/fifo_i0/FF_48 is a one-to-one match with receive_i0/fifo_i0/FF_42.
17
Duplicate register/latch removal. send_i0/fifo_i0/FF_66 is a one-to-one match with send_i0/fifo_i0/FF_60.

Danke fÜr's miträtseln!

von Martin S. (strubi)


Lesenswert?

Edit: Da ist irgendwie dein letzter Post bei mir durch die Luecken. 
Damit erklaert sich's wohl...

----

Hmm. 32 Woerter passen in einen EBR, da gibt's eigentlich keinen Grund 
fuer Aerger. Oder mappt LSE das auf LUTs? Was, wenn das FIFO groesser 
ist?

Die Meldung betr. doppelter Register klingt nach Normalfall, da man ja 
oefters mal redundante Logik erzeugt.
Mit LSE hatte ich oefters non-funktionale Logik aus VHDL bekommen. Von 
seiten Lattice-Support hiess es lapidar aus Indien: Nimm halt Verilog 
oder Synplify, an einem Bugfixing schien das Interesse zu gering.

Kompatibilitaeten-Aerger mit dem Diamond-Geraffel und spaeteren 
Toolchains vermeidet sich uebrigens gut per Docker-Installation (siehe 
auch https://github.com/Gekkio/docker-fpga).

: Bearbeitet durch User
von Rick D. (rickdangerus)


Lesenswert?

Martin S. schrieb:
> 32 Woerter passen in einen EBR, da gibt's eigentlich keinen Grund
> fuer Aerger. Oder mappt LSE das auf LUTs?
Ob LUT oder EBR kann man sich raussuchen. Ich wollte für 32 Bytes 
eigentlich keinen EBR opfern.

> Mit LSE hatte ich oefters non-funktionale Logik aus VHDL bekommen. Von
> seiten Lattice-Support hiess es lapidar aus Indien: Nimm halt Verilog
> oder Synplify, an einem Bugfixing schien das Interesse zu gering.
Ja, diese Erfahrung mit dem Support habe ich auch schon gemacht. Trotz 
mitgeliefertem Minimalbeispiel.

von Martin S. (strubi)


Lesenswert?

Rick D. schrieb:
> Ob LUT oder EBR kann man sich raussuchen. Ich wollte für 32 Bytes
> eigentlich keinen EBR opfern.

Zu spaet deinen screenshot angeschaut... tja.
Kann es leider nicht ad-hoc nachpruefen, ob der IPX in harte Primitiven 
instanziert, aber vermutlich tut er das, und LSE 'optimiert' dann.
Bei so MiniFIFOs hatte ich mit haendischer Implementierung und 
one-hot-up/down countern mehr Spass und Speed als mit IPX, wo ploetzlich 
nach dem Upgrade die generierten Cores nicht mehr wollten.

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.