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
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.
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!
>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
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