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


von Hochpass (Gast)


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

von Hochpass (Gast)


Angehängte Dateien:

Lesenswert?

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

von Duke Scarring (Gast)


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

von Klaus (Gast)


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.

von Hochpass (Gast)


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.

von Duke Scarring (Gast)


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

von Hochpass (Gast)


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?

von Hans (Gast)


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.

von Hans (Gast)


Lesenswert?

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

von Hochpass (Gast)


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!

von Duke Scarring (Gast)


Lesenswert?

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

Duke

von Marco (Gast)


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.

von bko (Gast)


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.

von Hochpass (Gast)


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?

von Johny (Gast)


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

von Johny (Gast)


Angehängte Dateien:

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

von Duke Scarring (Gast)


Lesenswert?

Um welches Register geht es? DDR2_RAS?

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

Duke

von Florian V. (florianv)


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.

von Johny (Gast)


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

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.