Forum: FPGA, VHDL & Co. MAX10 DDR3 Timing Violations (Arrow DECA)


von M. Н. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe auch zugeschlagen und mir ein DECA Board gekauft.
Nach dem ersten Lauflicht habe ich mich dann an den DDR3 gesetzt.
Leider ist der User Guide dazu etwas mau. Ich habe mir die Infos also 
teilweise aus den Beispielen von Terasic und aus dem netz gezogen.

Dabei ist mir aufgefallen, dass auch die Beispiele auf der Terasic CD 
mehr oder weniger schlecht sind. Es wird bspw. Die "Output Termination" 
auf "Series 40 Ohm with Calibration" gesetzt. Das geht aber laut Alt... 
Intel nur, wenn man auch die externen RUP/RDN Widerstände auf 40 Ohm 
hat. Auf dem Board sind es aber 50 Ohm Widerstände.

Ich dachte mir: "Egal, jetzt bastelst mal drauf los". Ich habe den 
Memory Controller jetzt soweit am Laufen, dass der DDR3 initialisiert 
und mein selbstgeschriebener Memory Test durchläuft.

Jetzt habe ich folgende Frage: Ich habe ein paar minimale 
Timingverletzungen an den DDR3 Signalen.
weiß jemand, wie ich die wegbekomme?
Der DDR3-Core bringt ja seine eigenen Constraints mit.

Ich habe euch das Ganze mal angehängt. Das völlig verbastelte Toplevel 
mit dem MemoryTest bitte ich zu entschuldigen. Das ist über die letzten 
2 Stunden ziemlich eklig gewachsen.

Vielen Dank!

von M. Н. (Gast)


Angehängte Dateien:

Lesenswert?

Ich stelle gerade fest, dass ich es irgendwie geschafft habe, die Pin 
Platzierungen kaputt zu machen, bevor ich es euch angehängt habe.

Bitte vor dem test das QSF austauschen. Da sind die Pins wieder richtig.

von Fpgakuechle K. (Gast)


Lesenswert?

Moin,

bin über den Beitrag: 
Beitrag "Re: billiges MAX 10 Board von Arrow"

hier aufgeschlagen. Ich schau mal ob ich dein Design hier 
durchcompilieren kann. Bis dahin nur allgemein gehaltenen Infos zu 
"constraint driven placing".

Eigentlich ist so ein Interface recht einfach zu constrainen und ich 
persönlich glaube , das intel/Altera das unnötig kompliziert und 
umfangreich gamcht hat.

Über die IO-standard constraints hast du ja bereits geschrieben. Wichtig 
dich, das erstmal alle soweit möglich die gleichen bekommen (Slew, rate, 
drive strength). man kann später diese IO-constraints anpassen damit die 
Signale am scope besser aussehen (weniger überschwinger) dabei dann aber 
beser greuppenweise vorgehen, also innerhalb dieser Gruppe gleiche 
IO-constraints.
Diese Gruppen sind:
DQ, Adr+BA, Clk+clkn,DQS+DQSn, RAS+CAS+WE+DQM,

Dann schauen das alle FF also für datenbus,Adressbus,ctrl-sigs in den 
IO-Pads liegen damit sollte man a) den minimalen Signal-Weg haben und b) 
hoffentlich bei jedem Routing gleiche Ergebnisse erzielen, weil die 
Differenz zwischen den Signalwegen untereinander dann auch minimal ist.

Was man Laufzeitunterschieden brauchen sollte, also bespw wenn man 
datastrobe vom DDR3 beim Lesen benutzten möchte, dann erreicht man das 
durch ein eigenes Taktnatz für diese signale und dieser Takt ist 
phasenverschoben (dann muß man an der PLL etwas experimentiern) ....

OK, ich bemerke grad ich verlier mich wie intel in details -> zurück zu 
allgememeinen Ratschlägen.


Bei constraints kann auch die Reihenfeolge wichtig sein, weil der Router 
die resourcen so belegt wie er sie für wichtig hält. Das kann dazu 
führen, das eher unwichtige Leitungen wie der Systemreset 'schnelle' 
Kanäle belegt und für die wichtigen Signale wie set/Rest an den 
Steuerleitungen wie DWS nur 'langsame' sigs übrigbleiben. Das führt dann 
auch zu einem weiteren Hinweis, unnötoige Schaltvorgänge vermeiden. Und 
unwichtige Signale mit 'false Path' zu belgene und nicht zu 
overconstrainen, also härtere Vorgaben als nötig zu machen.

Dann schauen, nach einem 'erfolgreichen' routing dieses oder wenigstens 
das Placing 'festzuhalten'. Bei Xilinx bspw. habe ich mir die Lage der 
DCM (Clocking subcomponents) angeschaut und diese festgezurrt (Placing 
constraint) dann ging das auch ohne zeitintensive Optimierungsoptionen.

Und Routing benutzt gerne zufällige Startwerte, das ist das Grundprinzip 
des verwendeten Optimierungsalgos "Simulated Anealing". Das führt 
zwangsläufig zu unterschiedlichen ergebnissen.

