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
Zur veranschaulichung. Ich hätte hier genrne in Hardware 2 Register, die das gleiche machen.
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
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.
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.
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
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?
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.
Ich nochmal: Hatte vergessen zu dagen, daß du natürlich für beide Register ein Constraint setzen musst.
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!
Laut "Xilinx Constraint Guide" (cgd.pdf) steht S für save net flag. Duke
>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.
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.
> (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?
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
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
Um welches Register geht es? DDR2_RAS? Johny schrieb: > weil danach eig. alles laufen sollte Freu Dich mal nicht zu früh ;-) Duke
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.