Forum: FPGA, VHDL & Co. Signalname behalten für Clocknetz


von Harald S. (harald_dc)


Lesenswert?

Hi,
ich habe öfters das Problem, dass mir das Synthesetool (ISE 13.3) 
interne Netze eines VHDL-Codes (z.B. globale Clocks), die auch auf einen 
IO-Pin gehen, immer automatisch so umbenennt, wie der IO-Pin heißt. Wenn 
ich dann bei den Constraints zB diesen Takt beschreiben will, findet der 
Translater dieses Netz nicht mehr.

schemenhaftes Beispiel (nur zur Veranschaulichung):

im entity
   port( ClockOutput: out std_logic); -- Ausgang des Chips (zur 
Kontrolle)

in der architecture:
   signal gClk50 : std_logic;  -- Ausgang eines BUFGs, interner 
Systemtakt
   ClockOutput <= gClk50;

Im ucf hab ich dann zB folgendes stehen:
   NET gClk50 PERIOD = 50 MHz  HIGH 50 %;

Dann findet der Translater dieses Netz nicht mehr:

ERROR:ConstraintSystem:59 - Constraint <NET gClk50     PERIOD = 50 MHz 
HIGH 50%;> [C:/d/Projekte/vhdl_dcamC/src/constraints.ucf(17)]: NET 
"gClk50" not
   found.  Please verify that:


Ich hab natürlich schon gegoogelt und folgende Dinge leider ohne Erfolg 
ausprobiert:
-) "keep" attribute auf das signal
-) Synthese Einstellungen durch wie z.B. "keep_hierarchy"
-) verschiedene Optimierungseinstellungen

Ich könnte natürlich einfach dem Ausgang den gleichen Namen wie dem 
Ausgang geben, das kommt aber aufgrund der Leserlichkeit und unserer 
Coding-Guidelines leider nicht in Frage.

Hat wer von euch noch eine Idee? Besten Dank im Voraus,
lg Harald

von Joe (Gast)


Lesenswert?

Hmmm, das gleiche Problem gibt es bei Lattice (Diamond) auch. Diese 
Macke
ist sehr ärgerlich, keine keine Lösung hierfür.

von pks (Gast)


Lesenswert?

Versteh das Problem nicht ganz...

Was spricht denn dagegen im ucf den Namen des Ausgangs zu verwenden?

Außerdem, wenn dein clock aus einem globalen clock-buffer kommt, ist er 
doch von irgendeinem Eingangstakt abgeleitet. Da sollte es doch reichen, 
diesen zu constrainen.

von Duke Scarring (Gast)


Lesenswert?

Harald Schweitzer schrieb:
> Hat wer von euch noch eine Idee?
Ich würde den Takt über einen ODDR-Buffer ausgeben.

Welchen FPGA verwendest Du?

Duke

von Harald S. (harald_dc)


Lesenswert?

Hi und danke für eure schnellen Antworten.

> Was spricht denn dagegen im ucf den Namen des Ausgangs zu verwenden?

Darüber lässt sich sicher streiten, aber kurz gesagt wäre ein Argument: 
Wir haben platzmäßig ziemlich zu kämpfen und deshalb nur ein paar wenige 
Signale auf Testpunkte geroutet. Wenn man diese nun verschieden 
beschaltet (für Debugging), dann ändert sich die Quelle für diesen 
Ausgang. Und um sprechend zu bleiben, will man im ucf ja nicht einen 
Testpunkt constrainen, sondern eben ein Clock ö.ä.
Nun besser verständlich?

> Außerdem, wenn dein clock aus einem globalen clock-buffer kommt, ist er
> doch von irgendeinem Eingangstakt abgeleitet. Da sollte es doch reichen,
> diesen zu constrainen.

Das wäre allerdings möglich, das schau ich mir nochmal an, danke für den 
Hinweis. Nur ist es keine Lösung für mein ursächliches Problem mit der 
Namensänderung.

von Harald S. (harald_dc)


Lesenswert?

> Ich würde den Takt über einen ODDR-Buffer ausgeben.

Hmm, im Falle eines Taktes geht das, stimmt. Dies ist aber ebenfalls 
eine spezielle Sache und eigentlich auch keine Lösung für das 
ursächliche Problem.
Ich möchte nochmal darauf hinweisen, dass dieses Problem nicht nur für 
Clock-Netze besteht, sondern auch für Signale verschiedenen Typs.

> Welchen FPGA verwendest Du?

Spartan 6. Bin zur Zeit erst auf meinem zweiten Design für den 6er. Hab 
schon öfters gelesen, dass er vom Clocking usw nicht so ganz trivial wie 
seine Vorgänger sei.

