Core-Komponenten durch Register entkoppeln?

Gast #1358878
Lesenswert?

Hallo zusammen!

Ich hätte da mal eine Frage zu einem Problem, das mich schon länger 
beschäftigt.

ich habe eine Divisions-Einheit, die zwei Integer-Operanden a und b mit 
je 32 Bit einliest und das Ergebnis ebenfalls als 32 Bit Integer 
ausgibt. Intern arbeitetet diese Einheit aber mit einer 
Fließpunkt-Divisions-Einheit.

Der Datenfluss sieht also wie folgt aus:

fixed_to_float(a) -->
                      float_divider --> float_to_fixed
fixed_to_float(b) -->


Die drei Komponenten sind mit dem Core-Generator xon Xilinx erstellt 
worden.

Nun stellt sich mir die Frage, wie ich das in einer Pipeline so 
umsetzten kann, dass ich den maximalen Takt herauszuhole ( bzw. was 
schreiben die "Coding Styles" o.ä. in diesem Falle vor?):

1. Direkt verdrahten (so wie oben abgebildet)
2. Vor und hinter float_divider ein Register (also insgesamt drei)
3. So wie 2., aber auch die Ein- und Ausgänge der Pipeline mit Registern 
entkoppeln (also insgesamt sechs)

Wie würdet ihr das machen? Bringen denn die Vorschläge 2 und 3 überhaupt 
einen Performance-Gewinn gegenüber Vorschlag 1 oder verschenke ich da 
bloß wertvolle Flip-Flops?

Gruß,
dito

PS: Der obige Ansatz verbraucht tatsächlich weniger Ressourcen als die 
direkte Division mit Integerzahlen (zumindest für den Fall, dass ich mit 
jedem Takt ein Ergbnis erhalte (Latenz dafür 40 Takte))
Persönliche Seite #1358900
Lesenswert?

Sind die Einheiten schon getaktet oder sind das kombinatorische Sachen?
Wenn die getaktet sind hast du eh schon die Register an den Eingängen 
und es bringt nix, ansosnten kann es helfen ein Register vor und nach 
Float divider einzubauen (am Anfang und ende bringts nicht so viel bzw 
sizt da eh meist noch ein Register wenn du es mit anderer getakteter 
Logik verwindest).
Gast #1359132
Lesenswert?

Alle Komponenten sind getaktet. Der Float-Divider wird daher wohl auch 
Register am Eingang haben.
Ich habe irgendwo mal gelesen, dass man "an bestimmten Stellen" (ich 
glaube an Anfang und Ende eines Moduls) Register plazieren sollte, um 
die Synthesewerkzeuge bei der Ermittlung des maximalen Taktes zu 
unterstützen.
Weiß nur leider nicht mehr was da genau stand... :-(
Gast #1359190
Lesenswert?

Das ist das Registerbalancing... Das muss nicht nur ein FF sein, es 
können auch mehrere Stufen sein und die Synthese versucht, die möglichst 
gleichmässig zwischen die Kombinatorik zu verteilen. Man kann die FFs 
vor die Logik setzen oder auch dahinter. BTW: Das kann auch zu 
Registerverdopplungen führen, die Funktion wird aber nicht geändert 
(wenn die Synthese keinen Mist baut...).

Beim xst schaltet man das mit "-register_balancing YES" an. Hau einfach 
mal ein paar Register vor deine Eingänge und schau, ob die Taktperiode 
kleiner wird. Wenn der kritische Pfad aber zB. schon in dem FP_DIV war, 
wird die Balazierung wohl direkt nichts mehr bringen. Allerdings relaxed 
sie das gesamte Timing, das kann sich psoitiv auf die Routingzeiten 
auswirken.

> Weiß nur leider nicht mehr was da genau stand... :-(

XST User Guide S. 325
http://www.xilinx.com/support/documentation/sw_manuals/xilinx11/xst.pdf

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren