Forum: FPGA, VHDL & Co. Multiplizierer - Place & Route Problem


von Harald M. (Gast)


Lesenswert?

Hallo,

für meine Diplomarbeit entwickele ich einen Prozessor, der ähnlich MMX 
mehrere Register mit einem Befehl parallel verarbeiten können soll.

Dazu habe ich 16 parallele ALUs aufgebaut, in denen auch eine 
Multiplikation möglich sein soll.

Der Code dafür sieht in jeder dieser ALUs folgendermaßen aus:
1
 
2
signal mult_right: unsigned(15 downto 0);
3
signal mult_left:  unsigned(15 downto 0);
4
signal mult_res32: unsigned(31 downto 0);
5
6
mult_res32 <= mult_left * mult_right;

Die Synthese läuft einwandfrei ab, allerdings liefert mir Place & Route 
für jede der ALUs diese Fehlermeldung:

WARNING:Place:119 - Unable to find location.  MULT18X18SIO component 
cpu_impl/vector_executionunit_impl/.../valu/Mmult_mult_res32 not placed.

Der FPGA für den das Bitfile generiert werden soll ist ein Xilinx 
Spartan 3A (XC3S700A), welcher laut Datenblatt 
(http://direct.xilinx.com/bvdocs/publications/ds529.pdf) zwanzig 18x18 
Multiplizierer besitzen sollte.

Kann mir eventuell jemand einen Tipp geben, was hier schief laufen 
könnte?

Viele Grüße,
Harald

von Falk B. (falk)


Lesenswert?

@ Harald M. (Gast)

>WARNING:Place:119 - Unable to find location.  MULT18X18SIO component
>cpu_impl/vector_executionunit_impl/.../valu/Mmult_mult_res32 not placed.

>(http://direct.xilinx.com/bvdocs/publications/ds529.pdf) zwanzig 18x18
>Multiplizierer besitzen sollte.

>Kann mir eventuell jemand einen Tipp geben, was hier schief laufen
>könnte?

Bei einigen "edlen" Komponenten will die Software EXPLIZITE Location 
Constraints im UCF dafür haben. Möglicherweise ist das auch hier der 
Fall. Also mal alle Multiplizierer per Hand platzieren, geht am 
einfachsten im Floorplanner.

MFG
Falk

von Harald M. (Gast)


Lesenswert?

Hallo,

danke für die Antwort!

Leider komme ich mit dem Floorplaner überhaupt nicht klar und kann den 
Fehler damit auch nicht beheben. Problematisch ist auch der große Umfang 
des Prozessors (benötigt je nach Konfiguration bis zu 100% der 
Chipfläche) und, dass die Anzahl der ALUs konfigurierbar ist.

Auf der Xilinx Webseite wird zu meinem Fehler übrigens folgender Tipp 
gegeben:

"ERROR:Place:120 - There were not enough sites to place all selected 
components
Some of these failures can be circumvented by using an alternate 
algorithm (though it may take longer run time). If you would like to 
enable this algorithm please set the environment variable 
XIL_PAR_ENABLE_LEGALIZER to 1 and try again.

Leider finde ich aber im Xilinx ISE keine Stelle, an der ich die 
Umgebungsvariable setzen kann, wo hat sich diese Option denn versteckt?

Viele Grüße,
Harald M.

von Michael N. (bigmike47)


Lesenswert?

die setzt man dort wo man alle environmental variables in windows bzw. 
linux setzt

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?


von Harald M. (Gast)


Lesenswert?

@Michael

Ahja, ich bin irgendwie nicht auf die Idee gekommen, dass Xilinx 
tatsächlich für solche Einstellungen Variablen im Betriebssystem 
braucht, da sowas ja eher Projektabhängig ist. Danke für den Tipp. 
Leider hat das Setzen dieser Variable nichts geholfen.


@Andreas
Das Problem lag tatsächlich daran, dass ich das komplette Block-RAM für 
meine Register verwendet habe um LUTs zu sparen. Nachdem ich dem 
Synthesetool gesagt habe er kann zwischen Block-RAMs/LUTs selbst 
entscheiden, können die Multiplizierer platziert werden. Leider passt 
jetzt der Prozessor nicht mehr in der Konfiguration auf den Chip, die 
ich vorher hatte. Aber irgendwo muss man wohl Abstriche machen.



Danke nochmal an alle für die Hilfe!

Harald

von Fpgakuechle K. (Gast)


Lesenswert?

Harald M. wrote:

> @Andreas
> Das Problem lag tatsächlich daran, dass ich das komplette Block-RAM für
> meine Register verwendet habe um LUTs zu sparen. Nachdem ich dem
> Synthesetool gesagt habe er kann zwischen Block-RAMs/LUTs selbst
> entscheiden, können die Multiplizierer platziert werden. Leider passt
> jetzt der Prozessor nicht mehr in der Konfiguration auf den Chip, die
> ich vorher hatte. Aber irgendwo muss man wohl Abstriche machen.


Na dann musst du deinem Diplmobetreuer auch verklickern, das das design 
größer als der FPGA sein muß. an welchen ressourcen klemmt es denn, 
welche Ecke des designs müßen wir noch mit guten Ratschlägen in den FPGA 
quetschen.
Und hast Du wirklich die richtigen Schalter für Flächenoptimierung 
genutzt,
z.B. compressed Logik aktiviert?Und auch keinen reset asynchron gebaut?

FPGAküchle

von Harald M. (Gast)


Lesenswert?

Das Problem ist nicht ganz so dramatisch. Der Prozessor lässt sich an 
mehreren Stellen durch die Konfiguration in der Größe anpassen. Wenn man 
eben unbedingt 16 Multiplizierer braucht muss man an einer anderen 
Stelle Abstriche machen oder auf einen größeren Chip wechseln. Der 
Prozessor soll ja nicht speziell für einen FPGA entwickelt werden 
sondern die Leistungsfähigkeit mit der des verwendeten Chips skalieren.

Komplett auf Fläche kann ich den Prozessor leider nicht optimieren, da 
ich mindestens eine Taktfrequenz von 50 MHz erreichen muss weil daraus 
der Takt für die Kommuniktaion per RS232 gewonnen wird. Fällt der 
Prozessor unter die Geschwindigkeit kann ich meine Programme nicht mehr 
auf der Hardware debuggen.

50 MHz ist natürlich relativ wenig, ergibt sich aber aus den 32 Bit 
Registern, keinen Pipelines und der "MMX"-Einheit.

Es wäre natürlich schön gewesen, wenn der Prozessor mit allen Optionen 
und 16 parallelen ALUs auf meinem FPGA läuft. Aber wenn das nicht der 
Fall ist wird sich das vermutlich auch nicht auf meine Bewertung 
niederschlagen. Ist eher persönlicher Ergeiz in der Leistungsbewertung 
am Ende meiner Arbeit einen guten Wert zu erzielen.

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.