: Bearbeitet durch User
von Leonard Lebewohl (Gast)


Lesenswert?

BTW ich verwende immer zwei constraints für sowas:
ein timing net spezifizieren
ein constraint an das timing net flanschen. Bsp:

NET "M133CLK" TNM_NET=TN_MASTER_CLK;
TIMESPEC "TS_period_266M" = PERIOD TN_MASTER_CLK  266 MHz;

MfG,

Ansosnten das constraint weglassen, alles durchlaufen lassen und dann im 
PAR-report schauen wie die Taktnetze heißen. Damit dann das constraint 
schreiben.

von Duke Scarring (Gast)


Lesenswert?

Harald Schweitzer schrieb:
> Ich möchte nochmal darauf hinweisen, dass dieses Problem nicht nur für
> Clock-Netze besteht, sondern auch für Signale verschiedenen Typs.
Dann kann ich Dein Problem nicht nachvollziehen. Ich muß mein ucf-File 
nur sehr selten ändern.
Die Namen im ucf und in meinem  top-level-Modul sind identisch. Wenn ich 
Signale umroute, dann mach ich das im top-level mit direkten Zuweisungen 
oder per alias.
Damit muß ich die location-constraints nicht ständig ändern.
Timing-Constraints werden im Prinzip nur auf die Eingangstakte 
angewandt, das Tools generiert dann abgeleitete Takte (DCM, PLL) von 
allein.

Duke

von Christoph Z. (christophz)


Lesenswert?

Leonard Lebewohl schrieb:
> Ansosnten das constraint weglassen, alles durchlaufen lassen und dann im
> PAR-report schauen wie die Taktnetze heißen. Damit dann das constraint
> schreiben.

Super! Das verdoppelt einfach mal so schnell die Implementationszeit. 
Sobald das Design länger als 5 min hat wird man das vermeiden wollen.

von Harald S. (harald_dc)


Lesenswert?

>> Ansosnten das constraint weglassen, alles durchlaufen lassen und dann im
>> PAR-report schauen wie die Taktnetze heißen. Damit dann das constraint
>> schreiben.
>
> Super! Das verdoppelt einfach mal so schnell die Implementationszeit.
> Sobald das Design länger als 5 min hat wird man das vermeiden wollen.

Hm, das sehe ich ähnlich. Keine wirkliche Option, außer für sehr kleine 
Designs.

> Dann kann ich Dein Problem nicht nachvollziehen. Ich muß mein ucf-File
> nur sehr selten ändern.
> Die Namen im ucf und in meinem  top-level-Modul sind identisch. Wenn ich
> Signale umroute, dann mach ich das im top-level mit direkten Zuweisungen
> oder per alias.
> Damit muß ich die location-constraints nicht ständig ändern.

Wie gesagt: ja, das wären alles Wege, um dieses Problem zu UMGEHEN.
Trotzdem bleibt die Frage, ob man das dem Synthesetool irgendwie sagen 
kann (attribute o.ä.), dass er einen Signalnamen erhält und nicht 
selbständig ändert. Ähnlich zum "volatile" keyword in C.
Das mit den Alias hab ich irgendwann mal aufgegeben weil der ISIM das 
nicht korrekt machte. Klappt das inzwischen besser? Dann wäre das evtl 
eine Option.

> Timing-Constraints werden im Prinzip nur auf die Eingangstakte
> angewandt, das Tools generiert dann abgeleitete Takte (DCM, PLL) von
> allein.

Das ist wahr - hab ich, wie oben bereits geschrieben, übersehen. Danke.

von franke (Gast)


Lesenswert?

Hi

In Diamond funktioniert das:


attribute syn_keep : boolean;
attribute syn_keep of k_clk,k1_clk : signal is true;
attribute PRESERVE_Z : string;
attribute PRESERVE_Z of k_clk,k1_clk : signal is "true";

damit werden clock Signal nicht umbenannt.

Cheers.

von Philip K. (philip_k)


Lesenswert?

Er hat ja schon geschrieben, dass es mit keep-Attribut nicht 
funktioniert.
Es sollte dann allerdings im Synthese-Report irgendwo stehen, dass das 
keep ignoriert wurde. Leider ist ISE mit Begründungen oft ziemlich 
sparsam...

von Fpgakuechle K. (Gast)


Lesenswert?

wenn ich dich recht verstehe dann willst du ein constraint auf ein 
ausgangspin setzen, wobei das constraint sich auf ein netz bezieht das 
mit dem ausgangspin verbunden ist aber nicht so heisst wie dieses?

