Forum: FPGA, VHDL & Co. Timing Constraints mit negativen Zeiten


von Jens W. (jensw)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe ein Design erstellt, wo schnell gerechnet werden soll. Für den 
Clock habe ich ein constraint angelegt und jetzt schlägt das Design 
fehl.
Den Teil aus dem Log File habe ich angehängt.

Wie muss ich das denn verstehen, wenn die Zeit hier negativ wird?

Wenn man den Signalen folgt, dann betrifft das drei Signale, die aus 
einem BRAM an einen Addierer gehen.
Wie kann ich da weiter vorgehen, um das so zu optimieren, dass die 
Zeiten eingehalten werden?
Ich steh hier auf dem Schlauch und die Doku gibt da auch nichts weiter 
her.

Danke euch!

Grüße, Jens

von Andreas H. (signore_rossi)


Lesenswert?

Das Delay auf dem Pfad liegt bei 15,892 ns. Dein Constraint erfordert 
aber 15,892 ns - 5,946 ns, also vermutlich knapp über 100 MHz Takt.

Was du da jetzt am bestens machst, ist ohne mehr Infos zum Datenpfad und 
FPGA nur schwer zu sagen. Vielleicht tut es schon ein zusätzliches 
Register zwischen BRAM und Addierer. Nutzt Du die DSP Module? Ist der 
FPGA sehr voll?

: Bearbeitet durch User
von Jens W. (jensw)


Lesenswert?

Hallo Andreas,
vielen Dank für deine Einschätzung.

Das ist ein "Spiel-Projekt" von mir. Einfach nur zum üben. Da verwende 
ich einen Spartan 3. Der hat keinen DSP Block drin.

Ich bin gerade unterwegs, daher kann ich dir leider kein Blockschaltbild 
machen. Ich versuche es zu beschreiben.

Ich habe hier einen rudimentären Rechenkern drin, ähnlich wie bei einem 
µC. Aber wirklich nur ähnlich.
Ich habe ein Opcode-Memory und da springe ich mit einem Programm Counter 
durch. Im Opcode ist codiert, was für die ALU (im Moment nur ein 
Addierer/Subtrahierer) die Eingangssignale sind und was die Operation 
selbst. Und genau der durchgereichte Opcode macht hier das Problem. Das 
scheint aus dem Memory zur Addierer-Einheit zu langsam sein.
Die maximale Frequenz habe ich momentan mit 250MHz angegeben, man will 
ja flott rechnen ;-)
In der Simulation funktioniert das auch prima, nur habe ich meine 
Zweifel, ob das auch so in der Schaltung die Geschwindigkeit erreicht.

Das mit den Registern habe ich auch schon gelesen, dass das helfen soll.
Wie oder was müsste ich denn da machen?


Viele Grüße, Jens

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

> negativen Zeiten

dazu fällt mir der alte Limerick ein

Relativity.
There was a young lady named Bright
Whose speed was far faster than light;
She set out one day
In a relative way
And returned on the previous night.

https://quoteinvestigator.com/2013/12/19/lady-bright/
schon von 1923, Einsteins Relativitätstheorie war laut Wikipedia 
1905/1916

von Andreas H. (signore_rossi)


Lesenswert?

Jens W. schrieb:
> Die maximale Frequenz habe ich momentan mit 250MHz angegeben, man will
> ja flott rechnen ;-)

Da ist ein antiker Spartan 3 einfach die falsche Wahl. :-)

