Vorausgeschickt: mit X* kenn' ich mich nicht aus. Ob das folgende (das
in Quartus so funktioniert) auch bei Vivado so läuft, weiß ich nicht.
Jedenfalls ist ein .sdc-File bei Quartus einfach ein tcl Script.
Mirko H. schrieb:
> Aber wie spezifiziere ich die Endpunkte für "set_multicycle_path"? Wie
> transformiere ich die ehmals sehr eleganten
> INST "eae_inst/op*" TNM="EAE_OPS";
> INST "eae_inst/res*" TNM="EAE_RES";
um ehrlich zu sein: besonders "elegant" finde ich das nicht. Das ist
doch nichts anderes als eine Gruppenbildung?
1 | set eae_ops [get_cells eae_inst/op*]
|
2 | set eae_res [get_cells eae_inst/res*]
|
macht praktisch dasselbe: alle Elemente, auf die die Wildcards passen,
sind anschliessend unter den Namen $eae_ops bzw. $eae_res ansprechbar.
Dann - wie von Tobias B. schon geschrieben, diese Gruppen einfach in
set_multicycle_path verwenden:
1 | set_multicycle_path -from $eae_ops -to $eae_res -setup 2
|
2 | set_multicycle_path -from $eae_ops -to $eae_res -hold 1
|
Das erste Statement sagt, dass auf allen Pfaden von $eae_ops nach
$eae_res nicht mehr die Default-Regel gilt, dass das/die Signal(e) vor
der nächsten (1 = default) Latch-Taktflanke stabil am Ziel verfügbar
sein müssen, sondern dass die übernächste (2) auch noch reicht.
Das zweite Statement sagt, dass das/die Signal(e) statt frühestens
nach der (0. = default) an der (1). Latch-Taktflanke danach am Ziel
ankommen dürfen.
Ich finde das ehrlich gesagt viel eleganter und eingängiger als
1 | TIMESPEC TS_EAE=FROM "EAE_OPS" TO "EAE_RES" 32 ns;
|
Noch dazu musst Du das Statement ändern, wenn Du den Takt änderst.
set_multicycle_path musst Du nur ändern, wenn Du das Design änderst.