und das ist ein period constraint?

period constraint auf ausgangs pads ist mindestens seltsam, period 
bezieht sich auf taktnetze (netz auf clock eingänge von FF o.ä. ) wenn 
das clock signal nur übers pad rausgeht dann ist period eh fehl am 
platz. wenn es ein internes taktsignal ist das zu testzwecken 
rausgegeben wird dann genügt das period constraint für das interne netz, 
da brauchts kein zweites period constraint.

was willst du genau für die testsignale constrainen?

Meines erachtens hast ist dein problem nicht richtig formuliert. signale 
werden nicht so ohne weiteres umbenannt. pads heissen so wie der port 
der topentity und nicht wie das signal daran. alles andere führt nur ins 
chaos.

KEEP und abstellen von dead logic elimination dient nicht zum erhalt von 
signalnamen, sondern von signalen resp. deren treiber. wenn aber dein 
netz wegoptimiert wird weil es funktionslos ist, das hast du kein 
problem das mit attributen etc. zu  lösen ist.



aber schau dir mal den constraintguide cgd.pdf an. insbesonders das 
bilden von timing groups.
timing constraints beziehen sich auf timing-netze -gruppen und mit einem 
grupping-constraint TMN_NET, TIMESPEC packst du netze in diese gruppe.
heisst das timing constraint selber musst du nicht verändern, nur die 
gruppe auf die es sich bezieht um das testpin ergänzen.

aber am wichtigsten ist meines erachtens dein problem richtig zu 
formulieren. "signalnamen behalten " ist es meines erachtens nicht.

MfG

von Joe (Gast)


Lesenswert?

>aber am wichtigsten ist meines erachtens dein problem richtig zu
>formulieren. "signalnamen behalten " ist es meines erachtens nicht.

Doch das ist schon ganz treffend beschrieben.
Bei Diamond ist es ähnlich: In Abhängigkeit davon, ob man Reveal 
(integrierter Logicanalyzer) integriert oder nicht werden schon mal
Taktnamen willkürlich umbenannt. Einfach so ...

von franke (Gast)


Lesenswert?

es sind aber auch beide Attribute notwendig, nicht nur "Keep"

gruß

von Lattice User (Gast)


Lesenswert?

franke schrieb:
> es sind aber auch beide Attribute notwendig, nicht nur "Keep"
>
> gruß

PRESERVE_Z ist ein Attribute für den Precision Synthesetool von Mentor.
syn_keep für Synplify

Es kann also nicht sein, dass beide Attributes im Einzelfall nötig sind.
Ausserdem setzt der OT ISE ein, also weder Synplify noch Precision.

von Fpgakuechle K. (Gast)


Lesenswert?

Joe schrieb:
>>aber am wichtigsten ist meines erachtens dein problem richtig zu
>>formulieren. "signalnamen behalten " ist es meines erachtens nicht.
>
> Doch das ist schon ganz treffend beschrieben.
> Bei Diamond ist es ähnlich: In Abhängigkeit davon, ob man Reveal
> (integrierter Logicanalyzer) integriert oder nicht werden schon mal
> Taktnamen willkürlich umbenannt. Einfach so ...

Es ist keine bloße Umbennung, das "alte" Taktnetz wird durch ein neues 
mit anderen Namen ersetzt. Ebenso verhindert keep keine Umbennenung von 
NAMEN sondern das Wegoptimieren von NETZEN. Das Problem liegt nicht in 
den Namen/identifiern sondern in den Netzen selbst.

VHDL verleidet leider das man Analogien zu Programmiersprachen zieht
wie hier Neuvergabe von identifier (Name binding). Das ist aber nicht 
das zugrunde liegende Problem sondern die Generierung von netzen aus der 
modellbeschreibung und die Zuweisung von constraints an siesen

Will man FPGA-tools verstehen, muß man denken wie diese, eben in 
Hardware denken. ;-)

MfG,

von Joe (Gast)


Lesenswert?

>Es ist keine bloße Umbennung, das "alte" Taktnetz wird durch ein neues
>mit anderen Namen ersetzt.

Lesen im Kaffeesatz.

Fakt ist: Durch mir nicht ersichtliche Gründe greifen die Constraints 
nicht mehr.

von Joe (Gast)


Lesenswert?

Ich konnte beobachten (Diamond Physical View), dass bei der Wahl des 
Taktnetztes ein Taktverteiler-Hard-Makro mehr oder weniger (oder anders) 
verwendet wird (ohne funktionale Änderung des Taktes), was zur 
Umbenennung des Taktes führt.

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.