Im Datenblatt (https://docs.amd.com/v/u/en-US/ds099) stehen die 
maximalen Delays für die verschiedenen Elemente des FPGAs, BRAM, 
Multiplizierer, etc...
Das BRAM allein hat schon mindestens 0,43 + 2,09 = 2,52 ns Verzögerung, 
um ein Datum auszugeben. Da bleibt bei Deinen 4 ns pro Takt nicht mehr 
viel für Routing und CLBs übrig.

Die 18 x 18 Bit Multiplizierer des Spartan brauchen auch über 5 ns für 
das höchstwertige Bit.

von Jens W. (jensw)


Lesenswert?

Hallo Andreas,

Andreas H. schrieb:
> Da ist ein antiker Spartan 3 einfach die falsche Wahl. :-)
Da hast du sicher Recht! Das ist schon ein altes Teil.
Aber da ich ja nur ein bisschen spielen will, steige ich nicht auf ein 
Spartan 7 um. Vor allem, da man die Gehäuse nur noch als BGA bekommt.

Aber genau dafür ist die Erkenntnis ja gut, dass man versteht woran es 
nun liegt, dass man die maximale Taktrate aus dem Datenblatt nicht 
erreicht.

Aber ich würde gerne nochmal auf das Register zurück kommen.
So wie ich es verstanden habe ist das ein FF. Klar, damit wird das 
Signal synchron zum Takt verarbeitet, was beim Timing Vorteile bringt. 
Aber wird das Signal dadurch nicht auch verzögert?
Wie geht das zusammen, dass das gesamte Design schneller wird, wenn das 
Signal selbst verzögert wird?

Viele Grüße, Jens

von Fooji (fooji)


Lesenswert?

Das Design wird durch Pipelining "schneller".

Mal angenommen, du schaltest 2 Gatter hintereinander, die jeweils 100ns 
brauchen. Dann beträgt die Verzögerung insgesamt 200ns. Wenn du aber ein 
Register dazwischen machst, kannst du alle 100ns ein Datum 
durchschieben. Es kommt trotzdem erst nach 200ns raus, aber eben alle 
100ns ein neues. Das verspricht doppelten Durchsatz. Die Gatter arbeiten 
sozusagen "parallel".

mfg, Fooji

von Martin S. (strubi)


Lesenswert?

An den Spartan3 BRAMs gibt es schnell Verstopfung, wenn da noch 
Decoder-Logik haengt. Mit einem zusaetzlichen Ausgangsregister und 
Aufstueckeln in weitere Pipeline-Stages kriegt man das aufgeloest, aber 
250 MHz klingen mir recht optimistisch.
Im Timing-Report und Floorplanner muesstest du eigentlich sehr schnell 
auf die Ursache stossen.

von Jens W. (jensw)


Angehängte Dateien:

Lesenswert?

Hallo Fooji,
Hallo Martin,

vielen Dank für die Aufklärung. Das leuchtet mir ein mit dem Pipelining.
Ich möchte das gerne Stück für Stück versuchen. Wenn ich das mit einer 
Pipeline machen will, dann muss ich vermutlich recht viel an der 
Struktur ändern, dass das funktioniert.
Der Pfad, der da klemmt, ist ja gerade der, der aus dem BRAM die ALU mit 
Daten versorgt. Ich möchte hier gerne erstmal ein Register ergänzen.
Aber wie mache ich das richtig? Einfach ein FF hat nichts gebracht.
Ich hänge mal die Implementierung von mir zum OpCode ROM.
Wie muss das aussehen mit einem Register am Ausgang?

Martin S. schrieb:
> 250 MHz klingen mir recht optimistisch.

Ja, das wird nicht erreichbar sein. Das ist in der Tat illusorisch.
90MHz sind mir aber auch ein bisschen zu wenig. Wenn ich in die Region 
150MHz kommen würde, wäre ich auch mehr als zufrieden.

Viele Grüße, Jens

von Jens W. (jensw)


Lesenswert?

Das einfachste Register wäre ja folgendes:
1
entity registers_1 is
2
  port(C, D : in std_logic;
3
       Q : out std_logic);
4
  end registers_1;
5
6
architecture archi of registers_1 is
7
 begin
8
 process (C)
9
  begin
