mikrocontroller.net

Forum: FPGA, VHDL & Co. Xilinx: zwei identische Register generieren, ohne dass diese wegoptimiert werden


Autor: Hochpass (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Servus,
ich versuche gerade zwei Register zu erzeuge, die sich absolut identisch 
verhalten. Es geht um ein SPI Interface das nach extern geht und an 
einen internen Pattern Generator für Selbsttests. Das Register für das 
externe SPI Interface möchte ich gerne in einen IOB legen, was nur 
funktioniert wenn an dem Register nur noch das Pad hängt.
Jetzt optimiert mir die Synthese die zwei Register zu einem und mein MAP 
haut nicht mehr hin, weil an dem Register das Pad und der interne 
Pattern Generator hängt. Wie kann ich die Optimierung verhindern?

Hat wer eine Idee?

Danke

Gruß Hochpass

Autor: Hochpass (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Zur veranschaulichung. Ich hätte hier genrne in Hardware 2 Register, die 
das gleiche machen.

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hochpass schrieb:
> die sich absolut identisch
> verhalten

Dann darf doch eins auch wegoptimiert werden, oder?!
Ich verstehe nicht, warum Du da zwei getrennte brauchst.

Duke

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Duke Scarring schrieb:
> Dann darf doch eins auch wegoptimiert werden, oder?!
> Ich verstehe nicht, warum Du da zwei getrennte brauchst.

Ich zitiere:
Hochpass schrieb:
> Das Register für das
> externe SPI Interface möchte ich gerne in einen IOB legen, was nur
> funktioniert wenn an dem Register nur noch das Pad hängt.

Autor: Hochpass (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau. Ein Register muss zwingen in einen IOB um Delay nach außen zu 
minimieren. Register im IOB gehen nur wenn am Ausgang nur das Pad hängt. 
Zurückrouten in den FPGA geht nicht. Deshalb ein Register im IOB eins im 
FPGA, die aber absolut das gleiche machen. Das Synthesetool weiß ja noch 
nicht, dass ich zwei Register brauche, da erst Map das Register ins IOB 
packt.

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie schnell läuft die SPISchnittstelle? Da dürften die paar ns keine 
Rolle spielen. Ansonsten gibt es bei Xilinx diverse Attribute (z.B. 
IOBDELAY und S)

Duke

Autor: Hochpass (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
SPI läuft mit 100 Mhz. Zeit zum Rücklesen sind kleiner 6 ns.
Der Spartan3A DSP ist leider recht langsam. Das kleinste Delay zum 
Ausgang erwarte ich, wenn ich das Register in den IOB lege.

Mit IOBDELAY kann ich nur zurätzliches Delay hinzufügen. Dafür brauche 
ich aber konstante Pattern vom SPI Baustein um das Interface anzulernen. 
Diese Möglichkeit hab ich nicht. Daher möchte ich Delay minimieren.

Was macht S?

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem kenne ich persönlich auch. Hatte das gleiche Problem mit nem 
schnellen SPI.

Lösen kann man das entweder durch ein Atribut im VHDL Code (finde ich 
aber sehr unschön) oder über ein Constraint im Synthese Constraints 
File.

Hier mal beispielhaft

BEGIN MODEL "dein_entity_name_hier"
  NET "dein_signal_hier" equivalent_register_removal=false";
END;

Das ganze dann in eine .xcf Datei abspeichern und bei der Synthese als 
Synthesis Constraint File angeben.

ich glaube das "equivalent register removal" kann man auch global in der 
ISE ausstellen.

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich nochmal:
Hatte vergessen zu dagen, daß du natürlich für beide Register ein 
Constraint setzen musst.

Autor: Hochpass (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klasse genau das ist es:

attribute equivalent_register_removal: string;
attribute equivalent_register_removal of sck_out_reg: signal is "NO";
attribute equivalent_register_removal of sck_out_pat_gen_reg: signal is 
"NO";


jetzt muss ich es nur noch meinem Tool beibringen, dass er es mir in den 
code hängt oder ein constraintsfile bei der Synthese mitnimmt. 
HDL-Author von Mentor. Langsam hasse ich es. :-(

Dank dir!

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Laut "Xilinx Constraint Guide" (cgd.pdf) steht S für save net flag.

Duke

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>HDL-Author von Mentor. Langsam hasse ich es.
Ich habe es ganz schnell gehasst. So einen Bockmist benutzen zu müssen, 
ist fast ein Grund, den Job zu wechseln.

Autor: bko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hatte eine ähnliches Problem, mein Output Flipflop
hat sogar feed-back aber der ISE hat es aufgeteilt, und
ein Flipflop in den IO gepackt und das andere mit feedback
in den core.

(Meldung aus dem XST-Report):
>Mapping all equations...
>Building and optimizing final netlist ...
>FlipFlop io1/par_out_reg_31 has been replicated 1 time(s) to handle >iob=true 
attribute.

Das waren die ISE-Synthesis Settings:
 *   Pack IO-Registers into IOBs: Auto
 *            Register Duplication:   [haken drin]
 *             Optimization Effort:   High
Und im UCF file ein timing contraint für den Takt:

>TIMEGRP xstALLSEQ = FFS:LATCHES:RAMS;
># spartan3
>TIMESPEC tsxstallclocknets = FROM xstALLSEQ TO xstALLSEQ 120 MHz;

(ISE 10.1)


>>HDL-Author von Mentor. Langsam hasse ich es.
>Ich habe es ganz schnell gehasst. So einen Bockmist benutzen zu müssen,
>ist fast ein Grund, den Job zu wechseln.
Da sind wir schon zu dritt, seither scripte ich das Xst.

Autor: Hochpass (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> (Meldung aus dem XST-Report):
>>Mapping all equations...
>>Building and optimizing final netlist ...
>>FlipFlop io1/par_out_reg_31 has been replicated 1 time(s) to handle >iob=true
> attribute.
>
> Das waren die ISE-Synthesis Settings:
>  *   Pack IO-Registers into IOBs: Auto
>  *            Register Duplication:   [haken drin]
>  *             Optimization Effort:   High

Aber hier kann man sich nicht sicher sein, ob er das Register auch immer 
in den IOB packt.

> Und im UCF file ein timing contraint für den Takt:
>
>>TIMEGRP xstALLSEQ = FFS:LATCHES:RAMS;
>># spartan3
>>TIMESPEC tsxstallclocknets = FROM xstALLSEQ TO xstALLSEQ 120 MHz;
>
> (ISE 10.1)
>

Das UCF wird doch erst für MAP benötigt. Vorher wird das doch gar nicht 
ausgewertet? Wenn XST jetzt nur ein Register generiert, kann das UCF 
nichts mehr ausrichten..

>>>HDL-Author von Mentor. Langsam hasse ich es.
>>Ich habe es ganz schnell gehasst. So einen Bockmist benutzen zu müssen,
>>ist fast ein Grund, den Job zu wechseln.
> Da sind wir schon zu dritt, seither scripte ich das Xst.

TCL aus dem Mentor Tool heraus? Oder nimmst du es gar nicht mehr?

Autor: Johny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Eine Frage habe ich noch wie das genau in VHDL aussehen muss damit ein 
zweites Register Platziert wird.

Habe ein Register das ich nicht selbst iwo als Feedback nutze aber die 
ISE baut sich das iwas zusammen.
Hab jetzt schon tausend Möglichkeiten Ausprobiert ein zweites Register 
platzieren zu lassen aber alles erfolglos!

Vllt. könnte mir das jemand einmal kurz in VHDL verdeutlichen :)

Gruß Johny

Autor: Johny (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi

So hier auch bei mir einmal zur Verdeutlichung ein Bild!

Das Register wird in einer State Machine beschrieben und nicht wieder 
gelesen.
Doch die Synthese macht eben genau das daraus!

Habe Schon probiert die den Synthese Einstellungen ein anderes Ergebnis 
zu bekommen und auch Intern einfach mal 2 Signale Verwendet und eins mit 
Keep beibehalten bzw. auch alle anderen möglichen Contains darauf 
angewendet.

Wäre für eine Hilfe echt Dankbar weil danach eig. alles laufen sollte :)

Gruß Johny

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Um welches Register geht es? DDR2_RAS?

Johny schrieb:
> weil danach eig. alles laufen sollte
Freu Dich mal nicht zu früh ;-)

Duke

Autor: Florian V. (florianv)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ganz wichtig: Bereits im Synthesis Constraint File deklarieren, dass man 
an dem Pin das Ausgangsregister nutzen will. Im User Constraint File ist 
es zu spät, da erst nach der Synthese ausgewertet.

Dieser kleine aber feine Unterschied hat mir schon diverse graue Haare 
beschert. Der Synthesizer hatte bei mir eine Struktur, die eigentlich 
kein Feedback nach dem Register hat, so umgebaut, dass da doch ein 
Feedback war. Und dann hat sich der Mapper beschwert, dass das Register 
in der IO-Zelle nicht benutzt werden kann.

Autor: Johny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Habe leider schon im VHDL File dem Signal gesagt das es in IOB gehört 
(IOB = Force).
Hatte den Source beim 2. Post von mir mit angehangen, vllt. habe ich 
dort auch iwas drinn wodurch die Synthese mir nen Feedback Pfad da rein 
setzt!

Gruß Johny

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.