von Tobias (. (Gast)


Lesenswert?

M. H. schrieb:
> Nach dem ersten Lauflicht habe ich mich dann an den DDR3 gesetzt.
Das ist fürwahr ein Sprung!

Fpgakuechle K. schrieb:
> Eigentlich ist so ein Interface recht einfach zu constrainen
Das dürfte weniger das Problem des TE sein. Eher schon scheint mir die 
Schaltung nicht geeignet, das timing treffen zu können.

von M. Н. (Gast)


Lesenswert?

Tobias N. schrieb:
>> Eigentlich ist so ein Interface recht einfach zu constrainen
> Das dürfte weniger das Problem des TE sein. Eher schon scheint mir die
> Schaltung nicht geeignet, das timing treffen zu können.

Richtig. Ich bekomme es einfach nicht hin, dass Quartus mir den DDR3 
core korrekt platziert. Ich kann natürlich das Placement 4 mal machen. 
Dann passt es irgendwann auch. Aber sollte er das nicht automatisch 
wiederholen, wenn er merkt, dass das Timing nicht eingehalten wird. Es 
ist ja schließlich constraint.

An meinem Design kann es eigemtlich nicht liegen. Die kritischen Pfade 
sind alle tief im DDR3 Controller. auß0er dem DDR3 controller + einer 
kleinen Statemachine ist auch nsonst nichts im Design. Es sind also 
genug Reserven im FPGA.

von Fpgakuechle K. (Gast)


Lesenswert?

vielleicht ist "logic lock" und "design partition" ne Möglichkeit, das 
einmal optimal getroffen Placement einzufrieren.

https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/ug/ug-qpp-design-constraints.pdf 
page. 8 c.

https://www.intel.de/content/www/de/de/programmable/documentation/rbb1513988527943.html#mwh1410471305915

Es könnte auch sein das logic lock nicht mit allen Lizensen tut:
https://www.intel.de/content/www/de/de/software/programmable/quartus-prime/download.html

von Markus F. (mfro)


Lesenswert?

M. H. schrieb:
> Jetzt habe ich folgende Frage: Ich habe ein paar minimale
> Timingverletzungen an den DDR3 Signalen.

Ich habe dein Design mal bei mir durch den Wolf gedreht und bekomme auch 
Timing-Verletzungen (allerdings andere).
Trotzdem scheint es zu laufen wie beabsichtigt. Lediglich mit dem Makel, 
daß die "Fehler-LED" nicht wieder ausgeht, wenn man den "Fehler" am 
Switch wieder ausschaltet (oder ist das so gewünscht?).

Aufgefallen ist mir, daß dein Design den Fehler/Warnung:

"Warning (330000): Timing-Driven Synthesis is skipped because it could 
not initialize the timing netlist"

ausspuckt, das ist bei meinen DECA-Designs nicht der Fall (da erscheint 
an ähnlicher Position "Timing-Driven Synthesis is running on partition 
"Top"").

Meist ein Zeichen dafür, daß mit den .sdc-Files was nicht stimmt 
(entweder ein syntaktischer Fehler oder irgendwas referenziert, das es 
im Design nicht gibt). Ich bin aber noch nicht dahintergestiegen, wo das 
Problem genau liegt, jedenfalls fehlt so (mindestens) ein Freiheitsgrad 
für die Optimierung (das könnte es ja schon sein, viel fehlt ja nicht).

Darüber hinaus könntest Du noch versuchen, den "Optimization mode" 
("Compiler Settings") auf "Performance"/Agressive zu stellen. Vielleicht 
bringt das ja noch was.

von M. Н. (Gast)


Lesenswert?

Vielen Dank für das durchwursten meines Codes :)

Markus F. schrieb:
> Meist ein Zeichen dafür, daß mit den .sdc-Files was nicht stimmt
> (entweder ein syntaktischer Fehler oder irgendwas referenziert, das es
> im Design nicht gibt). Ich bin aber noch nicht dahintergestiegen, wo das
> Problem genau liegt, jedenfalls fehlt so (mindestens) ein Freiheitsgrad
> für die Optimierung (das könnte es ja schon sein, viel fehlt ja nicht).

Mh. Kann gut sein. Muss mal nochmal durchschauen. Das war zu diesem 
Zeitpunkt bereits maximal verbastelt.

Markus F. schrieb:
> Darüber hinaus könntest Du noch versuchen, den "Optimization mode"
> ("Compiler Settings") auf "Performance"/Agressive zu stellen. Vielleicht
> bringt das ja noch was.

Habe ich bereits versucht. Bringt null Veränderung. Nach teils >10 
synthesen bekommt er es manchmal hin. Aber dann wieder nicht... Reines 
Glückspiel.

Markus F. schrieb:
> Trotzdem scheint es zu laufen wie beabsichtigt. Lediglich mit dem Makel,
> daß die "Fehler-LED" nicht wieder ausgeht, wenn man den "Fehler" am
> Switch wieder ausschaltet (oder ist das so gewünscht?).

Das ist so "beabsichtigt". Man muss das design resetten um den Fehler zu 
löschen. Die LED war dafür da, dass ich das Board mal 10h laufen lassen 
kann und sicherzugehen, dass der DDR3 nichts verschluckt. Der 
testschalter ist nur dafür da, dass manuell zu triggern, um den 
Detektionsmechanismus zu testen.

von M. Н. (Gast)


Lesenswert?

Markus F. schrieb:
> "Warning (330000): Timing-Driven Synthesis is skipped because it could
> not initialize the timing netlist"
>
> ausspuckt, das ist bei meinen DECA-Designs nicht der Fall (da erscheint
> an ähnlicher Position "Timing-Driven Synthesis is running on partition
> "Top"").

Diese Meldung bekomme ich auch. Ich habe jetzt ne Ganze Weile 
durchgewühlt, kann aber keinen Fehler in den Files finden. Ich hoffe, 
jemand mit mehr Ahnung kann helfen.

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.