10
    if (C'event and C='1') then
11
      Q <= D;
12
    end if;
13
  end process;
14
 end archi;

Das käme dem gleich wenn ich aus der Implementierung meine ROMs folgende 
Zeile
1
 Dout <= std_logic_vector(Parameter_Rom(RomAddr));
einfach in den Prozess reinschiebe. Aber das hat nichts gebracht am 
Timing.
Ich verstehe nicht, wie oder wo ich das Register am Ausgang richtig 
setze.

Grüße

von Martin S. (strubi)


Lesenswert?

Du musst wohl oder uebel die Logikverstopfung per detailliertem 
Timing-Report aufspueren und da entsprechend noch mehr Delay-Register 
einfuegen. Sonst ist das oben schon korrekt, wenn auch man kaum noch 
`(C'event and C='1')` in freier Wildbahn sieht :-)

Aber was ganz anderes: Bevor du dich ins Hochschrauben auf maximale 
f_max stuerzt, koenntest du auch deinen Mikrocode auf besagtes 
Pipelining optimieren, also auf Eimerketten-Prinzip mit parallel 
arbeitenden Opcodes.
Allerdings ist das nur fuer linear ablaufende Hardware-Schleifen ohne 
Spruenge trivial. Ich lese aus deinem Mikrocode allerdings einiges an 
IDLE-Zyklen, so dass sich das zumindest auf eine FSM-Pipeline Kombi 
runterkochen sollte und du mit realistischen 50 MHz f_max auf der 
entspannten Seite bist.

Dann: Dein ROM braucht vermutlich zwei BRAM-Primitiven, da recht breit, 
mit Runterschrumpfen auf kompaktere Opcodes und einer Decoder-Stufe 
dazwischen holst du allenfalls auch noch etwas raus, mit nur einem 
BRAM-Block oder gar erzwungener Fabric/LUT-RAM-Umsetzung verteilt sich 
die Logik allenfalls besser. Das BRAM brauchst du ja nur, wenn du zur 
Laufzeit dein "Programm" aendern willst.

von Rick D. (rickdangerus)


Lesenswert?

Nur mal so 'ne Hausnummer: Wir hatten damals Probleme einen Microblaze 
mit 100 MHz laufen zu lassen. Mit 90 MHz ging es. Kann mich aber nicht 
mehr erinnern, ob es ein Spartan 3 oder ein Spartan 3E war...

von Jens W. (jensw)


Lesenswert?

Hallo zusammen,

vielen Dank für eure Hilfe!

Rick D. schrieb:
> Nur mal so 'ne Hausnummer: Wir hatten damals Probleme einen Microblaze
> mit 100 MHz laufen zu lassen. Mit 90 MHz ging es. Kann mich aber nicht
> mehr erinnern, ob es ein Spartan 3 oder ein Spartan 3E war...
Ich komme auch immer mehr zu der Erkenntnis, dass ich mich von den 
Taktraten aus dem Datenblatt habe blenden lassen. Aber dafür ist es ja 
gut. Das ist die Erfahrung, die ich machen wollte.

Das Pipelining werde ich mir noch näher anschauen. Das klingt für mich 
noch nach einer Option. Den Rest werde ich auf dem einfachen kleinen 
FPGA nicht umsetzen können.
Wenn man genau in die Familie schaut, ist es schon ein Unterschied, ob 
man ein Spartan 3 oder ein Spartan 3E/A/AN nimmt. Die unterscheiden sich 
genau an dem BRAM. Die einen haben die Output Register mit integriert 
(und die DSP Slices), meines natürlich nicht.
Ich werde mit den Zeiten leben müssen. Vielleicht komme ich von den 11ns 
auf 8ns runter, aber sicher nicht in die Region 5ns.

Martin S. schrieb:
> `(C'event and C='1')` in freier Wildbahn sieht :-)
Da hast du wohl recht, das war aus dem XST User Guide herauskopiert. Das 
ist in die Jahre gekommen, da das FPGA das auch ist! ;-)

Viele Grüße, Jens

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.